日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python游戏程序中游戏对象是什么_练习项目21:使用python制作游戏(下)

發(fā)布時間:2024/9/27 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python游戏程序中游戏对象是什么_练习项目21:使用python制作游戏(下) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

該樓層疑似違規(guī)已被系統(tǒng)折疊 隱藏此樓查看此樓

這一篇教程,我們來完成游戲的主程序模塊。

最終編寫完的游戲會有如下界面。

游戲界面匯總圖:

接下來,根據(jù)上一篇教程的結(jié)構(gòu),我們編寫每一個類的代碼。

一、State類

從游戲界面匯總圖中,我們能夠看出,游戲中會有暫停狀態(tài)(除關(guān)卡界面之外的界面)和運行狀態(tài)(關(guān)卡界面)。

State類就是將這兩個狀態(tài)進行抽象,包括。

無論那個狀態(tài)都需要對退出游戲的指令進行處理;

無論哪個狀態(tài)都要顯示界面內(nèi)容。

對于退出游戲指令的處理,我們需要定義一個處理方法;

而顯示內(nèi)容我們需要定義兩個方法,因為兩個狀態(tài)的內(nèi)容顯示要有不同的處理。

示例代碼:

class State:

"""泛型游戲狀態(tài)類,可以處理事件并在給定的表面上顯示自身。"""

def handle(self, event):

"""處理退出事件。"""

if event.type == QUIT:

sys.exit()

if event.type == KEYDOWN and event.key == K_ESCAPE:

sys.exit()

def paused_display(self, screen):

"""暫停時顯示。"""

r = config.getint('Screen', 'red')

b = config.getint('Screen', 'blue')

g = config.getint('Screen', 'green')

screen.fill((r, b, g)) # 屏幕填充顏色

pygame.display.flip() # 刷新顯示屏幕

def display(self, screen): # 默認(rèn)不作處理,由子類Level重寫。

"""刷新顯示時。"""

pass

二、Level類

這個類繼承State類,主要對關(guān)卡運行時進行相應(yīng)的處理。

具體實現(xiàn)過程,大家可以通過注釋理解。

示例代碼:

class Level(State):

"""游戲等級,用于計算共有多少敵機落下,移動游戲?qū)ο笠约捌渌c游戲相關(guān)的邏輯任務(wù)。"""

def __init__(self, number=1):

