-
Notifications
You must be signed in to change notification settings - Fork 1k
Expand file tree
/
Copy pathgrave.py
More file actions
134 lines (110 loc) · 4.36 KB
/
grave.py
File metadata and controls
134 lines (110 loc) · 4.36 KB
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
__author__ = 'marble_xu'
import pygame as pg
from .. import tool
from .. import constants as c
class Grave(pg.sprite.Sprite):
def __init__(self, x, y):
pg.sprite.Sprite.__init__(self)
self.name = c.GRAVE
self.frames = []
self.frame_index = 0
self.loadImages()
self.frame_num = len(self.frames)
self.image = self.frames[self.frame_index]
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.health = 10 # Grave health
self.dead = False
self.animate_timer = 0
self.animate_interval = 150
def loadImages(self):
# Load grave images
grave_name = self.name
self.loadFrames(self.frames, grave_name, 1)
def loadFrames(self, frame_list, name, scale):
# Load frames from sprite sheet
frame_rect = tool.GRAVE_RECT[name]
for i in range(frame_rect['frame_num']):
x = frame_rect['x'] + i * frame_rect['width']
y = frame_rect['y']
width = frame_rect['width']
height = frame_rect['height']
image = tool.get_image(tool.GFX[name], x, y, width, height, c.BLACK, scale)
frame_list.append(image)
def update(self, game_info):
self.current_time = game_info[c.CURRENT_TIME]
self.animation()
def animation(self):
if (self.current_time - self.animate_timer) > self.animate_interval:
self.frame_index += 1
if self.frame_index >= self.frame_num:
self.frame_index = 0
self.animate_timer = self.current_time
self.image = self.frames[self.frame_index]
def setDamage(self, damage):
self.health -= damage
if self.health <= 0:
self.dead = True
self.kill()
class GraveBuster(pg.sprite.Sprite):
def __init__(self, x, y, grave):
pg.sprite.Sprite.__init__(self)
self.name = c.GRAVE_BUSTER
self.frames = []
self.frame_index = 0
self.loadImages()
self.frame_num = len(self.frames)
self.image = self.frames[self.frame_index]
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.grave = grave
self.eat_timer = 0
self.eat_duration = c.GRAVE_BUSTER_EAT_TIME
self.state = c.IDLE
self.animate_timer = 0
self.animate_interval = 150
def loadImages(self):
# Load grave buster images
buster_name = self.name
self.loadFrames(self.frames, buster_name, 1)
def loadFrames(self, frame_list, name, scale):
# Load frames from sprite sheet
frame_rect = tool.PLANT_RECT[name]
for i in range(frame_rect['frame_num']):
x = frame_rect['x'] + i * frame_rect['width']
y = frame_rect['y']
width = frame_rect['width']
height = frame_rect['height']
image = tool.get_image(tool.GFX[name], x, y, width, height, c.BLACK, scale)
frame_list.append(image)
def update(self, game_info):
self.current_time = game_info[c.CURRENT_TIME]
self.handleState()
self.animation()
def handleState(self):
if self.state == c.IDLE:
self.idling()
elif self.state == c.ATTACK:
self.attacking()
def idling(self):
# Start eating grave
self.state = c.ATTACK
self.eat_timer = self.current_time
def attacking(self):
# Check if done eating
if (self.current_time - self.eat_timer) > self.eat_duration:
# Destroy both grave and grave buster
self.grave.setDamage(10) # Enough damage to destroy grave
self.kill()
def animation(self):
if (self.current_time - self.animate_timer) > self.animate_interval:
self.frame_index += 1
if self.frame_index >= self.frame_num:
self.frame_index = self.frame_num - 1 # Stay on last frame
self.animate_timer = self.current_time
self.image = self.frames[self.frame_index]
def canAttack(self, zombie):
# Grave buster doesn't attack zombies
return False