Pygame - 运动加速
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pygame - 运动加速相关的知识,希望对你有一定的参考价值。
我想在python / pygame中创建一个脚本,当你按住一个移动按钮时,它会使角色加速(所以,当我按住左键时,角色会加速到特定的速度,然后速度会均匀,当我松开钥匙它会慢慢减速直到完全停止。)
此刻,我的代码会识别出角色必须加速,但速度的变化只会在每次按下并释放按键时发生(例如:第一次按键的速度为1,第二次按下的速度为2,在重置前,一直到最高速度的第五或第六次按下。)
我想编写我的代码,这意味着当按键被按下而不需要多次按下时,角色会加速。
到目前为止,我的代码是运动部分(周围有几个随机位):
x = (display_width * 0.45)
y = display_height * 0.8
x_change = 0
negx = 0
posx = 0
bun_speed = 0
while not crashed:
for event in pygame.event.get():
if event.type == pygame.QUIT:
crashed = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
posx = 0
if negx != -5:
negx = negx - 1
x_change = negx
elif negx == -5:
negx = 0
x_change = -5
elif event.key == pygame.K_RIGHT:
negx = 0
if posx != 5:
posx = posx + 1
x_change = posx
elif posx == 5:
posx = 0
x_change = 5
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_change = 0
elif event.key == pygame.K_RIGHT:
x_change = 0
x += x_change
display.fill(white)
bunny(x,y)
pygame.display.update()
clock.tick(60)
两个变量negx和posx分别根据按下的键减小和增加。按下分配给一个变量的键会将另一个键重置为零,因此当按下相反按钮时接下来调用该变量时,它将从零加速。一旦任一变量达到最大速度,它将在按钮释放时重置,这意味着角色可以再次加速。
如果有任何方法可以使这项工作(以及如果你能够完成代码),那么关于如何使其发挥作用的指导将非常感激。
为加速度定义变量(示例中为accel_x
),在事件循环中将其设置为所需的值,并将其添加到每帧的x_change
以加速。要将x_change
限制为最大速度,您必须将其标准化并将其乘以max_speed
。
要减速对象,可以在没有按键时将x_change
乘以低于1的值。
import pygame
pygame.init()
display = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
GRAY = pygame.Color('gray12')
display_width, display_height = display.get_size()
x = display_width * 0.45
y = display_height * 0.8
x_change = 0
accel_x = 0
max_speed = 6
crashed = False
while not crashed:
for event in pygame.event.get():
if event.type == pygame.QUIT:
crashed = True
elif event.type == pygame.KEYDOWN:
# Set the acceleration value.
if event.key == pygame.K_LEFT:
accel_x = -.2
elif event.key == pygame.K_RIGHT:
accel_x = .2
elif event.type == pygame.KEYUP:
if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
accel_x = 0
x_change += accel_x # Accelerate.
if abs(x_change) >= max_speed: # If max_speed is exceeded.
# Normalize the x_change and multiply it with the max_speed.
x_change = x_change/abs(x_change) * max_speed
# Decelerate if no key is pressed.
if accel_x == 0:
x_change *= 0.92
x += x_change # Move the object.
display.fill(GRAY)
pygame.draw.rect(display, (0, 120, 250), (x, y, 20, 40))
pygame.display.update()
clock.tick(60)
pygame.quit()
我找到了另一种加速角色的方法。而不是改变距离,改变时间。我定义了一个变量,它位于pygame.time.delay()中,延迟是我改变的。这样做更好,因为当从一个地方移动到另一个地方时,角色看起来不像是一个小故障。
import pygame
pygame.init()
win = pygame.display.set_mode((500, 500))
pygame.display.set_caption("ACCELERATE")
def main():
k = True
thita = 40
x = 250
y = 400
while k:
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
thita = 40
if event.key == pygame.K_RIGHT:
thita = 40
if event.type == pygame.QUIT:
k = False
if keys[pygame.K_LEFT]:
x -= 4
pygame.time.delay(thita)
if thita > 12:
thita -= 1
if keys[pygame.K_RIGHT]:
x += 4
pygame.time.delay(thita)
if thita > 11:
thita -= 1
pygame.draw.rect(win, (255, 0, 0), (x, y, 10, 10))
pygame.display.update()
win.fill((0, 0, 0))
main()
一旦我们拿起钥匙,你就会看到thita恢复原来的价值。
以上是关于Pygame - 运动加速的主要内容,如果未能解决你的问题,请参考以下文章