简单的拖动物理,左右移动时的动作有所不同

发布于 2021-01-29 16:44:38

这个问题已经在这里有了答案

Pygame不允许我将float用于rect.move,但我需要它 (2个答案)

如何在Pygame中以小角度低速闪烁绘制运动的圆? (1个答案)

20天前关闭。

我的代码对负速度的作用与对正速度的作用不同

我正在尝试实现平台物理学,玩家在X方向上具有速度,当用户分别按下“ A”或“ D”时,速度会增大或减小,或者在玩家与墙碰撞时将其设置为0。

为了模拟与地面的摩擦,请将玩家的X速度乘以“ self.drag”(浮动值小于1)

我希望这段代码可以降低玩家的X速度,随着时间的流逝,它会微不足道地降低到接近0的水平,而实际上并没有反转速度(就像减去一个值一样),这会在用户不执行运动命令时阻止玩家无法控制地滑动。

这在向右移动时按预期工作,但是向左移动时的行为有所不同,当向左移动时,玩家似乎在停止之前会继续漂浮一段时间。

这是在播放器类内部获取播放器输入的代码,运行每一帧:

dx = 0
if pygame.key.get_pressed()[pygame.K_a]:
        dx -= self.speed
if pygame.key.get_pressed()[pygame.K_d]:
        dx += self.speed

# to slow down horizontal movement
self.vx *= self.drag

# Add change in velocity to total velocity
self.vx += dx
self.vy += dy

也许这个概念行得通,而我实施得不正确?有碰撞代码可能以我未注意到的方式影响速度吗?对于正负速度,此系统是否工作不同?

谢谢!任何帮助深表感谢

关注者
0
被浏览
35
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    造成此问题的原因是,pygame.Rect存储整数坐标:

    Rect对象的坐标都是整数。[…]

    的部分组件dx,并dy当你丢失:

    self.Rect.x += dx
    
    
    
    self.Rect.y += dy
    

    您必须以浮点精度进行计算。在类中添加一个xandy属性。递增属性move并同步Rect属性:

    class Player:
        def __init__(self, color):
            self.Rect = pygame.Rect([50, 50], [30, 50])
            self.x = self.Rect.x
            self.y = slef.Rect.y
            # [...]
    
        def move(self, dx, dy, platforms):
            # Test for collisions with platforms
    
            # handle movement on the X axis
            self.x += dx
            self.Rect.x = round(self.x)
            for platform in platforms:
                if self.Rect.colliderect(platform.Rect):
                    if dx > 0:
                        self.Rect.right = platform.Rect.left
                    if dx < 0:
                        self.Rect.left = platform.Rect.right
                    self.x = self.Rect.x
                    # Reset velocity when collision with wall
                    self.vx = 0
    
            # handle movement on the Y axis
            self.Rect.y += dy
            self.Rect.y = round(self.y)
            for platform in platforms:
                if self.Rect.colliderect(platform.Rect):
                    if dy > 0:
                        self.Rect.bottom = platform.Rect.top
                    if dy < 0:
                        self.Rect.top = platform.Rect.bottom
                    self.y = self.Rect.y
                    # Reset velocity when collision with floor or roof
                    self.vy = 0
    
            # return correctly collided rect to draw()
            return self.Rect
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看