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 const SPEED = 300.0 const JUMP_VELOCITY = -400.0 const PUSH_POWER= 2000 var direction: float enum FaceDirection{LEFT, RIGHT} 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_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 # Handle jump. if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY direction = Input.get_axis("ui_left", "ui_right") if direction < 0: facing = FaceDirection.LEFT elif direction > 0: facing = FaceDirection.RIGHT 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: velocity.x = direction * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) 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