[英]Why is my cube moving faster to the left than to the right?
我正在嘗試學習游戲編程(以及一般的編程),因此我使用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
我不明白這一點,現在有人這是什么原因造成的? 而且,我的運動有點口吃,為什么呢?
發生這種情況是因為pygame.Rect
只能將整數作為坐標,如果添加或減去浮點數,結果會在之后被截斷。
例如,如果rect.x
是10並且你向rect.x
添加1.5,則新值為11.5,然后轉換為11.如果從10減去1.5,則得到8.5並且在截斷它之后8.所以在第一種情況下你向右移動1像素,在第二步向左移動2像素。
解決方案是將實際位置存儲為單獨的變量或屬性,向其添加速度,然后將此值分配給rect。
pos_x += speed
rect.x = pos_x
我通常使用向量來存儲位置和速度。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.