我在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()
据我所知,pygame中没有任何内容,例如frames()
,它为你提供了一个可用于for
循环的框架的迭代器。你需要使用while
循环。在循环体中,您可以进行所有计算,移动曲面,在屏幕上显示它们并绘制。所以循环的每次迭代都是一个“框架”(我认为术语框架在这种情况下不合适,它不是带有一系列图像的电影)。
重力是一种力量或加速度(假设你不关心质量)。在你的代码中,你将它视为一个速度,每次迭代以一个恒定的速度移动对象。如果你想真实地模拟你的引力,你需要随着时间增加速度,以便由于重力的速度根据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
实例,这应该是某个精灵子类的实例,还可以再次在object
的前一个位置进行blitting,或者一种方式打破循环。
每次物体落在表面上时,object.time
应重置为0
,防止其跌落。
另请注意,object
应该是您创建的类的实例(可能是Sprite的子类),因此您可以实现自己的属性(如time
,如果不创建它则没有类)和方法。
事实是你在游戏中实现了物理。 pygame不适合你。
此外,pygame intro tutorial和Sprite tutorial可能是一个很好的阅读。
好吧,我已经能够发挥引力。
它不需要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)
希望它能为您服务