Python項目實戰學習 外星人入侵 第一篇 飛船大戰 基礎飛船的繪製以及左右移動控制

外星人入侵

創建pygame遊戲窗口 主文件 alien_invasion.py

alien_invasion.py 是整個遊戲都要用到的對象,存儲了ai_settings中的設置、存儲在screen的主線是surface以及一個飛船實例。
進入外星人入侵遊戲,就只能運行這個文件。

import sys
import pygame
from setting import Settings
from ship import Ship
import game_functions as gf
def run_game():
    # 初始化遊戲並創建一個屏幕對象
    pygame.init()  #初始化背景設置
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    #創建一個sceen窗口
    pygame.display.set_caption("Alien Invasion")
    #創建一艘飛船
    ship = Ship(ai_settings,screen)
    #設置背景顏色
    bg_color = (230, 230, 230)
    #開始遊戲的主循環
    #循環控制管理屏幕更新
    while True:
        gf.check_events(ship)
        ship.update()
        gf.update_screen(ai_settings, screen, ship)
run_game()

存儲基本設置參數的文件 settings.py

settings.py 包含Settings類,這個類只有__init__()方法,初始化控制遊戲的外觀飛行速度屬性

class Settings():
    """ 存儲 遊戲 的所有設置的類,存放一些基本參數"""
    def __init__(self):
        """ 初始化遊戲的設置"""
        #屏幕設置
        self.screen_width = 600
        self.screen_height  = 400
        self.bg_color =  (230,230,230)
        # 設置屬性ship_speed_factor來控制飛船的速度
        # 移動飛船時移動1.5 個像素
        self.ship_speed_factor = 1.0

遊戲運行文件,事件響應 game_functions.py

文件game_functions.py包含了一系列的函數,遊戲的大部分工作都是由它們完成。 如事件監聽,飛船的控制

import sys
import pygame
def check_events(ship):
    """ 響應按鍵和鼠標事件,在這個方法中指定需要檢查的事件 """
    # 事件都是通過pygame.event.get()方法獲取
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
         # 每次按鍵都會註冊一個KEYDOWN
         # 檢測到KEYDOWN事件時,我們需要檢查按下的是否是特定的鍵
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event,ship)
        # 鬆開方向鍵時觸發的事件,將moving_right or moving_left設爲false
        elif event.type == pygame.KEYUP:
            check_keyup_events(event,ship)
        
def check_keydown_events(event,ship):
    # 響應按鍵 右方向鍵
    # 通過讀取event.key,檢查按下的是否是右箭頭鍵
    if event.key == pygame.K_RIGHT:
        # 向右移動飛船
        # ship.rect.centerx += 1  飛船向右移動
        ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        # 向左移動飛船
        # ship.rect.centerx -= 1
        ship.moving_left = True

def check_keyup_events(event ,ship):
    # 響應鬆開
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False
    elif event.key == pygame.K_LEFT:
        ship.moving_left = False
def update_screen(ai_settings, screen, ship):
    # 更新屏幕上的圖像, 並切換新屏幕
    #每次循環都會重繪製屏幕
    screen.fill(ai_settings.bg_color)    #只能有一個參數
    ship.blitme()
    # 讓最近繪製的屏幕可見
    pygame.display.flip()

創建ship.py 飛船類 飛船的屬性

文件ship.py包含Ship類,這個類包含方法__init__()、管理飛船位置的方法update()以及在屏幕上繪製飛船的方法blitme()。

import pygame
class Ship():
    def __init__(self,ai_settings, screen):
        """ 初始化飛船設置其初始化位置"""
        self.screen = screen
        self.ai_settings = ai_settings
        # 加載飛船圖像並獲取其外接矩形
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect() 
        self.screen_rect = screen.get_rect()
        #將每艘新飛船放在屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
        # 在飛船的屬性center中存儲小數值
        self.center = float(self.rect.centerx)
        # 添加一個向右移動的屬性 初始化爲False
        # 在向右鍵按下時,爲真,鬆開爲False,實現按住持續移動
        self.moving_right = False
        self.moving_left = False

        # 更新飛船的位置座標,窗口寬1200,飛船默認居中。
        # 右加左減
    def update(self):
        #控制飛船活動範圍的方法,一種是限制位置變量的取值範圍,這樣是固定的範圍
        #一種是動態限制範圍,以下是動態限制
        # self.rect.right返回飛船外接矩形的右邊緣的x座標,
        # 如果這個值小於self.screen_rect.right的值,就說明飛船未觸及屏幕右邊緣
        if self.moving_right and self.rect.right<self.screen_rect.right:
            # self.rect.centerx +=1
            # ai_settings是settings模塊中的函數,函數裏面有ship_speed_factor速度變量
            self.center += self.ai_settings.ship_speed_factor
        if self.moving_left and self.rect.left>0:
            self.center -= self.ai_settings.ship_speed_factor
        # center是自己創建的一個變量,用來記錄飛船的位置
        # self.rect.centerx是系統的變量,用來控制飛船的位置
        self.rect.centerx = self.center
    def blitme(self):
        """ 在指定位置繪製飛船"""
        self.screen.blit(self.image,self.rect)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章