我想在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)这两个变量按分配给一个变量的键将另一个变量重置为零,因此当下一个变量被调用时,当按下相反的按钮时,它将从零加速。一旦任何一个变量达到最大速度,它就会重新设置按钮何时释放,这意味着字符可以再次加速。
如果有任何方法使这个工作(以及整理代码,如果你能够),那么如何使它发挥作用的指导将是非常感激的。
发布于 2018-04-10 17:02:30
为加速定义一个变量(示例中为accel_x),在事件循环中将其设置为所需的值,并将其添加到x_change --每一个帧--以加速。要将x_change限制到最大速度,您必须将其规范化并乘以max_speed。
要使对象减速,可以在没有按键的情况下,将值小于1的x_change相乘。
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()发布于 2019-04-10 11:57:52
我找到了另一种加速这个角色的方法。与其改变距离,不如改变时间。我在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就会返回到它的原始值。
发布于 2020-05-13 13:16:17
凯文,你提到的是一个关键点,但这是一个很容易解决的问题,你只需要用一些东西来代替减速代码,检查x_change是正的还是负的,然后在你搞清楚之后再加或减。
例如,他的代码是:
if accel_x == 0:
x_change *= 0.92代之以大致如下的内容:
if accel_x == 0:
if x_change > 0:
x_change -= 0.2
if x_change < 0.2:
x_change = 0
elif x_change < 0:
x_change += 0.2
if x_change > -0.2:
x_change = 0https://stackoverflow.com/questions/49752275
复制相似问题