Петля Pygame frames - PullRequest
       50

Петля Pygame frames

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

Я делаю свою первую игру в Pygame.Это игра в стиле Flappy Bird.Теперь я должен сделать гравитацию, но я не знаю, как сделать, чтобы каждый кадр уменьшал положение y на объекте.На данный момент мой код:

import pygame
from pygame.locals import *
import sys
import time
import os
width = 950
height = 500
Screen = 0 # 0 = Playscreen | 1 = Game screen | 2 = Game Over screen


def main():
    pygame.init()
    screen = pygame.display.set_mode((width, height))
    pygame.display.set_caption('Flappy Dog')
    background = pygame.image.load(os.path.join("Images", "Background_00.png")).convert()
    FlappyDog = pygame.image.load(os.path.join("Images", "Flappy.png")).convert_alpha()
    Play = pygame.image.load(os.path.join("Images", "Play.png")).convert_alpha()
    Dog0 = pygame.image.load(os.path.join("Images", "Dog0.png")).convert_alpha()
    Dog1 = pygame.image.load(os.path.join("Images", "Dog1.png")).convert_alpha()
    SpikeUp0 = pygame.image.load(os.path.join("Images", "SpikeUp0.png")).convert_alpha()
    SpikeUp1 = pygame.image.load(os.path.join("Images", "SpikeUp1.png")).convert_alpha()
    SpikeDown0 = pygame.image.load(os.path.join("Images", "SpikeDown0.png")).convert_alpha()
    SpikeDown1 = pygame.image.load(os.path.join("Images", "SpikeDown1.png")).convert_alpha()
    GameOver = pygame.image.load(os.path.join("Images", "Game-Over.png")).convert_alpha()
    Replay = pygame.image.load(os.path.join("Images", "Replay.png")).convert_alpha()

    if  Screen == 0:   
        screen.blit(background, (0, 0))
        screen.blit(Dog1, (0, 0))
        pygame.display.update()
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                    pygame.display.update()


if __name__ == "__main__":
    main()

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Хорошо, я смог сделать гравитацию.

Это не требует fps.Только вы должны написать это через какое-то время, что говорит о том, что вы играете в игру.

while playing == true:
    Dog_pos_y = Dog_pos_y +1
    screen.blit(background, (0, 0)
    screen.blit(Dog, (Dog_pos_x, Dog_pos_y))
    screen.blit(SpikeUp, (0, 0))
    screen.blit(SpikeDown, (0, 436))
    pygame.display.update()
    pygame.time.delay(1)

(вы должны установить Dog x и y в начале кода)

Надеюсь, что это послужит вам

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

Loop

Насколько я знаю, в Pygame нет ничего такого, что frames() дает вам итератор кадров, пригодных для использования с циклом for.Вам нужно использовать цикл while.В теле цикла вы выполняете все вычисления, перемещаете поверхности, перетаскиваете их на экран и рисуете.Таким образом, каждая итерация цикла является «кадром» (я думаю, что термин frame в данном случае не подходит, это не фильм с последовательностью изображений).

Примечание ксила тяжести

Гравитация - это сила или ускорение (если вы не заботитесь о массах).В вашем коде вы воспринимаете это как скорость, перемещая объект с дорогой скоростью в каждой итерации.Если вы хотите реалистично смоделировать гравитацию, вам нужно увеличить скорость со временем, чтобы скорость из-за гравитации увеличивалась в соответствии с законом равномерного ускорения .

A очень простой пример, чтобы дать вам идею.

Этот код воспроизводит свободное падение:

gravity = 2 #or whatever constant value you want for the gravity acceleration
screen = pygame.display.set_mode((x, y)) #x and y here is the resolution
while True:
    object.time += 1
    gravity_speed = gravity * object.time
    object.rect.y += gravity_speed
    screen.blit(object.image, object.rect)
    pygame.display.update()
    pygame.time.delay(50) #add a delay before the next loop, otherwise things happens really fast.

Этот код не работает, как есть, вещи отсутствуют, как рисованиефон экрана, создание экземпляра object, который должен быть экземпляром некоторого подкласса спрайта, а также повторное создание фона на предыдущей позиции object или способ разрыва цикла.
object.time должно бытьСбрасывайте на 0 каждый раз, когда объект приземляется на поверхность, не позволяя ему упасть.
Обратите внимание, что object должен быть экземпляром созданного вами класса (вероятно, дочерний класс Sprite ) так что вы можете реализовать свои собственные атрибуты (например, time, ни один класс не имеет его, если вы его не создаете) и методы.

Дело в том, что у вас есть реализация физики, которую яв игре.pygame не делает этого за вас.

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

...