Pygame цикл через движение с экземпляром класса - PullRequest
0 голосов
/ 07 марта 2020

Я не могу понять, как l oop через функцию перехода, не имея ее в первом блоке while True. Ни одна из предложенных альтернатив пока не сработала. В настоящее время единственный способ заставить его работать - это нажимать пробел для каждого шага прыжка.

import pygame
from pygame import Color

HEIGHT = 500
WIDTH = 400
surface = pygame.display.set_mode((HEIGHT, WIDTH))


class Bird:
    def __init__(self):
        self.x = 10
        self.y = 300
        self.vy = 5
        self.jumpCount = 10
        self.isJump = False

    def draw(self):
        pygame.draw.rect(surface, Color("yellow"), (self.x, self.y, 10, 10))
        pygame.display.flip()

    def jump(self):

        if self.isJump:
            # using 'while' doesn't work either
            if self.jumpCount >= -10:
                # this doesn't work -> pygame.time.delay(100)
                print(self.jumpCount)
                self.y += (self.jumpCount * abs(self.jumpCount)) * -0.5
                self.jumpCount -= 1
            else:
                self.jumpCount = 10
                self.isJump = False

        return self.isJump

    def move(self):
        return

def run():
    bird = Bird()
    while True:

        pygame.time.delay(100)
        # only works if I put 'bird.isJump = True, bird.jump()' here, and then it loops continuously
        surface.fill(Color("blue"))
        bird.draw()
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == 32:
                    bird.isJump = True
                    bird.jump()
            if event.type == pygame.QUIT:
                pygame.quit()
        pygame.display.flip()


run()

1 Ответ

1 голос
/ 07 марта 2020

Вы можете вызывать метод move каждый раз, когда запускаете игру l oop вместе с draw, а затем вызывать метод jump только один раз, когда нажимается пробел.

Результатом будет (с некоторыми другими незначительными изменениями, такими как вызов pygame.init, выход с quit вместо pygame.quit и удаление избыточных членов класса):

import pygame
from pygame import Color


class Bird:
    def __init__(self):
        self.x = 10
        self.y = 300
        self.jumpCount = 10
        self.isJump = False

    def draw(self):
        pygame.draw.rect(surface, Color("yellow"), (self.x, self.y, 10, 10))
        pygame.display.flip()

    def jump(self):
        self.jumpCount = 10
        self.isJump = True

    def move(self):
        if self.isJump:
            if self.jumpCount >= -10:
                self.y += (self.jumpCount * abs(self.jumpCount)) * -0.5
                self.jumpCount -= 1
            else:
                self.isJump = False


def run():
    bird = Bird()
    while True:

        pygame.time.delay(100)
        surface.fill(Color("blue"))
        bird.move()
        bird.draw()
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == 32:
                    bird.jump()
            if event.type == pygame.QUIT:
                quit()
        pygame.display.flip()


pygame.init()
HEIGHT = 500
WIDTH = 400
surface = pygame.display.set_mode((HEIGHT, WIDTH))
run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...