上面一節主要介紹pygame入門,這一節是利用面向對象完成整個項目設計:子彈射擊敵機,戰機碰撞敵機,用戶左右控制戰機移動等等
1、知識點:pygame中提供了倆個非常強大的類精靈類和精靈組類:
精靈類可以創建很多對象,例如:創建多個敵機,是用精靈類創建方便快速,代碼簡潔
精靈組可以接受多個精靈類創建的對象,並且可以一次性將多個對象一次性繪制到屏幕
首先創建一個plane_sprites模塊,所有創建的敵機精靈,戰機精靈,子彈精靈等類都寫在此文件:
import pygame import random """pygame中提供了倆個非常強大的類精靈類和精靈組類 精靈類可以創建很多對象,例如:創建多個敵機,是用精靈類創建方便快速,代碼簡潔 精靈組可以接受多個精靈類創建的對象,並且可以一次性將多個對象一次性繪制到屏幕 """ SCREEN=pygame.Rect(0,0,480,700) # 屏幕大小常量 CREAT_EVENT=pygame.USEREVENT # 定時器常量,這個用於向屏幕定時添加敵機 BULLET_EVENT = pygame.USEREVENT+1 # 這也是定時器常量,用於定時發射子彈。 class PlaneSprites(pygame.sprite.Sprite): """創建精靈類""" def __init__(self, image, speed=1): super().__init__() self.image = pygame.image.load(image) self.rect = self.image.get_rect() self.speed = speed # 重寫update方法 def update(self): self.rect.y += self.speed """制作背景滾動:方法就是需要倆張一摸一樣的圖片,一張位置放在覆蓋屏幕,另外一張放在屏幕上方,一起向下移動時, 當第一張剛好移到屏幕最下方,第二張剛好覆蓋屏幕,此時將第一張再放到屏幕上方,如此循環,看到的效果就是背景滾動了 提示:rect設置的矩形對象,xy值默認的是(0,0) """ class BackGround(PlaneSprites): def __init__(self,is_flag=False): super().__init__('./images/background.png') if is_flag: self.rect.y =-self.rect.height def update(self): super().update() if self.rect.y >= SCREEN.height: # 判斷圖片是否滾出屏幕,如果背景圖片rect對象的y值大於屏幕的高度 self.rect.y =-self.rect.height # 將背景圖的y值設置為背景圖高度的負值,這張圖片就在屏幕上方 # 創建敵機類 class CreatPlane(PlaneSprites): def __init__(self): super().__init__('./images/enemy1.png') self.speed = random.randint(1,3) # 利用隨機數控制敵機飛行速度 self.rect.y = -self.rect.height self.rect.x = random.randint(0, SCREEN.width-self.rect.width) def update(self): super().update() if self.rect.y >= SCREEN.height: self.kill() def __del__(self): print('敵機消失.....') # 創建戰機類 class CreatHero(PlaneSprites): def __init__(self): super().__init__('./images/me1.png', speed=0) self.rect.centerx = SCREEN.centerx self.rect.bottom = SCREEN.bottom-120 self.bullet_gruop = pygame.sprite.Group() def update(self): self.rect.x += self.speed if self.rect.x < 0: self.rect.x = 0 elif self.rect.right > SCREEN.right: self.rect.right = SCREEN.right # 發射子彈 def fire(self): for i in (0, 1, 2): bullt = CreatBullet() bullt.rect.bottom = self.rect.y-i*20 bullt.rect.centerx = self.rect.centerx self.bullet_gruop.add(bullt) # 創建子彈精靈類 class CreatBullet(PlaneSprites): def __init__(self): super().__init__('./images/bullet1.png', speed=-2) def update(self): super().update() if self.rect.y < SCREEN.y: self.kill() def __del__(self): print('子彈消失......')
2、創建一個plane_main模塊,這個是運行的主程序入口:
import pygame from plane_sprites import * class GamePlay(object): def __init__(self): self.screen = pygame.display.set_mode(SCREEN.size) self.clock = pygame.time.Clock() self.__creat_sprite() pygame.time.set_timer(CREAT_EVENT, 1000) # 定時器:第一個參數是定時事件發生的,第二是每隔多少毫秒發生一次,這里是每個1秒觸發這個定時器 pygame.time.set_timer(BULLET_EVENT, 500) def start_game(self): while True: self.clock.tick(60) self.__update() pygame.display.update() self.__event() self.__chenck() def __chenck(self): # 子彈摧毀敵機 pygame.sprite.groupcollide(self.hero.bullet_gruop,self.enemy_group,True,True) # 敵機碰撞戰機 bullet_list = pygame.sprite.spritecollide(self.hero,self.enemy_group, True) if len(bullet_list) != 0: self.hero.kill() GamePlay.game_over() def __creat_sprite(self): # hero1=BackGround('./images/background.png') # hero2=BackGround('./images/background.png') # hero2.rect.y =-hero2.rect.height # 創建背景精靈和精靈組 bg1 = BackGround() bg2 = BackGround(is_flag=True) self.bg_group = pygame.sprite.Group(bg1,bg2) # 創建敵機精靈組 self.enemy_group = pygame.sprite.Group() # 創建戰機精靈和精靈組 self.hero = CreatHero() self.hero_group = pygame.sprite.Group(self.hero) self.hero.bullet_gp = pygame.sprite.Group() # 更新精靈的位置 def __update(self): # 更新背景圖片位置 self.bg_group.update() self.bg_group.draw(self.screen) # 更新敵機位置 self.enemy_group.update() self.enemy_group.draw(self.screen) # 更新戰機位置 self.hero_group.update() self.hero_group.draw(self.screen) # 更新子彈位置 self.hero.bullet_gruop.update() self.hero.bullet_gruop.draw(self.screen) # 事件監聽 def __event(self): for event in pygame.event.get(): if event.type == pygame.QUIT: # 當監聽事件為退出事件,則退出游戲 print('游戲退出....') pygame.quit() # 卸載所有模塊 exit() # 退出整個系統 elif event.type == CREAT_EVENT: # 當監聽事件為定時器發生的,則創建一個敵機 enemy1 = CreatPlane() self.enemy_group.add(enemy1) elif event.type == BULLET_EVENT: self.hero.fire() keys_press = pygame.key.get_pressed() # 鍵盤操作戰機左右移動 if keys_press[pygame.K_RIGHT]: # 按下右鍵, self.hero.speed = 2 elif keys_press[pygame.K_LEFT]: # 按下左鍵 self.hero.speed = -2 else: self.hero.speed = 0 @staticmethod def game_over(): pygame.quit() if __name__ == '__main__': game = GamePlay() game.start_game()
3、運行效果如下: