偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

用Pygame使你的游戲角色移動(dòng)起來

開發(fā) 后端
在本系列的第四部分,學(xué)習(xí)如何編寫移動(dòng)游戲角色的控制代碼。在本篇文章中,我們將使用 Pygame 來添加鍵盤控制,如此一來你就可以控制你的角色的移動(dòng)。

[[265868]]

在本系列的第四部分,學(xué)習(xí)如何編寫移動(dòng)游戲角色的控制代碼。

在這個(gè)系列的***篇文章中,我解釋了如何使用 Python 創(chuàng)建一個(gè)簡(jiǎn)單的基于文本的骰子游戲。在第二部分中,我向你們展示了如何從頭開始構(gòu)建游戲,即從 創(chuàng)建游戲的環(huán)境 開始。然后在第三部分,我們創(chuàng)建了一個(gè)玩家妖精,并且使它在你的(而不是空的)游戲世界內(nèi)生成。你可能已經(jīng)注意到,如果你不能移動(dòng)你的角色,那么游戲不是那么有趣。在本篇文章中,我們將使用 Pygame 來添加鍵盤控制,如此一來你就可以控制你的角色的移動(dòng)。

在 Pygame 中有許多函數(shù)可以用來添加(除鍵盤外的)其他控制,但如果你正在敲擊 Python 代碼,那么你一定是有一個(gè)鍵盤的,這將成為我們接下來會(huì)使用的控制方式。一旦你理解了鍵盤控制,你可以自己去探索其他選項(xiàng)。

在本系列的第二篇文章中,你已經(jīng)為退出游戲創(chuàng)建了一個(gè)按鍵,移動(dòng)角色的(按鍵)原則也是相同的。但是,使你的角色移動(dòng)起來要稍微復(fù)雜一點(diǎn)。

讓我們從簡(jiǎn)單的部分入手:設(shè)置控制器按鍵。

為控制你的玩家妖精設(shè)置按鍵

在 IDLE、Ninja-IDE 或文本編輯器中打開你的 Python 游戲腳本。

因?yàn)橛螒蛐枰獣r(shí)刻“監(jiān)聽”鍵盤事件,所以你寫的代碼需要連續(xù)運(yùn)行。你知道應(yīng)該把需要在游戲周期中持續(xù)運(yùn)行的代碼放在哪里嗎?

如果你回答“放在主循環(huán)中”,那么你是正確的!記住除非代碼在循環(huán)中,否則(大多數(shù)情況下)它只會(huì)運(yùn)行僅一次。如果它被寫在一個(gè)從未被使用的類或函數(shù)中,它可能根本不會(huì)運(yùn)行。

要使 Python 監(jiān)聽傳入的按鍵,將如下代碼添加到主循環(huán)。目前的代碼還不能產(chǎn)生任何的效果,所以使用 print 語句來表示成功的信號(hào)。這是一種常見的調(diào)試技術(shù)。

  1. while main == True:
  2.     for event in pygame.event.get():
  3.         if event.type == pygame.QUIT:
  4.             pygame.quit(); sys.exit()
  5.             main = False
  6.  
  7.         if event.type == pygame.KEYDOWN:
  8.             if event.key == pygame.K_LEFT or event.key == ord('a'):
  9.                 print('left')
  10.             if event.key == pygame.K_RIGHT or event.key == ord('d'):
  11.                 print('right')
  12.             if event.key == pygame.K_UP or event.key == ord('w'):
  13.             print('jump')
  14.  
  15.         if event.type == pygame.KEYUP:
  16.             if event.key == pygame.K_LEFT or event.key == ord('a'):
  17.                 print('left stop')
  18.             if event.key == pygame.K_RIGHT or event.key == ord('d'):
  19.                 print('right stop')
  20.             if event.key == ord('q'):
  21.                 pygame.quit()
  22.                 sys.exit()
  23.                 main = False    

一些人偏好使用鍵盤字母 W、A、SD 來控制玩家角色,而另一些偏好使用方向鍵。因此確保你包含了兩種選項(xiàng)。

注意:當(dāng)你在編程時(shí),同時(shí)考慮所有用戶是非常重要的。如果你寫代碼只是為了自己運(yùn)行,那么很可能你會(huì)成為你寫的程序的唯一用戶。更重要的是,如果你想找一個(gè)通過寫代碼賺錢的工作,你寫的代碼就應(yīng)該讓所有人都能運(yùn)行。給你的用戶選擇權(quán),比如提供使用方向鍵或 WASD 的選項(xiàng),是一個(gè)優(yōu)秀程序員的標(biāo)志。

