網(wǎng)站首頁 編程語言 正文
Python?pygame?動畫游戲循環(huán)游戲時(shí)鐘實(shí)現(xiàn)原理_python
作者:ZacheryZHANG ? 更新時(shí)間: 2022-10-10 編程語言1. 游戲循環(huán)和游戲時(shí)鐘
之前幾篇文章中,飛機(jī)大戰(zhàn)游戲中的英雄飛機(jī)已經(jīng)被繪制到屏幕上了,怎么能夠讓飛機(jī)移動呢?
1.1 游戲中的動畫實(shí)現(xiàn)原理
跟電影的原理類似,游戲中的動畫效果,本質(zhì)上是快速的在屏幕上繪制圖像
電影是將多張靜止的電影膠片連接、快速的播放,產(chǎn)生連貫的視覺效果!
一般在電影上每秒繪制60次,就能夠達(dá)到非常連續(xù)高品質(zhì)的動畫效果(相當(dāng)于要每秒鐘調(diào)用60次update效果)
每次繪制的結(jié)果被稱為幀F(xiàn)rame(靜止畫面)
2. 游戲循環(huán)
游戲的兩個組成部分:
- 游戲的初始化:創(chuàng)建游戲窗口,繪制圖像初始位置,設(shè)置游戲時(shí)鐘
- 游戲循環(huán):設(shè)置刷新幀率,檢測用戶交互,更新所有圖像位置,更新屏幕顯示
游戲循環(huán)的開始就意味著游戲的正式開始
游戲循環(huán)的作用:
- 保證游戲不會直接退出
- 變化圖像位置--動畫效果
- 每隔1/60秒移動一下所有圖像位置
- 調(diào)用
pygame.display.update()
更新屏幕顯示
- 檢測用戶交互--按鍵、鼠標(biāo)等
3. 游戲時(shí)鐘
pygame專門提供了一個類pygame.time.Clock
可以非常方便的設(shè)置屏幕繪制速度--刷新幀率
要使用時(shí)鐘對象需要兩步驟:
在游戲初始化創(chuàng)建一個時(shí)鐘對象
在游戲循環(huán)中讓時(shí)鐘對象調(diào)用tick(幀率)方法
tick
方法會根據(jù)上次被調(diào)用的時(shí)間,自動設(shè)置游戲循環(huán)中的延時(shí)
案例演示:本案例將在游戲循環(huán)外部創(chuàng)建時(shí)鐘對象,在游戲循環(huán)內(nèi)部創(chuàng)建tick方法,就可以來指定循環(huán)內(nèi)部的代碼執(zhí)行的頻率。
具體代碼演示如下所示:游戲循環(huán)內(nèi)部的代碼,每秒重復(fù)循環(huán)60次就可以,就在游戲初始化的時(shí)候,創(chuàng)建游戲時(shí)鐘對象。
然后,在游戲循環(huán)中,通過時(shí)鐘對象調(diào)用tick的方法,就可以輕松的指定,游戲循環(huán)內(nèi)部的代碼每秒鐘執(zhí)行的次數(shù)。
import pygame pygame.init() # 創(chuàng)建游戲的窗口 640*642 screen = pygame.display.set_mode((640, 642)) # 繪制背景圖像 bg = pygame.image.load("./飛機(jī)大戰(zhàn)資料包/images/background1.jpg") screen.blit(bg, (0, 0)) # 繪制英雄的飛機(jī) hero = pygame.image.load("./飛機(jī)大戰(zhàn)資料包/images/me1.png") screen.blit(hero, (300, 500)) # 可以在所有繪制工作完成之后,統(tǒng)一調(diào)用update方法 pygame.display.update() # 創(chuàng)建時(shí)鐘對象 clock = pygame.time.Clock() # 游戲循環(huán)->意味著游戲的正式開始 i = 0 while True: # 希望無限循環(huán)內(nèi)部的代碼每秒鐘重復(fù)循環(huán)60次 # 可以指定循環(huán)體內(nèi)部的代碼執(zhí)行的頻率 clock.tick(60) print(i) i = i + 1 pass pygame.quit()
原文鏈接:https://juejin.cn/post/7130266390895788039
相關(guān)推薦
- 2022-11-05 Golang操作命令行的幾種方式總結(jié)_Golang
- 2022-06-10 Python?Pytorch學(xué)習(xí)之圖像檢索實(shí)踐_python
- 2022-11-25 Python中日期和時(shí)間的用法超強(qiáng)總結(jié)_python
- 2022-07-31 C++超詳細(xì)講解引用和指針_C 語言
- 2023-01-12 python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀_python
- 2022-03-19 Docker?link實(shí)現(xiàn)容器互聯(lián)的方式_docker
- 2022-05-17 MacOS下如何配置多JDK,配置Jdk 1.8 jdk 11和jdk17共同管理
- 2022-10-16 C語言中關(guān)于計(jì)算字符串長度的幾種方式_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支