Compare commits

...

3 Commits

Author SHA1 Message Date
Ervan Lefevre a380551643 Adds checkpoint mecanism 2 years ago
Ervan Lefevre 426646f4e0 💅: Adds a UI to show level messages 2 years ago
Ervan Lefevre 9768c389cd 💅: Adds a water indicator 2 years ago
  1. BIN
      assets/sprites/water.png
  2. 34
      assets/sprites/water.png.import
  3. 11
      nodes/player/player.gd
  4. 11
      nodes/triggers/checkpoint.gd
  5. 6
      nodes/triggers/checkpoint.tscn
  6. 6
      nodes/triggers/level_trigger.gd
  7. 8
      nodes/ui/ui.gd
  8. 104
      nodes/ui/ui.tscn
  9. 1
      project.godot
  10. 25
      scenes/lose_screen.tscn
  11. 60
      scenes/poc.tscn
  12. 10
      scripts/gameplay/rising_level.gd
  13. 31
      scripts/singletons/gamestate.gd
  14. 4
      scripts/ui/change_scene_button.gd
  15. 7
      scripts/ui/last_checkpoint_button.gd

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://8wee83rmjpqj"
path="res://.godot/imported/water.png-817b08231a2ad4ae2410fb94c54aa35d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/water.png"
dest_files=["res://.godot/imported/water.png-817b08231a2ad4ae2410fb94c54aa35d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

@ -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")

@ -4,6 +4,7 @@ extends Area2D
@export var LEVEL_MESSAGE : String = ''
@export var ENABLED_NODES : Array[Node] = []
@export var DISABLED_NODES : Array[Node] = []
@export var UI : Node
# Called when the node enters the scene tree for the first time.
func _ready():
@ -18,9 +19,8 @@ func on_body_entered(body):
if body.is_in_group("npc"):
body.queue_free()
if LEVEL_MESSAGE:
# TODO
print(LEVEL_MESSAGE)
pass
if UI:
UI.show_message(LEVEL_MESSAGE)
for node in ENABLED_NODES:
node.set_physics_process(true)
for node in DISABLED_NODES:

@ -0,0 +1,8 @@
extends CanvasLayer
@onready var animator = $animator
@onready var title = $panel/title
func show_message(message):
title.text = message
animator.play('splash')

@ -0,0 +1,104 @@
[gd_scene load_steps=6 format=3 uid="uid://7flwkthps8ty"]
[ext_resource type="Script" path="res://nodes/ui/ui.gd" id="1_1svns"]
[sub_resource type="Animation" id="Animation_6cer2"]
resource_name = "splash"
length = 6.0
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("panel:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 2, 4, 6),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("panel:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 6),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
[sub_resource type="Animation" id="Animation_4v8h2"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("panel:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("panel:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_d41ii"]
resource_name = "hide"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("panel:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_iii80"]
_data = {
"RESET": SubResource("Animation_4v8h2"),
"hide": SubResource("Animation_d41ii"),
"splash": SubResource("Animation_6cer2")
}
[node name="ui" type="CanvasLayer"]
script = ExtResource("1_1svns")
[node name="animator" type="AnimationPlayer" parent="."]
autoplay = "hide"
libraries = {
"": SubResource("AnimationLibrary_iii80")
}
[node name="panel" type="Panel" parent="."]
offset_left = 64.0
offset_top = 64.0
offset_right = 1856.0
offset_bottom = 264.0
[node name="title" type="Label" parent="panel"]
layout_mode = 0
offset_right = 448.0
offset_bottom = 48.0
scale = Vector2(4, 4)
text = "Level 3 - Spider-Ant, Spider-ant ! "
horizontal_alignment = 1
vertical_alignment = 1

@ -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