Adds checkpoint mecanism

main
Ervan Lefevre 2 years ago
parent 426646f4e0
commit a380551643
  1. 11
      nodes/player/player.gd
  2. 11
      nodes/triggers/checkpoint.gd
  3. 6
      nodes/triggers/checkpoint.tscn
  4. 1
      project.godot
  5. 25
      scenes/lose_screen.tscn
  6. 32
      scenes/poc.tscn
  7. 10
      scripts/gameplay/rising_level.gd
  8. 31
      scripts/singletons/gamestate.gd
  9. 4
      scripts/ui/change_scene_button.gd
  10. 7
      scripts/ui/last_checkpoint_button.gd

@ -54,6 +54,10 @@ var grabbed_obstacle = null
func _ready():
$fsm.set_states(STATES)
add_to_group("player")
g_game_state.restore_checkpoint.connect(on_restore_checkpoint)
func _exit_tree():
g_game_state.restore_checkpoint.disconnect(on_restore_checkpoint)
func on_enter_spawn_state():
$fsm.set_next_state("idle")
@ -136,6 +140,9 @@ func climb_state(_delta):
func after_state(delta):
if Input.is_action_pressed('player_action'):
die()
move_and_slide()
if is_dead():
return
@ -253,6 +260,8 @@ func on_enter_die_state():
func die_state(_delta):
prints("die_state", $fsm.state_duration)
if $fsm.state_duration > DURATION_BEFORE_LOSE_SCREEN:
get_tree().change_scene_to_file(LOSE_SCREEN)
func on_restore_checkpoint(_level_rising):
global_position = g_game_state.player_position_at_checkpoint

@ -0,0 +1,11 @@
extends Area2D
# Called when the node enters the scene tree for the first time.
func _ready():
body_entered.connect(on_body_entered)
func on_body_entered(body):
if body.is_in_group('player'):
g_game_state.checkpoint(body.global_position)
queue_free()

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://cjuqvtp3lhsuc"]
[ext_resource type="Script" path="res://nodes/triggers/checkpoint.gd" id="1_v47vq"]
[node name="checkpoint" type="Area2D"]
script = ExtResource("1_v47vq")

@ -18,6 +18,7 @@ config/icon="res://icon.svg"
[autoload]
g_music="*res://scripts/singletons/music.gd"
g_game_state="*res://scripts/singletons/gamestate.gd"
[display]

@ -1,7 +1,8 @@
[gd_scene load_steps=3 format=3 uid="uid://ckt2twwgcgwtt"]
[gd_scene load_steps=4 format=3 uid="uid://ckt2twwgcgwtt"]
[ext_resource type="Script" path="res://scripts/ui/change_scene_button.gd" id="1_oyu1u"]
[ext_resource type="Script" path="res://scripts/ui/quit_button.gd" id="2_7spq8"]
[ext_resource type="Script" path="res://scripts/ui/last_checkpoint_button.gd" id="2_vu7kg"]
[node name="lose_screen" type="Control"]
layout_mode = 3
@ -24,16 +25,26 @@ text = "You lose"
horizontal_alignment = 1
vertical_alignment = 1
[node name="Button" type="Button" parent="Panel"]
[node name="main_menu" type="Button" parent="Panel"]
layout_mode = 0
offset_left = 800.0
offset_top = 744.0
offset_right = 1144.0
offset_bottom = 840.0
text = "Play Again"
offset_left = 632.0
offset_top = 776.0
offset_right = 1280.0
offset_bottom = 848.0
text = "Back To Main Menu"
script = ExtResource("1_oyu1u")
TARGET_SCENE = "res://scenes/main_menu.tscn"
[node name="last_checkpoint" type="Button" parent="Panel"]
layout_mode = 0
offset_left = 632.0
offset_top = 632.0
offset_right = 1280.0
offset_bottom = 704.0
text = "Restore Last Save"
script = ExtResource("2_vu7kg")
GAME_SCENE = "res://scenes/poc.tscn"
[node name="quit" type="Button" parent="Panel"]
offset_left = 629.0
offset_top = 875.0

File diff suppressed because one or more lines are too long

@ -6,14 +6,21 @@ const FORCE_CHECK_FREQUENCY = 5
var duration = 0
func _enter_tree():
g_game_state.restore_checkpoint.connect(on_restore_checkpoint)
func _ready():
body_entered.connect(_body_entered)
area_entered.connect(_area_entered)
body_exited.connect(_body_exited)
func _exit_tree():
g_game_state.restore_checkpoint.disconnect(on_restore_checkpoint)
func _physics_process(delta):
$shape.position.y -= RISING_SPEED * delta
self.position = self.position
g_game_state.save_level_rising_height($shape.position.y)
duration += delta
if duration > FORCE_CHECK_FREQUENCY:
@ -38,3 +45,6 @@ func process_body(body, force= false):
if body.is_in_group("npc"):
body.die(RISING_SPEED)
func on_restore_checkpoint(level):
$shape.position.y = level

@ -0,0 +1,31 @@
extends Node2D
class_name GGameState
signal restore_checkpoint(level)
var level_rising_height_now = 0
var level_rising_height_at_death = 0
var player_position_at_checkpoint = Vector2(0, 0)
var must_restore_checkpoint = false
func reset():
level_rising_height_now = 0
level_rising_height_at_death = 0
func save_level_rising_height(now):
if must_restore_checkpoint:
restore_checkpoint_now()
must_restore_checkpoint = false
else :
level_rising_height_now = now
func checkpoint(player_position):
level_rising_height_at_death = level_rising_height_now
player_position_at_checkpoint = player_position
func restore_checkpoint_now():
prints('restoring with', level_rising_height_at_death)
level_rising_height_now = level_rising_height_at_death
emit_signal("restore_checkpoint", level_rising_height_at_death)

@ -2,7 +2,11 @@ extends Button
class_name SceneChanger
@export_file("*.tscn") var TARGET_SCENE;
@export var reset_gamestate = false
func _pressed():
print("Changing scene to: " + TARGET_SCENE)
get_tree().change_scene_to_file(TARGET_SCENE)
if reset_gamestate:
g_game_state.reset()

@ -0,0 +1,7 @@
extends Button
@export_file('*.tscn') var GAME_SCENE
func _pressed():
get_tree().change_scene_to_file(GAME_SCENE)
g_game_state.must_restore_checkpoint = true
Loading…
Cancel
Save