二、飛機大戰終極版-鞏固面向對象設計項目的思想


上面一節主要介紹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、運行效果如下:

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM