python-pygame飛機大戰version1
阿新 • • 發佈:2018-11-14
分為兩個檔案,一個為遊戲入口檔案,進行遊戲的初始化,開啟遊戲迴圈
需求分析:
飛機大戰需要做的事情
1,迴圈前的準備
2,迴圈開始
迴圈前的準備:
載入畫布
載入時鐘
載入英雄
迴圈開始:
設定迴圈的幀 __
設定事件監聽 __event_handler
檢測碰撞 __check_collide
重新整理螢幕 pygame.dispaly.update()
對類的構造:
英雄飛機
敵方飛機
plane_main.py
import pygame from plane_sprites import * class PlaneGame(object): def __init__(self): self.screen = pygame.display.set_mode(SCREEN_RECT.size) self.clock = pygame.time.Clock() self.__create_sprites() pygame.time.set_timer(CREATE_ENEMY_EVENT,1000) def __create_sprites(self): bg1 = BackGround() bg2 = BackGround(True) #? # bg2.rect.y = -SCREEN_RECT.height self.back_group = pygame.sprite.Group(bg1,bg2) self.enemy_group = pygame.sprite.Group() self.hero = Hero() self.hero_group = pygame.sprite.Group(self.hero) def start_game(self): while True: self.clock.tick(FRAME_PER_SEC) self.__event_handler() self.__check_collide() self.__update_sprites() pygame.display.update() def __event_handler(self): for event in pygame.event.get(): if event.type == pygame.QUIT: PlaneGame.__game_over() elif event.type == CREATE_ENEMY_EVENT: print("敵機出場") enemy = Enemy() self.enemy_group.add(enemy) # elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: # print("向右移動") keys_pressed = pygame.key.get_pressed() if keys_pressed[pygame.K_RIGHT]: print("持續向右移動") self.hero.speed = 2 elif keys_pressed[pygame.K_LEFT]: self.hero.speed = -2 else: self.hero.speed = 0 def __check_collide(self): pass def __update_sprites(self): self.back_group.update() self.back_group.draw(self.screen) self.enemy_group.update() self.enemy_group.draw(self.screen) self.hero_group.update() self.hero_group.draw(self.screen) @staticmethod def __game_over(): print("遊戲結束") pygame.quit() exit() if __name__ == "__main__": game = PlaneGame() game.start_game()
在另外一個檔案中將精靈的建立和一些常量進行設定,這樣做的目的是保證了一個檔案只書寫一個類,而且讓主程式結構清晰。
plane_sprites.py
import random import pygame SCREEN_RECT = pygame.Rect(0,0,480,600) FRAME_PER_SEC = 60 CREATE_ENEMY_EVENT = pygame.USEREVENT class GameSprite(pygame.sprite.Sprite): """飛機大戰遊戲精靈""" def __init__(self,image_name,speed=1): super().__init__() self.image = pygame.image.load(image_name) self.rect = self.image.get_rect() #返回照片的位置 print(self.rect) self.speed = speed def update(self): self.rect.y += self.speed class BackGround(GameSprite): # def __init__(self,image_name): # super().__init__() def __init__(self,is_alt=False): super().__init__("./image/background.jpg") if is_alt: self.rect.y = -self.rect.height def update(self): super().update() if self.rect.y >= SCREEN_RECT.height: self.rect.y = -self.rect.height class Enemy(GameSprite): def __init__(self): super().__init__("./image/enemy1.png") self.speed = random.randint(1,3) self.rect.bottom = 0 max_x = SCREEN_RECT.width - self.rect.width self.rect.x = random.randint(0,max_x) def update(self): super().update() if self.rect.y >= SCREEN_RECT.height: print("飛出螢幕需要從精靈組中刪除") self.kill() def __del__(self): print("敵機掛了 %s" % self.rect) class Hero(GameSprite): def __init__(self): super().__init__("./image/me1.png",0) self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom - 120 def update(self): self.rect.x += self.speed if self.rect.x < 0 : self.rect.x = 0 elif self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right
以上已經解決了,背景的迴圈重新整理,敵方飛機的隨機出現,退出遊戲事件監聽,玩家角色的移動,以及移動的邊界控制。
還沒有做到的是:玩家角色和敵方飛機的子彈發射,以及碰撞檢測