mirror of
https://github.com/HarmonyHoney/tiny_crate.git
synced 2026-01-23 02:34:53 +00:00
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:
parent
f928b55c15
commit
c7de6059db
5 changed files with 91 additions and 163 deletions
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
7
src/shader/grayscale.gdshader
Normal file
7
src/shader/grayscale.gdshader
Normal 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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue