extends CharacterBody2D const SPEED: int = 500 @onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D @onready var cam: Camera2D = $Camera2D @export var tilemap: TileMapLayer var tilesize: int = 32 var position_limit_rect: Rect2 func _ready() -> void: var used_tilemap_rect: Rect2i = tilemap.get_used_rect() tilesize = tilemap.tile_set.tile_size.x cam.limit_left = used_tilemap_rect.position.x * tilesize cam.limit_top = used_tilemap_rect.position.y * tilesize cam.limit_right = used_tilemap_rect.end.x * tilesize cam.limit_bottom = used_tilemap_rect.end.y * tilesize var x_margin: float = float(tilesize) / 4 var y_margin: float = float(tilesize) / 2 position_limit_rect = Rect2( Vector2(cam.limit_left + x_margin, cam.limit_top + y_margin), Vector2( (cam.limit_right - x_margin) - (cam.limit_left + x_margin), (cam.limit_bottom - y_margin) - (cam.limit_top + y_margin) ) ) func _physics_process(delta: float) -> void: velocity = Input.get_vector("move_left","move_right","move_up","move_down").normalized() * delta * SPEED * 3 move_and_slide() position = position.clamp(position_limit_rect.position, position_limit_rect.end) if velocity.length() != 0: animated_sprite.play() animated_sprite.flip_h = false if abs(velocity.x) > abs(velocity.y): animated_sprite.animation = "side" animated_sprite.flip_h = velocity.x < 0 elif velocity.y < 0: animated_sprite.animation = "up" else: animated_sprite.animation = "down" else: animated_sprite.stop()