雷霆戰機

前言

  多年前,你我在一塊兒"打飛機"。爲了實現真正的打飛機,在下一年前踏足帝都學習了無所不能的Python,辣麼接下來帶你在倆個小時用200行代碼學會打飛機。html

  python中提供了一個pygame的模塊可以讓咱們快速編寫一個遊戲。接下來,簡要建立一個目錄結構,存放代碼(規範的目錄結構可讓代碼保持高度的靈活性及可讀性),以下: python

複製代碼
"""
PlayPlane/
|-- bin/
|   |-- main.py         程序運行主體程序
|-- config/
|   |-- settings.py     程序配置(例如: 遊戲背景音樂的加載等)
|-- material            程序素材放置(打飛機遊戲素材放置)
    |-- ...
|-- src/                程序主體模塊存放
|   |-- __init__.py 
|   |-- bullet.py       我方飛機發射子彈實現代碼存放
|   |-- enemy.py        敵方飛機實現代碼存放
|   |-- plane.py        我方飛機實現代碼存放
|-- manage.py           程序啓動文件
|-- README.md           
""" 
複製代碼

打飛機啦

1、首先在 config/settings.py 中進行如下功能的實現git

遊戲素材滑動到文章底部點擊連接便可下載github

  • 遊戲初始化
  • 遊戲混音器初始化
  • 背景音樂初始化
  • 我方飛機掛了音樂
  • 敵方飛機掛了音樂
  • 子彈發射音樂
  config/settings.py

2、小試牛刀
ide

飛機和子彈都是可移動的,那麼怎麼實現讓它們動起來呢(我方飛機能夠玩家進行操控,敵機就是隨機性的出現,子彈暫由我方飛機發射)。函數

在Pygame中,全部移動對象均可看作是一個精靈(sprite),精靈之間可以進行相互的交互通訊,例如如何讓碰撞檢測更加精準等等。學習

那麼先讓咱們先在屏幕上製做一個遊戲板,根據 settings.py 配置,並讓它有聲音播放,首先咱們在 bin/main.py 中這麼寫:spa

  咱們能夠直接運行它,那麼咱們會看到如下畫面,而且還會有激情的聲音吆!!!可是咱們要將文件配置爲絕對路徑才能夠運行,由於剛剛在settings中的加載的音樂文件爲相對路徑。code

  DEMO

接下來呢,咱們將要製做我方飛機,敵方飛機和子彈如何讓它們展現在遊戲畫板上,繼而讓它們變得可移動起來,請看代碼實現方案...htm

從遊戲畫板上添加飛機,首先咱們應怎樣在屏幕上輸出飛機???

上述講過,pygame中的 sprite(精靈)可以使一張圖片或者一個靜態物體動起來,那麼製做飛機須要考慮並作些什麼呢?

  1. 飛機的初始位置
  2. 經過按鍵 上下左右 來調控飛機的位置移動
  3. 飛機只能呆在製做的遊戲畫板中
  4. 飛機的速度
  5. 飛機死亡的加載
  6. 設定一個狀態標識飛機的存活
  7. 讓飛機具備動態的噴氣式效果

那麼如何實現以上的功能呢?接下來結合上述的示例代碼咱們先將我方飛機繪製到畫板上方,而且咱們經過按鍵 J 斷定我方飛機的存活狀態爲死亡,繪製飛機的死亡畫面並重置飛機

複製代碼
"""
    建立飛機
    在pygame中, 全部可移動的對象均叫可看做一個精靈(sprite)
    該類並實現了碰撞方法 spritecollide

    我方飛機和敵方飛機指定掩膜屬性以及生存狀態標誌位 添加 self.mask 屬性(能夠實現更精準的碰撞效果)
"""

# 倒入精靈模塊, 使飛機能夠動起來
import pygame


