blob: 508cd3728cd94ffeb6bc4c68b85622555e5301ed (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
extends KinematicBody2D
# Member variables
const MAX_SPEED = 300.0
const IDLE_SPEED = 10.0
const ACCEL = 5.0
const VSCALE = 0.5
const SHOOT_INTERVAL = 0.3
var speed = Vector2()
var current_anim = ""
var current_mirror = false
var shoot_countdown = 0
func _input(event):
if (event.type == InputEvent.MOUSE_BUTTON and event.button_index == 1 and event.pressed and shoot_countdown <= 0):
var pos = get_canvas_transform().affine_inverse()*event.pos
var dir = (pos - get_global_pos()).normalized()
var bullet = preload("res://shoot.scn").instance()
bullet.advance_dir = dir
bullet.set_pos(get_global_pos() + dir*60)
get_parent().add_child(bullet)
shoot_countdown = SHOOT_INTERVAL
func _fixed_process(delta):
shoot_countdown -= delta
var dir = Vector2()
if (Input.is_action_pressed("up")):
dir += Vector2(0, -1)
if (Input.is_action_pressed("down")):
dir += Vector2(0, 1)
if (Input.is_action_pressed("left")):
dir += Vector2(-1, 0)
if (Input.is_action_pressed("right")):
dir += Vector2(1, 0)
if (dir != Vector2()):
dir = dir.normalized()
speed = speed.linear_interpolate(dir*MAX_SPEED, delta*ACCEL)
var motion = speed*delta
motion.y *= VSCALE
motion = move(motion)
if (is_colliding()):
var n = get_collision_normal()
motion = n.slide(motion)
move(motion)
var next_anim = ""
var next_mirror = false
if (dir == Vector2() and speed.length() < IDLE_SPEED):
next_anim = "idle"
next_mirror = false
elif (speed.length() > IDLE_SPEED*0.1):
var angle = atan2(abs(speed.x), speed.y)
next_mirror = speed.x > 0
if (angle < PI/8):
next_anim = "bottom"
next_mirror = false
elif (angle < PI/4 + PI/8):
next_anim = "bottom_left"
elif (angle < PI*2/4 + PI/8):
next_anim = "left"
elif (angle < PI*3/4 + PI/8):
next_anim = "top_left"
else:
next_anim = "top"
next_mirror = false
if (next_anim != current_anim or next_mirror != current_mirror):
get_node("frames").set_flip_h(next_mirror)
get_node("anim").play(next_anim)
current_anim = next_anim
current_mirror = next_mirror
func _ready():
set_fixed_process(true)
set_process_input(true)
|