почему левый движется быстрее, чем правый для моего пигамного спрайта? - PullRequest
2 голосов
/ 28 июня 2019

У меня есть спрайт, представляющий моих игроков в моей игре в pygame, но оба они перемещаются влево быстрее, чем вправо.

важные части моего кода:

class Player(pygame.sprite.Sprite):
    def __init__(self,
                 name,
                 width,
                 height,
                 image=None,
                 keys=dict(left=pygame.K_a, right=pygame.K_d, up=pygame.K_w, down=pygame.K_s),
                 jump_height=2.55,
                 move_speed=1.5,
                 pos=(0, 0)):
        super().__init__()
        self.name = name
        if image is None:
            self.rect = pygame.Rect(pos, (width, height))
        else:
            self.rect = pygame.Rect(pos, (width, height))
            self.image = pygame.Surface((width, height))
            self.image.fill(image)
        self.keys = keys
        self.width = width
        self.height = height
        self.pos = pos
        self.rect.topleft = pos
        self.VX = 0
        self.VY = 0
        self.jump_height = jump_height
        self.move_speed = move_speed
        self.haveJumped = False
        self.wins = 0

    def move(self):
        self.VX = 0.0
        pressed = pygame.key.get_pressed()
        if pressed[self.keys["left"]]:
            self.VX = -self.move_speed
            if self.rect.left > 0:
                self.rect.left += self.VX

        if pressed[self.keys["right"]]:
            self.VX = self.move_speed
            if self.rect.right < windowWidth:
                self.rect.right += self.VX


будеткто-нибудь, пожалуйста, сможет мне сказать, почему мои игроки двигаются быстрее влево и как это исправить?

1 Ответ

5 голосов
/ 28 июня 2019

Согласно документам Rect :

Координаты для объектов Rect являются целыми числами.

Rect Pygame предназначен для работы с пикселями, а ваш move_speed равен 1.5, поэтому

if pressed[self.keys["left"]]:
    self.VX = -self.move_speed
    if self.rect.left > 0:
        self.rect.left += self.VX

Перемещает ваш прямоугольник 2 влево и

if pressed[self.keys["right"]]:
    self.VX = self.move_speed
    if self.rect.right < windowWidth:
        self.rect.right += self.VX

Перемещает ваш прямоугольник 1 вправо.

Вы должны использовать некоторую другую переменную в вашем классе для хранения позиции вашего объекта. Вы можете использовать атрибут pos, который уже существует:

class Player(pygame.sprite.Sprite):
    def __init__(self,
                 name,
                 width,
                 height,
                 image=None,
                 keys=dict(left=pygame.K_a, right=pygame.K_d, up=pygame.K_w, down=pygame.K_s),
                 jump_height=2.55,
                 move_speed=1.5,
                 pos=(0, 0)):
        super().__init__()
        self.name = name
        if image is None:
            self.rect = pygame.Rect(pos, (width, height))
        else:
            self.rect = pygame.Rect(pos, (width, height))
            self.image = pygame.Surface((width, height))
            self.image.fill(image)
        self.keys = keys
        self.width = width
        self.height = height
        self.pos = pos
        self.rect.topleft = pos
        self.VX = 0
        self.VY = 0
        self.jump_height = jump_height
        self.move_speed = move_speed
        self.haveJumped = False
        self.wins = 0

    def move(self):
        self.VX = 0.0
        pressed = pygame.key.get_pressed()
        if pressed[self.keys["left"]]:
            self.VX = -self.move_speed
            if self.pos[0] > 0:
                self.pos[0] += self.VX

        if pressed[self.keys["right"]]:
            self.VX = self.move_speed
            if (self.pos[0] + self.width) < windowWidth:
                self.pos[0] += self.VX

Но учтите, что вам необходимо соответствующим образом изменить код рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...