pyscratch-pysc 1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- assets/bullet_hell/enemy.py +130 -0
- assets/bullet_hell/enemy_bullets.py +230 -0
- assets/bullet_hell/main.py +11 -0
- assets/bullet_hell/old_verisons/bullet_hell.py +379 -0
- assets/bullet_hell/old_verisons/enemy.py +226 -0
- assets/bullet_hell/old_verisons/game_start.py +6 -0
- assets/bullet_hell/old_verisons/main.py +50 -0
- assets/bullet_hell/old_verisons/player.py +76 -0
- assets/bullet_hell/player.py +89 -0
- assets/bullet_hell/player_bullets.py +34 -0
- assets/bullet_hell/setting.py +33 -0
- examples/animated_sprite/main.py +7 -0
- examples/animated_sprite/my_sprite.py +79 -0
- examples/bullet_hell/enemy.py +152 -0
- examples/bullet_hell/enemy_bullet.py +88 -0
- examples/bullet_hell/main.py +17 -0
- examples/bullet_hell/player.py +39 -0
- examples/bullet_hell/player_bullet.py +31 -0
- examples/doodle_jump/main.py +9 -0
- examples/doodle_jump/platforms.py +51 -0
- examples/doodle_jump/player.py +52 -0
- examples/fish/assets/bullet_hell/enemy.py +130 -0
- examples/fish/assets/bullet_hell/enemy_bullets.py +230 -0
- examples/fish/assets/bullet_hell/main.py +11 -0
- examples/fish/assets/bullet_hell/old_verisons/bullet_hell.py +379 -0
- examples/fish/assets/bullet_hell/old_verisons/enemy.py +226 -0
- examples/fish/assets/bullet_hell/old_verisons/game_start.py +6 -0
- examples/fish/assets/bullet_hell/old_verisons/main.py +50 -0
- examples/fish/assets/bullet_hell/old_verisons/player.py +76 -0
- examples/fish/assets/bullet_hell/player.py +89 -0
- examples/fish/assets/bullet_hell/player_bullets.py +34 -0
- examples/fish/assets/bullet_hell/setting.py +33 -0
- examples/fish/fish.py +67 -0
- examples/fish/main.py +4 -0
- examples/getting-started/step 1 - create a sprite/main.py +11 -0
- examples/getting-started/step 1 - create a sprite/player.py +5 -0
- examples/getting-started/step 2 - control a sprite/main.py +11 -0
- examples/getting-started/step 2 - control a sprite/player.py +42 -0
- examples/getting-started/step 3 - backdrops/main.py +17 -0
- examples/getting-started/step 3 - backdrops/player.py +33 -0
- examples/getting-started/step 4 - clone a sprite/enemy.py +53 -0
- examples/getting-started/step 4 - clone a sprite/main.py +17 -0
- examples/getting-started/step 4 - clone a sprite/player.py +32 -0
- examples/getting-started/step 4 - clone a sprite (simple)/enemy.py +42 -0
- examples/getting-started/step 4 - clone a sprite (simple)/main.py +17 -0
- examples/getting-started/step 4 - clone a sprite (simple)/player.py +32 -0
- examples/getting-started/step 5 - local variables/enemy.py +52 -0
- examples/getting-started/step 5 - local variables/main.py +17 -0
- examples/getting-started/step 5 - local variables/player.py +49 -0
- examples/getting-started/step 6 - shared variables/enemy.py +64 -0
- examples/getting-started/step 6 - shared variables/main.py +17 -0
- examples/getting-started/step 6 - shared variables/player.py +80 -0
- examples/getting-started/step 7 - Referencing other sprites/enemy.py +83 -0
- examples/getting-started/step 7 - Referencing other sprites/hearts.py +39 -0
- examples/getting-started/step 7 - Referencing other sprites/main.py +23 -0
- examples/getting-started/step 7 - Referencing other sprites/player.py +59 -0
- examples/getting-started/step 8 - sprite variables/enemy.py +98 -0
- examples/getting-started/step 8 - sprite variables/hearts.py +39 -0
- examples/getting-started/step 8 - sprite variables/main.py +22 -0
- examples/getting-started/step 8 - sprite variables/player.py +63 -0
- examples/getting-started/step 9 - messages/enemy.py +98 -0
- examples/getting-started/step 9 - messages/hearts.py +39 -0
- examples/getting-started/step 9 - messages/main.py +23 -0
- examples/getting-started/step 9 - messages/player.py +78 -0
- examples/perspective_background/main.py +14 -0
- examples/perspective_background/player.py +52 -0
- examples/perspective_background/trees.py +39 -0
- examples/simple_pong/ball.py +72 -0
- examples/simple_pong/left_paddle.py +36 -0
- examples/simple_pong/main.py +21 -0
- examples/simple_pong/right_paddle.py +37 -0
- examples/simple_pong/score_display.py +54 -0
- pyscratch/__init__.py +48 -0
- pyscratch/event.py +263 -0
- pyscratch/game_module.py +1589 -0
- pyscratch/helper.py +561 -0
- pyscratch/sprite.py +1920 -0
- pyscratch/tools/sprite_preview/left_panel/frame_preview_card.py +238 -0
- pyscratch/tools/sprite_preview/left_panel/frame_preview_panel.py +42 -0
- pyscratch/tools/sprite_preview/main.py +18 -0
- pyscratch/tools/sprite_preview/main_panel/animation_display.py +77 -0
- pyscratch/tools/sprite_preview/main_panel/frame_bin.py +33 -0
- pyscratch/tools/sprite_preview/main_panel/play_edit_ui.py +64 -0
- pyscratch/tools/sprite_preview/main_panel/set_as_sprite_folder.py +22 -0
- pyscratch/tools/sprite_preview/main_panel/sprite_edit_ui.py +174 -0
- pyscratch/tools/sprite_preview/main_panel/warning_message.py +25 -0
- pyscratch/tools/sprite_preview/right_panel/back_button.py +35 -0
- pyscratch/tools/sprite_preview/right_panel/cut_button.py +32 -0
- pyscratch/tools/sprite_preview/right_panel/cut_parameter_fitting.py +152 -0
- pyscratch/tools/sprite_preview/right_panel/cut_parameters.py +42 -0
- pyscratch/tools/sprite_preview/right_panel/file_display.py +84 -0
- pyscratch/tools/sprite_preview/right_panel/file_display_area.py +57 -0
- pyscratch/tools/sprite_preview/right_panel/spritesheet_view.py +262 -0
- pyscratch/tools/sprite_preview/right_panel/ss_select_corner.py +208 -0
- pyscratch/tools/sprite_preview/settings.py +14 -0
- pyscratch/tools/sprite_preview/utils/input_box.py +235 -0
- pyscratch/tools/sprite_preview/utils/render_wrapped_file_name.py +86 -0
- pyscratch_pysc-1.0.3.dist-info/METADATA +37 -0
- pyscratch_pysc-1.0.3.dist-info/RECORD +101 -0
- pyscratch_pysc-1.0.3.dist-info/WHEEL +5 -0
- pyscratch_pysc-1.0.3.dist-info/top_level.txt +3 -0
@@ -0,0 +1,379 @@
|
|
1
|
+
import random
|
2
|
+
import re, sys
|
3
|
+
import numpy as np
|
4
|
+
import pymunk
|
5
|
+
import pyscratch.game_module
|
6
|
+
from pyscratch.sprite import Sprite, create_rect, create_rect_sprite, create_edge_sprites
|
7
|
+
from pyscratch.helper import _get_frame_dict
|
8
|
+
from pyscratch.game_module import Game
|
9
|
+
import pygame
|
10
|
+
WIDTH = 720
|
11
|
+
HEIGHT = 1280
|
12
|
+
|
13
|
+
|
14
|
+
ENEMY_TYPE = 3
|
15
|
+
PLAYER_TYPE = 2
|
16
|
+
PLAYER_BULLET_TYPE = 4
|
17
|
+
EDGE_TYPE = 1
|
18
|
+
|
19
|
+
def cap(v, min_v, max_v):
|
20
|
+
return max(min(max_v, v), min_v)
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
game = Game((WIDTH, HEIGHT))
|
25
|
+
sprite_sheet = pygame.image.load("assets/09493140a07b68502ef63ff423a6da3954d36fd8/Green Effect and Bullet 16x16.png").convert_alpha()
|
26
|
+
|
27
|
+
font = pygame.font.SysFont(None, 24) # None = default font, 48 = font size
|
28
|
+
game._suppress_type_collision(PLAYER_TYPE, True)
|
29
|
+
|
30
|
+
|
31
|
+
frames = _get_frame_dict(sprite_sheet, 36, 13, {
|
32
|
+
"spin": [i+4*36 for i in range(14, 17+1)],
|
33
|
+
"star_explosion": [i+4*36 for i in range(19, 22+1)],
|
34
|
+
"heal": [i+1*36 for i in range(24, 28+1)],
|
35
|
+
"circle_explosion": [i+5*36 for i in range(14, 17+1)],
|
36
|
+
|
37
|
+
|
38
|
+
"square_bullets": [i+9*36 for i in range(24, 28+1)]+[i+9*36 for i in range(27, 24, -1)],
|
39
|
+
"circle_bullets": [i+8*36 for i in range(24, 28+1)]+[i+8*36 for i in range(27, 24, -1)],
|
40
|
+
|
41
|
+
"shield": [i+5*36 for i in [17]],
|
42
|
+
|
43
|
+
"bullet1": [i+3*36 for i in range(7, 7+1)]
|
44
|
+
})
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
start_buttom = create_rect_sprite((200, 0, 0), width=150, height=60, pos=(game._screen.get_width()//2, game._screen.get_height()//2))
|
49
|
+
start_buttom.write_text("Click to Start", font)
|
50
|
+
#game.add_sprite(start_buttom)
|
51
|
+
|
52
|
+
def on_click():
|
53
|
+
start_buttom.scale_by(0.9)
|
54
|
+
|
55
|
+
on_condition = game.when_condition_met(
|
56
|
+
lambda: (not pyscratch.game.get_mouse_presses()[0]), repeats=1)
|
57
|
+
|
58
|
+
def start_game(x):
|
59
|
+
start_buttom.scale_by(1/0.9)
|
60
|
+
game.broadcast_message('game_start', {'count': 0})
|
61
|
+
game._remove_sprite(start_buttom)
|
62
|
+
|
63
|
+
on_condition.add_handler(start_game)
|
64
|
+
|
65
|
+
#game.retrieve_sprite_click_trigger(start_buttom).add_callback(on_click)
|
66
|
+
on_click()
|
67
|
+
|
68
|
+
|
69
|
+
def shoot_player_bullet(origin, inaccuracy):
|
70
|
+
|
71
|
+
bullet = Sprite(frames, "circle_bullets", origin)
|
72
|
+
|
73
|
+
#game.add_sprite(bullet)
|
74
|
+
bullet.set_collision_type(PLAYER_BULLET_TYPE)
|
75
|
+
bullet.set_rotation(-90 + inaccuracy*random.random()-inaccuracy/2)
|
76
|
+
|
77
|
+
movement_timer = game.when_timer_reset(1000/240).add_handler(
|
78
|
+
lambda x: bullet.move_indir(2)
|
79
|
+
)
|
80
|
+
|
81
|
+
next_frame_timer = game.when_timer_reset(100).add_handler(
|
82
|
+
lambda x: bullet.next_frame()
|
83
|
+
)
|
84
|
+
|
85
|
+
|
86
|
+
def destroy_when_exit(x):
|
87
|
+
movement_timer.remove()
|
88
|
+
next_frame_timer.remove()
|
89
|
+
game._remove_sprite(bullet)
|
90
|
+
|
91
|
+
|
92
|
+
destroy_condition = game.when_condition_met(lambda: (bullet.y < 0), repeats=1)
|
93
|
+
destroy_condition.add_handler(destroy_when_exit)
|
94
|
+
|
95
|
+
|
96
|
+
def create_bullet_attracted(position):
|
97
|
+
bullet = Sprite(frames, "spin", position)
|
98
|
+
|
99
|
+
bullet.set_scale(2.3)
|
100
|
+
#game.add_sprite(bullet)
|
101
|
+
speed = random.random()*15+5
|
102
|
+
|
103
|
+
|
104
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: bullet.move_indir(speed))
|
105
|
+
following_event = game.when_timer_reset(200, 5).add_handler(lambda x: bullet.point_towards_sprite(game.shared_data['player']))
|
106
|
+
|
107
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
108
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
109
|
+
|
110
|
+
|
111
|
+
def explode_and_destroy(a):
|
112
|
+
bullet.set_animation('star_explosion')
|
113
|
+
game.broadcast_message('player_health', -1)
|
114
|
+
movement_event.remove()
|
115
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
116
|
+
|
117
|
+
|
118
|
+
def destory(x):
|
119
|
+
movement_event.remove()
|
120
|
+
frame_event.remove()
|
121
|
+
following_event.remove()
|
122
|
+
hitting_player_event.remove()
|
123
|
+
game._remove_sprite(bullet)
|
124
|
+
|
125
|
+
when_exit_screen = game.when_condition_met(lambda: bullet.y > HEIGHT, repeats=1)
|
126
|
+
when_exit_screen.add_handler(destory)
|
127
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
def create_bullet_start_pointing(position, _):
|
132
|
+
|
133
|
+
bullet = Sprite(frames, "spin", position)
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
bullet.point_towards_sprite(game.shared_data['player'])
|
138
|
+
bullet.set_scale(2.3)
|
139
|
+
#game.add_sprite(bullet)
|
140
|
+
speed = random.random()*15+5
|
141
|
+
bullet.point_towards_sprite(game.shared_data['player'])
|
142
|
+
|
143
|
+
|
144
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: bullet.move_indir(speed))
|
145
|
+
#movement_event = game.create_timer_trigger(20).on_reset(lambda x: bullet.move_across_dir((random.random()-0.5)*speed*0.3))
|
146
|
+
|
147
|
+
|
148
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
149
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
150
|
+
|
151
|
+
|
152
|
+
def explode_and_destroy(a):
|
153
|
+
bullet.set_animation('star_explosion')
|
154
|
+
game.broadcast_message('player_health', -1)
|
155
|
+
movement_event.remove()
|
156
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
157
|
+
|
158
|
+
|
159
|
+
def destory(x):
|
160
|
+
movement_event.remove()
|
161
|
+
frame_event.remove()
|
162
|
+
hitting_player_event.remove()
|
163
|
+
game._remove_sprite(bullet)
|
164
|
+
|
165
|
+
when_exit_screen = game.when_condition_met(lambda: bullet.y > HEIGHT, repeats=1)
|
166
|
+
when_exit_screen.add_handler(destory)
|
167
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
168
|
+
pass
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
def create_bullet_move_sine(position, rotation):
|
174
|
+
bullet = Sprite(frames, "square_bullets", position)
|
175
|
+
bullet.set_scale(2.3)
|
176
|
+
#game.add_sprite(bullet)
|
177
|
+
bullet.set_rotation(rotation+90)
|
178
|
+
#speed = random.random()*15+5
|
179
|
+
speed = 10
|
180
|
+
|
181
|
+
|
182
|
+
bullet.sprite_data['phase'] = 0
|
183
|
+
movement_event = game.when_timer_reset(30)
|
184
|
+
def move(x):
|
185
|
+
bullet.sprite_data['phase']+=.1
|
186
|
+
angle = np.tanh(np.cos(.6*bullet.sprite_data['phase']))
|
187
|
+
|
188
|
+
|
189
|
+
bullet.add_rotation(angle)
|
190
|
+
|
191
|
+
bullet.move_indir(speed)
|
192
|
+
|
193
|
+
|
194
|
+
movement_event.add_handler(move)
|
195
|
+
|
196
|
+
|
197
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
198
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
199
|
+
|
200
|
+
|
201
|
+
def explode_and_destroy(a):
|
202
|
+
bullet.set_animation('star_explosion')
|
203
|
+
game.broadcast_message('player_health', -1)
|
204
|
+
movement_event.remove()
|
205
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
206
|
+
|
207
|
+
|
208
|
+
def destory(x):
|
209
|
+
movement_event.remove()
|
210
|
+
frame_event.remove()
|
211
|
+
hitting_player_event.remove()
|
212
|
+
game._remove_sprite(bullet)
|
213
|
+
|
214
|
+
when_exit_screen = game.when_condition_met(lambda: (bullet.y > HEIGHT) or (bullet.y < 0) or (bullet.x <0) or (bullet.x>WIDTH) , repeats=1)
|
215
|
+
when_exit_screen.add_handler(destory)
|
216
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
217
|
+
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
def create_bullet_type1(position, rotation):
|
222
|
+
bullet = Sprite(frames, "spin", position)
|
223
|
+
bullet.add_rotation(rotation)
|
224
|
+
bullet.set_scale(2.3)
|
225
|
+
#game.add_sprite(bullet)
|
226
|
+
speed = random.random()*15+5
|
227
|
+
#speed = 15
|
228
|
+
|
229
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: bullet.move_indir(speed))
|
230
|
+
#movement_event = game.create_timer_trigger(20).on_reset(lambda x: bullet.move_across_dir((random.random()-0.5)*speed*0.3))
|
231
|
+
|
232
|
+
|
233
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
234
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
235
|
+
|
236
|
+
|
237
|
+
def explode_and_destroy(a):
|
238
|
+
bullet.set_animation('star_explosion')
|
239
|
+
game.broadcast_message('player_health', -1)
|
240
|
+
movement_event.remove()
|
241
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
242
|
+
|
243
|
+
when_exit_screen = game.when_condition_met(lambda: bullet.y > HEIGHT, repeats=1)
|
244
|
+
|
245
|
+
def destory(x):
|
246
|
+
movement_event.remove()
|
247
|
+
frame_event.remove()
|
248
|
+
hitting_player_event.remove()
|
249
|
+
game._remove_sprite(bullet)
|
250
|
+
when_exit_screen.remove()
|
251
|
+
|
252
|
+
when_exit_screen.add_handler(destory)
|
253
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
254
|
+
|
255
|
+
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
|
260
|
+
def create_enemy_type1(position):
|
261
|
+
|
262
|
+
enemy_sprite = create_rect_sprite((255, 0, 0), 50, 30, pos=position)
|
263
|
+
#game.add_sprite(enemy_sprite)
|
264
|
+
|
265
|
+
enemy_sprite.add_rotation(90+(random.random()-0.5)*15)
|
266
|
+
enemy_sprite.set_collision_type(ENEMY_TYPE)
|
267
|
+
|
268
|
+
|
269
|
+
speed = random.random()*6
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
|
274
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: enemy_sprite.move_indir(speed))
|
275
|
+
bullet_event = game.when_timer_reset(150).add_handler(lambda x: create_bullet_type1((enemy_sprite.x, enemy_sprite.y), enemy_sprite.get_rotation()))
|
276
|
+
#bullet_event = game.create_timer_trigger(1500).on_reset(lambda x: create_bullet_attracted((enemy_sprite.x, enemy_sprite.y)))
|
277
|
+
|
278
|
+
when_hit_player = game.when_condition_met(lambda: pyscratch.game.is_touching(game, enemy_sprite, game.shared_data['player']), repeats=1)
|
279
|
+
when_leaving_screen = game.when_condition_met(lambda: (enemy_sprite.y > HEIGHT), repeats=1)
|
280
|
+
when_hit_by_player_bullet = game._create_type2type_collision_trigger(PLAYER_BULLET_TYPE, ENEMY_TYPE)
|
281
|
+
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
|
286
|
+
def destroy(x):
|
287
|
+
when_hit_player.remove()
|
288
|
+
when_leaving_screen.remove()
|
289
|
+
when_hit_by_player_bullet.remove()
|
290
|
+
movement_event.remove()
|
291
|
+
bullet_event.remove()
|
292
|
+
game._remove_sprite(enemy_sprite)
|
293
|
+
|
294
|
+
def check_collision(a):
|
295
|
+
if enemy_sprite._shape in a.shapes:
|
296
|
+
destroy(None)
|
297
|
+
|
298
|
+
when_hit_player.add_handler(destroy)
|
299
|
+
when_hit_player.add_handler(lambda x: game.broadcast_message('player_health', -1))
|
300
|
+
|
301
|
+
when_leaving_screen.add_handler(destroy)
|
302
|
+
|
303
|
+
when_hit_by_player_bullet.add_handler(check_collision)
|
304
|
+
|
305
|
+
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
|
310
|
+
def game_start(data):
|
311
|
+
|
312
|
+
player = create_rect_sprite((0, 0, 255), 50, 30, pos=(720//2, 1200))
|
313
|
+
#game.add_sprite(player)
|
314
|
+
create_edge_sprites(game)
|
315
|
+
player.set_collision_type(PLAYER_TYPE)
|
316
|
+
|
317
|
+
|
318
|
+
healthbar_red = create_rect((255, 0, 0), 60, 50)
|
319
|
+
|
320
|
+
healthbar_empty = create_rect_sprite((255, 255, 255), 60, 5, pos=(0,0))
|
321
|
+
|
322
|
+
|
323
|
+
|
324
|
+
game.shared_data['player'] = player
|
325
|
+
game.shared_data['inaccuracy'] = 5
|
326
|
+
|
327
|
+
player.sprite_data['health'] = 10
|
328
|
+
|
329
|
+
|
330
|
+
#game.add_sprite(healthbar_empty)
|
331
|
+
healthbar_empty.lock_to(player, (0,-30))
|
332
|
+
healthbar_empty.blit(healthbar_red, (0,0))
|
333
|
+
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
game.when_timer_reset(100, 20).add_handler(lambda x: create_bullet_move_sine((355, 1), 0))
|
338
|
+
game.when_timer_reset(100, 20).add_handler(lambda x: create_bullet_attracted((355, 1)))
|
339
|
+
game.when_timer_reset(100, 100).add_handler(lambda x: create_bullet_type1((100, 100), 90))
|
340
|
+
|
341
|
+
#game.create_timer_trigger(100, 10)
|
342
|
+
|
343
|
+
|
344
|
+
#game.create_timer_trigger(1200).on_reset(lambda x: shoot_player_bullet((player.x, player.y), game.shared_data['inaccuracy']))
|
345
|
+
#game.create_timer_trigger(500, 30).on_reset(lambda x: create_enemy_type1((random.random()*WIDTH, 0)))
|
346
|
+
|
347
|
+
|
348
|
+
def run_forever(_):
|
349
|
+
if pyscratch.game.is_key_pressed('w'):
|
350
|
+
player.move_xy((0, -5))
|
351
|
+
|
352
|
+
if pyscratch.game.is_key_pressed('s'):
|
353
|
+
player.move_xy((0, 5))
|
354
|
+
|
355
|
+
if pyscratch.game.is_key_pressed('a'):
|
356
|
+
player.move_xy((-5, 0))
|
357
|
+
|
358
|
+
if pyscratch.game.is_key_pressed('d'):
|
359
|
+
player.move_xy((5, 0))
|
360
|
+
|
361
|
+
player.set_xy((cap(player.x, 50, WIDTH-50), cap(player.y, HEIGHT-500, HEIGHT)))
|
362
|
+
|
363
|
+
|
364
|
+
def on_health_change(change):
|
365
|
+
player.sprite_data['health'] += change
|
366
|
+
new_health = max(0, player.sprite_data['health'])
|
367
|
+
|
368
|
+
healthbar_red = create_rect((255, 0, 0), 60*(new_health/10), 50)
|
369
|
+
healthbar_empty.blit(healthbar_red)
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
game.when_timer_reset(1000/120).add_handler(run_forever)
|
374
|
+
game.when_receive_message('player_health').add_handler(on_health_change)
|
375
|
+
|
376
|
+
wait_for_game_start = game.when_receive_message('game_start').add_handler(game_start)
|
377
|
+
|
378
|
+
|
379
|
+
game.start(60, 60, False, True)
|
@@ -0,0 +1,226 @@
|
|
1
|
+
import random
|
2
|
+
import re, sys
|
3
|
+
import numpy as np
|
4
|
+
import pymunk
|
5
|
+
from pyscratch import game
|
6
|
+
from pyscratch.sprite import Sprite, create_rect, create_rect_sprite
|
7
|
+
from pyscratch.helper import _get_frame_dict
|
8
|
+
from pyscratch.game_module import Game
|
9
|
+
|
10
|
+
from main import game, frames, WIDTH, HEIGHT, ENEMY_TYPE, PLAYER_BULLET_TYPE
|
11
|
+
|
12
|
+
|
13
|
+
def create_bullet_attracted(position):
|
14
|
+
bullet = Sprite(frames, "spin", position)
|
15
|
+
|
16
|
+
bullet.set_scale(2.3)
|
17
|
+
#game.add_sprite(bullet)
|
18
|
+
speed = random.random()*15+5
|
19
|
+
|
20
|
+
bullet.point_towards_sprite(game.shared_data['player'])
|
21
|
+
|
22
|
+
|
23
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: bullet.move_indir(speed))
|
24
|
+
following_event = game.when_timer_reset(200, 5).add_handler(lambda x: bullet.point_towards_sprite(game.shared_data['player']))
|
25
|
+
|
26
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
27
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
28
|
+
|
29
|
+
|
30
|
+
def explode_and_destroy(a):
|
31
|
+
bullet.set_animation('star_explosion')
|
32
|
+
game.broadcast_message('player_health', -1)
|
33
|
+
movement_event.remove()
|
34
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
35
|
+
|
36
|
+
|
37
|
+
def destory(x):
|
38
|
+
movement_event.remove()
|
39
|
+
frame_event.remove()
|
40
|
+
following_event.remove()
|
41
|
+
hitting_player_event.remove()
|
42
|
+
game._remove_sprite(bullet)
|
43
|
+
|
44
|
+
when_exit_screen = game.when_condition_met(lambda: bullet.y > HEIGHT, repeats=1)
|
45
|
+
when_exit_screen.add_handler(destory)
|
46
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
def create_bullet_start_pointing(position, _):
|
51
|
+
|
52
|
+
bullet = Sprite(frames, "spin", position)
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
bullet.point_towards_sprite(game.shared_data['player'])
|
57
|
+
bullet.set_scale(2.3)
|
58
|
+
#game.add_sprite(bullet)
|
59
|
+
speed = random.random()*15+5
|
60
|
+
bullet.point_towards_sprite(game.shared_data['player'])
|
61
|
+
|
62
|
+
|
63
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: bullet.move_indir(speed))
|
64
|
+
#movement_event = game.create_timer_trigger(20).on_reset(lambda x: bullet.move_across_dir((random.random()-0.5)*speed*0.3))
|
65
|
+
|
66
|
+
|
67
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
68
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
69
|
+
|
70
|
+
|
71
|
+
def explode_and_destroy(a):
|
72
|
+
bullet.set_animation('star_explosion')
|
73
|
+
game.broadcast_message('player_health', -1)
|
74
|
+
movement_event.remove()
|
75
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
76
|
+
|
77
|
+
|
78
|
+
def destory(x):
|
79
|
+
movement_event.remove()
|
80
|
+
frame_event.remove()
|
81
|
+
hitting_player_event.remove()
|
82
|
+
game._remove_sprite(bullet)
|
83
|
+
|
84
|
+
when_exit_screen = game.when_condition_met(lambda: bullet.y > HEIGHT, repeats=1)
|
85
|
+
when_exit_screen.add_handler(destory)
|
86
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
87
|
+
pass
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
def create_bullet_move_sine(position, rotation):
|
93
|
+
bullet = Sprite(frames, "square_bullets", position)
|
94
|
+
bullet.set_scale(2.3)
|
95
|
+
#game.add_sprite(bullet)
|
96
|
+
bullet.set_rotation(rotation+90)
|
97
|
+
#speed = random.random()*15+5
|
98
|
+
speed = 10
|
99
|
+
|
100
|
+
|
101
|
+
bullet.sprite_data['phase'] = 0
|
102
|
+
movement_event = game.when_timer_reset(30)
|
103
|
+
def move(x):
|
104
|
+
bullet.sprite_data['phase']+=.1
|
105
|
+
angle = np.tanh(np.cos(.6*bullet.sprite_data['phase']))
|
106
|
+
|
107
|
+
|
108
|
+
bullet.add_rotation(angle)
|
109
|
+
|
110
|
+
bullet.move_indir(speed)
|
111
|
+
|
112
|
+
|
113
|
+
movement_event.add_handler(move)
|
114
|
+
|
115
|
+
|
116
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
117
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
118
|
+
|
119
|
+
|
120
|
+
def explode_and_destroy(a):
|
121
|
+
bullet.set_animation('star_explosion')
|
122
|
+
game.broadcast_message('player_health', -1)
|
123
|
+
movement_event.remove()
|
124
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
125
|
+
|
126
|
+
|
127
|
+
def destory(x):
|
128
|
+
movement_event.remove()
|
129
|
+
frame_event.remove()
|
130
|
+
hitting_player_event.remove()
|
131
|
+
game._remove_sprite(bullet)
|
132
|
+
|
133
|
+
when_exit_screen = game.when_condition_met(lambda: (bullet.y > HEIGHT) or (bullet.y < 0) or (bullet.x <0) or (bullet.x>WIDTH) , repeats=1)
|
134
|
+
when_exit_screen.add_handler(destory)
|
135
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
def create_bullet_type1(position, rotation):
|
141
|
+
bullet = Sprite(frames, "spin", position)
|
142
|
+
bullet.add_rotation(rotation)
|
143
|
+
bullet.set_scale(2.3)
|
144
|
+
#game.add_sprite(bullet)
|
145
|
+
speed = random.random()*15+5
|
146
|
+
#speed = 15
|
147
|
+
|
148
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: bullet.move_indir(speed))
|
149
|
+
#movement_event = game.create_timer_trigger(20).on_reset(lambda x: bullet.move_across_dir((random.random()-0.5)*speed*0.3))
|
150
|
+
|
151
|
+
|
152
|
+
frame_event = game.when_timer_reset(200).add_handler(lambda x: bullet.next_frame())
|
153
|
+
hitting_player_event = game._create_specific_collision_trigger(bullet, game.shared_data['player'])
|
154
|
+
|
155
|
+
|
156
|
+
def explode_and_destroy(a):
|
157
|
+
bullet.set_animation('star_explosion')
|
158
|
+
game.broadcast_message('player_health', -1)
|
159
|
+
movement_event.remove()
|
160
|
+
game.when_timer_reset(200, 1).add_handler(destory)
|
161
|
+
|
162
|
+
when_exit_screen = game.when_condition_met(lambda: bullet.y > HEIGHT, repeats=1)
|
163
|
+
|
164
|
+
def destory(x):
|
165
|
+
movement_event.remove()
|
166
|
+
frame_event.remove()
|
167
|
+
hitting_player_event.remove()
|
168
|
+
game._remove_sprite(bullet)
|
169
|
+
when_exit_screen.remove()
|
170
|
+
|
171
|
+
when_exit_screen.add_handler(destory)
|
172
|
+
hitting_player_event.add_handler(explode_and_destroy)
|
173
|
+
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
def create_enemy_type1(position):
|
180
|
+
|
181
|
+
enemy_sprite = create_rect_sprite((255, 0, 0), 50, 30, pos=position)
|
182
|
+
#game.add_sprite(enemy_sprite)
|
183
|
+
|
184
|
+
enemy_sprite.add_rotation(90+(random.random()-0.5)*15)
|
185
|
+
enemy_sprite.set_collision_type(ENEMY_TYPE)
|
186
|
+
|
187
|
+
|
188
|
+
speed = random.random()*6
|
189
|
+
print(game.shared_data['player'])
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
movement_event = game.when_timer_reset(20).add_handler(lambda x: enemy_sprite.move_indir(speed))
|
194
|
+
bullet_event = game.when_timer_reset(150).add_handler(lambda x: create_bullet_type1((enemy_sprite.x, enemy_sprite.y), enemy_sprite.get_rotation()))
|
195
|
+
#bullet_event = game.create_timer_trigger(1500).on_reset(lambda x: create_bullet_attracted((enemy_sprite.x, enemy_sprite.y)))
|
196
|
+
|
197
|
+
when_hit_player = game.when_condition_met(lambda: game.is_touching(game, enemy_sprite, game.shared_data['player']), repeats=1)
|
198
|
+
when_leaving_screen = game.when_condition_met(lambda: (enemy_sprite.y > HEIGHT), repeats=1)
|
199
|
+
when_hit_by_player_bullet = game._create_type2type_collision_trigger(PLAYER_BULLET_TYPE, ENEMY_TYPE)
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
def destroy(x):
|
206
|
+
when_hit_player.remove()
|
207
|
+
when_leaving_screen.remove()
|
208
|
+
when_hit_by_player_bullet.remove()
|
209
|
+
movement_event.remove()
|
210
|
+
bullet_event.remove()
|
211
|
+
game._remove_sprite(enemy_sprite)
|
212
|
+
|
213
|
+
def check_collision(a):
|
214
|
+
if enemy_sprite._shape in a.shapes:
|
215
|
+
destroy(None)
|
216
|
+
|
217
|
+
when_hit_player.add_handler(destroy)
|
218
|
+
when_hit_player.add_handler(lambda x: game.broadcast_message('player_health', -1))
|
219
|
+
|
220
|
+
when_leaving_screen.add_handler(destroy)
|
221
|
+
|
222
|
+
when_hit_by_player_bullet.add_handler(check_collision)
|
223
|
+
|
224
|
+
|
225
|
+
|
226
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import random
|
2
|
+
import re, sys
|
3
|
+
import numpy as np
|
4
|
+
import pymunk
|
5
|
+
from pyscratch.sprite import Sprite, create_rect, create_rect_sprite
|
6
|
+
from pyscratch.helper import _get_frame_dict
|
7
|
+
from pyscratch.game_module import Game
|
8
|
+
|
9
|
+
|
10
|
+
import pygame
|
11
|
+
|
12
|
+
WIDTH = 720
|
13
|
+
HEIGHT = 1280
|
14
|
+
|
15
|
+
|
16
|
+
ENEMY_TYPE = 3
|
17
|
+
PLAYER_TYPE = 2
|
18
|
+
PLAYER_BULLET_TYPE = 4
|
19
|
+
EDGE_TYPE = 1
|
20
|
+
|
21
|
+
def cap(v, min_v, max_v):
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
return max(min(max_v, v), min_v)
|
26
|
+
|
27
|
+
game = Game((WIDTH, HEIGHT))
|
28
|
+
sprite_sheet = pygame.image.load("assets/09493140a07b68502ef63ff423a6da3954d36fd8/Green Effect and Bullet 16x16.png").convert_alpha()
|
29
|
+
|
30
|
+
font = pygame.font.SysFont(None, 24) # None = default font, 48 = font size
|
31
|
+
game._suppress_type_collision(PLAYER_TYPE, True)
|
32
|
+
|
33
|
+
|
34
|
+
frames = _get_frame_dict(sprite_sheet, 36, 13, {
|
35
|
+
"spin": [i+4*36 for i in range(14, 17+1)],
|
36
|
+
"star_explosion": [i+4*36 for i in range(19, 22+1)],
|
37
|
+
"heal": [i+1*36 for i in range(24, 28+1)],
|
38
|
+
"circle_explosion": [i+5*36 for i in range(14, 17+1)],
|
39
|
+
|
40
|
+
|
41
|
+
"square_bullets": [i+9*36 for i in range(24, 28+1)]+[i+9*36 for i in range(27, 24, -1)],
|
42
|
+
"circle_bullets": [i+8*36 for i in range(24, 28+1)]+[i+8*36 for i in range(27, 24, -1)],
|
43
|
+
|
44
|
+
"shield": [i+5*36 for i in [17]],
|
45
|
+
|
46
|
+
"bullet1": [i+3*36 for i in range(7, 7+1)]
|
47
|
+
})
|
48
|
+
|
49
|
+
|
50
|
+
#game.start(60, 300, False)
|