class_name Player extends CharacterBody2D const bullet_scene = preload("res://scenes/bullet.tscn") @onready var right_cast: RayCast2D = $RightCast @onready var left_cast: RayCast2D = $LeftCast @onready var bullet_spawn_point_right: Node2D = $BulletSpawnPointRight @onready var bullet_spawn_point_left: Node2D = $BulletSpawnPointLeft @onready var jump_buffer_timer: Timer = $JumpBufferTimer @onready var player_animation: AnimatedSprite2D = $PlayerAnimation const SPEED = 300.0 const JUMP_VELOCITY = -400.0 const PUSH_POWER= 2000 @export var acceleration: int = 5 @export var health: int = 100 var direction: float enum FaceDirection{LEFT, RIGHT} enum State{IDLE, RUN, JUMP, FALL} var state: State = State.IDLE var facing: FaceDirection = FaceDirection.RIGHT var pushTarget: Object var pushEnabled: bool = false func _physics_process(delta: float) -> void: handle_input(delta) handle_movement(delta) handle_state(delta) handle_animation(delta) handle_collisions(delta) func handle_gravity(delta: float) -> void: # Add the gravity. if not is_on_floor(): velocity += get_gravity() * delta func handle_input(delta: float) -> void: var dir: int = 0 match facing: FaceDirection.LEFT: dir = -1 FaceDirection.RIGHT: dir = 1 if Input.is_action_just_pressed("ui_accept"): jump_buffer_timer.start() # Handle jump. direction = Input.get_axis("ui_left", "ui_right") if direction < 0: facing = FaceDirection.LEFT elif direction > 0: facing = FaceDirection.RIGHT player_animation.flip_h = facing == FaceDirection.LEFT if Input.is_action_just_pressed("ForcePush") && pushEnabled: (pushTarget as RigidBody2D).apply_central_impulse(Vector2(dir, 0) * PUSH_POWER) if Input.is_action_just_pressed("Shoot"): var spawnAt: Node2D = bullet_spawn_point_left if dir == 1: spawnAt = bullet_spawn_point_right #var b = bullet_scene.instantiate() #b.position = spawnAt.position print("make a bullet") var b = %SceneManager.makeBullet(spawnAt.global_transform, dir) #b.position = Player. #b.Position = Player.Position func handle_movement(delta: float) -> void: handle_gravity(delta) # Get the input direction and handle the movement/deceleration. # As good practice, you should replace UI actions with custom gameplay actions. if direction == 0: # not moving velocity.x = move_toward(velocity.x, 0, acceleration) else: velocity.x = move_toward(velocity.x, SPEED * direction, acceleration) if jump_buffer_timer.time_left > 0 and is_on_floor(): velocity.y = JUMP_VELOCITY jump_buffer_timer.stop() upJump = true state = State.JUMP move_and_slide() func handle_collisions(delta: float) -> void: for i in get_slide_collision_count(): var coll = get_slide_collision(i) if coll.get_collider() is RigidBody2D: coll.get_collider().apply_central_impulse(-coll.get_normal() * 100) if right_cast.is_colliding() && facing == FaceDirection.RIGHT: var col = right_cast.get_collider() if col != null && col.is_in_group("pushable"): pushTarget = col pushEnabled = true elif left_cast.is_colliding() && facing == FaceDirection.LEFT: var col = left_cast.get_collider() if col != null && col.is_in_group("pushable"): pushTarget = col pushEnabled = true else: pushEnabled = false pushTarget = null func handle_state(delta: float) -> void: match state: State.IDLE when velocity.x != 0: state = State.RUN if velocity.y > 0: state = State.FALL if velocity.y == 0 && velocity.x == 0: state = State.IDLE elif velocity.y == 0: state = State.RUN func handle_animation(delta: float) -> void: match state: State.IDLE: player_animation.play("idle") State.RUN: player_animation.play("run") State.JUMP: if upJump: player_animation.play("jump") upJump = false State.FALL: player_animation.play("fall") var upJump: bool = false #func _on_animation_finished() -> void: