为什么我的立方体向左移动比向右移动快?

use*_*212 3 python pygame

我正在尝试学习游戏编程(以及一般的编程),因此我使用 pygame 在 Python 中制作了一个简单的侧滚器。

问题是,当我将角色(一个简单的立方体)向左移动时,它比向右移动时移动得更快,如稍后在控制台中所示。

这是游戏的图片。

带有循环的主类(我删掉了其中的一些,因为我认为它没有相关性,但如果需要,我可以发布它):

player.speed = 135
player = Player.Cube([255,0,0],600, screen.get_height()*0.8-screen.get_height()*0.125,screen.get_height()*0.125,screen.get_height()*0.125)
running = True
clock = pygame.time.Clock()

while running:

    deltaTime = clock.tick(60) / 1000



    screen.blit(background, (0, 0))
    screen.blit(player.image,(player.rect.x,player.rect.y))
    screen.blit(grass,(0,screen.get_height()-grass.get_height()))

    keystate = pygame.key.get_pressed()

    if keystate[K_RIGHT]:
        player.moveRight(deltaTime)
    elif keystate[K_LEFT]:
        player.moveLeft(deltaTime)
    pygame.display.flip()
Run Code Online (Sandbox Code Playgroud)

立方体类:

class Cube(pygame.sprite.Sprite):
    speed = 0
    def __init__(self, color, left,top, width, height):
        # Call the parent class (Sprite) constructor
        pygame.sprite.Sprite.__init__(self)
        self.left = left
        self.top = top
        self.image = pygame.Surface([width,height])
        self.image.fill(color)
        self.rect  = pygame.Rect(left, top, width, height)
    def moveRight(self,deltaTime):
        oldX=self.rect.x
        self.rect.x += self.speed*deltaTime
        print(self.speed*deltaTime)
        print("deltaX: " + str(self.rect.x-oldX))
    def moveLeft(self,deltaTime):
        oldX = self.rect.x
        self.rect.x -= self.speed*deltaTime
        print(self.speed * deltaTime)
        print("deltaX: " + str(self.rect.x-oldX))
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在尝试打印出向右移动了多少像素与向左移动了多少像素:

Speed times deltaTime, right: 2.2950000000000004
deltaX, right: 2
exiting game
Speed times deltaTime, left: 2.2950000000000004
deltaX, left: -3
Run Code Online (Sandbox Code Playgroud)

我有点不明白这一点,现在有人知道这是什么原因吗?还有,我的动作有点卡顿,这是为什么?

skr*_*krx 5

发生这种情况是因为pygame.Rects 只能将整数作为其坐标,并且如果添加或减去浮点数,结果会在之后被截断。

例如,如果rect.x10 并且您将 1.5 添加到rect.x新值 11.5,然后将其转换为 11。如果您从 10 中减去 1.5,您将得到 8.5,截断后为 8。因此,在第一种情况下,您向右移动 1 px在第二个中,您向左移动 2 px。

解决方案是将实际位置存储为单独的变量或属性,为其添加速度,然后将此值分配给 rect。

pos_x += speed
rect.x = pos_x
Run Code Online (Sandbox Code Playgroud)

我通常使用向量来存储位置和速度。

import pygame as pg
from pygame.math import Vector2


class Player(pg.sprite.Sprite):

    def __init__(self, pos, *groups):
        super().__init__(*groups)
        self.image = pg.Surface((30, 50))
        self.image.fill(pg.Color('dodgerblue1'))
        self.rect = self.image.get_rect(center=pos)
        self.vel = Vector2(0, 0)
        self.pos = Vector2(pos)

    def update(self):
        self.pos += self.vel
        self.rect.center = self.pos
Run Code Online (Sandbox Code Playgroud)