我正在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()
答案 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 tutorial和Sprite 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)
希望它为您服务