-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGameControl.gd
189 lines (135 loc) · 4.29 KB
/
GameControl.gd
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
extends Node2D
# class member variables go here, for example:
# var a = 2
# var b = "textvar"
export (String) var sceneFolder = "res://"
export (int) var numberOfPups = 5
export (float) var shrinkPerSecond = 30
var land
var landRadius = 500
var landCenter
export (float) var preySpawnRatePerSec = 0.1
var preySpawnTimer = 0
var score = 0
var player
var pups = []
var food = []
func _ready():
# Called when the node is added to the scene for the first time.
# Initialization here
land = $Land
land.connect("body_exited", self, "_on_body_exited_land")
land.connect("body_entered", self, "_on_body_entered_land")
landCenter = land.position
player = $Player
player.position = landCenter
player.target = player.position
for i in range(0,numberOfPups):
createPup(landCenter+Vector2(numberOfPups/2 -i,0))
#createPrey(Vector2(400,200))
func _process(delta):
handlePreySpawning(delta)
shrinkLand(delta)
updateInputHint()
testForGameOver()
func testForGameOver():
if(!player.isCarryingPup and pups.size() <= 0):
onGameOver()
func shrinkLand(delta):
if(landRadius >= 0.1):
landRadius -= delta * shrinkPerSecond * (landRadius)/5000
else:
landRadius = 0
setLandScale(landRadius)
func handlePreySpawning(delta):
preySpawnTimer += delta * preySpawnRatePerSec
if(preySpawnTimer >= 1):
preySpawnTimer=0
var vec = getVectorOutsideLand()
if vec.x>=0:
createPrey(vec)
func getVectorOutsideLand():
var vec = Vector2(rand_range(0,get_viewport().size.x), rand_range(0,get_viewport().size.y))
var breakI = 0
while (isPointInsideLand(vec) and breakI < 100):
vec.x = rand_range(0,get_viewport().size.x)
vec.y = rand_range(0,get_viewport().size.y)
breakI += 1
if(breakI == 100):
print("did not find suitable spot for prey")
vec = Vector2(-1,-1)
return vec
func isPointInsideLand(point):
return (landCenter - point).length() < landRadius
#var space_state = get_world_2d().direct_space_state
#var result = space_state.intersect_ray(point, point+Vector2(0.1,0.1))
#if result.size == 0:
# return false
#elif result[collider] != null:
# print( result[collider].name)
func createPup(location):
var p = instantiate("AI", location)
pups.append(p)
func createPrey(location):
var p = instantiate("Prey",location)
p.connect("body_entered", self, "_on_body_entered_prey")
p.connect("body_entered", p, "_on_body_entered_prey")
func dropFood(location):
var newFood = instantiate("DroppedFood",location)
food.append(newFood)
newFood.connect("body_entered", newFood, "_on_body_entered_food")
land.connect("area_exited", newFood, "_on_food_exited_land")
newFood.connect("body_entered", self, "_on_body_entered_food")
func onFoodDestroyed(foodObject):
var i = food.find(foodObject)
if i>=0:
food.remove(i)
func instantiate(sceneName, location):
var scene = load(sceneFolder+sceneName+".tscn")
var scene_instance = scene.instance()
scene_instance.set_name(sceneName)
add_child(scene_instance)
scene_instance.position = location
print("instantiated "+sceneName)
return scene_instance
func _on_body_entered_food(body):
if body.name != "Player":
score+=pups.size()
displayScore()
func _on_body_exited_land(body):
print("_on_body_exited_land ",body.name)
var i = pups.find(body)
body._on_exited_land()
func _on_body_entered_land(body):
if(body.name == "Player"):
body._on_entered_land()
func _on_body_entered_prey(body):
if(body.name == "Player"):
body.onCaughtPrey()
func playerPickedUpPut(pup):
print("playerPickedUpPut ",pup.name)
var i = pups.find(pup)
if (i>=0): #body is a pup
player.pickUpPup(pup)
pups.remove(i)
func onPupDied(pup):
print("onPupDied ",pup.name)
var i = pups.find(pup)
if (i>=0): #body is a pup
pups.remove(i)
func setLandScale(radius):
land.get_child(1).shape.set_radius( radius)
land.get_child(0).scale = Vector2(radius/500.0,radius/500.0)
landRadius = radius
func onGameOver():
get_parent().startGameOverScreen()
func displayScore():
var lab = $CanvasLayer.get_node("Score")
lab.set_text(str(score))
func updateInputHint():
if player.isCarryingPup:
$CanvasLayer.get_node("InputHint").text = "press Enter to put the cub down"
elif player.isCarryingFood:
$CanvasLayer.get_node("InputHint").text = "press Enter to drop food"
else:
$CanvasLayer.get_node("InputHint").text = "click with the mouse at fishes to collect food"