Пигамный спрайт вращается слишком быстро - PullRequest
0 голосов
/ 04 февраля 2019

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

Я уже пробовал использовать операторы if с true и false, но это все равно заставляет его слишком быстро наклоняться, когда предполагается, что он остановится на 90 градусов.

Функция обновления в основном добавляет скорость кфункция position и draw выводит объект на экран в зависимости от того, какие позиции у объекта.

Вот фрагмент кода:

class Tank:
    def __init__(self, x, y, pic):
        self.xpos = x
        self.ypos = y
        self.speed_x = 0
        self.speed_y = 0
        self.picture = pic
        self.rotation_angle = 0
        self.rotation_angle_speed = 0
        self.rect = self.picture.get_rect()

    def update(self):
        self.xpos =+ self.speed_x
        self.ypos =+ self.speed_y
        self.rotation_angle =+ self.rotation_angle_speed


    def rotate(self):
        self.picture = pygame.transform.rotate(self.picture, self.rotation_angle)


    def draw(self):
        screen.blit(self.picture, (self.xpos, self.ypos))


    def is_collided_with(self, sprite):
        return self.rect.colliderect(sprite.rect)

one_tank = pygame.image.load("C:/aliens/tank_two.png").convert_alpha()
one_tank = pygame.transform.scale(one_tank, (100, 100))

tank_one = Tank(100, 100, one_tank)
level = Level_background(0, 0, level_pic)

one_right = False
one_left = False

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                tank_one.speed_y = -5

            elif event.key == pygame.K_s:
                tank_one.speed_y = 5

            elif event.key == pygame.K_a:
                tank_one.speed_x = -5

            elif event.key == pygame.K_d:
                tank_one.speed_x = 5

            elif event.key == pygame.K_q:
                if one_left == False:
                    tank_one.rotation_angle_speed = -90
                    one_left = True

            elif event.key == pygame.K_e:
                if one_right == False:
                    tank_one.rotation_angle_speed = 90
                    one_right = True

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_w:
                tank_one.speed_y = 0

            elif event.key == pygame.K_s:
                tank_one.speed_y = 0

            elif event.key == pygame.K_a:
                tank_one.speed_x = 0

            elif event.key == pygame.K_d:
                tank_one.speed_x = 0

            elif event.key == pygame.K_q:
                if one_left == True:
                    tank_one.rotation_angle_speed = 0
                    one_left = False

            elif event.key == pygame.K_e:
                if one_right == True:
                    tank_one.rotation_angle_speed = 0
                    one_right = False

    tank_one.update()

    level.draw()

    tank_one.rotate()

    tank_one.draw()

    pygame.display.flip()
    clock.tick(60)

Что я ожидал бы сделатьбудет наклоняться на 90 градусов и оставаться таким до тех пор, пока кнопка не будет нажата снова.Но вместо этого он просто решает отклониться на угол более 90 градусов

1 Ответ

0 голосов
/ 04 февраля 2019

Сброс параметров, управляющих вращением, после того, как вы сделали одно вращение на 90 градусов.Это приводит к тому, что дальнейшее вращение не применяется, пока не нажата новая кнопка:

class Tank:

    # [...]

    def rotate(self):
        self.picture = pygame.transform.rotate(self.picture, self.rotation_angle)
        self.rotation_angle_speed = 0
        self.rotation_angle = 0 

Кроме того, существует проблема в методе update класса Tank.=+ назначит значение.Примечание = - это присвоение, а + - просто положительный знак для значения.Инкрементное присваивание равно +=, а не =+:

class Tank:

    # [...]

    def update(self):
        self.xpos += self.speed_x
        self.ypos += self.speed_y 
        # [...]

Далее вы должны очистить все окно в начале каждого кадра.Это можно сделать с помощью pygame.Surface.fill():

while True:

    screen.fill((0,0,0))

    # [...]
...