所以我正在使用pygame进行侧滚动游戏,我正在努力实现引力。 我现在的代码理论上工作,但程序只是停止响应,我已经关闭它。我甚至没有任何错误回到我身边让我知道出了什么问题。
我曾经让重力工作,但它只在未按下按键时激活。如果您按下“跳跃按钮”(空格键),您将无限向上移动,当您释放它时,您将最终开始下降。 所以我改变了我的想法,然后让重力在一个keydown事件中循环。 在循环内部,我添加了两个变量,gravity和grav_time,并将变量add_grav_time设置为True。虽然这是真的,并且重力小于数字,但我会让角色跳起来。一旦重力超过一定数量,我就会让角色掉下来。然后我重置重力。我没有看到我的代码有任何错误,所以我不知道问题是什么。
import Level, pygame, sys
import time
pygame.init()
f=open("lvl1.txt")
lvldata=[]
for line in f:
x=line.split()
lvldata.append([int(v)for v in x])
size=1000,555
screen=pygame.display.set_mode(size)
pygame.key.set_repeat(15,15)
lvl=Level.Level(lvldata,screen,size)
hero_img=pygame.image.load("hero.png")
herorect=pygame.Rect(lvl.spawn_x, lvl.spawn_y, 100, 100)
hero_position=[lvl.spawn_x, lvl.spawn_y]
velocity = [0,0]
face='R'
bkrd = pygame.image.load("bkrd2.png")
bkrdrect = bkrd.get_rect()
Gc=0
while True:
Gc+=0.1
if lvl.checkcollision(herorect):
velocity=[0,0]
for event in pygame.event.get():
keys=pygame.key.get_pressed()
if keys[pygame.QUIT]:
sys.exit()
if event.type == pygame.KEYDOWN:
if keys[pygame.K_LEFT]:
if face=='R':
hero_img = pygame.transform.flip(hero_img, True, False)
face='L'
if herorect.left>0:
hero_position[0]-=10
else:
hero_position[0]=0
if keys[pygame.K_RIGHT]:
if face=='L':
hero_img = pygame.transform.flip(hero_img, True, False)
face='R'
if herorect.right<size[0]:
hero_position[0]+=10
if keys[pygame.K_SPACE]:
if velocity[1] == 0:
gravity=0
grav_time=1
add_grav_time = True
while add_grav_time:
gravity += grav_time
while gravity <30:
velocity[1] -=5
while gravity >=30:
velocity[1] -=5
#gravity = 0
#timer.start()
#while gravity <50:
# velocity[1] -=5
# gravity += timer.s()
#while gravity >=50:
# velocity[1] +=5
#while velocity[1] >=-10:
# velocity[1] -=5
#while velocity[1] <=-10:
elif event.type==pygame.KEYUP:
add_time = False
gravity = 0
if event.key==pygame.K_SPACE and velocity[1]<0 :velocity[1] +=10
#if event.key==pygame.K_space
#Gc=0
#elif not keys[pygame.K_SPACE]:
#velocity[1]+=Gc
herorect.left=hero_position[0]
herorect.top=hero_position[1]
if hero_position[1]<0:
hero_position[1]-=hero_position[1]
hero_position[0]+=velocity[0]
hero_position[1]+=velocity[1]
if herorect.left<0 or herorect.right>=size[0]: velocity[0]=0
#screen.fill((0,0,0))
screen.blit(bkrd,bkrdrect)
lvl.draw()
screen.blit(hero_img, herorect)
pygame.display.flip()
print lvl
答案 0 :(得分:1)
程序停止的直接原因是无限循环:您的while
条件在循环内部不会发生变化,因此循环一旦输入就不会退出。
但是,您的问题更具概念性。你无法通过游戏循环中的循环来做到这一点:无论如何,游戏循环都需要继续旋转。在游戏循环的每次传递中,您可以稍微调整速度,直到达到地面(或者您拥有的任何其他条件)。
如果你正在模拟真实的物理学,跳跃应该会让你立即增加速度;然后在主循环的每次通过时,将此速度降低一个常数(在现实世界中为9.81 m / s / s),并在撞到地面时使其为零。