godot_tiny_crate/Script/Player.gd
Harmony Monroe ae64e5d236 spikes work
2020-08-26 16:09:19 -04:00

156 lines
3.4 KiB
GDScript

extends Actor
var move_speed = 1
var move_slow = 0.75
var move_accel = 0.15
var move_last = 0
var push_speed = 0.3
var jump_speed = 2
var jump_frames = 10
var jump_count = 0
var is_jump = false
var coyote_time = 3
var anim_frame = 0
var anim_step_run = 0.2
var anim_step_idle = 0.04
var is_pickup = false
var speed_drop_x = 1
var speed_drop_y = -1
var speed_throw_x = 1.0
var speed_throw_y = -2.3
var pickup_frames = 8
var pickup_count = 0
var dir = 1
var node_sprites : Node2D
var node_sprite_guy : Sprite
var node_sprite_box : Sprite
var scene_box = load("res://Scene/Box.tscn")
# Called when the node enters the scene tree for the first time.
func _ready():
# ref nodes
node_sprites = get_node("Sprites")
node_sprite_guy = node_sprites.get_node("SpriteGuy")
node_sprite_box = node_sprites.get_node("SpriteBox")
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if btn.p("reset"):
get_tree().reload_current_scene()
var btnx = btn.d("right") - btn.d("left")
var btny = btn.d("down") - btn.d("up")
# open door
if btn.p("up"):
for a in check_area_actors(position.x, position.y, hitbox_x, hitbox_y, "door"):
a.open()
return
# hit spike
if speed_y > -1:
for a in check_area_actors(position.x, position.y, hitbox_x, hitbox_y, "spike"):
print("hit spike")
death()
return
# walking
if btnx == 0:
speed_x *= move_slow
else:
speed_x += move_accel * btnx
speed_x = clamp(speed_x, -move_speed, move_speed)
dir = btnx
node_sprite_guy.flip_h = btnx == -1
# start jump
if btn.p("jump") and time_since_floor <= coyote_time:
is_jump = true
jump_count = 0
# jump height
if is_jump:
if btn.d("jump"):
speed_y = -jump_speed
jump_count += 1
if jump_count > jump_frames:
is_jump = false
else:
is_jump = false
# pickup box
if btn.p("action"):
if is_pickup:
if btn.d("down"):
box_release(speed_drop_x * dir, speed_drop_y)
else:
box_release(speed_throw_x * dir, speed_throw_y)
else:
if btn.d("down"):
box_pickup(0, 1)
else:
box_pickup(dir * 4, 0)
# push box
if is_on_floor and move_get_dist().x != 0 and not is_pickup:
for a in check_area_actors(position.x + dir, position.y, hitbox_x, hitbox_y, "box"):
a.push(dir)
# slow movement when pushing
if abs(speed_x) > push_speed:
speed_x = push_speed * sign(speed_x)
move_x(dir)
break
func box_release(sx : int, sy : int):
is_pickup = false
node_sprite_box.visible = false
hitbox_y = 8
position.y += 8
var box = scene_box.instance()
box.position = Vector2(position.x, position.y - 8)
box.speed_x = sx
box.speed_y = sy
get_parent().add_child(box)
node_sprites.position.y = 0
func box_pickup(dx : int, dy : int):
var offset_y = 0 if btn.d("down") else -8
# pick crate on x axis
for a in check_area_actors(position.x + dx, position.y + dy, hitbox_x, hitbox_y, "box"):
var offset_x = box_find_space(0, offset_y, a)
if offset_x != null:
is_pickup = true
node_sprite_box.visible = true
a.queue_free()
position.y += offset_y
position.x += offset_x
hitbox_y = 16
node_sprites.position.y = 8
break
# ox, oy = offset x and y
func box_find_space(ox, oy, ignore : Actor):
# wiggle around and look for an open space
for i in [0, 1, -1, 2, -2, 3, -3, 4, -4]:
if not is_area_solid(position.x + ox + i, position.y + oy, 8, 16, ignore):
return i
return null
func death():
get_tree().reload_current_scene()