Player animation simplify! Using Sprite.frame

Replays refined a bit (: using grayscale.gdshader on ghost!
Notes now stored by map_name ^.^
Silent Wolf highscores working again!
This commit is contained in:
Harmony Honey 2023-11-29 03:36:12 -05:00
parent f928b55c15
commit c7de6059db
5 changed files with 91 additions and 163 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=2]
[gd_scene load_steps=12 format=2]
[ext_resource path="res://src/actor/Player.gd" type="Script" id=1]
[ext_resource path="res://media/audio/sfx/player_jump.wav" type="AudioStream" id=2]
@ -8,39 +8,11 @@
[ext_resource path="res://media/audio/sfx/box_drop.wav" type="AudioStream" id=6]
[ext_resource path="res://media/audio/sfx/push.wav" type="AudioStream" id=7]
[sub_resource type="Animation" id=1]
length = 0.6
loop = true
[sub_resource type="Animation" id=7]
length = 0.001
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:region_rect")
tracks/0/interp = 0
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.4 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Rect2( 56, 0, 8, 24 ), Rect2( 64, 0, 8, 24 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:offset")
tracks/1/interp = 0
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.4 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ), Vector2( 0, 0 ) ]
}
[sub_resource type="Animation" id=2]
length = 0.1
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:region_rect")
tracks/0/interp = 0
tracks/0/path = NodePath("Sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
@ -48,130 +20,54 @@ tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Rect2( 104, 0, 8, 24 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:offset")
tracks/1/interp = 0
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ) ]
}
[sub_resource type="Animation" id=3]
length = 0.6
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:region_rect")
tracks/0/interp = 0
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.2, 0.3, 0.5 ),
"transitions": PoolRealArray( 1, 1, 1, 1 ),
"update": 0,
"values": [ Rect2( 72, 0, 8, 24 ), Rect2( 80, 0, 8, 24 ), Rect2( 88, 0, 8, 24 ), Rect2( 96, 0, 8, 24 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:offset")
tracks/1/interp = 0
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.2, 0.3, 0.5 ),
"transitions": PoolRealArray( 1, 1, 1, 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ), Vector2( 0, 0 ), Vector2( 0, 0 ), Vector2( 0, 0 ) ]
"values": [ 0 ]
}
[sub_resource type="Animation" id=4]
length = 0.6
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:region_rect")
tracks/0/interp = 0
tracks/0/path = NodePath("Sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.4 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Rect2( 0, 0, 8, 24 ), Rect2( 8, 0, 8, 24 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:offset")
tracks/1/interp = 0
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.4 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ), Vector2( 0, 0 ) ]
"update": 1,
"values": [ 0, 1 ]
}
[sub_resource type="Animation" id=5]
length = 0.1
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:region_rect")
tracks/0/interp = 0
tracks/0/path = NodePath("Sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Rect2( 48, 0, 8, 24 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:offset")
tracks/1/interp = 0
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ) ]
"update": 1,
"values": [ 6 ]
}
[sub_resource type="Animation" id=6]
length = 0.6
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:region_rect")
tracks/0/interp = 0
tracks/0/path = NodePath("Sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.2, 0.3, 0.5 ),
"transitions": PoolRealArray( 1, 1, 1, 1 ),
"update": 0,
"values": [ Rect2( 16, 0, 8, 24 ), Rect2( 24, 0, 8, 24 ), Rect2( 32, 0, 8, 24 ), Rect2( 40, 0, 8, 24 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:offset")
tracks/1/interp = 0
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.2, 0.3, 0.5 ),
"transitions": PoolRealArray( 1, 1, 1, 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ), Vector2( 0, 0 ), Vector2( 0, 0 ), Vector2( 0, 0 ) ]
"update": 1,
"values": [ 2, 0, 4, 0 ]
}
[node name="Player" type="Node2D"]
@ -190,14 +86,12 @@ jump_frames = 16
[node name="Sprite" type="Sprite" parent="."]
position = Vector2( 4, -4 )
texture = ExtResource( 3 )
region_enabled = true
region_rect = Rect2( 0, 0, 8, 24 )
hframes = 14
region_rect = Rect2( 40, 0, 8, 24 )
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
autoplay = "idle"
anims/box_idle = SubResource( 1 )
anims/box_jump = SubResource( 2 )
anims/box_run = SubResource( 3 )
anims/RESET = SubResource( 7 )
anims/idle = SubResource( 4 )
anims/jump = SubResource( 5 )
anims/run = SubResource( 6 )

