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
|
from setup import *
from colors import COLOR_BLACK
from player import Player
class Platform:
width, height = 200, 5
color = COLOR_BLACK
# Called on platform creation
def __init__(self, x, y):
self.position = pygame.Vector2(x, y)
# Draws the platform every frame
def draw(self, screen, camera_y):
r = pygame.Rect(self.position.x, self.position.y - camera_y, self.width, self.height)
pygame.draw.rect(screen, self.color, r)
class PlatformManager:
# Spacing interval for platform slots; all platforms will be spaced at a multiple of this value
platform_spread = 50
min_slots_between_platforms = 1
max_slots_between_platforms = 4
# The slot of the initial platform the player should spawn on
# It is in the middle of the screen
starting_platform_slot = (SCREEN_HEIGHT / platform_spread) // 2 + 1
# Called when the game starts
def __init__(self):
# Create a list of platforms that will be used in the game
self.platforms = []
# Keeps track of the next slot where a platform will spawn
self.next_slot = 0
# Create our initial platforms
self.spawn_initial_platforms()
# Spawns a platform at a given slot
def spawn_platform_at_slot(self, slot, center=False):
if center == False:
# Generate a random horizontal position for the next platform
# This position will range from 0, where the platform will be at the left side, to
# SCREEN_WIDTH - Platform.width, where the platform will be at the right side
platform_position_x = random.random() * (SCREEN_WIDTH - Platform.width)
else:
platform_position_x = SCREEN_WIDTH / 2 - Platform.width / 2
# Find the y correct y position of a slot at the specified slot
platform_position_y = SCREEN_HEIGHT - (self.platform_spread * slot) - Platform.height
# Create a new platform at the correct position and add it to our list of platforms
new_platform = Platform(platform_position_x, platform_position_y)
self.platforms.append(new_platform)
def spawn_initial_platforms(self):
has_starting_platform_spawned = False
# How many platform slots fit on the screen initially
max_initial_slots = SCREEN_HEIGHT // self.platform_spread
# Keep updating the next slot until we've reached the maximum amount
# that can fit on the screen
while self.next_slot < max_initial_slots:
# If the next slot is above or equal to the middle platform slot, also spawn the middle
# platform if it hasn't already been spawned
if self.next_slot >= self.starting_platform_slot and not has_starting_platform_spawned:
self.spawn_platform_at_slot(self.starting_platform_slot, center=True)
has_starting_platform_spawned = True
# Spawn the platform at the next slot if the next slot is not the starting platform
if self.next_slot != self.starting_platform_slot:
self.spawn_platform_at_slot(self.next_slot)
# Calculate the next slot
self.next_slot += random.randint(self.min_slots_between_platforms,
self.max_slots_between_platforms)
def spawn_new_platforms(self, camera_y):
# While the next platform to spawn is on screen
while camera_y <= SCREEN_HEIGHT - (self.platform_spread * self.next_slot):
# Spawn a platform at the slot and calculate the slot where the next platform will spawn
self.spawn_platform_at_slot(self.next_slot)
self.next_slot += random.randint(self.min_slots_between_platforms,
self.max_slots_between_platforms)
def delete_old_platforms(self, camera_y):
# If there exists platforms to delete
if self.platforms:
# Get the first platform in the list
# This will always be at the bottom most platform
platform = self.platforms[0]
# How far platforms can travel off screen
# * Platform height is added to ensure platforms are fully off screen before deletion
# * Player height is added so that players that don't completely fall off screen have
# a chance to catch a platform that just went off screen
offset = Platform.height + Player.height + camera_y
# If the platform meets the criteria for deletion, delete it
if platform.position.y > SCREEN_HEIGHT + offset:
self.platforms.remove(self.platforms[0])
def update(self, camera_y):
self.delete_old_platforms(camera_y)
self.spawn_new_platforms(camera_y)
# Draws all platforms to the screen
def draw(self, screen, camera_y):
for platform in self.platforms:
platform.draw(screen, camera_y)
|