Python Platformer: прыжки персонажей - PullRequest
0 голосов
/ 24 апреля 2018

Для одного из моих проектов я пытаюсь сделать так, чтобы, если я коснусь w, он прыгнул, но если я удержу, он немного повысится и прыгнет выше.

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

Я использую pygame.math.Vector2 для векторов движения, с настройкой ускорения и скорости.Когда я прыгаю, он применяет ускорение, и у меня есть сила тяжести, тянущая его вниз.

Спасибо за помощь!

(Если мне неясно, просто скажите мне, я не очень хорош в объяснении вещей...: /)

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Что вы можете сделать, это использовать переменную времени какого-либо типа, чтобы проверить, сколько миллисекунд удерживается символ «W». Если его просто нажать, то он будет прыгать только один раз, но если удерживать клавишу, скажем, 800 миллисекунд, то вместо простого прыжка вы сделаете прыжок в высоту или ускоренный прыжок.

Вот код sudo:

# this variable will keep track of your time
# look for an online time library for python
time = 0;

# Check for "W" key and duration of press
if keypressed = w: 
    if time < 800 miliseconds:
        # Execute normal jump
    else:
        # Execute boosted jump
0 голосов
/ 24 апреля 2018

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

Если вы используете векторы pos и гравитационную переменную, этокод столкновения будет творить чудеса.Убедитесь, что для on_ground установлено значение False, когда вы тоже прыгаете.

    self.pos.x += self.vel.x * dt
    self.rect.x = self.pos.x

    collisions = pg.sprite.spritecollide(self, self.blocks, False)
    for block in collisions:
        if self.vel.x > 0:
            self.rect.right = block.rect.left
        elif self.vel.x < 0:
            self.rect.left = block.rect.right
        self.pos.x = self.rect.x

    self.pos.y += self.vel.y * dt
    self.rect.y = self.pos.y

    collisions = pg.sprite.spritecollide(self, self.blocks, False)
    for block in collisions:
        if self.vel.y > 0:
            self.rect.bottom = block.rect.top
            self.vel.y = 0
            self.on_ground = True
        elif self.vel.y < 0:
            self.rect.top = block.rect.bottom
            self.vel.y = 0
        self.pos.y = self.rect.y

    if self.rect.bottom >= WINDOW_HEIGHT:
        self.vel.y = 0
        self.rect.bottom = WINDOW_HEIGHT
        self.pos.y = self.rect.y
        self.on_ground = True
    else:
        self.vel.y += GRAVITY * dt  # Gravity

PS Проверьте ответ на приведенный ниже вопрос.

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