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

时间:2018-05-29 17:17:43

标签: python pygame

我正在尝试学习游戏编程(以及一般的编程),因此我使用pygame在Python中创建一个简单的sidescroller。

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

Here is picture of the game.

循环的主要类(我已经删除了一些,因为它没有相关性,我想,但我可以在必要时发布它):

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()

多维数据集类:

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))

正如你所看到的,我正在尝试打印出来,向右移动了多少像素与左边有多少像素:

Speed times deltaTime, right: 2.2950000000000004
deltaX, right: 2
exiting game
Speed times deltaTime, left: 2.2950000000000004
deltaX, left: -3

我不明白这一点,现在有人这是什么原因造成的? 另外,我的动作有点口吃,为什么会这样?

1 个答案:

答案 0 :(得分:4)

这是因为pygame.Rect s只能将整数作为坐标,如果加上或减去浮点数,结果会在之后被截断。

例如,如果rect.x为10并且您向rect.x添加1.5,则新值为11.5,然后将其转换为11.如果从10减去1.5,则得到8.5并且在截断之后为8所以在第一种情况下你向右移动1像素,在第二种情况下向左移动2像素。

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

pos_x += speed
rect.x = pos_x

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

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