View file

@ -32,13 +32,13 @@ var current_map := 0
var maps := []
var map_save := 0
var map_name := ""
var map_clock := 0.0
var map_frame := 0
var map_times := {}
var deaths := {}
var replays := {}
var replay := {"time" : 999.0, "pos" : [], "sprite" : []}
var replay := {"frames" : 0, "x" : [], "y": [], "sprite" : []}
var replaying := {}
var is_win := false
var actors := []
@ -69,18 +69,18 @@ func _ready():
Wipe.connect("finish", self, "wipe_finish")
# silent wolf
var api_key = load("silent_wolf_api_key.gd").source_code.replace('"', "")
var api_key = load("silent_wolf_api_key.gd").source_code.strip_edges().replace('"', "")
SilentWolf.configure({
"api_key": str(api_key),
"api_key": api_key,
"game_id": "TinyCrate",
"game_version": "1.0.0",
"log_level": 2})
"log_level": 1})
SilentWolf.configure_scores({"open_scene_on_close": "res://scenes/MainPage.tscn"})
# yield(get_tree(), "idle_frame")
yield(get_tree(), "idle_frame")
# SilentWolf.Players.post_player_data("player_name", {"1-1" : 23}, false)
# SilentWolf.Scores.persist_score("player_name", 1)
SilentWolf.Scores.persist_score("player_name", 1)
func _physics_process(delta):
# reset timer
@ -92,21 +92,25 @@ func _physics_process(delta):
if is_in_game:
# map time
if !Pause.is_paused:
map_clock += delta
map_frame += 1
if replaying.has_all(["time", "pos", "sprite"]) and map_frame < replaying["pos"].size():
if replaying.has_all(["frames", "x", "y", "sprite"]) and map_frame < replaying["frames"]:
var px = node_ghost.position.x
node_ghost.position = replaying["pos"][map_frame]
node_ghost.position.x = replaying["x"][map_frame]
node_ghost.position.y = replaying["y"][map_frame]
var nx = node_ghost.position.x
node_ghost.region_rect = replaying["sprite"][map_frame]
node_ghost.frame = replaying["sprite"][map_frame]
if px != nx:
node_ghost.flip_h = nx < px
else:
node_ghost.visible = false
if is_instance_valid(player):
replay["pos"].append(player.position)
replay["sprite"].append(player.node_sprite.region_rect)
if is_instance_valid(player) and !is_win:
replay["frames"] += 1
replay["x"].append(player.position.x)
replay["y"].append(player.position.y)
replay["sprite"].append(player.node_sprite.frame)
### Changing Maps
@ -146,9 +150,9 @@ func change_map():
is_level_select = scene_path == level_select_path
is_in_game = scene_path.begins_with(map_path) or scene_path.begins_with(win_screen_path)
map_name = "" if !is_in_game else scene_path.split("/")[-1].trim_suffix(".tscn")
map_clock = 0.0
is_win = false
map_frame = 0
replay = {"time" : 999.0, "pos" : [], "sprite" : []}
replay = {"frames" : 0, "x" : [], "y" : [], "sprite" : []}
replaying = {}
node_ghost.visible = false
@ -162,9 +166,9 @@ func change_map():
TouchScreen.turn_arrows(false)
TouchScreen.show_keys(true, true, true, true, true)
if replays.has(map_name):
var r = {"time" : INF}
var r = {"frames" : INF}
for i in replays[map_name]:
if i.has("time") and i["time"] < r["time"]:
if i.has("frames") and i["frames"] < r["frames"]:
r = i.duplicate()
replaying = r
node_ghost.visible = true
@ -215,11 +219,21 @@ func load_save():
var l = load_file(save_filename)
if l:
save_data = JSON.parse(l).result
print("save_data: " + JSON.print(save_data, "\t"))
#print("save_data: " + JSON.print(save_data, "\t"))
if save_data.has("map"):
map_save = int(save_data["map"])
if save_data.has("notes"):
notes = PoolIntArray(save_data["notes"])
var n = PoolStringArray(save_data["notes"])
# convert old saves
for i in n:
if i.find("-") == -1:
var m = maps[int(i)]
if !notes.has(m):
notes.append(m)
elif !notes.has(i):
notes.append(i)
notes.sort()
if save_data.has("times"):
map_times = Dictionary(save_data["times"])
if save_data.has("deaths"):
@ -242,29 +256,32 @@ func unlock():
save()
func win():
is_win = true
var ms = map_save
if map_save < current_map + 1:
map_save = current_map + 1
if is_note and !notes.has(current_map):
notes.append(current_map)
if is_note and !notes.has(map_name):
notes.append(map_name)
notes.sort()
if !map_times.has(map_name) or (map_times.has(map_name) and (map_times[map_name] > map_clock)):
map_times[map_name] = map_clock
if !map_times.has(map_name) or (map_times.has(map_name) and (map_frame < map_times[map_name])):
map_times[map_name] = map_frame
save_data["map"] = map_save
save_data["notes"] = notes
save_data["times"] = map_times
replay["time"] = map_clock
if !replays.has(map_name):
replays[map_name] = []
replays[map_name].append(replay)
replays[map_name].sort_custom(self, "sort_replays")
if replays[map_name].size() > 3:
replays[map_name].resize(3)
save_data["replays"] = replays
save()
print("map complete, save_data: ", save_data)
print("map complete")#, save_data: ", save_data)
if map_save > ms:
set_map(current_map + 1)
@ -272,12 +289,16 @@ func win():
scene_path = level_select_path
start_reset()
func sort_replays(a, b):
if a["frames"] < b["frames"]:
return true
return false
func die():
deaths[map_name] = 1 if !deaths.has(map_name) else (deaths[map_name] + 1)
save_data["deaths"] = deaths
save()
print("you died, save_data: ", save_data)
print("you died")#, save_data: ", save_data)
# look into a folder and return a list of filenames without file extension
func dir_list(path : String):

