pygame框架循环

时间:2019-02-23 21:18:24

标签: python loops pygame frames gravity

我正在pygame做我的第一场比赛。这是一个飞扬的小鸟风格的游戏。现在,我必须进行重力处理,但是我不知道该怎么做,因为每个框架都会降低对象的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 :(得分:0)

循环

据我所知,在pygame中没有frames()这样的东西,它为您提供了for循环可使用的帧的迭代器。您需要使用while循环。在循环的主体中,您可以进行所有计算,移动曲面,在屏幕上涂抹曲面并进行绘制。因此,循环的每个迭代都是一个“帧”(我认为 frame 不适用于这种情况,因为它不是具有一系列图像的电影)。

关于重力的注释

重力是一种力或加速度(假设您不关心质量)。在您的代码中,您像对待速度一样对待它,每次迭代都以大步伐移动对象。如果要现实地建模重力,则需要随时间增加速度,以使重力引起的速度根据uniform acceleration law增大。

一个非常基本的示例可以为您提供想法。

此代码再现了自由下落:

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实例(该实例应该是某些sprite子类的实例),并再次在前一个位置涂抹背景object中的一种,或一种打破循环的方式。
每次物体降落在表面上时,object.time都应重置为0,以防止其掉落。
另请注意,object应该是您创建的类的实例(可能是Sprite的子类),以便您可以实现自己的属性(例如time,如果您拥有此类,则没有任何类不要创建它)和方法。

事实是您已经在游戏中实现了物理功能。 pygame不会帮您做到这一点。

此外,pygame intro tutorialSprite tutorial可能是不错的读物。

答案 1 :(得分: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)

希望它为您服务