使用 Python 啟動(dòng)你的游戲,并在你按下“上下左右”方向鍵或 ADW 鍵的時(shí)候查看控制臺(tái)窗口的輸出。

  1. $ python ./your-name_game.py
  2.   left
  3.   left stop
  4.   right
  5.   right stop
  6.   jump

這驗(yàn)證了 Pygame 可以正確地檢測(cè)按鍵。現(xiàn)在是時(shí)候來完成使妖精移動(dòng)的艱巨任務(wù)了。

編寫玩家移動(dòng)函數(shù)

為了使你的妖精移動(dòng)起來,你必須為你的妖精創(chuàng)建一個(gè)屬性代表移動(dòng)。當(dāng)你的妖精沒有在移動(dòng)時(shí),這個(gè)變量被設(shè)為 0

如果你正在為你的妖精設(shè)置動(dòng)畫,或者你決定在將來為它設(shè)置動(dòng)畫,你還必須跟蹤幀來使走路循環(huán)保持在軌跡上。

Player 類中創(chuàng)建如下變量。開頭兩行作為上下文對(duì)照(如果你一直跟著做,你的代碼中就已經(jīng)有這兩行),因此只需要添加***三行:

  1.     def __init__(self):
  2.         pygame.sprite.Sprite.__init__(self)
  3.         self.movex = 0 # 沿 X 方向移動(dòng)
  4.         self.movey = 0 # 沿 Y 方向移動(dòng)
  5.         self.frame = 0 # 幀計(jì)數(shù)

設(shè)置好了這些變量,是時(shí)候去為妖精移動(dòng)編寫代碼了。

玩家妖精不需要時(shí)刻響應(yīng)控制,有時(shí)它并沒有在移動(dòng)。控制妖精的代碼,僅僅只是玩家妖精所有能做的事情中的一小部分。在 Python 中,當(dāng)你想要使一個(gè)對(duì)象做某件事并獨(dú)立于剩余其他代碼時(shí),你可以將你的新代碼放入一個(gè)函數(shù)。Python 的函數(shù)以關(guān)鍵詞 def 開頭,(該關(guān)鍵詞)代表了定義函數(shù)。

在你的 Player 類中創(chuàng)建如下函數(shù),來為你的妖精在屏幕上的位置增加幾個(gè)像素?,F(xiàn)在先不要擔(dān)心你增加幾個(gè)像素,這將在后續(xù)的代碼中確定。

  1.     def control(self,x,y):
  2.         '''
  3.         控制玩家移動(dòng)
  4.         '''
  5.         self.movex += x
  6.         self.movey += y

為了在 Pygame 中移動(dòng)妖精,你需要告訴 Python 在新的位置重繪妖精,以及這個(gè)新位置在哪里。

因?yàn)橥婕已⒉豢偸窃谝苿?dòng),所以更新只需要是 Player 類中的一個(gè)函數(shù)。將此函數(shù)添加前面創(chuàng)建的 control 函數(shù)之后。

要使妖精看起來像是在行走(或者飛行,或是你的妖精應(yīng)該做的任何事),你需要在按下適當(dāng)?shù)逆I時(shí)改變它在屏幕上的位置。要讓它在屏幕上移動(dòng),你需要將它的位置(由 self.rect.xself.rect.y 屬性指定)重新定義為當(dāng)前位置加上已應(yīng)用的任意 movexmovey。(移動(dòng)的像素?cái)?shù)量將在后續(xù)進(jìn)行設(shè)置。)

  1.     def update(self):
  2.         '''
  3.         更新妖精位置
  4.         '''
  5.         self.rect.x = self.rect.x + self.movex        

對(duì) Y 方向做同樣的處理:

  1.         self.rect.y = self.rect.y + self.movey

