pygame中的重力导致我的程序崩溃

时间:2014-12-12 04:43:27

标签: python loops timer pygame gravity

所以我正在使用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

1 个答案:

答案 0 :(得分:1)

程序停止的直接原因是无限循环:您的while条件在循环内部不会发生变化,因此循环一旦输入就不会退出。

但是,您的问题更具概念性。你无法通过游戏循环中的循环来做到这一点:无论如何,游戏循环都需要继续旋转。在游戏循环的每次传递中,您可以稍微调整速度,直到达到地面(或者您拥有的任何其他条件)。

如果你正在模拟真实的物理学,跳跃应该会让你立即增加速度;然后在主循环的每次通过时,将此速度降低一个常数(在现实世界中为9.81 m / s / s),并在撞到地面时使其为零。