簡體   English   中英

為什么我的立方體向左移動比向右移動更快?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM