def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) # 设置窗口标题 pygame.display.set_caption("Enemy Invasion") # 创建Play按钮 play_button = Button(ai_settings, screen, "Play") # 创建一个用于存储游戏统计信息的实例,并创建记分牌 stats = GameStats(ai_settings) scoreboard = Scoreboard(ai_settings, screen, stats) # 创建一艘新的战斗机、一个子弹编组和一个敌机编组 fighter = Fighter(ai_settings, screen) bullets = Group() enemies = Group() # 创建敌机舰队 gf.create_fleet(ai_settings, screen, fighter, enemies) # 开始游戏的主循环 while True: # 监听键盘和鼠标事件 gf.check_events(ai_settings, screen, stats, scoreboard, play_button, fighter, enemies, bullets) if stats.game_active: fighter.update() gf.update_bullets(ai_settings, screen, stats, scoreboard, fighter, enemies, bullets) gf.update_enemies(ai_settings, screen, stats, scoreboard, fighter, enemies, bullets) gf.update_screen(ai_settings, screen, stats, scoreboard, fighter, enemies, bullets, play_button)
def run_game(): pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption('Zombie Appocalypse') play_button = Button(ai_settings, screen, "Play Game") fighter = Fighter(ai_settings, screen) bullets = Group() zombies = Group() gf.create_fighter(ai_settings, screen, fighter, zombies) stats = GameStats(ai_settings) sb = Scoreboard(ai_settings, screen, stats) while True: gf.check_events(ai_settings, screen, stats, sb, play_button, fighter, zombies, bullets) if stats.game_active: fighter.update() bullets.update() gf.update_bullets(ai_settings, screen, stats, sb, fighter, zombies, bullets) gf.update_zombies(ai_settings, stats, screen, fighter, zombies, bullets) gf.update_screen(ai_settings, screen, stats, sb, fighter, zombies, bullets, play_button)
class TetrisDumpUniverse: """Main Class to manage game assests and behavior""" def __init__(self): """Inits game and create game resources""" # * inits background setting for pygame pygame.init() # * creates Surface display window, for drawing game # instance of Settings self.settings = Settings() # * ASSIGNS MAIN DISPLAY SURFACE self.screen = pygame.display.set_mode( (self.settings.screen_width, self.settings.screen_height)) # * CREATE FULLSCREEN # self.screen = pygame.display.set_mode( # (0, 0), pygame.FULLSCREEN) # self.settings.screen_width = self.screen.get_rect().width # self.settings.screen_height = self.screen.get_rect().height pygame.display.set_caption("Tetris Dump Universe") # * FIGHTER INSTANCE # Fighter requires one instance of TDU game so we pass self for the current intance of the TDU game class self.fighter = Fighter(self) # * BULLETS INSTANCES self.bullets = pygame.sprite.Group() # * ALIEN GROUP INSTANCE self.aliens = pygame.sprite.Group() self._create_fleet() # *********************** FUNCTIONS ********************************************* def run_game(self): """Start MAIN LOOP for the game""" # while loop: manage Event loop and Screen updates while True: # Event Loop: Watch for keyboard and mouse events self._check_events() self.fighter.update() self.bullets.update() self._update_bullets() self._update_aliens() self._update_screen() def _check_events(self): """DETECTS REVELANT USER INPUT EVENTS""" for event in pygame.event.get(): # returns list of events if event.type == pygame.QUIT: sys.exit() # * On KEYDOWN = True elif event.type == pygame.KEYDOWN: self._check_keydown_events(event) # * On KEYUP = False elif event.type == pygame.KEYUP: self._check_keyup_events(event) def _check_keydown_events(self, event): if event.key == pygame.K_RIGHT: # Move the fighter to the right self.fighter.moving_right = True elif event.key == pygame.K_LEFT: # Move the fighter left self.fighter.moving_left = True elif event.key == pygame.K_q: sys.exit() # shoots bullet elif event.key == pygame.K_SPACE: self._fire_bullet() def _check_keyup_events(self, event): if event.key == pygame.K_RIGHT: self.fighter.moving_right = False elif event.key == pygame.K_LEFT: self.fighter.moving_left = False def _fire_bullet(self): """Create a new bullet and add it to the bullets group""" # first we check the elngth of bullets that are active if len(self.bullets) < self.settings.bullets_allowed: new_bullet = Bullet(self) self.bullets.add(new_bullet) def _update_bullets(self): """Update position of bullets and get rid of old bullets""" # Update bullet position for bullet in self.bullets.copy(): if bullet.rect.bottom <= 0: self.bullets.remove(bullet) def _update_aliens(self): """Checl if the fleet is at an edge Update the position of all aliens in the fleet""" self._check_fleet_edges() self.aliens.update() def _create_fleet(self): """Create the fleet of alien""" # Create an alien and find the number of aliens in a row # Spacing between each alien is equal to the one alien width alien = Alien(self) # Make an alien for calculations alien_width, alien_height = alien.rect.size # alien_width = alien.rect.width # get alien width # Calc horizontal space available for aliens and the number of aliensthat can fit available_space_x = self.settings.screen_width - (2 * alien_width) number_alien_x = available_space_x // (2 * alien_width) # Determinate the number of rows of alien that fit on the screen fighter_height = self.fighter.rect.height available_space_y = (self.settings.screen_height - (10 * alien_height) - fighter_height) number_rows = available_space_y // (2 * alien_height) # Create fleet of aliens for row_number in range(number_rows): for alien_number in range(number_alien_x): self._create_alien(alien_number, row_number) def _create_alien(self, alien_number, row_number): """Create an alien and place it in the row""" alien = Alien(self) alien_width, alien_height = alien.rect.size # each alien is push to the right 1 alien width of space from the left margin # Calc:The alien width * 2 to account for the empty spaceincluding the empty space to the right the * by the alien's position. alien_width = alien.rect.width alien.x = alien_width + 2 * alien_width * alien_number alien.rect.x = alien.x alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number # adds alien to group self.aliens.add(alien) def _check_fleet_edges(self): """Respond appropriately if any aliens have reached an edge""" for alien in self.aliens.sprites(): if alien.check_edges(): self._change_fleet_direction() break def _change_fleet_direction(self): """Drop the entire fleet and change the fleet's direction""" for alien in self.aliens.sprites(): alien.rect.y += self.settings.fleet_drop_speed self.settings.fleet_direction *= -1 def _update_screen(self): """Redraw the screen during each pass through the loop""" self.screen.fill(self.settings.bg_color) self.fighter.blitme() # bullets.sprite returns a list of all sprites in bullets for bullet in self.bullets.sprites(): # calls draw_bullet() on bullet bullet.draw_bullet() # adds or draw aliens to screen self.aliens.draw(self.screen) # Make the most recently drawn screen visible (updates loc of game elements) pygame.display.flip()
class Game: def __init__(self, screen, clock): self.screen = screen self.clock = clock self.width, self.height = self.screen.get_size() self.world = World(self.width, self.height) self.knight = Fighter('Knight', 30, 10, 3, 0) self.bandits = self.create_bandits(2) def run(self): self.playing = True while self.playing: self.clock.tick(FPS) self.events() self.draw() self.update() def events(self): for event in pg.event.get(): if event.type == pg.QUIT: pg.quit() sys.exit() if event.type == pg.KEYDOWN: if event.key == pg.K_ESCAPE: pg.quit() sys.exit() def update(self): self.knight.update() for bandit in self.bandits: bandit.update() def draw(self): self.world.draw(self.screen) self.knight.draw(self.screen) for bandit in self.bandits: bandit.draw(self.screen) pg.display.flip() def create_bandits(self, amount): arr = [] for i in range(amount): arr.append(Fighter("Bandit", 20, 6, 1, i)) return arr
class Game: def __init__(self): pygame.mixer.pre_init(frequency=22050, size=-16, channels=8, buffer=256) pygame.init() pygame.display.set_caption("Injection") pygame.mixer.init() self.clock = pygame.time.Clock() self.surface = pygame.display.set_mode((1024, 768), pygame.DOUBLEBUF) self.viewport = Viewport(self) self.world = World(self, "gfx/world01.json") self.fighter1 = Fighter(self, 'g', startpos=(100, 0)) self.fighter2 = Fighter(self, 'r', startpos=(850, 0)) self.fighter2.rect.left = 800 self.pointsbar1 = PointsBar(self.fighter1, pygame.Rect(22, 17, 323, 27), color=1) self.pointsbar2 = PointsBar(self.fighter2, pygame.Rect(683, 17, 323, 27), color=2) self.injectionsbar1 = InjectionsBar(self.fighter1, pygame.Rect(33, 50, 300, 27)) self.injectionsbar2 = InjectionsBar(self.fighter2, pygame.Rect(695, 50, 300, 27)) self.roundcounter = RoundCounter(self, pygame.Rect(427, 0, 167, 50)) self.ai = FightingAi(self, self.fighter2) self.menu = Menu(self) self.ignore_keys = False self.multiplayer = 0 self.fireballs = [] pygame.mixer.music.load("snd/music.wav") pygame.mixer.music.set_volume(.35) #pygame.mixer.music.set_volume(0) pygame.mixer.music.play() self.f = self.fighter1 def ev_quit(self, e): pass def ev_keydown(self, e): if self.ignore_keys: return # Fighter 2 if self.multiplayer: if e.key == pygame.K_RIGHT: self.fighter2.right() elif e.key == pygame.K_LEFT: self.fighter2.left() elif e.key == pygame.K_DOWN: self.fighter2.block() elif e.key == pygame.K_SLASH: self.fighter2.jump() elif e.key == pygame.K_PERIOD: self.fighter2.punch() elif e.key == pygame.K_COMMA: self.fighter2.kick() elif e.key == pygame.K_UP: if self.fighter2.current_injection < len(self.fighter2.injections) - 1: self.fighter2.switch_to_injection(self.fighter2.current_injection + 1) # Fighter 1 if e.key == pygame.K_d: self.fighter1.right() elif e.key == pygame.K_a: self.fighter1.left() elif e.key == pygame.K_s: self.fighter1.block() elif e.key == pygame.K_j: self.fighter1.jump() elif e.key == pygame.K_h: self.fighter1.punch() elif e.key == pygame.K_g: self.fighter1.kick() elif e.key == pygame.K_w: if self.fighter1.current_injection < len(self.fighter1.injections) - 1: self.fighter1.switch_to_injection(self.fighter1.current_injection + 1) elif e.key == pygame.K_ESCAPE: self.menu.current_menu = 0 self.menu.active = 1 self.roundcounter.round = -1 self.fighter1.wins = 0 self.fighter2.wins = 0 def ev_keyup(self, e): if self.ignore_keys: return # Fighter 2 if self.multiplayer: if e.key == pygame.K_LEFT: self.fighter2.stop_left() elif e.key == pygame.K_RIGHT: self.fighter2.stop_right() # Fighter 1 if e.key == pygame.K_a: self.fighter1.stop_left() elif e.key == pygame.K_d: self.fighter1.stop_right() def opponent(self, caller): opp = self.fighter2 if opp == caller: opp = self.fighter1 return opp def hit_opponent(self, caller, damage, hit_boxes=None, kind='physical'): opp = self.opponent(caller) opp_hb = opp.hit_boxes() direction = 1 if caller.looking_right: direction = -1 if hit_boxes == None: hit_boxes = caller.hit_boxes() if any([x.collidelist(opp_hb) != -1 for x in hit_boxes]): opp.take_damage(damage, direction, kind=kind) return True return False def game_over(self): if self.fighter1.wins > self.fighter2.wins: gameover_image = pygame.image.load("gfx/player1won.png") else: gameover_image = pygame.image.load("gfx/player2won.png") self.surface.blit(gameover_image, (330, 140)) self.roundcounter.render(self.surface) pygame.display.flip() while True: for e in pygame.event.get(): if e.type == pygame.KEYDOWN: if e.key == pygame.K_RETURN: self.roundcounter.round = -1 self.fighter1.wins = 0 self.fighter2.wins = 0 self.fighter1.reset() self.fighter2.reset() self.menu.activate() return def next_round(self): if self.roundcounter.round < len(self.roundcounter.rounds) - 1: if self.fighter1.wins == 2 or self.fighter2.wins == 2: self.game_over() return self.fighter1.reset() self.fighter2.reset() self.ai.reset() for inj in self.injectionsbar1.injections[1:]: inj.disabled = False inj.activate = False for inj in self.injectionsbar2.injections[1:]: inj.disabled = False inj.activate = False self.pointsbar1.health = self.fighter1.health self.pointsbar2.health = self.fighter2.health self.viewport.offset = 0 self.roundcounter.next_round() else: self.game_over() def check_state(self): if self.fighter1.health <= 0: self.fighter2.wins += 1 self.next_round() if self.fighter2.health <= 0: self.fighter1.wins += 1 self.next_round() def main_loop(self): while True: if self.menu.active: self.fighter1.reset() self.fighter2.reset() self.menu.loop() self.clock.tick(30) for e in pygame.event.get(): if e.type == pygame.QUIT: self.ev_quit(e) elif e.type == pygame.KEYDOWN: self.ev_keydown(e) elif e.type == pygame.KEYUP: self.ev_keyup(e) self.fighter1.update() self.fighter2.update() self.surface.fill((0, 0, 0)) self.world.render(self.surface) self.fighter1.render(self.surface) self.fighter2.render(self.surface) self.pointsbar1.render(self.surface) self.pointsbar2.render(self.surface) self.injectionsbar1.render(self.surface) self.injectionsbar2.render(self.surface) self.roundcounter.render(self.surface) if not self.ignore_keys and not self.multiplayer: self.ai.update() for f in self.fireballs: f.update() f.render(self.surface) pygame.display.flip()