python-pygame實現飛機大戰-添加背景以及飛機運動


不多說,先上圖(看到這個熟悉不,我也是網絡上找的教程以及資源,去一步步學着寫的,這里我把項目拆解了幾大步,接下來一步步說明):

 

 

先准備資源,網絡上也可以下載到,我這里直接用的教程的資源,為什么呢(確實好看,自己找的慘不忍睹)

 

 

 

 然后不多說,上代碼(本次實現的是放背景圖片+飛機跟誰鍵盤操作運動)
main.py,注釋基本上都加了,不清楚的可以試着百度一下對應的方法

import pygame
import sys
import traceback
from pygame.locals import *
from random import *
import myplane

# 初始化
pygame.init()
# 設置窗口大小
bg_size = width, height = 400, 700  # 實際上是元組
screen = pygame.display.set_mode(bg_size)  # 設置窗口
pygame.display.set_caption("飛機大戰")  # 窗口標題
# 加載背景圖片,對於普通圖像的顯示效果有沒有convert都是一樣的,但是 使用 convert 可以轉換格式,提高 blit 的速度
background = pygame.image.load("images/background.png").convert()

def main():
    # 創建時鍾對象(可以控制游戲循環頻率)
    clock = pygame.time.Clock()

    # 生成玩家飛機
    me = myplane.MyPlane(bg_size)

    # 玩家三條命
    life_num = 3

    # 游戲暫停,默認為非暫停狀態
    paused = False

    # 控制玩家飛機圖片切換,展示突突突的效果
    switch_image = True
    # 切換延時
    delay = 100

    running = True
    while running:
        # 獲取事件
        for event in pygame.event.get():
            # 結束事件觸發結束操作
            if event.type == QUIT:
                pygame.quit()
                sys.exit()


        # 檢測用戶鍵盤操作,分別為上下左右
        key_pressed = pygame.key.get_pressed()
        if key_pressed[K_w] or key_pressed[K_UP]:
            me.moveUp()
        if key_pressed[K_s] or key_pressed[K_DOWN]:
            me.moveDown()
        if key_pressed[K_a] or key_pressed[K_LEFT]:
            me.moveLeft()
        if key_pressed[K_d] or key_pressed[K_RIGHT]:
            me.moveRight()


        # 在屏幕上面繪制背景圖像,並指定位置
        screen.blit(background, (0, 0))

        # 繪制子彈補給、炸彈補給等各種元素
        # 未暫停且生命大於0
        if paused == False and life_num > 0:
            # 繪制玩家飛機,如果飛機為激活狀態
            if me.active:
                # 在屏幕上繪制玩家飛機,switch_image為是否切換圖片
                if switch_image:
                    screen.blit(me.image1, me.rect)
                # 代表切換一下飛行圖片
                else:
                    screen.blit(me.image2, me.rect)
            # 代表飛機遭到碰撞,激活爆炸事件
            else:
                print("飛機損毀")

            delay -= 1
            if delay == 0:
                delay = 100
            # 每5幀切換一下飛行圖片樣式
            if delay % 5 == 0:
                switch_image = not switch_image

        # 在屏幕上面繪制背景圖像,並指定位置
        screen.blit(me.image1, me.rect)

        # 更新整個待顯示的  Surface 對象到屏幕上,將內存中的內容顯示到屏幕上
        pygame.display.flip()
        # 通過時鍾對象指定循環頻率,每秒循環60次
        # 幀速率是指程序每秒在屏幕山繪制圖
        clock.tick(60)

if __name__ == "__main__":
    try:
        main()
    # 服務正常退出
    except SystemExit:
        print("游戲正常退出!")
        # pass忽略錯誤並繼續往下運行,其實這里以及退出了
        pass
    # 服務出現其他的異常
    except:
        # 直接將錯誤打印出來
        traceback.print_exc()
        pygame.quit()

myplane.py:主要是玩家飛機的控制,包括玩家飛機各種屬性、飛機的上下左右移動,以及飛機的重生

import pygame

# 玩家飛機類,pygame.sprite模塊里面包含了一個名為Sprite類,他是pygame本身自帶的一個精靈。
class MyPlane(pygame.sprite.Sprite):
    def __init__(self, bg_size):
        # convert_alpha()更改圖像的像素格式,包括每個像素的alpha,相當於圖片背景變為透明
        self.image1 = pygame.image.load('images/me1.png').convert_alpha()
        self.image2 = pygame.image.load('images/me2.png').convert_alpha()
        # 飛機摧毀圖片,以數字形式保存
        self.destory_image = []
        self.destory_image.extend([
            pygame.image.load('images/me_destroy_1.png').convert_alpha(),
            pygame.image.load('images/me_destroy_2.png').convert_alpha(),
            pygame.image.load('images/me_destroy_3.png').convert_alpha(),
            pygame.image.load('images/me_destroy_4.png').convert_alpha()
        ])
        # 定義屏幕寬高
        self.width = bg_size[0]
        self.height = bg_size[1]

        # get_rect()是一個處理矩形圖像的方法,返回值包含矩形的居中屬性,這里返回飛機圖片1的位置,可以獲取圖片的寬高等屬性
        self.rect = self.image1.get_rect()

        # 飛機的初始化位置,//是整除,位置居中以及高度為圖片下框離屏幕最下方60
        self.rect.left = (self.width - self.rect.width)//2
        self.rect.top = self.height - self.rect.height - 60

        # 設置飛機的速度
        self.myPlaneSpeed = 10
        self.active = True

        # 設置飛機是否是無敵狀態(重生3秒內無敵)
        self.invincible = True

        # 飛機碰撞檢測,會忽略掉圖片中白色的背景部分,從指定 Surface 對象中返回一個 Mask
        # 用於快速實現完美的碰撞檢測,Mask 可以精確到 1 個像素級別的判斷。
        # Surface 對象中透明的部分設置為 1,不透明部分設置為 0。
        self.mask = pygame.mask.from_surface(self.image1)

    # 玩家飛機向上移動
    def moveUp(self):
        # 說明還沒定格,即還未到達游戲界面上邊界
        if self.rect.top > 0:
            self.rect.top -= self.myPlaneSpeed
        # 說明移動到達上邊界了
        else:
            self.rect.top = 0

    # 玩家飛機向下移動
    def moveDown(self):
        # 底部需要划出60的高度用來展示其他數據(炸彈數,生命數等)
        if self.rect.bottom < self.height - 60:
            # self.rect.bottom指的是飛機圖片下邊界
            self.rect.bottom += self.myPlaneSpeed
        else:
            self.rect.bottom = self.height - 60

    # 玩家飛機向左移動
    def moveLeft(self):
        if self.rect.left > 0:
            self.rect.left -= self.myPlaneSpeed
        else:
            self.rect.left = 0

    # 玩家飛機向右移動
    def moveRight(self):
        if self.rect.right < self.width:
            self.rect.right += self.myPlaneSpeed
        else:
            self.rect.right = self.width

    # 玩家飛機重生
    def reset(self):
        self.active = True
        # 重生時處於無敵狀態
        self.invincible = True
        # 重生飛機的初始化位置,//是整除,位置居中以及高度為圖片下框離屏幕最下方60
        self.rect.left = (self.width - self.rect.width) // 2
        self.rect.top = self.height - self.rect.height - 60

對其中某一步不清楚的,也可以提出來,我也是小菜雞,屬於摸索階段,有問題請輕點噴
然后運行main.py的時候,就可以控制游戲玩家的飛機進行移動了(后面會慢慢加上各種其他功能)

 


免責聲明!

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



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