pygame製作遊戲人物精靈的行走及二段跳實現方法
不得不承認《Python遊戲程式設計入門》這本書翻譯、排版非常之爛,但是裡面的demo還是很好的,之前做了些改編放到這裡。
先是素材:
背景
精靈
所有素材均取自此書
接下來就是精靈類別的創建了:
(self) self.master_image === -1= 1= 1=== 1============rect == (rect.width // width) * (rect.height // height) - 1 update(self, current_time, rate=30 current_time > self.last_time ++= 1 self.frame >== self.frame !== (self.frame % self.columns) *= (self.frame // self.columns) *=== self.frame
將精靈類別「放置」到遊戲畫面上,並加上背景
pygame.init() screen = pygame.display.set_mode((800, 600)) font = pygame.font.Font(None, 24) framerate = pygame.time.Clock() bg = pygame.image.load("background.png").convert_alpha() pl = pygame.image.load('caveman.png').convert_alpha()# 创建精灵组group = pygame.sprite.Group() player = MySprite(screen) player.load("caveman.png", 50, 64, 8) player.first_frame = 1player.last_frame = 7player.position = 400, 303group.add(player)while True:for event in pygame.event.get():if event.type == QUIT: sys.exit()# 设置帧数framerate.tick(30) ticks = pygame.time.get_ticks()
# 這樣的話精靈就在畫布上了,我們得讓它能左右移動:
#
keys = pygame.key.get_pressed()if keys[K_ESCAPE]: sys.exit()if keys[K_RIGHT]: player.X += 8if keys[K_LEFT]:if player.X > 0: player.X -= 8
#
然後實現跳躍及二段跳躍
這裡需要下二段跳躍的注意點:
1.直到落地前,只能跳兩次,也就是說精靈進行二次跳躍後不能再跳了
2.按下空格後,精靈的加速度重置
,這需要修改前面的程式碼:
jump_vel = 0.0# 设置一个记录跳跃次数的变量space_number = 0# 跳跃判断player_jumping = False player_start_y = player.Ywhile True:for event in pygame.event.get():if event.type == QUIT: sys.exit()if event.type == KEYDOWN:if event.key == K_SPACE:# 跳跃次数小于2次时,if space_number < 2: jump_vel = -15.0space_number += 1player_jumping = True keys = pygame.key.get_pressed()if keys[K_ESCAPE]: sys.exit()if keys[K_RIGHT]: player.X += 8if keys[K_LEFT]:if player.X > 0: player.X -= 8# 设置帧数framerate.tick(30) ticks = pygame.time.get_ticks()# 当按下空格后,jump_vel变量不断变大,直到接触地面if player_jumping: player.Y += jump_vel jump_vel += 2# 落地后,重置跳跃速度和其他判断变量if player.Y >= player_start_y: player_jumping = False player.Y = player_start_y jump_vel = 0 space_number = 0# 创建背景 screen.blit(bg, (0, 0))# 精灵组更新group.update(ticks, 50) group.draw(screen) pygame.display.update()
#
所有程式碼:
import sys, time, random, math, pygamefrom pygame.locals import *class MySprite(pygame.sprite.Sprite):def __init__(self, target): pygame.sprite.Sprite.__init__(self) self.master_image = None self.frame = 0 self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0 self.last_frame = 0 self.columns = 1self.last_time = 0# 使用property方法,让精灵类对坐标操作更方便def _getx(self):return self.rect.xdef _setx(self, value): self.rect.x = value X = property(_getx, _setx)def _gety(self):return self.rect.ydef _sety(self, value): self.rect.y = value Y = property(_gety, _sety)def _getpos(self):return self.rect.topleftdef _setpos(self, pos): self.rect.topleft = pos position = property(_getpos, _setpos)def load(self, filename, width, height, columns): self.master_image = pygame.image.load(filename).convert_alpha() self.frame_width = width self.frame_height = height self.rect = Rect(0, 0, width, height) self.columns = columns rect = self.master_image.get_rect() self.last_frame = (rect.width // width) * (rect.height // height) - 1def update(self, current_time, rate=30):# 更新帧数if current_time > self.last_time + rate: self.frame += 1if self.frame > self.last_frame: self.frame = self.first_frame self.last_time = current_time# 当帧数发生改变时,创建新的图片if self.frame != self.old_frame: frame_x = (self.frame % self.columns) * self.frame_width frame_y = (self.frame // self.columns) * self.frame_height rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height) self.image = self.master_image.subsurface(rect) self.old_frame = self.frame pygame.init() screen = pygame.display.set_mode((800, 600)) font = pygame.font.Font(None, 24) framerate = pygame.time.Clock() bg = pygame.image.load("background.png").convert_alpha() pl = pygame.image.load('caveman.png').convert_alpha()# 创建精灵组group = pygame.sprite.Group() player = MySprite(screen) player.load("caveman.png", 50, 64, 8) player.first_frame = 1player.last_frame = 7player.position = 400, 303group.add(player) jump_vel = 0.0# 设置一个记录跳跃次数的变量space_number = 0# 跳跃判断player_jumping = False player_start_y = player.Ywhile True:for event in pygame.event.get():if event.type == QUIT: sys.exit()if event.type == KEYDOWN:if event.key == K_SPACE:# 跳跃次数小于2次时,if space_number < 2: jump_vel = -15.0space_number += 1player_jumping = True keys = pygame.key.get_pressed()if keys[K_ESCAPE]: sys.exit()if keys[K_RIGHT]: player.X += 8if keys[K_LEFT]:if player.X > 0: player.X -= 8# 设置帧数framerate.tick(30) ticks = pygame.time.get_ticks()# 当按下空格后,jump_vel变量不断变大,直到接触地面if player_jumping: player.Y += jump_vel jump_vel += 2# 落地后if player.Y >= player_start_y: player_jumping = False player.Y = player_start_y jump_vel = 0 space_number = 0 rush_number = 0# 创建背景 screen.blit(bg, (0, 0))# 精灵组更新group.update(ticks, 50) group.draw(screen) pygame.display.update()
這樣,一個粗糙的、會二段跳的精靈就完成了。
很感謝這本書提供單次跳躍的思路,讓我有思考二段跳的想法。其實像二段跳這類看起來很容易,但實現其實還是需要思考一番的。
以上是pygame製作遊戲人物精靈的行走及二段跳實現方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

華為手機如何實現雙微信登入?隨著社群媒體的興起,微信已成為人們日常生活中不可或缺的溝通工具之一。然而,許多人可能會遇到一個問題:在同一部手機上同時登入多個微信帳號。對於華為手機用戶來說,實現雙微信登入並不困難,本文將介紹華為手機如何實現雙微信登入的方法。首先,華為手機自帶的EMUI系統提供了一個很方便的功能-應用程式雙開。透過應用程式雙開功能,用戶可以在手機上同

Pygame安裝詳解:一步步教你安裝並配置開發環境,需要具體程式碼範例引言:Pygame是一個基於Python的遊戲開發庫,它提供了豐富的工具和函數,使遊戲開發變得簡單而有趣。本文將詳細介紹如何安裝Pygame,並配置開發環境,同時提供具體的程式碼範例。第一部分:安裝Pygame安裝Python:在開始安裝Pygame之前,首先要確保你的電腦上已經安裝了Pyt

程式語言PHP是一種用於Web開發的強大工具,能夠支援多種不同的程式設計邏輯和演算法。其中,實作斐波那契數列是一個常見且經典的程式設計問題。在這篇文章中,將介紹如何使用PHP程式語言來實作斐波那契數列的方法,並附上具體的程式碼範例。斐波那契數列是一個數學上的序列,其定義如下:數列的第一個和第二個元素為1,從第三個元素開始,每個元素的值等於前兩個元素的和。數列的前幾元

從零開始學習Pygame:完整的安裝和配置教程,需要具體程式碼範例引言:Pygame是一個使用Python程式語言開發的開源遊戲開發庫,它提供了豐富的功能和工具,使得開發者可以輕鬆創建各種類型的遊戲。本文將帶您從零開始學習Pygame,並提供完整的安裝和配置教程,以及具體的程式碼範例,讓您快速入門。第一部分:安裝Python和Pygame首先,確保您的電腦上已

如何在華為手機上實現微信分身功能隨著社群軟體的普及和人們對隱私安全的日益重視,微信分身功能逐漸成為人們關注的焦點。微信分身功能可以幫助使用者在同一台手機上同時登入多個微信帳號,方便管理和使用。在華為手機上實現微信分身功能並不困難,只需要按照以下步驟操作即可。第一步:確保手機系統版本和微信版本符合要求首先,確保你的華為手機系統版本已更新至最新版本,以及微信App

在現今的軟體開發領域中,Golang(Go語言)作為一種高效、簡潔、並發性強的程式語言,越來越受到開發者的青睞。其豐富的標準庫和高效的並發特性使它成為遊戲開發領域的一個備受關注的選擇。本文將探討如何利用Golang來實現遊戲開發,並透過具體的程式碼範例來展示其強大的可能性。 1.Golang在遊戲開發中的優勢作為靜態類型語言,Golang正在建構大型遊戲系統

PHP遊戲需求實現指南隨著網路的普及和發展,網頁遊戲的市場也越來越火爆。許多開發者希望利用PHP語言來開發自己的網頁遊戲,而實現遊戲需求是其中一個關鍵步驟。本文將介紹如何利用PHP語言來實現常見的遊戲需求,並提供具體的程式碼範例。 1.創造遊戲角色在網頁遊戲中,遊戲角色是非常重要的元素。我們需要定義遊戲角色的屬性,例如姓名、等級、經驗值等,並提供方法來操作這些

在Golang中實現精確除法運算是一個常見的需求,特別是在涉及金融計算或其它需要高精度計算的場景中。 Golang的內建的除法運算子「/」是針對浮點數計算的,並且有時會出現精度遺失的問題。為了解決這個問題,我們可以藉助第三方函式庫或自訂函數來實現精確除法運算。一種常見的方法是使用math/big套件中的Rat類型,它提供了分數的表示形式,可以用來實現精確的除法運算
