原文: https://pythonspot.com/jump-and-run-in-pygame/

在本文中,您将学习如何在 Pygame 中实现跳和跑逻辑。 为此,我们将实现玩家逻辑。

移动

左右移动与上一教程类似,只是意味着更改玩家的(x, y)位置。 对于跳跃,我们使用经典力学中的公式:

  1. F = 1/2 * m * v^2

其中F是向上/向下的力,m是物体的质量,v是速度。 速度会随着时间的推移而下降,因为在此模拟中,当玩家跳跃时速度不会增加更多。 如果玩家到达地面,则跳跃结束。 在 Python 中,我们设置了一个变量isjump来指示玩家是否在跳跃。 如果是玩家,则其位置将根据以上公式进行更新。

完整代码:

  1. from pygame.locals import *
  2. import pygame
  3. import math
  4. from time import sleep
  5. class Player:
  6. x = 10
  7. y = 500
  8. speed = 10
  9. # Stores if player is jumping or not.
  10. isjump = 0
  11. # Force (v) up and mass m.
  12. v = 8
  13. m = 2
  14. def moveRight(self):
  15. self.x = self.x + self.speed
  16. def moveLeft(self):
  17. self.x = self.x - self.speed
  18. def jump(self):
  19. self.isjump = 1
  20. def update(self):
  21. if self.isjump:
  22. # Calculate force (F). F = 0.5 * mass * velocity^2.
  23. if self.v > 0:
  24. F = ( 0.5 * self.m * (self.v*self.v) )
  25. else:
  26. F = -( 0.5 * self.m * (self.v*self.v) )
  27. # Change position
  28. self.y = self.y - F
  29. # Change velocity
  30. self.v = self.v - 1
  31. # If ground is reached, reset variables.
  32. if self.y >= 500:
  33. self.y = 500
  34. self.isjump = 0
  35. self.v = 8
  36. class App:
  37. windowWidth = 800
  38. windowHeight = 600
  39. player = 0
  40. def __init__(self):
  41. self._running = True
  42. self._display_surf = None
  43. self._image_surf = None
  44. self.player = Player()
  45. def on_init(self):
  46. pygame.init()
  47. self._display_surf = pygame.display.set_mode((self.windowWidth,self.windowHeight), pygame.HWSURFACE)
  48. pygame.display.set_caption('Pygame pythonspot.com example')
  49. self._running = True
  50. self._image_surf = pygame.image.load("pygame.png").convert()
  51. def on_event(self, event):
  52. if event.type == QUIT:
  53. self._running = False
  54. def on_loop(self):
  55. pass
  56. def on_render(self):
  57. self._display_surf.fill((0,0,0))
  58. self._display_surf.blit(self._image_surf,(self.player.x,self.player.y))
  59. self.player.update()
  60. pygame.display.flip()
  61. sleep(0.03)
  62. def on_cleanup(self):
  63. pygame.quit()
  64. def on_execute(self):
  65. if self.on_init() == False:
  66. self._running = False
  67. while( self._running ):
  68. pygame.event.pump()
  69. keys = pygame.key.get_pressed()
  70. if (keys[K_RIGHT]):
  71. self.player.moveRight()
  72. if (keys[K_LEFT]):
  73. self.player.moveLeft()
  74. if (keys[K_UP]):
  75. self.player.jump()
  76. if (keys[K_ESCAPE]):
  77. self._running = False
  78. self.on_loop()
  79. self.on_render()
  80. self.on_cleanup()
  81. if __name__ == "__main__" :
  82. theApp = App()
  83. theApp.on_execute()

如果要跳跃对象,只需将它们添加到屏幕上,进行碰撞检测,如果碰撞为true,则重置跳跃变量。