-
Notifications
You must be signed in to change notification settings - Fork 1
/
zombie.py
101 lines (75 loc) · 2.63 KB
/
zombie.py
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
import math
import pyglet
import xsect
import timevars as tv
from gameassets import GameAssets
class Zombie(object):
"""docstring for Zombie"""
ST_CHASING, ST_FALLING, ST_DONE = 1, 2, 3
def __init__(self, posX, posY):
super(Zombie, self).__init__()
ga = GameAssets.Instance()
self.sprite = pyglet.sprite.Sprite(ga.getImage('zom'))
self.posX = posX
self.posY = posY
self.radius = ga.getImage('zom').width / 2
self.maxDamage = 20 #points per second
self.zombieSpeedCurve = tv.PLInterpolator([(0, 230), (250, 95),
(500,95), (750, 80), (800, 15), (3000, 10)])
self.status = Zombie.ST_CHASING
def update(self, dt, famPosition, walls):
mv = self.getDesiredMove(dt, famPosition)
move = xsect.Move((self.posX, self.posY), (self.posX + mv[0], self.posY + mv[1]))
hits = xsect.disc_move_x_polygon_list(self.radius, move, walls)
if not hits:
self.posX = move.endPoint[0]
self.posY = move.endPoint[1]
return
#there was a hit
hit = hits[0]
tailMove = move.submove(hit.moveParameter - 0.00001, 1.0)
moveMod, _ = xsect.bounceMoveOffHit(tailMove, hit, rebound = 0.0)
#print(type(moveMod))
self.posX = moveMod.endPoint[0]
self.posY = moveMod.endPoint[1]
def getDesiredMove(self, dt, famPosition):
dx = famPosition[0] - self.posX
dy = famPosition[1] - self.posY
r = math.sqrt(dx * dx + dy *dy)
if r < 1.0:
return (0.0, 0.0)
if r > 0:
dx /= r
dy /= r
'''if r < 300.0:
speed = 120.0
elif r < 700.0:
speed = 85.0
else:
speed = 5.0'''
speed = self.zombieSpeedCurve(r)
dtravel = speed * dt
if dtravel > r:
dtravel = r
return (dtravel * dx, dtravel * dy)
def draw(self):
self.sprite.x = self.posX
self.sprite.y = self.posY
if self.status == Zombie.ST_CHASING:
self.sprite.draw()
elif self.status == Zombie.ST_FALLING:
pass
elif self.status == Zombie.ST_DONE:
pass
else:
print("unrecognized zombie status")
def getPosition(self):
return (self.posX, self.posY)
def computeDamage(self, famPosition, famRadius):
dx = self.posX - famPosition[0]
dy = self.posY - famPosition[1]
dist = math.sqrt(dx * dx + dy * dy)
hit = dist / (famRadius + self.radius)
if hit > 1:
return 0.0
return (1 - hit) * self.maxDamage