IT培訓(xùn)網(wǎng)
IT在線學(xué)習(xí)
每個游戲的核心控制流程都是循環(huán),稱為游戲循環(huán)。游戲循環(huán)不斷地反復(fù)運(yùn)行,完成使游戲正常運(yùn)行所需的工作。每迭代一次游戲循環(huán)稱為一幀。
Pygame框架游戲循環(huán)中發(fā)生的事情可以分為三種不同的類別。
①事件:需要游戲做出響應(yīng)的所有內(nèi)容。例如,在鍵盤上按下的鍵,在鼠標(biāo)上點擊的鍵等。
②更新游戲:此框架上需要更改的所有內(nèi)容。例如,如果角色懸空,那么需要使用重力將其拉下來;如果兩個對象相遇,那么需要發(fā)生爆炸。
③渲染:將所有內(nèi)容繪制在屏幕上。例如,播放器需要查看的背景、角色、菜單或其他任何內(nèi)容,都必須在屏幕上正確的位置繪制。
游戲循環(huán)的關(guān)鍵是控制整個游戲循環(huán)的運(yùn)行速度,即FPS,它表示每秒的幀數(shù),這意味著游戲循環(huán)每秒應(yīng)該發(fā)生多少次。如果控制不好FPS,游戲就會運(yùn)行得過快或過慢。
(1)創(chuàng)建Pygame模版
編寫一個簡單的Pygame程序,該程序除了打開游戲窗口并運(yùn)行游戲循環(huán)外什么也不做。
首先導(dǎo)入所需的Pygame庫,并設(shè)置游戲的全局選項變量:
- import pygame
- WIDTH = 300 # 游戲窗口的寬度
- HEIGHT = 420 # 游戲窗口的高度
- FPS = 30 # 每秒的幀數(shù)
接下來創(chuàng)建游戲窗口:
- # 初始化Pygame并創(chuàng)建游戲窗口
- pygame.init()
- screen = pygame.display.set_mode((WIDTH, HEIGHT))
- pygame.display.set_caption('Demo Game') # 設(shè)置游戲標(biāo)題
- clock = pygame.time.Clock()
先調(diào)用pygame.init()啟動Pygame并將其初始化;再調(diào)用pygame.display.set_mode()創(chuàng)建游戲窗口screen,其參數(shù)是一個元組,表示該游戲窗口的寬度和高度;最后調(diào)用pygame.time.Clock()創(chuàng)建時鐘對象clock,以便能夠確保游戲按照設(shè)定好的FPS運(yùn)行。
然后開始編寫游戲循環(huán):
- # 游戲循環(huán)
- running = True
- while running:
- pass
這是游戲循環(huán)的框架代碼,它是由變量running控制是否執(zhí)行的while循環(huán),如果希望游戲循環(huán)結(jié)束,那么只需將running設(shè)置為False即可。
(2)渲染部分
目前示例代碼中僅僅演示的是用純色填充屏幕。下面先介紹一下計算機(jī)對顏色的處理。
計算機(jī)屏幕由像素組成,這些像素的顏色由三個顏色混合生成,這三個顏色就是三基色:紅色(R),綠色(G)和藍(lán)色(B)。每個顏色的發(fā)光強(qiáng)度決定了該像素的顏色,用0到255之間的一個整數(shù)來表示發(fā)光強(qiáng)度的大小,因此,RGB三個顏色中的每個都有256種亮度等級。可以通過三者的乘積,獲得計算機(jī)中可以顯示的顏色總數(shù):256*256*256=16777216。
在項目中定義一些顏色:
- BLACK = (0, 0, 0) # 黑色
- WHITE = (255, 255, 255) # 白色
- RED = (255, 0, 0) # 紅色
- GREEN = (0, 255, 0) # 綠色
- BLUE = (0, 0, 255) # 藍(lán)色
以上顏色由一個元組定義,元組中的項按照RGB排序,數(shù)值為顏色的亮度等級。
給屏幕填充顏色,并使最近繪制的屏幕可見:
- screen.fill(WHITE)
- pygame.display.flip()
(3)事件部分
此時嘗試運(yùn)行程序,則會發(fā)現(xiàn)程序存在問題——無法關(guān)閉窗口,單擊窗口右上角的“關(guān)閉”按鈕無效。這是因為“單擊窗口右上角的‘關(guān)閉’按鈕”其實是一個事件,需要監(jiān)聽該事件并做出相應(yīng)處理——退出游戲。
事件可以隨時發(fā)生。如果游戲在循環(huán)的更新或渲染過程中單擊其他按鈕怎么辦?Pygame要做的是保存自上一幀以來發(fā)生的所有事件。這樣,如果游戲快速將許多按鈕混在一起,那么可以使所有按鈕都有效。監(jiān)聽的事件是一個列表,可以使用一個for循環(huán)來查看它們:
- for event in pygame.event.get():
- # 檢查窗口是否關(guān)閉
- if event.type == pygame.QUIT:
- running = False
Pygame中有很多可以監(jiān)聽的事件,pygame.QUIT是單擊窗口右上角的“關(guān)閉”時觸發(fā)的事件,此時將running設(shè)置為False,游戲循環(huán)將終止。
(4)控制FPS
使用FPS來控制游戲的運(yùn)行速度:
- while running:
- clock.tick(FPS)
tick()方法用于告訴Pygame循環(huán)所花的時間。變量FPS已經(jīng)賦值為30,這意味著游戲循環(huán)每秒應(yīng)該發(fā)生30次,即每幀持續(xù)1⁄30秒。
(5)組裝代碼
將上述代碼組裝起來,并在末尾添加pygame.quit()用于終止游戲:
- import pygame
- WIDTH = 300
- HEIGHT = 420
- FPS = 30
- # 定義顏色
- WHITE = (255, 255, 255)
- BLACK = (0, 0, 0)
- RED = (255, 0, 0)
- GREEN = (0, 255, 0)
- BLUE = (0, 0, 255)
- # 初始化pygame并創(chuàng)建游戲窗口
- pygame.init()
- pygame.mixer.init()
- screen = pygame.display.set_mode((WIDTH, HEIGHT))
- pygame.display.set_caption('Demo Game')
- clock = pygame.time.Clock()
- # 游戲循環(huán)
- running = True
- while running:
- clock.tick(FPS)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- screen.fill(WHITE)
- pygame.display.flip()
- pygame.quit()
將上述代碼進(jìn)行保存,文件名為template.py,本書后文將使用該P(yáng)ygame模板作為項目的起點。
運(yùn)行template.py,運(yùn)行結(jié)果如圖1所示。
圖1 Pygame模板運(yùn)行結(jié)果
更多內(nèi)容
>>本文地址:http://www.littlerockbway.com/zhuanye/2021/70178.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學(xué)歷
3 您更想做哪個方向的工作?