"""初始化關(guān)卡的等級和游戲?qū)ο蟆?#34;""

self.number = number # 初始化關(guān)卡級別

self.remaining = config.getint('Level', 'pre_level') # 初始化關(guān)卡敵機數(shù)量

speed = config.getint('Speed', 'drop_speed') # 獲取設(shè)置文件中的敵機速度數(shù)值

speed += (self.number - 1) * config.getint('Speed', 'speed_increase') # 計算當(dāng)前關(guān)卡敵機速度數(shù)值

self.enemy = objects.Enemy(speed) # 創(chuàng)建敵方飛機游戲?qū)ο?/p>

self.plane = objects.Plane() # 創(chuàng)建己方飛機對象

self.sprites = pygame.sprite.RenderUpdates(self.enemy, self.plane) # 創(chuàng)建游戲?qū)ο蠹砑佑螒驅(qū)ο?/p>

def update(self, game):

"""關(guān)卡運行,并進行游戲結(jié)束或通過關(guān)卡的處理。"""

self.sprites.update() # 刷新游戲?qū)ο?/p>

if self.plane.touches(self.enemy): # 如果碰撞到敵方飛機

game.next_state = GameOver() # 變更狀態(tài)為游戲結(jié)束

elif self.enemy.landed: # 如果敵方飛機從屏幕底邊移出

self.enemy.reset() # 重置敵方飛機位置

self.remaining -= 1 # 敵機數(shù)量減少1架

if self.remaining == 0: # 如果敵機數(shù)量為0

game.next_state = LevelCleared(self.number) # 變更狀態(tài)為清空關(guān)卡

def display(self, screen):

"""關(guān)卡運行時的屏幕顯示。"""

r = config.getint('Screen', 'red')

b = config.getint('Screen', 'blue')

g = config.getint('Screen', 'green')

screen.fill((r, b, g)) # 關(guān)卡運行時為屏幕填充顏色

updates = self.sprites.draw(screen) # 繪制屏幕外觀

pygame.display.update(updates) # 刷新屏幕外觀

三、Paused類

這個類繼承自State類,是其它暫停狀態(tài)類的超類。

暫停狀態(tài)基本都是白色的屏幕和黑色的文字內(nèi)容。

當(dāng)然,也有例外。

歡迎界面做了兩種不同的方案,方案1只有一張圖片,方案2既有文字又有圖片。

根據(jù)這些情況,我們分析一下如何處理。

如果只有圖片直接繪制圖片;

如果只有文字則在屏幕中心繪制文字;

如果既有文字又有圖片,將圖片繪制在文字上方,間隔20像素。

具體實現(xiàn)過程,請大家參考代碼中的注釋理解。

示例代碼:

class Paused(State):

"""暫停游戲的狀態(tài),按任意鍵或點擊鼠標(biāo)退出暫停狀態(tài)。"""

next_state = None # 存儲下一個游戲狀態(tài)

finish = False # 記錄是否完成按鍵或鼠標(biāo)點擊

image = None # 存儲屏幕中顯示的圖片

text = '' # 存儲屏幕中顯示的文字

def handle(self, event):

"""處理按任意鍵繼續(xù)游戲。"""

State.handle(self, event)

if event.type in [MOUSEBUTTONDOWN, KEYDOWN]: # 如果捕獲鼠標(biāo)點擊和按鍵的事件

self.finish = True # 記錄完成操作

def update(self, game):

"""按任意鍵時進入下一個游戲狀態(tài)。"""

if self.finish: # 如果按鍵或鼠標(biāo)點擊完成

game.next_state = self.next_state() # 將變量next_state中類的實例化,存入Game類進行處理。

def paused_display(self, screen):

"""暫停時顯示的處理。"""

State.paused_display(self, screen) # 重載超類中的方法

font = pygame.font.SysFont('SimHei', config.getint('Screen', 'font_size')) # 設(shè)置使用系統(tǒng)字體(用于支持中文)

lines = self.text.strip().splitlines() # 獲取子類中設(shè)置的文字內(nèi)容并分行

height = len(lines) * font.get_linesize() # 計算文字高度

center, middle = screen.get_rect().center # 獲取屏幕中心坐標(biāo)值

top = middle - height // 2 # 計算顯示內(nèi)容中心點的y軸坐標(biāo)

if self.image: # 如果有圖片

image = pygame.image.load(self.image).convert_alpha() # 載入圖片

img_rect = image.get_rect() # 創(chuàng)建矩形

top += img_rect.height // 2 # 重新計算頂部y軸坐標(biāo)

if self.text: # 如果有文字

img_rect.midbottom = center, top - 20 # 設(shè)置圖片位置為中心且底邊與文字頂部間隔20像素。

else: # 否則

img_rect.center = center, middle # 設(shè)置圖片中心點為屏幕中心點

screen.blit(image, img_rect) # 屏幕填充圖片

antialias = True # 設(shè)置抗鋸齒(平滑文字)

black = 0, 0, 0 # 設(shè)置文字顏色

for line in lines:

text = font.render(line.strip(), antialias, black) # 創(chuàng)建單行文字對象

txt_rect = text.get_rect() # 創(chuàng)建矩形

txt_rect.midtop = center, top # 設(shè)置文字顯示位置

screen.blit(text, txt_rect) # 屏幕填充文字

top += font.get_linesize() # 逐行下移文字位置

pygame.display.flip() # 刷新屏幕顯示

四、Paused類的子類(StartUp、Info、LevelCleared、GameOver)

這幾個子類都比較簡單,主要是定義暫停狀態(tài)下屏幕中顯示的內(nèi)容。

其中,略有不同的是LevelCleared類,在這個類中要進行下一個關(guān)卡的實例化。

另外,為了能夠方便更換歡迎界面的方案,在配置文件(config.ini)中我們新增一項配置內(nèi)容。

示例代碼:

[Welcome]

skin = 1

各個Paused類的子類實現(xiàn),大家可以根據(jù)下方代碼中的注釋理解。

示例代碼:

class Info(Paused):

"""游戲信息。"""

next_state = Level # 將類存入變量,以便在Paused類中實例化。

text = '''控制移動你的飛機,

不要被敵機撞到它。'''

class StartUp(Paused):

"""進入游戲。"""

next_state = Info # 將類存入變量,以便在Paused類中實例化。

if config.getint('Welcome', 'skin'): # 讀取配置文件中歡迎界面的方案設(shè)置

text = ''

image = config.get('Image', 'welcome')

else:

text = '老司機開飛機'

image = config.get('Image', 'plane')

class LevelCleared(Paused):

"""游戲過關(guān)。"""

def __init__(self, number):

"""過關(guān)信息。"""

self.number = number # 獲取當(dāng)前關(guān)卡級別

self.text = '''恭喜闖過第 %d 關(guān),

點擊繼續(xù)下一關(guān)。''' % self.number

def next_state(self):

"""創(chuàng)建下一關(guān)卡。"""

return Level(self.number + 1) # 返回下移關(guān)卡的對象

class GameOver(Paused):

"""游戲結(jié)束。"""

next_state = Level # 將類存入變量,以便在Paused類中實例化。

text = '游戲結(jié)束!'

五、Game類

這個類負責(zé)處理游戲的整個運行過程。

class Game:

"""負責(zé)主事件循環(huán)的游戲?qū)ο?#xff0c;完成在不同狀態(tài)間切換的任務(wù)。"""

