-
Notifications
You must be signed in to change notification settings - Fork 0
/
ch12_astrocrash04.py
164 lines (126 loc) · 5.61 KB
/
ch12_astrocrash04.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
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Прерванный полёт-1
# Только астероиды движутся по экрану
import math, random
from superwires import games
games.init(screen_width=640, screen_height=480, fps=50)
class Asteroid(games.Sprite):
"""Астероид, прямолинейно движущийся по экрану"""
SMALL = 1
MEDIUM = 2
LARGE = 3
images = {SMALL : games.load_image("asteroid_small.bmp"),
MEDIUM : games.load_image("asteroid_med.bmp"),
LARGE : games.load_image("asteroid_big.bmp")}
SPEED = 2
def __init__(self, x, y, size):
"""Инициализирует спрайт с изображением астероида"""
super(Asteroid, self).__init__(
image=Asteroid.images[size],
x=x, y=y,
dx=random.choice([1, -1]) * Asteroid.SPEED * random.random()/size,
dy=random.choice([1, -1]) * Asteroid.SPEED * random.random()/size)
self.size = size
def update(self):
"""Заставляет астероид обогнуть экран"""
if self.top > games.screen.height:
self.bottom = 0
if self.bottom < 0:
self.top = games.screen.height
if self.left > games.screen.width:
self.right = 0
if self.right < 0:
self.left = games.screen.width
class Ship(games.Sprite):
"""Корабль игрока"""
image = games.load_image("ship.bmp")
sound = games.load_sound("thrust.wav")
ROTATION_STEP = 3
VELOCITY_STEP = .03
def update(self):
"""Вращает корабль при нажатии клавиш со стрелками"""
if games.keyboard.is_pressed(games.K_LEFT):
self.angle -= Ship.ROTATION_STEP
if games.keyboard.is_pressed(games.K_RIGHT):
self.angle += Ship.ROTATION_STEP
# корабль совершает рывок
if games.keyboard.is_pressed(games.K_UP):
Ship.sound.play()
# изменение горизонтальной и вертикальной скорости корабля с учётом угла поворота
angle = self.angle * math.pi / 180 # преобразование в радианы
self.dx += Ship.VELOCITY_STEP * math.sin(angle)
self.dy += Ship.VELOCITY_STEP * -math.cos(angle)
# корабль будет "огибать" экран
if self.top > games.screen.height:
self.bottom = 0
if self.bottom < 0:
self.top = games.screen.height
if self.left > games.screen.width:
self.right = 0
if self.right < 0:
self.left = games.screen.width
# если нажат пробел, выпустить ракету
if games.keyboard.is_pressed(games.K_SPACE):
new_missile = Missile(self.x, self.y, self.angle)
games.screen.add(new_missile)
class Missile(games.Sprite):
"""Ракета, которую может выпустить космический корабль игрока"""
image = games.load_image("missile.bmp")
sound = games.load_sound("missile.wav")
BUFFER = 40
VELOCITY_FACTOR = 7
LIFETIME = 40
def __init__(self, ship_x, ship_y, ship_angle):
"""Инициализирует спрайт с изображением ракеты"""
Missile.sound.play()
# преобразование в радианы
angle = ship_angle * math.pi / 180
# вычисление начальной позиции ракеты
buffer_x = Missile.BUFFER * math.sin(angle)
buffer_y = Missile.BUFFER * -math.cos(angle)
x = ship_x + buffer_x
y = ship_y + buffer_y
# вычисление горизонтальной и вертикальной скорости ракеты
dx = Missile.VELOCITY_FACTOR * math.sin(angle)
dy = Missile.VELOCITY_FACTOR * -math.cos(angle)
# создание ракеты
super(Missile, self).__init__(image=Missile.image,
x=x, y=y,
dx=dx, dy=dy)
self.lifetime = Missile.LIFETIME
def update(self):
"""Перемещает ракету"""
# если "срок годности" ракеты истёк, она уничтожается
self.lifetime -= 1
if self.lifetime == 0:
self.destroy()
# ракета будет огибать экран
if self.top > games.screen.height:
self.bottom = 0
if self.bottom < 0:
self.top = games.screen.height
if self.left > games.screen.width:
self.right = 0
if self.right < 0:
self.left = games.screen.width
def main():
# назначаем фоновую картинку
nebula_image = games.load_image("nebula.jpg")
games.screen.background = nebula_image
# создаём 8 астероидов
for i in range(8):
x = random.randrange(games.screen.width)
y = random.randrange(games.screen.height)
size = random.choice([Asteroid.SMALL, Asteroid.MEDIUM, Asteroid.LARGE])
new_asteroid = Asteroid(x=x, y=y, size=size)
games.screen.add(new_asteroid)
# создаём корабль
the_ship = Ship(image=Ship.image,
x=games.screen.width/2,
y=games.screen.height/2)
games.screen.add(the_ship)
games.screen.mainloop()
# поехали!
if __name__ == "__main__":
main()