class_name Player extends CharacterBody2D const SPEED =200.0 const JUMP_VELOCITY = -500.0 var direction enum FaceDirection{LEFT, RIGHT} var facing:FaceDirection = FaceDirection.RIGHT enum player_state{IDLE,RUNNING} var current_player_state:player_state = player_state.IDLE @onready var player_graphic: AnimatedSprite2D = $"player graphic" @onready var rightspawn: Marker2D = $rightspawn @onready var leftspawn: Marker2D = $leftspawn @onready var right_cast: RayCast2D = $RightCast @onready var left_cast: RayCast2D = $LeftCast var pushTarget var pushEnabled:bool=false func _ready() -> void: print(right_cast) func _physics_process(delta: float) -> void: handle_input() handle_movement(delta) handle_state() handle_animation() move_and_slide() handle_collisions() func handle_input()->void: if Input.is_action_just_pressed("chuck"): print("chuck grenade") %SceneManager.makeGrenade(rightspawn.global_transform, 1) if Input.is_action_just_pressed("ui_accept"): velocity.y = JUMP_VELOCITY if Input.is_action_just_pressed("magic push") and pushEnabled: print("I want to shove") var shoveDirection:int match facing: FaceDirection.RIGHT: shoveDirection = 1 FaceDirection.LEFT: shoveDirection = -1 pushTarget.apply_central_impulse(Vector2(shoveDirection,0)*700) # Get the input direction and handle the movement/deceleration. # As good practice, you should replace UI actions with custom gameplay actions. direction = Input.get_axis("ui_left", "ui_right") if direction<0: facing = FaceDirection.LEFT player_graphic.flip_h = true if direction>0: facing = FaceDirection.RIGHT player_graphic.flip_h = false func handle_movement(delta)->void: if not is_on_floor(): velocity += get_gravity() * delta # Handle jump. if direction: velocity.x = direction * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) func handle_collisions()->void: if right_cast.is_colliding() && facing==FaceDirection.RIGHT: var collider = right_cast.get_collider() if collider is Node && collider is RigidBody2D: pushTarget = collider pushEnabled = true if left_cast.is_colliding() && facing==FaceDirection.LEFT: var collider = left_cast.get_collider() if collider is Node && collider is RigidBody2D: pushTarget = collider pushEnabled = true for i in get_slide_collision_count(): var c = get_slide_collision(i) if c.get_collider() is RigidBody2D: #deliver the impact c.get_collider().apply_central_impulse(-c.get_normal() * 100) func handle_state()->void: match current_player_state: player_state.IDLE when velocity.x !=0: print("runnnnnn") current_player_state = player_state.RUNNING player_state.RUNNING when velocity.x ==0: current_player_state = player_state.IDLE func handle_animation()->void: match current_player_state: player_state.IDLE: player_graphic.play("idle") player_state.RUNNING: player_graphic.play("run")