def __init__(self):

"""初始化。"""

self.state = None # 初始化當(dāng)前狀態(tài)

self.next_state = StartUp() # 初始化下一個狀態(tài)為開始游戲的狀態(tài)

def run(self):

"""運行游戲。"""

pygame.init() # 游戲初始化

flag = 0 # 記錄是否全屏的標(biāo)志

if config.getint('Screen', 'full_screen'): # 如果配置文件中設(shè)置為全屏

flag = FULLSCREEN # 標(biāo)志設(shè)置為全屏

screen_size = (config.getint('Screen', 'width'), config.getint('Screen', 'height')) # 讀取配置文件中的屏幕尺寸設(shè)置

screen = pygame.display.set_mode(screen_size, flag) # 設(shè)置屏幕外觀模式

pygame.display.set_caption('老司機開飛機') # 設(shè)置游戲窗口標(biāo)題(非全屏?xí)r顯示)

pygame.mouse.set_visible(False) # 隱藏鼠標(biāo)指針顯示

while True:

pygame.time.Clock().tick(200) # 設(shè)置每秒幀數(shù)

if self.state != self.next_state: # 如果有新的游戲狀態(tài)

self.state = self.next_state # 切換到新的狀態(tài)

self.state.paused_display(screen) # 屏幕中顯示暫停狀態(tài)的內(nèi)容(切換狀態(tài)會進入暫停狀態(tài))

for event in pygame.event.get(): # 獲取事件

self.state.handle(event) # 處理事件

self.state.update(self) # 游戲?qū)ο蟮漠?dāng)前狀態(tài)內(nèi)容刷新

self.state.display(screen) # 屏幕中顯示刷新后的狀態(tài)內(nèi)容

到這里,我們就完成了這個項目所有代碼的編寫。

大家可以運行程序,查看一下是否能夠正確執(zhí)行。

示例代碼:

if __name__ == '__main__':

game = Game()

game.run()

本節(jié)練習(xí)源代碼:【點此下載】

總結(jié)

以上是生活随笔為你收集整理的python游戏程序中游戏对象是什么_练习项目21:使用python制作游戏(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。