class OurPlane(pygame.sprite.Sprite):

    def __init__(self, bg_size):
        super(OurPlane, self).__init__()
        # 肯定我方飛機背景圖(有倆張,可讓它們不停的切換,造成動態效果)
        self.image_one = pygame.image.load("material/image/hero1.png")
        self.image_two = pygame.image.load("material/image/hero2.png")
        # 獲取我方飛機的位置
        self.rect = self.image_one.get_rect()
        # 本地化背景圖片的尺寸
        self.width, self.height = bg_size[0], bg_size[1]
        # 獲取飛機圖像的掩膜用以更加精確的碰撞檢測
        self.mask = pygame.mask.from_surface(self.image_one)
        # 定義飛機初始化位置,底部預留60像素
        self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60)
        # 設置飛機移動速度
        self.speed = 10
        # 設置飛機存活狀態(True爲存活, False爲死亡)
        self.active = True
        # 加載飛機損毀圖片
        self.destroy_images = []
        self.destroy_images.extend(
            [
                pygame.image.load("material/image/hero_blowup_n1.png"),
                pygame.image.load("material/image/hero_blowup_n2.png"),
                pygame.image.load("material/image/hero_blowup_n3.png"),
                pygame.image.load("material/image/hero_blowup_n4.png")
            ]
        )

    def move_up(self):
        """
        飛機向上移動的操做函數,其他移動函數方法相似
        """
        if self.rect.top > 0:  # 若是飛機還沒有移動出背景區域
            self.rect.top -= self.speed
        else:  # 若即將移動出背景區域,則及時糾正爲背景邊緣位置
            self.rect.top = 0

    def move_down(self):
        """
        飛機向下移動
        """
        if self.rect.bottom < self.height - 60:
            self.rect.top += self.speed
        else:
            self.rect.bottom = self.height - 60

    def move_left(self):
        """
        飛機向左移動
        """
        if self.rect.left > 0:
            self.rect.left -= self.speed
        else:
            self.rect.left = 0

    def move_right(self):
        """
        飛機向右移動
        """
        if self.rect.right < self.width:
            self.rect.right += self.speed
        else:
            self.rect.right = self.width

    def reset(self):
        # 初始化飛機(飛機掛了, 初始化到初始位置)
        self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60)
        # 重置飛機的存活狀態
        self.active = True
複製代碼

上面的代碼寫了一個 咱們的飛機 (OurPlane) 類,它初始化了一些屬性以及 上下左右 移動的方法和重置方法,接下來將要運用它展現到遊戲畫板上面

因爲飛機是一直存在的,接下咱們主程序 main 下面的死循環中這樣寫

  1.在屏幕上繪製飛機
  2.讓飛機上下左右動起來
  3.按鍵爲 j 繪製飛機的死亡狀態

那麼上述的功能都已經實現了,接下來就開始真正的"打飛機"

3、接下來能夠製做我方飛機,敵方戰機,子彈等,這些功能均在 src/ 目錄下實現

  • 我方飛機根據按鍵上下左右進行移動,初始化位置,噴氣式圖片加載切換及重置效果等
  src/plane.py
  • 敵方飛機隨機移動出現及重置(製做出我方飛機以後,敵機和子彈其實都是大同小異的)
  src/enemy.py
  • 子彈按照我方飛機正中上方發射及頻率調控,重置
  src/bullet.py

在上面的內容中,使用面向對象的形式製做了遊戲中可移動的對象並繼承 pygame.sprite.Sprite 

4、繼而在 bin/main.py 中進行主體功能的實現

  • 初始化背景圖及大小
  • 我方飛機移動及發射子彈
  • 敵方飛機移動
  • 我方飛機和敵方飛機碰撞檢測
  • 鍵盤按鍵監測效果
  • 我方飛機和敵方飛機掛了效果繪製
  bin/main.py

5、暢汗淋漓,一鼓作氣打飛機

組合一下,running起來

from bin.main import main


if __name__ == '__main__':
    """
    環境: python3 + pygame
    running 起來就能夠打飛機了O(∩_∩)O~.
    """
    main()

原文來自:http://www.javashuo.com/article/p-vxjwovow-d.html

github下載:https://github.com/1352282824shy/-Lightning-Fighter-Game

相關文章
相關標籤/搜索