【问题标题】:How can I make directional movement in pygame smooth?如何使pygame中的定向运动平滑?
【发布时间】:2021-11-05 19:03:55
【问题描述】:

我正在 pygame 中制作一个游戏,你是一只水母,你可以四处游动。我设法能够转向并朝着水母旋转的方向前进。但是当我朝那个方向走时,玩家的形象在颤抖。我能以某种方式解决这个问题吗?

其中 self.list[int(self.current)] 是动画的当前图像和 dt 增量时间。

if pygame.key.get_pressed()[pygame.K_UP]:
    self.rotr = math.radians(self.rot)
    self.ysp = math.cos(self.rotr)
    self.xsp = math.sin(self.rotr)
    self.x -= self.xsp*dt*20
    self.y -= self.ysp*dt*20
    self.image = pygame.transform.rotate(self.list[int(self.current)], self.rot)
    self.rect = self.image.get_rect(center = (x, y))

if pygame.key.get_pressed()[pygame.K_LEFT]:
    self.rot += math.pi*dt*7

if pygame.key.get_pressed()[pygame.K_RIGHT]:
    self.rot -= math.pi*dt*7

【问题讨论】:

  • 似乎您依赖某种量化(即整数)值来进行位置和/或旋转。您应该使用浮动的 X 和 Y 值以及角度值。但是如果没有minimal reproducible example,这个问题就无法回答,可能会被关闭。但无论如何,人们通常使用图像像素值或 rect X 和 Y 值作为其对象的坐标,这会引入各种抖动,就像您正在经历的那样。您需要对浮点 X 和 Y 值进行四舍五入,以便将精灵放在屏幕上的某个位置。
  • 我不知道你所说的“摇晃”是什么意思。在我看来并不坏。由于图像旋转,您确实会得到一些伪影,但在旋转具有锐利边缘的小图像时总是会出现这种情况。您可能会考虑将水母换成更柔软的边缘。
  • 很抱歉没有添加我的代码,但我现在这样做了。至少我认为重要的代码
  • 试试self.rect = self.image.get_rect(center = (round(x), round(y)))。然而,在 Pygame 中,精灵总是以 1 像素为间隔移动。它可能没有比这更好的了。
  • 动画精灵的大小都一样吗?

标签: python pygame


【解决方案1】:

您可能已经看过有关如何在 PyGame 中移动对象的教程,这些教程依赖于整数 X 和 Y 值。这不是实现平滑运动的好方法。 NOT 平滑运动的示例如下 - 请注意速度和位置值如何为整数:

import pygame
pygame.init()  
win = pygame.display.set_mode((500, 500))
pygame.display.set_caption("Moving rectangle")
x = 200 #integer value
y = 200 #integer value
width = 20
height = 20
vel = 10 # integer value
run = True
while run:
    pygame.time.delay(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        x -= vel
    if keys[pygame.K_RIGHT]:
        x += vel
    if keys[pygame.K_UP]:
        y -= vel
    if keys[pygame.K_DOWN]:
        y += vel
    win.fill((0, 0, 0))
    #int values are directly used for screen position
    pygame.draw.rect(win, (255, 0, 0), (x, y, width, height)) 
    pygame.display.update() 
pygame.quit()

不过,这是一个简单的解决方法:

x = 200.0 #now a float
y = 200.0 #now a float
width = 20
height = 20
vel = 10.0 #now a float
run = True
while run:
    pygame.time.delay(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        x -= vel
    if keys[pygame.K_RIGHT]:
        x += vel
    if keys[pygame.K_UP]:
        y -= vel
    if keys[pygame.K_DOWN]:
        y += vel
    win.fill((0, 0, 0))
    #now converting X and Y from floats to integers, rounding first
    pygame.draw.rect(win, (255, 0, 0), (int(round(x)), int(round(y)), width, height)) 

请注意,当我们绘制矩形时,我们如何舍入 X 和 Y 坐标。四舍五入的坐标是显示坐标。您在内部使用的 X 和 Y 值甚至不必与像素值 1:1 相对应;您可以控制从位置坐标到屏幕坐标的转换是如何发生的。这只是最简单的情况。

使用加速度、摩擦力等可以实现更平滑的运动。不过有很多关于这方面的教程。

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 2021-01-13
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多