我正在尝试学习游戏编程(以及一般的编程),因此我使用pygame在Python中创建一个简单的sidescroller。
问题是,当我将角色(一个简单的立方体)向左移动时,它比我向右移动时的移动速度更快,如稍后在控制台中所示。
循环的主要类(我已经删除了一些,因为它没有相关性,我想,但我可以在必要时发布它):
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
我不明白这一点,现在有人这是什么原因造成的? 另外,我的动作有点口吃,为什么会这样?
答案 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