Как мне заставить моего персонажа ускоряться и замедляться вместо того, чтобы просто двигаться с определенной скоростью (в pygame)? - PullRequest
2 голосов
/ 04 августа 2020

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

Я хочу, чтобы движение было как у астероидов, где он ускоряется в направление, в которое вы смотрите, и скорость в какой-то момент падает, затем, если вы прекращаете ускоряться, его скорость медленно уменьшается, пока не остановится.

rn, если я нажимаю кнопку вперед, он просто начинает двигаться с максимальной скоростью напрямую и немедленно останавливается, когда я позволяю go.

Это код для моего класса корабля

class Ship:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.width = 0
        self.vel = 0
        self.angle = 0

    def draw(self):
        ship_img = pygame.image.load("sprites/ship_off.png")
        ship_img_copy = pygame.transform.rotate(ship_img, self.angle)
        window.blit(ship_img_copy,
                    (self.x - (ship_img_copy.get_width()) / 2, self.y - (ship_img_copy.get_height()) / 2))

        keys = pygame.key.get_pressed()

        if keys[pygame.K_w]:
            ship_img = pygame.image.load("sprites/ship_on.png")
            ship_img_copy = pygame.transform.rotate(ship_img, self.angle)
            window.blit(ship_img_copy,
                        (self.x - (ship_img_copy.get_width()) / 2, self.y - (ship_img_copy.get_height()) / 2))

    def move(self):
        keys = pygame.key.get_pressed()
        # todo acceleration and thrust mechanics
        if keys[pygame.K_w]:
            self.x += self.vel * cos(self.angle * (pi / 180) + (90 * pi / 180))
            self.y -= self.vel * sin(self.angle * (pi / 180) + 90 * (pi / 180))
            # So that if it leaves one side it comes from the other
            if self.y < 0:
                self.y = (self.y - self.vel) % 600

            elif self.y > 600:
                self.y = (self.y + self.vel) % 600

            elif self.x < 0:
                self.x = (self.x - self.vel) % 800

            elif self.x > 800:
                self.x = (self.x + self.vel) % 800

        if keys[pygame.K_a]:
            self.angle += 7

        if keys[pygame.K_d]:
            self.angle -= 7

Я пробовал, но не смог, поэтому вот мой код

1 Ответ

2 голосов
/ 04 августа 2020

Вы должны изменить self.vel при нажатии w или s , но вы должны изменить self.x и self.y в каждом кадре, в зависимости от self.vel :

class Ship:
    def __init__(self, x, y):
        # [...] 

        self.vel = 0
        self.max_vel = 10

    # [...]

    def move(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w]:
            self.vel = min(self.vel+1, self.max_vel)
        if keys[pygame.K_s]:
            self.vel = max(self.vel-1, 0)

        if keys[pygame.K_a]:
            self.angle += 7
        if keys[pygame.K_d]:
            self.angle -= 7

        self.x += self.vel * cos(self.angle * (pi / 180) + (90 * pi / 180))
        self.y -= self.vel * sin(self.angle * (pi / 180) + 90 * (pi / 180))
        if self.y < 0:
            self.y = (self.y - self.vel) % 600
        elif self.y > 600:
            self.y = (self.y + self.vel) % 600
        elif self.x < 0:
            self.x = (self.x - self.vel) % 800
        elif self.x > 800:
            self.x = (self.x + self.vel) % 800
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...