-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprototype.py
More file actions
133 lines (114 loc) · 4.15 KB
/
prototype.py
File metadata and controls
133 lines (114 loc) · 4.15 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
import os
import sys
import random
import pygame
# Constants
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_SPEED = 5
BULLET_SPEED = 10
ENEMY_SPEED = 3
SPAWN_EVENT = pygame.USEREVENT + 1
# Weapon upgrade thresholds
UPGRADE_KILLS = [0, 5, 15]
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((40, 30))
self.image.fill((0, 255, 255))
self.rect = self.image.get_rect()
self.rect.center = (60, SCREEN_HEIGHT // 2)
self.kill_count = 0
self.weapon_level = 0
def update(self, pressed):
if pressed[pygame.K_UP]:
self.rect.y -= PLAYER_SPEED
if pressed[pygame.K_DOWN]:
self.rect.y += PLAYER_SPEED
self.rect.clamp_ip(pygame.Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT))
def shoot(self, bullets):
if self.weapon_level == 0:
bullets.add(Bullet(self.rect.midright))
elif self.weapon_level == 1:
bullets.add(Bullet((self.rect.right, self.rect.top)))
bullets.add(Bullet((self.rect.right, self.rect.bottom)))
else:
bullets.add(Bullet((self.rect.right, self.rect.centery - 10), (-1, -0.2)))
bullets.add(Bullet(self.rect.midright))
bullets.add(Bullet((self.rect.right, self.rect.centery + 10), (-1, 0.2)))
def add_kill(self):
self.kill_count += 1
if self.weapon_level < len(UPGRADE_KILLS) - 1:
if self.kill_count >= UPGRADE_KILLS[self.weapon_level + 1]:
self.weapon_level += 1
class Bullet(pygame.sprite.Sprite):
def __init__(self, position, direction=(1, 0)):
super().__init__()
self.image = pygame.Surface((10, 4))
self.image.fill((255, 255, 0))
self.rect = self.image.get_rect(center=position)
self.dx = direction[0] * BULLET_SPEED
self.dy = direction[1] * BULLET_SPEED
def update(self):
self.rect.x += self.dx
self.rect.y += self.dy
if self.rect.left > SCREEN_WIDTH or self.rect.bottom < 0 or self.rect.top > SCREEN_HEIGHT:
self.kill()
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
size = random.randint(20, 40)
self.image = pygame.Surface((size, size))
self.image.fill((255, 0, 0))
self.rect = self.image.get_rect()
self.rect.left = SCREEN_WIDTH + random.randint(0, 100)
self.rect.y = random.randint(0, SCREEN_HEIGHT - size)
def update(self):
self.rect.x -= ENEMY_SPEED
if self.rect.right < 0:
self.kill()
def main(max_frames=None):
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
clock = pygame.time.Clock()
player = Player()
bullets = pygame.sprite.Group()
enemies = pygame.sprite.Group()
all_sprites = pygame.sprite.Group(player)
pygame.time.set_timer(SPAWN_EVENT, 1000)
frame = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == SPAWN_EVENT:
enemy = Enemy()
enemies.add(enemy)
all_sprites.add(enemy)
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
player.shoot(bullets)
all_sprites.add(*bullets)
pressed = pygame.key.get_pressed()
player.update(pressed)
bullets.update()
enemies.update()
# Collisions
for enemy in pygame.sprite.groupcollide(enemies, bullets, True, True):
player.add_kill()
if pygame.sprite.spritecollide(player, enemies, False):
running = False
screen.fill((0, 0, 0))
all_sprites.draw(screen)
pygame.display.flip()
clock.tick(60)
frame += 1
if max_frames is not None and frame >= max_frames:
running = False
pygame.quit()
if __name__ == "__main__":
test_mode = "--test" in sys.argv
max_frames = 10 if test_mode else None
if os.environ.get("SDL_VIDEODRIVER") == "dummy" and not test_mode:
max_frames = 10
main(max_frames)