View file

@ -1,14 +1,19 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=5 format=2]
[ext_resource path="res://src/autoload/Shared.gd" type="Script" id=1]
[ext_resource path="res://media/image/player.png" type="Texture" id=2]
[ext_resource path="res://src/shader/grayscale.gdshader" type="Shader" id=3]
[sub_resource type="ShaderMaterial" id=2]
shader = ExtResource( 3 )
[node name="Shared" type="Node"]
script = ExtResource( 1 )
[node name="Ghost" type="Sprite" parent="."]
modulate = Color( 1, 1, 1, 0.5 )
modulate = Color( 1, 1, 1, 0.65098 )
material = SubResource( 2 )
texture = ExtResource( 2 )
offset = Vector2( 4, -4 )
region_enabled = true
hframes = 14
region_rect = Rect2( 0, 0, 8, 24 )

View file

@ -27,15 +27,16 @@ func _ready():
var new = screen.duplicate()
var sy = i / columns
var sx = i % columns
new.rect_position += Vector2(sx + (sy % 2) * 0.5, sy) * screen_dist
new.get_node("Overlay/Label").text = Shared.maps[i]
new.get_node("Overlay/Note").visible = Shared.notes.has(i)
var map_name = Shared.maps[i]
new.rect_position += Vector2(sx + (sy % 2) * 0.5, sy) * screen_dist
new.get_node("Overlay/Label").text = map_name
new.get_node("Overlay/Note").visible = Shared.notes.has(map_name)
var map_name = Shared.maps[i].trim_suffix(".tscn")
var is_time := Shared.map_times.has(map_name)
new.get_node("Overlay/Time").visible = is_time
if is_time:
new.get_node("Overlay/Time/Label").text = str(Shared.map_times[map_name]).pad_decimals(2)
new.get_node("Overlay/Time/Label").text = str(float(Shared.map_times[map_name]) * (1.0/60.0)).pad_decimals(2)
var is_death : bool = Shared.deaths.has(map_name) and Shared.deaths[map_name] > 0
new.get_node("Overlay/Death").visible = is_death

View file

@ -0,0 +1,7 @@
shader_type canvas_item;
void fragment(){
vec4 c = texture(TEXTURE, UV);
float average = (c.r + c.g + c.b) / 3.0;
COLOR = vec4(vec3(average), c.a);
}