def next_spawn(self): """spawn next wave adding dificulty and keeping the game going""" self._spawn += 1 self.hud.spawn = self._spawn # lets use fibonacci a, b = 0, 1 for i in range(0, self._spawn): a, b = b, a + b num_asteroids = a asteroids = load.asteroids( num_asteroids, self.player_ship.position, (self.width, self.height), batch=self.game_batch) self._event_stack_size += len([self.push_handlers(x) for x in asteroids]) self.physical_objects += asteroids self.spawn_condition if self._spawn <= 2: self.spawn_condition = num_asteroids elif self._spawn >= 3: self.spawn_condition = num_asteroids -1
def reset_level(num_lives=3): global player_ship, player_lives, game_objects, event_stack_size, level_reached # Clear the event stack of any remaining handlers from other levels while event_stack_size > 0: game_window.pop_handlers() event_stack_size -= 1 for life in player_lives: life.delete() player_ship = Player(x=resources.WIDTH / 2, y=resources.HEIGHT / 2, batch=main_batch) player_lives = load.player_lives(num_lives, batch=main_batch) asteroids = load.asteroids(num_asteroids, player_ship.position, batch=main_batch, speed=40 + level_reached * 5) level_label.text = f'Level {level_reached + 1}' game_objects = [player_ship] + asteroids for o in game_objects: for handler in o.event_handlers: # Player is an event handler so we need to push it onto the event stack game_window.push_handlers(handler) event_stack_size += 1
def reset_level(num_lives=2): global player_ship, player_lives, game_objects, event_stack_size # 清除事件栈 while event_stack_size > 0: game_window.pop_handlers() event_stack_size -= 1 for life in player_lives: life.delete() # 初始化飞船 player_ship = player.Player(x=400, y=300, batch=main_batch) # 初始化飞船生命 player_lives = load.player_lives(num_lives, batch=main_batch) # 初始化小行星 asteroids = load.asteroids(num_asteroids, player_ship.position, batch=main_batch) # 保存所有对象 game_objects = [player_ship] + asteroids # 添加所有对象的事件到游戏事件栈中 for obj in game_objects: for handler in obj.event_handlers: game_window.push_handlers(handler) event_stack_size += 1
def reset_level(): global player_ship, game_objects, event_stack_size # clear the event handler stack while event_stack_size > 0: game_window.pop_handlers() event_stack_size -= 1 # initialize the player ship if it doesn't already exist in the level if player_ship is None: player_ship = player.Player(x=width // 2, y=height // 2, batch=main_batch) # adding asteroids makes the game less boring asteroids = load.asteroids(current_level, player_ship.position, main_batch) if not game_objects: game_objects = [player_ship] game_objects = game_objects + asteroids # keeps bullets flying between levels # add event handlers for obj in game_objects: for handler in obj.event_handlers: game_window.push_handlers( handler) # tells pyglet who responds to events event_stack_size += 1 level_label.text = 'Level: {0}'.format(current_level)
def reset_level(num_lives=parameters.num_lives): global player_ship, player_lives, game_objects, event_stack_size, level, num_asteroids # Clear the event stack of any remaining handlers from other levels while event_stack_size > 0: game_window.pop_handlers() event_stack_size -= 1 # Initialize the player sprite player_ship = player.Player(x=parameters.half_width, y=parameters.half_height, batch=main_batch) # Make a number of sprites to represent remaining lives player_lives = load.player_lives(num_lives, batch=main_batch) # Make some asteroids so we have something to shoot at asteroids = load.asteroids(num_asteroids, player_ship.position, batch=main_batch) # Store all objects that update each frame in a list game_objects = [player_ship] + asteroids # Add any specified event handlers to the event handler stack for obj in game_objects: for handler in obj.event_handlers: game_window.push_handlers(handler) event_stack_size += 1 level_label.text = f"Level: {level}"
def reset_level(num_lives=2): global player_ship, player_lives, game_objects, event_stack_size # Clear the event stack of any remaining handlers from other levels while event_stack_size > 0: game_window.pop_handlers() event_stack_size -= 1 for life in player_lives: life.delete() # Initialize the player sprite player_ship = player.Player(x=400, y=300, batch=main_batch) # Make three sprites to represent remaining lives player_lives = load.player_lives(num_lives, main_batch) # Make some asteroids so we have something to shoot at asteroids = load.asteroids(num_asteroids, player_ship.position, main_batch) # Store all objects that update each frame in a list game_objects = [player_ship] + asteroids # Add any specified event handlers to the event handler stack for obj in game_objects: for handler in obj.event_handlers: game_window.push_handlers(handler) event_stack_size += 1
def reset_level(num_lives=2): global player_ship, player_lives, game_objects, event_stack_size # 清空事件栈 while event_stack_size > 0: game_window.pop_handlers() event_stack_size -= 1 for life in player_lives: life.delete() # 创建Player的实例 player_ship = player.Player(x=400, y=300, batch=main_batch) # 加载小飞船图标 player_lives = load.player_lives(num_lives, main_batch) # 加载多个小行星 asteroids = load.asteroids(num_asteroids, player_ship.position, main_batch) # 加载多个陨石 meteorites = load.meteorites(num_meteorites, player_ship.position, main_batch) # 为了调用每一个物体的update函数,需要一个列表来存放这些物体。 game_objects = [player_ship] + asteroids + meteorites ''' 告诉pyglet 哪些实例是事件句柄(event handler) 用game_window.push_handlers()函数把它压入事件栈中 ''' for obj in game_objects: for handler in obj.event_handlers: game_window.push_handlers(handler) event_stack_size += 1
def create_objects(): player_ship = player.Player(x=window_width//2, y=window_height//2, batch=main_batch) game_window.push_handlers(player_ship) game_window.push_handlers(player_ship.key_handler) asteroids = load.asteroids(3, player_ship.position, batch=main_batch) game_objects = [player_ship] + asteroids return player_ship, game_objects
def update(dt): global score, level # checa por colisoes for i in range(len(objects)): for j in range(i + 1, len(objects)): obj_1 = objects[i] obj_2 = objects[j] if not obj_1.dead and not obj_2.dead: if obj_1.collides_with(obj_2): p1 = obj_1.handle_collision_with(obj_2) p2 = obj_2.handle_collision_with(obj_1) to_add = [] asteroids_count = 0 player_dead = False points = 0 # adciona novos objetos ao jogo (tiros e asteroids) for obj in objects: obj.update(dt) to_add.extend(obj.new_objects) obj.new_objects = [] if isinstance(obj, game_objects.Asteroid): asteroids_count += 1 # remove objetos mortos for to_remove in [obj for obj in objects if obj.dead]: if isinstance(to_remove, game_objects.Player): player_dead = True if isinstance(to_remove, game_objects.Asteroid): points += to_remove.points to_add.extend(obj.new_objects) to_remove.delete() objects.remove(to_remove) objects.extend(to_add) # atuliza o estado do jogo if points > 0 and not player_dead: score += points score_label.text = "Nvl: {} Pontos {}".format(level, score) if player_dead: menu(dead=True) elif asteroids_count == 0: level += 1 score_label.text = "Nvl: {} Pontos: {}".format(level, score) asteroids = load.asteroids(n_asteroids + int(2 * log(level, 2)), player_ship.position, window.width, window.height, main_batch) objects.extend(asteroids)
def init(): global objects, score, lives, player_lives, level score = 0 level = 1 lives = max_lives asteroids = load.asteroids(n_asteroids, player_position, window.width, window.height, main_batch) player_lives = load.player_lives(lives, width, height, main_batch) objects = asteroids menu()
def refresh(keep_values): """ Refreshes the game when either the player has lost or the level is completed. This is illustrated by all asteroids having been destroyed. The *args are used to transfer characteristics of the last player_ship onto the new one, such as the lives remaining and the player's score. Inputs ====================================================================================== *args Boolean; qualities to move over to the new character. Currently only player_lives and player_score are supported. Outputs ====================================================================================== None """ global asteroids, game_objects, player_ship, lives game_objects.clear() # All characteristics of the player_ship player_ship.visible = True player_ship.dead = False player_ship.x = 1000 / 2 player_ship.velocity_x = 0 player_ship.y = 800 / 2 player_ship.velocity_y = 0 if keep_values: pass else: player_ship.lives = 3 player_ship.score = 0 player_ship.level = 1 # Redrawing the various indicators lives.clear() lives = load.player_lives(player_ship.lives, main_batch) score_label.text = 'Score: %d' % player_ship.score level_label.text = 'Level: %d' % player_ship.level # Respawning the asteroids asteroids = load.asteroids(max(player_ship.level, 3), player_ship.position, main_batch) # Re-establishin the new game_objects game_objects = [player_ship] + asteroids
def reset_game(): global player_ship, game_objects, asteroids_present, event_stack_size while event_stack_size > 0: game_window.pop_handlers() event_stack_size -= 1 player_ship = player.Player(x=400, y=300, batch=main_batch) asteroids = load.asteroids(num_asteroids, player_ship.position, batch=main_batch) asteroids_present += num_asteroids asteroids_label.text = "Asteroids: " + str(asteroids_present) game_objects = [player_ship] + asteroids game_over_label.y = -20 for obj in game_objects: for handler in obj.event_handlers: game_window.push_handlers(handler) event_stack_size += 1
def update(dt): global asteroids_present player_dead = False for i in xrange(len(game_objects)): for j in xrange(i+1, len(game_objects)): obj_1 = game_objects[i] obj_2 = game_objects[j] if not obj_1.dead and not obj_2.dead: if obj_1.collides_with(obj_2): obj_1.handle_collision_with(obj_2) obj_2.handle_collision_with(obj_1) to_add = [] for obj in game_objects: obj.update(dt) while asteroids_present < 3: new_asteroids = load.asteroids(randint(1,4), player_ship.position, batch=main_batch) to_add.extend(new_asteroids) asteroids_present += len(to_add) asteroids_label.text = "Asteroids: " + str(asteroids_present) to_add.extend(obj.new_objects) obj.new_objects = [] for to_remove in [obj for obj in game_objects if obj.dead]: if to_remove == player_ship: player_dead = True game_over_label.y = 534 asteroids_present = 0 to_add.extend(obj.new_objects) to_remove.delete() game_objects.remove(to_remove) if player_dead: reset_game() game_objects.extend(to_add)
# Set resources path pyglet.resource.path = ['../resources'] # Not sure what this does right now pyglet.resource.reindex() # Initializes 800x600 windows game_window = pyglet.window.Window(800, 600) score_label = pyglet.text.Label(text="Score: 0", x=10, y=575) level_label = pyglet.text.Label(text="Ben's Asteroid Game", x=400, y=575, anchor_x='center') player_ship = pyglet.sprite.Sprite(img=resources.player_image, x=400, y=300) asteroids = load.asteroids(3, player_ship.position) @game_window.event def on_draw(): game_window.clear() level_label.draw() score_label.draw() player_ship.draw() for asteroid in asteroids: asteroid.draw()
from game import load from game.player import Player game_window = pyglet.window.Window(800, 600, resizable=True) UI_batch = pyglet.graphics.Batch() main_batch = pyglet.graphics.Batch() score_label = pyglet.text.Label("Score: 0", x=10, y=575, batch=UI_batch) level_label = pyglet.text.Label("Learning Pyglet :D", x=400, y=575, anchor_x='center', batch=UI_batch) player_ship = Player( img=resources.player_image, x=400, y=300, batch=main_batch) player_lives = load.player_lives(3, UI_batch) asteroids = load.asteroids(3, player_ship.position, main_batch) game_objects = [player_ship] + asteroids def update(dt): to_add = [] for obj in game_objects: obj.update(dt) to_add.extend(obj.new_objects) obj.new_objects = [] if obj.dead: obj.delete()
# Set up a window game_window = pyglet.window.Window(800, 600) # Set up the two top labels score_label = pyglet.text.Label(text="Score: 0", x=10, y=575) level_label = pyglet.text.Label(text="Version 1: Static Graphics", x=400, y=575, anchor_x='center') # Initialize the player sprite player_ship = pyglet.sprite.Sprite(img=resources.player_image, x=400, y=300) # Make three asteroids so we have something to shoot at asteroids = load.asteroids(3, player_ship.position) @game_window.event def on_draw(): game_window.clear() player_ship.draw() for asteroid in asteroids: asteroid.draw() level_label.draw() score_label.draw() if __name__ == "__main__":
def test_asteroids__20_no_collosions(): suts = load.asteroids(3, (100, 100)) for sut in suts: assert utils.distance(sut.position, (100, 100)) >= 100
def test_asteroids__3(): suts = load.asteroids(3, (100, 100)) assert len(suts) == 3
# Set up the two top labels score_label = pyglet.text.Label(text="Score: 0", x=10, y=575, batch=main_batch) level_label = pyglet.text.Label(text="Version 3: Basic Collision", x=400, y=575, anchor_x='center', batch=main_batch) # Initialize the player sprite player_ship = player.Player(x=400, y=300, batch=main_batch) # Make three sprites to represent remaining lives player_lives = load.player_lives(2, main_batch) # Make three asteroids so we have something to shoot at asteroids = load.asteroids(3, player_ship.position, main_batch) # Store all objects that update each frame in a list game_objects = [player_ship] + asteroids # Tell the main window that the player object responds to events game_window.push_handlers(player_ship.key_handler) @game_window.event def on_draw(): game_window.clear() main_batch.draw() def update(dt):
import pyglet from game import resources from game import load game_window = pyglet.window.Window(800, 600) player_ship = pyglet.sprite.Sprite(img=resources.player_image, x=400, y=300) asteroids = load.asteroids(10) @game_window.event def on_draw(): game_window.clear() player_ship.draw() for asteroid in asteroids: asteroid.draw() if __name__ == '__main__': pyglet.app.run()