Added graphics animations, tilesets and tilemaps with physics layer, and player state machine.
This commit is contained in:
1 parent
458b3e25fc
commit
f916237426
21 files changed
+1000
-18
No files matched your search
@@ -50,3 +50,4 @@ func crateTotal(numOfCrates):
|
||||
func bulletDamage(body, _bullet) -> void:
|
||||
if body.is_in_group("shootable"):
|
||||
destroySignal.emit(body)
|
||||
destroySignal.emit(_bullet)
|
||||
+71
-10
@@ -6,40 +6,57 @@ signal shootSignal(markerPosition, speed)
|
||||
@onready var left_cast: RayCast2D = $LeftCast
|
||||
@onready var right_bullet_spawn: Marker2D = $RightBulletSpawn
|
||||
@onready var left_bullet_spawn: Marker2D = $LeftBulletSpawn
|
||||
@onready var player_graphic: AnimatedSprite2D = $PlayerGraphic
|
||||
|
||||
var pushRightEnabled = false
|
||||
var pushLeftEnabled = false
|
||||
var pushTarget
|
||||
var pushTimer = 0
|
||||
|
||||
const SPEED = 300.0
|
||||
const JUMP_VELOCITY = -400.0
|
||||
const SPEED = 400.0
|
||||
const JUMP_VELOCITY = -500.0
|
||||
|
||||
enum FaceDirection {RIGHT,LEFT}
|
||||
var facing:FaceDirection = FaceDirection.RIGHT
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
# Add the gravity.
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
enum PlayerStates {IDLE, RUNNING, JUMPING, FALLING, CHARGING, SHOVING}
|
||||
var current_player_state:PlayerStates = PlayerStates.IDLE
|
||||
var upJump:bool = false
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
handle_input()
|
||||
handle_movement(delta)
|
||||
handle_states()
|
||||
handle_animation()
|
||||
move_and_slide()
|
||||
handle_collisions()
|
||||
|
||||
func handle_input() -> void:
|
||||
# Handle jump.
|
||||
if Input.is_action_just_pressed("ui_up") and is_on_floor():
|
||||
velocity.y = JUMP_VELOCITY
|
||||
current_player_state = PlayerStates.JUMPING
|
||||
upJump = true
|
||||
|
||||
# Handle shove
|
||||
if Input.is_action_just_pressed("shove"):
|
||||
print("Shove pressed")
|
||||
pushTimer = Time.get_ticks_msec()
|
||||
if pushRightEnabled and facing == FaceDirection.RIGHT:
|
||||
current_player_state = PlayerStates.CHARGING
|
||||
pushTimer = Time.get_ticks_msec()
|
||||
if pushLeftEnabled and facing == FaceDirection.LEFT:
|
||||
current_player_state = PlayerStates.CHARGING
|
||||
pushTimer = Time.get_ticks_msec()
|
||||
if Input.is_action_just_released("shove"):
|
||||
var pushForce = Time.get_ticks_msec() - pushTimer
|
||||
if pushForce > 4000:
|
||||
pushForce = 4000
|
||||
if pushRightEnabled and facing == FaceDirection.RIGHT:
|
||||
pushSignal.emit(pushTarget, Vector2(1,0) * 100 * (pushForce/100))
|
||||
current_player_state = PlayerStates.SHOVING
|
||||
if pushLeftEnabled and facing == FaceDirection.LEFT:
|
||||
pushSignal.emit(pushTarget, Vector2(-1,0) * 100 * (pushForce/100))
|
||||
|
||||
current_player_state = PlayerStates.SHOVING
|
||||
# Handle shoot
|
||||
if Input.is_action_just_pressed("shoot"):
|
||||
print("Shoot pressed")
|
||||
@@ -47,7 +64,7 @@ func _physics_process(delta: float) -> void:
|
||||
FaceDirection.RIGHT:
|
||||
shootSignal.emit(right_bullet_spawn.global_transform, 800)
|
||||
FaceDirection.LEFT:
|
||||
shootSignal.emit(left_bullet_spawn.global_transform, 800)
|
||||
shootSignal.emit(left_bullet_spawn.global_transform, -800)
|
||||
|
||||
# Get the input direction and handle the movement/deceleration.
|
||||
# As good practice, you should replace UI actions with custom gameplay actions.
|
||||
@@ -56,12 +73,19 @@ func _physics_process(delta: float) -> void:
|
||||
velocity.x = direction * SPEED
|
||||
if direction > 0:
|
||||
facing = FaceDirection.RIGHT
|
||||
player_graphic.flip_h = false
|
||||
else:
|
||||
facing = FaceDirection.LEFT
|
||||
player_graphic.flip_h = true
|
||||
else:
|
||||
velocity.x = move_toward(velocity.x, 0, SPEED)
|
||||
|
||||
move_and_slide()
|
||||
func handle_movement(delta) -> void:
|
||||
# Add the gravity.
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
|
||||
func handle_collisions() -> void:
|
||||
# Collision detection needs to happen AFTER move_and_slide calculation
|
||||
if right_cast.is_colliding():
|
||||
print("Right raycast collision")
|
||||
@@ -86,3 +110,40 @@ func _physics_process(delta: float) -> void:
|
||||
if c.get_collider() is RigidBody2D:
|
||||
#c.get_collider().apply_central_impulse(-c.get_normal() * 100)
|
||||
pushSignal.emit(c.get_collider(),-c.get_normal() * 100)
|
||||
|
||||
func handle_states() -> void:
|
||||
match current_player_state:
|
||||
PlayerStates.IDLE when velocity.x != 0:
|
||||
current_player_state = PlayerStates.RUNNING
|
||||
PlayerStates.RUNNING when velocity.x == 0:
|
||||
current_player_state = PlayerStates.IDLE
|
||||
PlayerStates.JUMPING when velocity.y > 0:
|
||||
current_player_state = PlayerStates.FALLING
|
||||
PlayerStates.FALLING when is_on_floor():
|
||||
if velocity.x == 0:
|
||||
current_player_state = PlayerStates.IDLE
|
||||
else:
|
||||
current_player_state = PlayerStates.RUNNING
|
||||
|
||||
func handle_animation() -> void:
|
||||
match current_player_state:
|
||||
PlayerStates.RUNNING:
|
||||
player_graphic.play("run")
|
||||
PlayerStates.IDLE:
|
||||
player_graphic.play("idle")
|
||||
PlayerStates.JUMPING:
|
||||
if upJump:
|
||||
player_graphic.play("jump")
|
||||
PlayerStates.FALLING:
|
||||
player_graphic.play("fall")
|
||||
PlayerStates.CHARGING:
|
||||
player_graphic.play("charge")
|
||||
PlayerStates.SHOVING:
|
||||
player_graphic.play("shove")
|
||||
|
||||
func _on_animation_finished() -> void:
|
||||
match current_player_state:
|
||||
PlayerStates.JUMPING:
|
||||
upJump = false
|
||||
PlayerStates.SHOVING:
|
||||
current_player_state = PlayerStates.IDLE
|
||||
@@ -38,9 +38,22 @@ func updateCrates() -> void:
|
||||
func pushTarget(body,pushDirection) -> void:
|
||||
if body is RigidBody2D:
|
||||
body.apply_central_impulse(pushDirection)
|
||||
|
||||
|
||||
func stashBullet(bullet:Bullet) -> void:
|
||||
# hide the bullet
|
||||
var stashPosition:Vector2 = Vector2(-100,-100)
|
||||
bullet.position = stashPosition
|
||||
bullet.setSpeed(0)
|
||||
bullet.set_process(false)
|
||||
|
||||
func destroy(body) -> void:
|
||||
body.queue_free()
|
||||
match body:
|
||||
var bod when bod is Bullet:
|
||||
stashBullet(body)
|
||||
var bod when bod is Crate:
|
||||
body.queue_free()
|
||||
_:
|
||||
body.queue_free()
|
||||
|
||||
func teleportTarget(body) -> void:
|
||||
if body is Crate:
|
||||
@@ -67,3 +80,4 @@ func makeBullet(spawnPosition, speed) -> void:
|
||||
var myBullet:Bullet = bulletFactory()
|
||||
myBullet.transform = spawnPosition
|
||||
myBullet.setSpeed(speed)
|
||||
myBullet.set_process(true)
|
||||
Reference in new issue
Block a user