四、小白如何用Pygame制作一款跑酷類游戲(頁面暫停和主角跑步動作的實現)
提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 四、小白如何用Pygame制作一款跑酷類游戲(頁面暫停和主角跑步動作的實現)
- 前言
- 一、添加主角的跑步圖片素材
- 二、代碼部分
- 1.監聽鍵盤的按下動作,與按鍵抬起不同
- 2.在事件捕獲部分,監聽按鍵的抬起動作
- 3.根據按鍵進行不同的頁面變化
- 3.根據按鍵進行不同的主角人物動作變化
- 4.實現向右跑步后的完整的Myself.py代碼(帶注釋)
- 5.實現向右跑步后的完整的runner_main方法代碼(帶注釋)
- 實現效果
前言
本篇主要實現頁面通過空格鍵的釋放使得頁面進行暫停和運行,對主角添加按下向右箭頭按鍵實現向右快速跑步動作
一、添加主角的跑步圖片素材
圖片放在了主角跑步素材
二、代碼部分
1.監聽鍵盤的按下動作,與按鍵抬起不同
keys = pygame.key.get_pressed()
2.在事件捕獲部分,監聽按鍵的抬起動作
for event in pygame.event.get():if event.type == pygame.QUIT:running = False#空格鍵作為暫停鍵 當空格鍵抬起時觸發暫停動作#如果當前是運動狀態,抬起空格變為暫停#如果當前是暫停狀態,抬起空格變為運動elif event.type == pygame.KEYUP:if not isPause:if event.key == pygame.K_SPACE:isPause = Trueelse:if event.key == pygame.K_SPACE:isPause = False
3.根據按鍵進行不同的頁面變化
#暫停狀態下,道路不會向左滑動if isPause:margin=0else:margin=3#通過提升道路的滑動效果體現出疾跑的效果if keys[pygame.K_RIGHT]:margin=8
3.根據按鍵進行不同的主角人物動作變化
# 暫停狀態下,主角也要保持靜止,也就是說主角直保持一個動作,因此要傳遞一個參數給主角精靈
# 通過按下鍵盤的事件更改主角的狀態,因此也需傳遞一個參數給主角來決定狀態比如奔跑、跳躍以及滑行
screen.blit(myself.image, myself.rect)
myself.update(index,keys,isPause)
4.實現向右跑步后的完整的Myself.py代碼(帶注釋)
import pygame
class Myself(pygame.sprite.Sprite):def __init__(self):super(Myself, self).__init__()self.image = pygame.image.load('material/image/myself/walk/1.PNG').convert_alpha()self.walk = [pygame.image.load('material/image/myself/walk/{:d}.PNG'.format(i)).convert_alpha() for i inrange(1, 8)]self.run = [pygame.image.load('material/image/myself/run/{:d}.PNG'.format(i)).convert_alpha() for i inrange(1, 6)]self.rect = self.walk[0].get_rect()self.rect.top=400self.rect.left=200self.state = 0 # 初始狀態是步行態self.flag = 0 #設置標志位 記錄按鍵按下的時鐘def update(self, *args):#將是否暫停傳遞if args[2]: self.image=pygame.image.load('material/image/myself/walk/1.PNG').convert_alpha()else:#人物狀態傳遞keys = args[1]#這里選擇按下右箭頭 是奔跑狀態if keys[pygame.K_RIGHT]:self.state=1self.flag=args[0]#步行狀態if self.state==0:if args[0] % 6 == 0:i = int(args[0] / 6)self.image=self.walk[i % len(self.walk)]self.rect.top = 400#奔跑狀態elif self.state==1:#設置一定的動作時長 超出之后變為步行態if args[0]-self.flag>=12:self.state=0if args[0] % 6 == 0:i = int(args[0] / 8)self.image=self.run[i % len(self.run)]self.rect.top = 430
5.實現向右跑步后的完整的runner_main方法代碼(帶注釋)
import pygame
from Myself import Myself
import ospygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((1080, 600))
pygame.display.set_caption('跑酷游戲')
#背景圖
bg_image_path1 = 'material/image/background4.jpg'
bg_img_obj1 = pygame.image.load(bg_image_path1).convert_alpha()
#道路圖
road_image_path= 'material/image/road1.png'
road_img_obj=pygame.image.load(road_image_path).convert_alpha()
#距離圖
km_image_path= 'material/image/km.png'
km_img_obj=pygame.image.load(km_image_path).convert_alpha()
#按鍵圖
keyUp_image_path= 'material/image/keyboardUpUp.png'
keyUp_img_obj=pygame.image.load(keyUp_image_path).convert_alpha()
keyLeft_image_path= 'material/image/keyboardLEFT.png'
keyLeft_img_obj=pygame.image.load(keyLeft_image_path).convert_alpha()
keyDown_image_path= 'material/image/keyboardDown.png'
keyDown_img_obj=pygame.image.load(keyDown_image_path).convert_alpha()
font_path = 'material/ziti/AlimamaFangYuanTiVF-Thin-2.ttf' # 例如 'SimSun.ttf'
chinese_font = pygame.font.Font(font_path, 30)
text_surface = chinese_font.render('跳躍', True, (0, 0, 255))
text1_surface = chinese_font.render('疾跑', True, (0, 0, 255))
text2_surface = chinese_font.render('滑行', True, (0, 0, 255))
def init():fps = 60running = Trueindex = 0left = 0right = 1080margin = 3myself = Myself()pygame.mixer.music.load(os.path.join('material/music', 'bgm1.mp3'))pygame.mixer.music.play(-1)km = '0'#標志位是否暫停isPause = Falsewhile running:# 獲取鍵盤的按下事件,與抬起不同keys = pygame.key.get_pressed()for event in pygame.event.get():if event.type == pygame.QUIT:running = False#空格鍵作為暫停鍵 當空格鍵抬起時觸發暫停動作#如果當前是運動狀態,抬起空格變為暫停#如果當前是暫停狀態,抬起空格變為運動elif event.type == pygame.KEYUP:if not isPause:if event.key == pygame.K_SPACE:isPause = Trueelse:if event.key == pygame.K_SPACE:isPause = False#暫停狀態下,道路不會向左滑動if isPause:margin=0else:margin=3#通過提升道路的滑動效果體現出疾跑的效果if keys[pygame.K_RIGHT]:margin=8screen.blit(bg_img_obj1, (0, 0))screen.blit(road_img_obj, (left, 465))screen.blit(road_img_obj, (right, 465))#鍵位介紹screen.blit(keyUp_img_obj, (900, 5))screen.blit(text_surface, (980, 23))screen.blit(keyLeft_img_obj, (900, 70))screen.blit(text1_surface, (980, 88))screen.blit(keyDown_img_obj, (900, 135))screen.blit(text2_surface, (980, 148))if left<=-1080:left=left+2160if right<=-1080:right=right+2160# 暫停狀態下,主角也要保持靜止,也就是說主角直保持一個動作,因此要傳遞一個參數給主角精靈# 通過按下鍵盤的事件更改主角的狀態,因此也需傳遞一個參數給主角來決定狀態比如奔跑、跳躍以及滑行screen.blit(myself.image, myself.rect)myself.update(index,keys,isPause)screen.blit(km_img_obj, (10, 70))km_font = pygame.font.SysFont('arial', 30)km_num_surface = km_font.render(km, True, (0, 0, 255))screen.blit(km_num_surface, (80, 88))if index%6==0:km = str(int(km) + margin)index += 1pygame.display.update()clock.tick(fps)left -= marginright -= margin
if __name__=="__main__":init()
實現效果
按下向右疾跑鍵后實現加速效果
按下暫停鍵后實現暫停效果