我正在尝试学习游戏编程(以及一般的编程),因此我使用 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)
我有点不明白这一点,现在有人知道这是什么原因吗?还有,我的动作有点卡顿,这是为什么?
发生这种情况是因为pygame.Rect
s 只能将整数作为其坐标,并且如果添加或减去浮点数,结果会在之后被截断。
例如,如果rect.x
10 并且您将 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)