Pygame帧循环

问题描述 投票:-1回答:2

我在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()
python loops pygame frames gravity
2个回答
0
投票

Loop

据我所知,pygame中没有任何内容,例如frames(),它为你提供了一个可用于for循环的框架的迭代器。你需要使用while循环。在循环体中,您可以进行所有计算,移动曲面,在屏幕上显示它们并绘制。所以循环的每次迭代都是一个“框架”(我认为术语框架在这种情况下不合适,它不是带有一系列图像的电影)。

A note on gravity

重力是一种力量或加速度(假设你不关心质量)。在你的代码中,你将它视为一个速度,每次迭代以一个恒定的速度移动对象。如果你想真实地模拟你的引力,你需要随着时间增加速度,以便由于重力的速度根据uniform acceleration law增加。

A very basic example to give you the idea.

此代码重现了自由落体:

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的前一个位置进行blitting,或者一种方式打破循环。 每次物体落在表面上时,object.time应重置为0,防止其跌落。 另请注意,object应该是您创建的类的实例(可能是Sprite的子类),因此您可以实现自己的属性(如time,如果不创建它则没有类)和方法。

事实是你在游戏中实现了物理。 pygame不适合你。

此外,pygame intro tutorialSprite tutorial可能是一个很好的阅读。


0
投票

好吧,我已经能够发挥引力。

它不需要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 pos x和y)

希望它能为您服务

© www.soinside.com 2019 - 2024. All rights reserved.