summaryrefslogtreecommitdiff
path: root/demos/3d/platformer/enemy.gd
blob: 9b2e95a96dea9968bbd30ff7bf04ee722bd76984 (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
86
87
88
89
90
91
92
93
94
95

extends RigidBody

# member variables here, example:
# var a=2
# var b="textvar"

const STATE_WALKING = 0
const STATE_DYING = 1

                                     
var prev_advance = false
var deaccel = 20.0
var accel = 5
var max_speed = 2
var rot_dir = 4
var rot_speed = 1

var dying=false

func _integrate_forces(state):


	
	var delta = state.get_step()
	var lv = state.get_linear_velocity()
	var g = state.get_total_gravity()

	lv += g * delta #apply gravity
	var up = -g.normalized()

	if (dying):
		state.set_linear_velocity(lv)
		return
		
	for i in range(state.get_contact_count()):
		var cc = state.get_contact_collider_object(i)
		var dp = state.get_contact_local_normal(i)
	
		if (cc):
			if (cc extends preload("res://bullet.gd") and not cc.disabled):
				set_mode(MODE_RIGID)
				dying=true
				#lv=s.get_contact_local_normal(i)*400  
				state.set_angular_velocity( -dp.cross(up).normalized() *33.0)
				get_node("AnimationPlayer").play("impact")
				get_node("AnimationPlayer").queue("explode")
				set_friction(1)
				cc.disabled=true
				get_node("sound").play("hit")
				return

	
 		
	

	var col_floor = get_node("Armature/ray_floor").is_colliding()
	var col_wall = get_node("Armature/ray_wall").is_colliding()
	
	var advance = not col_wall and col_floor
	
	var dir = get_node("Armature").get_transform().basis[2].normalized()
	
	
	var deaccel_dir = dir
	
	if (advance):
		if (dir.dot(lv) < max_speed):
			lv+=dir * accel * delta
		deaccel_dir = dir.cross(g).normalized()
	else:
		if (prev_advance):
			rot_dir = 1 #randf() * 2.0 -1.0
		
		dir = Matrix3(up,rot_dir * rot_speed * delta).xform(dir)
		get_node("Armature").set_transform( Transform().looking_at(-dir,up) )
		
		
	var dspeed = deaccel_dir.dot(lv)
	dspeed -= deaccel * delta
	if (dspeed<0):
		dspeed=0
	
	lv = lv - deaccel_dir*deaccel_dir.dot(lv) + deaccel_dir*dspeed
			
	
	state.set_linear_velocity(lv)
	prev_advance=advance

func _ready():
	# Initalization here
	pass

func _die():
	queue_free()