Почему прыжки не работает, не работает в Pygame - PullRequest
1 голос
/ 13 января 2020

Я не могу понять, почему мой игрок не прыгает. Я определил функции jump и update следующим образом:

def jump(self):
     if self.is_jumping == False:
         self.is_jumping = True

def update(self):
    if self.is_jumping:
         self.y -= self.force

Вот инициализация

class Myman:
    def __init__(self, x, y, side):
        self.x  = x
        self.y = y
        self.side = side
        self.speed = 2
        self.is_jumping = False

Я реализовал это в основном l oop следующим образом:

while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                mm.jump()

    d.fill((98, 98, 98))
    mm.draw()
    mm.g()
    mm.update()


    if mm.y + mm.side > 550:
         mm.y = 550 - mm.side
         mm.falling = False

Однако, когда я пытаюсь прыгнуть, это не работает. Все примеры, которые я видел в прыжках до сих пор, делали то же самое, но мой не работает, и я не могу понять, почему. Спасибо за помощь.

Вот код для тех, кто хотел бы проверить для справки.

import pygame, os

os.environ["SDL_VIDEO_CENTERED"] = "1"
pygame.init()

win = pygame.display
d = win.set_mode((1200, 600))
win.set_caption("Jump")

gravity = 0.1

class Myman:
    def __init__(self, x, y, side):
        self.x  = x
        self.y = y
        self.side = side
        self.speed = 2
        self.is_jumping = False
        self.force = 2

    def draw(self):
        pygame.draw.rect(d, (0 ,255, 0), (self.x, self.y, self.side, self.side))

    def g(self):
        global gravity
        self.y += gravity
        gravity += 0.01

    def move_left(self):
        self.x -= self.speed

    def move_right(self):
        self.x += self.speed

    def jump(self):
        if self.is_jumping == False:
            self.is_jumping = True

    def update(self):
        if self.is_jumping:
            self.y -= self.force


mm = Myman(600, 400, 20)

def platform():
    pygame.draw.rect(d, (0 ,0, 0), (0, 550, 1200, 50))

while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                mm.jump()

    d.fill((98, 98, 98))
    mm.draw()
    mm.g()
    mm.update()
    platform()
    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT]:
        mm.move_right()
    if keys[pygame.K_LEFT]:
        mm.move_left()

    if mm.y + mm.side >= 550:
        mm.y = 550 - mm.side
        mm.falling = False

    win.flip()

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Проблема в том, что ваша гравитация постоянно увеличивается:

def g(self):
    global gravity
    self.y  += gravity
    gravity += 0.01        # <-- HERE

Через одну секунду гравитация составляет 60 пикселей на кадр. Это сразу более чем отменяет любое незначительное изменение скорости, вызванное прыжками.

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

Что-то вроде:

class Myman:
    JUMP_TIME = 1500  # milliseconds to jump apogee
    def __init__(self, x, y, side):
        self.x = x
        self.y = y
        self.jump_at = 0         # time of jump start
        # ... rest of code omitted

    def isJumping( self ):
       jumping = False
       time_now = pygame.time.get_ticks()
       if ( time_now - self.jump_at < 2 * Myman.JUMP_TIME ): # up and down time
           jumping = True
       return jumping

    def jump( self ):
        if ( not self.isJumping() ):   # is the player ready to jump again
            self.jump_at = pygame.time.get_ticks()  # time now

   def update( self ):
       if ( self.isJumping() ):
           time_now = pygame.time.get_ticks()
           # is the player going up, or coming down?
           if ( time_now - self.jump_at < Myman.JUMP_TIME ):
               self.gravity = -0.1                       # still jumping up
           else:
               self.gravity = 0.1                        # now going down
       # ... rest of code omitted

Примечание о стиле: я целенаправленно ставлю скобки вокруг всех if выражений, потому что я действительно Поверьте, это делает код более читабельным. Это противоречит рекомендациям в PEP8.

0 голосов
/ 13 января 2020

Надеюсь, это решит ваши проблемы, но ваш код имеет неправильный отступ. от d.fill((98, 98, 98)) до win.flip() вашему коду может потребоваться еще одна вкладка 4 пробела / 1, чтобы соответствовать для l oop

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