Почему мой куб движется быстрее влево, чем вправо? - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь научиться программированию игры (и программированию в целом), поэтому я делаю простой боковой скроллер на Python с использованием pygame.

Проблема в том, что когда я двигаю персонажа (простой куб)) слева он движется быстрее, чем когда я двигаюсь вправо, как показано в консоли позже.

Вот изображение игры.

Основной классс циклом (я вырезал некоторые из них, потому что они не имеют значения, я думаю, но я могу опубликовать его при необходимости):

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 голосов
/ 29 мая 2018

Это происходит потому, что pygame.Rect s могут иметь только целые числа в качестве своих координат, и если вы добавите или вычтете число с плавающей запятой, результат будет усечен впоследствии.

Например, если rect.x равно 10 иВы добавляете 1,5 к rect.x, новое значение 11,5, которое затем преобразуется в 11. Если вы вычтите 1,5 из 10, вы получите 8,5, а после усечения его 8. Таким образом, в первом случае вы перемещаете 1 пиксель вправо, а во второмВы перемещаете на 2 пикселя влево.

Решение состоит в том, чтобы сохранить фактическую позицию в виде отдельной переменной или атрибута, добавить к ней скорость и затем присвоить это значение прямоугольнику.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...