對(duì)于動(dòng)畫,在妖精移動(dòng)時(shí)推進(jìn)動(dòng)畫幀,并使用相應(yīng)的動(dòng)畫幀作為玩家的圖像:

  1.         # 向左移動(dòng)
  2.         if self.movex < 0:
  3.             self.frame += 1
  4.             if self.frame > 3*ani:
  5.                 self.frame = 0
  6.             self.image = self.images[self.frame//ani]
  7.  
  8.         # 向右移動(dòng)
  9.         if self.movex > 0:
  10.             self.frame += 1
  11.             if self.frame > 3*ani:
  12.                 self.frame = 0
  13.             self.image = self.images[(self.frame//ani)+4]

通過設(shè)置一個(gè)變量來告訴代碼為你的妖精位置增加多少像素,然后在觸發(fā)你的玩家妖精的函數(shù)時(shí)使用這個(gè)變量。

首先,在你的設(shè)置部分創(chuàng)建這個(gè)變量。在如下代碼中,開頭兩行是上下文對(duì)照,因此只需要在你的腳本中增加第三行代碼:

  1. player_list = pygame.sprite.Group()
  2. player_list.add(player)
  3. steps = 10  # 移動(dòng)多少個(gè)像素

現(xiàn)在你已經(jīng)有了適當(dāng)?shù)暮瘮?shù)和變量,使用你的按鍵來觸發(fā)函數(shù)并將變量傳遞給你的妖精。

為此,將主循環(huán)中的 print 語句替換為玩家妖精的名字(player)、函數(shù)(.control)以及你希望玩家妖精在每個(gè)循環(huán)中沿 X 軸和 Y 軸移動(dòng)的步數(shù)。

  1.         if event.type == pygame.KEYDOWN:
  2.             if event.key == pygame.K_LEFT or event.key == ord('a'):
  3.                 player.control(-steps,0)
  4.             if event.key == pygame.K_RIGHT or event.key == ord('d'):
  5.                 player.control(steps,0)
  6.             if event.key == pygame.K_UP or event.key == ord('w'):
  7.                 print('jump')
  8.  
  9.         if event.type == pygame.KEYUP:
  10.             if event.key == pygame.K_LEFT or event.key == ord('a'):
  11.                 player.control(steps,0)
  12.             if event.key == pygame.K_RIGHT or event.key == ord('d'):
  13.                 player.control(-steps,0)
  14.             if event.key == ord('q'):
  15.                 pygame.quit()
  16.                 sys.exit()
  17.                 main = False

記住,steps 變量代表了當(dāng)一個(gè)按鍵被按下時(shí),你的妖精會(huì)移動(dòng)多少個(gè)像素。如果當(dāng)你按下 D 或右方向鍵時(shí),你的妖精的位置增加了 10 個(gè)像素。那么當(dāng)你停止按下這個(gè)鍵時(shí),你必須(將 step)減 10(-steps)來使你的妖精的動(dòng)量回到 0。

現(xiàn)在嘗試你的游戲。注意:它不會(huì)像你預(yù)想的那樣運(yùn)行。

為什么你的妖精仍無法移動(dòng)?因?yàn)橹餮h(huán)還沒有調(diào)用 update 函數(shù)。

將如下代碼加入到你的主循環(huán)中來告訴 Python 更新你的玩家妖精的位置。增加帶注釋的那行:

  1.     player.update()  # 更新玩家位置
  2.     player_list.draw(world)
  3.     pygame.display.flip()
  4.     clock.tick(fps)

再次啟動(dòng)你的游戲來見證你的玩家妖精在你的命令下在屏幕上來回移動(dòng)?,F(xiàn)在還沒有垂直方向的移動(dòng),因?yàn)檫@部分函數(shù)會(huì)被重力控制,不過這是另一篇文章中的課程了。

與此同時(shí),如果你擁有一個(gè)搖桿,你可以嘗試閱讀 Pygame 中 joystick 模塊相關(guān)的文檔,看看你是否能通過這種方式讓你的妖精移動(dòng)起來?;蛘?,看看你是否能通過鼠標(biāo)與你的妖精互動(dòng)。

最重要的是,玩的開心!

本教程中用到的所有代碼

為了方便查閱,以下是目前本系列文章用到的所有代碼。

  1. #!/usr/bin/env python3
  2. # 繪制世界
  3. # 添加玩家和玩家控制
  4. # 添加玩家移動(dòng)控制
  5.  
  6. # GNU All-Permissive License
  7. # Copying and distribution of this file, with or without modification,
  8. # are permitted in any medium without royalty provided the copyright
  9. # notice and this notice are preserved. This file is offered as-is,
  10. # without any warranty.
  11.  
  12. import pygame
  13. import sys
  14. import os
  15.  
  16. '''
  17. Objects
  18. '''
  19.  
  20. class Player(pygame.sprite.Sprite):
  21. '''
  22. 生成玩家
  23. '''
  24. def __init__(self):
  25. pygame.sprite.Sprite.__init__(self)
  26. self.movex = 0
  27. self.movey = 0
  28. self.frame = 0
  29. self.images = []
  30. for i in range(1,5):
  31. img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
  32. img.convert_alpha()
  33. img.set_colorkey(ALPHA)
  34. self.images.append(img)
  35. self.image = self.images[0]
  36. self.rect = self.image.get_rect()
  37.  
  38. def control(self,x,y):
  39. '''
  40. 控制玩家移動(dòng)
  41. '''
  42. self.movex += x
  43. self.movey += y
  44.  
  45. def update(self):
  46. '''
  47. 更新妖精位置
  48. '''
  49.  
  50. self.rect.x = self.rect.x + self.movex
  51. self.rect.y = self.rect.y + self.movey
  52.  
  53. # 向左移動(dòng)
  54. if self.movex < 0:
  55. self.frame += 1
  56. if self.frame > 3*ani:
  57. self.frame = 0
  58. self.image = self.images[self.frame//ani]
  59.  
  60. # 向右移動(dòng)
  61. if self.movex > 0:
  62. self.frame += 1
  63. if self.frame > 3*ani:
  64. self.frame = 0
  65. self.image = self.images[(self.frame//ani)+4]
  66.  
  67.  
  68. '''
  69. 設(shè)置
  70. '''
  71. worldx = 960
  72. worldy = 720
  73.  
  74. fps = 40 # 幀刷新率
  75. ani = 4 # 動(dòng)畫循環(huán)
  76. clock = pygame.time.Clock()
  77. pygame.init()
  78. main = True
  79.  
  80. BLUE = (25,25,200)
  81. BLACK = (23,23,23 )
  82. WHITE = (254,254,254)
  83. ALPHA = (0,255,0)
  84.  
  85. world = pygame.display.set_mode([worldx,worldy])
  86. backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()
  87. backdropbox = world.get_rect()
  88. player = Player() # 生成玩家
  89. player.rect.x = 0
  90. player.rect.y = 0
  91. player_list = pygame.sprite.Group()
  92. player_list.add(player)
  93. steps = 10 # 移動(dòng)速度
  94.  
  95. '''
  96. 主循環(huán)
  97. '''
  98. while main == True:
  99. for event in pygame.event.get():
  100. if event.type == pygame.QUIT:
  101. pygame.quit(); sys.exit()
  102. main = False
  103.  
  104. if event.type == pygame.KEYDOWN:
  105. if event.key == pygame.K_LEFT or event.key == ord('a'):
  106. player.control(-steps,0)
  107. if event.key == pygame.K_RIGHT or event.key == ord('d'):
  108. player.control(steps,0)
  109. if event.key == pygame.K_UP or event.key == ord('w'):
  110. print('jump')
  111.  
  112. if event.type == pygame.KEYUP:
  113. if event.key == pygame.K_LEFT or event.key == ord('a'):
  114. player.control(steps,0)
  115. if event.key == pygame.K_RIGHT or event.key == ord('d'):
  116. player.control(-steps,0)
  117. if event.key == ord('q'):
  118. pygame.quit()
  119. sys.exit()
  120. main = False
  121.  
  122. # world.fill(BLACK)
  123. world.blit(backdrop, backdropbox)
  124. player.update()
  125. player_list.draw(world) # 更新玩家位置
  126. pygame.display.flip()
  127. clock.tick(fps)

你已經(jīng)學(xué)了很多,但還仍有許多可以做。在接下來的幾篇文章中,你將實(shí)現(xiàn)添加敵方妖精、模擬重力等等。與此同時(shí),練習(xí) Python 吧! 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2012-09-03 09:21:51

2013-05-27 15:35:18

用友UAP移動(dòng)應(yīng)用移動(dòng)平臺(tái)

2009-06-19 11:18:51

Factory BeaSpring配置

2021-01-18 10:36:13

移動(dòng)辦公首席信息官CIO

2010-05-21 11:03:51

統(tǒng)一通信系統(tǒng)

2022-07-13 15:46:57

Python數(shù)據(jù)可視化代碼片段

2022-02-24 08:30:24

操作系統(tǒng)CPU程序

2022-06-07 09:00:32

PythonAI靜態(tài)圖片

2015-12-01 13:51:52

Webrtc

2020-06-09 15:18:48

數(shù)據(jù)庫Python技術(shù)

2020-11-16 11:50:21

Python代碼命令

2012-05-21 10:53:30

HTML5

2012-05-21 10:45:30

HTML5

2010-09-01 17:35:41

云計(jì)算

2011-06-01 14:51:54

jQuery

2021-09-26 09:23:01

GC算法垃圾

2010-09-08 09:48:56

Gif播放教程Android

2021-08-02 23:19:06

微信小程序人工智能

2019-10-10 09:41:54

AI 數(shù)據(jù)人工智能

2014-03-21 09:52:29

jQuery動(dòng)畫插件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)