forked from tobiasbp/python-arcade
-
Notifications
You must be signed in to change notification settings - Fork 0
/
my_game.py
273 lines (202 loc) · 6.82 KB
/
my_game.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
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
"""
Simple program to show moving a sprite with the keyboard.
This program uses the Arcade library found at http://arcade.academy
Artwork from https://kenney.nl/assets/space-shooter-redux
"""
import arcade
SPRITE_SCALING = 0.5
# Set the size of the screen
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
# Variables controlling the player
PLAYER_LIVES = 3
PLAYER_SPEED_X = 5
PLAYER_START_X = SCREEN_WIDTH / 2
PLAYER_START_Y = 50
PLAYER_SHOT_SPEED = 4
FIRE_KEY = arcade.key.SPACE
class Player(arcade.Sprite):
"""
The player
"""
def __init__(self, **kwargs):
"""
Setup new Player object
"""
# Graphics to use for Player
kwargs['filename'] = "images/playerShip1_red.png"
# How much to scale the graphics
kwargs['scale'] = SPRITE_SCALING
# Pass arguments to class arcade.Sprite
super().__init__(**kwargs)
def update(self):
"""
Move the sprite
"""
# Update center_x
self.center_x += self.change_x
# Don't let the player move off screen
if self.left < 0:
self.left = 0
elif self.right > SCREEN_WIDTH - 1:
self.right = SCREEN_WIDTH - 1
class PlayerShot(arcade.Sprite):
"""
A shot fired by the Player
"""
def __init__(self, center_x=0, center_y=0):
"""
Setup new PlayerShot object
"""
# Set the graphics to use for the sprite
super().__init__("images/Lasers/laserBlue01.png", SPRITE_SCALING)
self.center_x = center_x
self.center_y = center_y
self.change_y = PLAYER_SHOT_SPEED
def update(self):
"""
Move the sprite
"""
# Update y position
self.center_y += self.change_y
# Remove shot when over top of screen
if self.bottom > SCREEN_HEIGHT:
self.kill()
class MyGame(arcade.Window):
"""
Main application class.
"""
def __init__(self, width, height):
"""
Initializer
"""
# Call the parent class initializer
super().__init__(width, height)
# Variable that will hold a list of shots fired by the player
self.player_shot_list = None
# Set up the player info
self.player_sprite = None
self.player_score = None
self.player_lives = None
# Track the current state of what key is pressed
self.left_pressed = False
self.right_pressed = False
self.up_pressed = False
self.down_pressed = False
# Get list of joysticks
joysticks = arcade.get_joysticks()
if joysticks:
print("Found {} joystick(s)".format(len(joysticks)))
# Use 1st joystick found
self.joystick = joysticks[0]
# Communicate with joystick
self.joystick.open()
# Map joysticks functions to local functions
self.joystick.on_joybutton_press = self.on_joybutton_press
self.joystick.on_joybutton_release = self.on_joybutton_release
self.joystick.on_joyaxis_motion = self.on_joyaxis_motion
self.joystick.on_joyhat_motion = self.on_joyhat_motion
else:
print("No joysticks found")
self.joystick = None
#self.joystick.
# Set the background color
arcade.set_background_color(arcade.color.AMAZON)
def setup(self):
""" Set up the game and initialize the variables. """
# No points when the game starts
self.player_score = 0
# No of lives
self.player_lives = PLAYER_LIVES
# Sprite lists
self.player_shot_list = arcade.SpriteList()
# Create a Player object
self.player_sprite = Player(
center_x=PLAYER_START_X,
center_y=PLAYER_START_Y
)
def on_draw(self):
"""
Render the screen.
"""
# This command has to happen before we start drawing
arcade.start_render()
# Draw the player shot
self.player_shot_list.draw()
# Draw the player sprite
self.player_sprite.draw()
# Draw players score on screen
arcade.draw_text(
"SCORE: {}".format(self.player_score), # Text to show
10, # X position
SCREEN_HEIGHT - 20, # Y positon
arcade.color.WHITE # Color of text
)
def on_update(self, delta_time):
"""
Movement and game logic
"""
# Calculate player speed based on the keys pressed
self.player_sprite.change_x = 0
# Move player with keyboard
if self.left_pressed and not self.right_pressed:
self.player_sprite.change_x = -PLAYER_SPEED_X
elif self.right_pressed and not self.left_pressed:
self.player_sprite.change_x = PLAYER_SPEED_X
# Move player with joystick if present
if self.joystick:
self.player_sprite.change_x = round(self.joystick.x) * PLAYER_SPEED_X
# Update player sprite
self.player_sprite.update()
# Update the player shots
self.player_shot_list.update()
def on_key_press(self, key, modifiers):
"""
Called whenever a key is pressed.
"""
# Track state of arrow keys
if key == arcade.key.UP:
self.up_pressed = True
elif key == arcade.key.DOWN:
self.down_pressed = True
elif key == arcade.key.LEFT:
self.left_pressed = True
elif key == arcade.key.RIGHT:
self.right_pressed = True
if key == FIRE_KEY:
new_shot = PlayerShot(
self.player_sprite.center_x,
self.player_sprite.center_y
)
self.player_shot_list.append(new_shot)
def on_key_release(self, key, modifiers):
"""
Called whenever a key is released.
"""
if key == arcade.key.UP:
self.up_pressed = False
elif key == arcade.key.DOWN:
self.down_pressed = False
elif key == arcade.key.LEFT:
self.left_pressed = False
elif key == arcade.key.RIGHT:
self.right_pressed = False
def on_joybutton_press(self, joystick, button_no):
print("Button pressed:", button_no)
# Press the fire key
self.on_key_press(FIRE_KEY, [])
def on_joybutton_release(self, joystick, button_no):
print("Button released:", button_no)
def on_joyaxis_motion(self, joystick, axis, value):
print("Joystick axis {}, value {}".format(axis, value))
def on_joyhat_motion(self, joystick, hat_x, hat_y):
print("Joystick hat ({}, {})".format(hat_x, hat_y))
def main():
"""
Main method
"""
window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
window.setup()
arcade.run()
if __name__ == "__main__":
main()