-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathjumper.py
More file actions
145 lines (126 loc) · 4.65 KB
/
jumper.py
File metadata and controls
145 lines (126 loc) · 4.65 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
135
136
137
138
139
140
141
142
143
144
145
import ugame
import stage
class Hero(stage.Sprite):
def __init__(self, x, y):
super().__init__(tiles, 4, x, y)
self.dy = 0
self.dx = 1
self.dead = False
def update(self, frame):
super().update()
if self.dead:
sprite.set_frame(8, (frame // 4) * 4)
return
bottom_tile = layer1.tile((self.x + 8) // 16, (self.y + 16) // 16)
if layer1.tile((self.x + 8) // 16, (self.y) // 16) == 0:
self.dy = 0
if bottom_tile not in (0, 2):
self.dy = min(self.dy + 1, 6)
elif bottom_tile == 2:
self.dy = min(self.dy + 1, 0)
else:
self.dy = min(self.dy, 0)
self.move(self.x, self.y + self.dy)
while layer1.tile((self.x + 8) // 16, (self.y + 15) // 16) == 0:
if self.y % 16 == 0:
break
self.move(self.x, self.y - 1)
keys = ugame.buttons.get_pressed()
if keys & ugame.K_RIGHT:
self.dx = 1
if layer1.tile((self.x + 13) // 16, (self.y + 10) // 16) != 0:
self.move(self.x + 2, self.y)
self.set_frame(4 + 1 + frame // 4, 0)
elif keys & ugame.K_LEFT:
self.dx = -1
if layer1.tile((self.x + 2) // 16, (self.y + 10) // 16) != 0:
self.move(self.x - 2, self.y)
self.set_frame(4 + 1 + frame // 4, 4)
elif keys & ugame.K_UP and layer1.tile((self.x + 8) // 16,
(self.y + 15) // 16) == 2:
self.move(self.x, self.y - 2)
self.set_frame(4 + 3, (frame // 4) * 4)
elif keys & ugame.K_DOWN and bottom_tile == 2:
self.move(self.x, self.y + 2)
self.set_frame(4 + 3, (frame // 4) * 4)
else:
self.set_frame(4 + 0, (frame // 4) * 4)
if keys & ugame.K_O and self.dy == 0 and bottom_tile in (0, 2):
self.dy = -6
if keys & ugame.K_X:
if bolt.dx == 0:
bolt.move(self.x + self.dx * 8, self.y)
bolt.dx = self.dx * 6
self.set_frame(10, 0 if self.dx > 0 else 4)
def kill(self):
self.dead = True
class Sparky(stage.Sprite):
def __init__(self, x, y):
super().__init__(tiles, 15, x, y)
self.dead = False
self.dx = 1
def update(self, frame):
super().update()
if self.dead:
if stage.collide(self.x + 3, self.y + 1, self.x + 13, self.y + 15,
hero.x + 3, hero.y + 1, hero.x + 13, hero.y + 15):
self.move(-16, -16)
return
sprite.set_frame(15, (frame // 4) * 4)
bottom_tile = layer1.tile((self.x + 8) // 16, (self.y + 16) // 16)
forward_tile = layer1.tile((self.x + 8 + 8 * self.dx) // 16,
(self.y + 8) // 16)
if bottom_tile != 0 or forward_tile == 0:
self.dx = -self.dx
self.move(self.x + self.dx, self.y)
if stage.collide(self.x + 3, self.y + 1, self.x + 13, self.y + 15,
bolt.x + 8, bolt.y + 8):
self.kill()
bolt.kill()
if stage.collide(self.x + 3, self.y + 1, self.x + 13, self.y + 15,
hero.x + 3, hero.y + 1, hero.x + 13, hero.y + 15):
hero.kill()
def kill(self):
self.dead = True
sprite.set_frame(12 + self.dx)
class Blinka(stage.Sprite):
def __init__(self, x, y):
super().__init__(tiles, 14, x, y)
def update(self, frame):
super().update()
sprite.set_frame(14, (frame // 4) * 4)
class Bolt(stage.Sprite):
def __init__(self, x, y, dx):
super().__init__(tiles, 9, x, y)
self.dx = dx
def update(self, frame):
super().update()
if layer1.tile((self.x + 8) // 16, (self.y + 8) // 16) == 0:
self.kill()
else:
sprite.set_frame(9, (frame // 4) * 4)
self.move(self.x + self.dx, self.y)
def kill(self):
self.dx = 0
self.move(-16, -16)
walls = stage.Bank.from_bmp16("walls.bmp")
tiles = stage.Bank.from_bmp16("jumper.bmp")
bmp = stage.BMP16("level.bmp")
bmp.read_header()
layer1 = stage.Grid(tiles, buffer=bmp.read_data())
del bmp
layer0 = stage.WallGrid(layer1, (0,), walls)
game = stage.Stage(ugame.display, 12)
bolt = Bolt(-16, -16, 0)
hero = Hero(16, 16)
sprites = [bolt, Sparky(104, 96), Sparky(64, 32), Sparky(16, 96),
Sparky(96, 16), hero]
game.layers = [layer0] + sprites + [layer1]
game.render_block()
frame = 0
while True:
frame = (frame + 1) % 8
for sprite in sprites:
sprite.update(frame)
game.render_sprites(sprites)
game.tick()