Godot Version
4.5
Question
Hi i am pretty new trough programming, and trying to make a simple turn based 2d game on a 16x16 grid.
My enemy ai keeps going trough walls. It does collide with the player for as far as i can tell. Does anyone know what im doing wrong?
I am trying to figure out the code either trough videos or chatGPT, but i cant get it to work.
here is my enemy script:
extends CharacterBody2D
const TILE_SIZE := Vector2(16, 16)
@onready var tile_layer: TileMapLayer = get_parent().get_node(“TileMapLayer”)
@onready var player: Node = get_parent().get_node(“Player”)
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
var move_tween: Tween
func _ready() → void:
player.player_did_a_move.connect(take_turn)
func take_turn() → void:
print(“Enemy turn”)
var directions := [Vector2.UP, Vector2.DOWN, Vector2.LEFT, Vector2.RIGHT]
directions.shuffle()
for dir in directions:
if can_move(dir):
move(dir)
return
func get_tile_pos() → Vector2i:
return tile_layer.local_to_map(tile_layer.to_local(global_position))
func get_player_tile_pos() → Vector2i:
return tile_layer.local_to_map(tile_layer.to_local(player.global_position))
func is_tile_blocked(tile_pos: Vector2i) → bool:
var tile_data := tile_layer.get_cell_tile_data(tile_pos)
return tile_data.get_custom_data(“blocked”) if tile_data.has_custom_data(“blocked”) else false
func can_move(dir: Vector2) → bool:
var target_tile := get_tile_pos() + Vector2i(dir)
if is_tile_blocked(target_tile):
return false
if target_tile == get_player_tile_pos():
return false
return true
func move(dir: Vector2) → bool:
if not can_move(dir):
return false
position += dir * TILE_SIZE
sprite.position = -dir * TILE_SIZE
if move_tween:
move_tween.kill()
move_tween = create_tween()
move_tween.set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
move_tween.tween_property(sprite, “position”, Vector2.ZERO, 0.18)
return true