2015-03-02 108 views
0

我觉得我已经尝试了一切,我越来越漂亮,现在再用厌倦了这....我是一个Python和pygame的小白努力使从头开始自己的比赛不看教程,但我不不知道如何解决这个问题,我一定错过了一些东西。不能让我的精灵碰撞?

这里是我的声明检查碰撞:

for c in cakes: 
     if pygame.sprite.collide_rect(jake, c) and c.eaten == False: 
      c.is_eaten() 
      score += 1 
      print score 



     c.draw() 
     c.update_pos() 

所以游戏基本上是“赶上下降的事情” - 游戏。 我不知道我错过了...

这里是蛋糕类,它看起来几乎一样的播放器类:

class Cake(pygame.sprite.Sprite): 


def load_image(self, image_name): 
    try: 
     image = pygame.image.load(image_name) 
    except pygame.error as message: 
     print ("Cannot load image: " + image_name) 
     raise SystemExit(message) 
    return image.convert_alpha() 


def __init__(self, screen, x, y, speed): 
    self.image = self.load_image("cake.png") 
    self.screen = screen 
    self.x = x 
    self.y = y 
    self.rect = self.image.get_rect() 
    self.w, self.h = self.image.get_size() 
    self.rect.move(self.x, self.y) 
    self.rect.topleft = (self.x, self.y) 
    self.rect.bottomright = (self.x + self.w, self.y + self.h) 
    self.eaten = False 
    self.speed = speed 


def draw(self): 
    if self.eaten == False: 
     self.screen.blit(self.image, (self.x, self.y)) 


def is_eaten(self): 
    self.eaten = True 


def update_pos(self): 
    if self.eaten == False: 
     self.y += self.speed 

我不是在找一个明确的或直接回答,只是在正确的方向推动,提前感谢。

回答

0

既然你提到你是新的蟒蛇,我会去上肢体和假设你一般是新的节目。

当出现问题并且您已经投入了一些努力并且仍然不确定有什么问题时,您可能需要深入研究调试

对于不同的语言有多种调试技术,但一般理论是验证程序是否按预期工作,如。很多时候,一个程序将失败的原因完全无关的初始可见的问题。

这里有一些基本的步骤,以帮助您调试程序:

  • 可靠重现问题 - ,最好是自动。

  • 以结构化的方式处理问题。做出有教育的假设,为什么该方案失败,然后测试他们...

  • 打印。打印变量的内容,函数参数的值,函数调用的结果。仔细检查输出,看看它是否符合你的期望。只要东西不,停止并找出为什么它没有。在Python中,你可以使用优秀的logging module你调试打印从你的正常输出分开。

  • 在交互式调试器中一步一步地运行您的程序。这可以帮助您更深入地检查数据结构,而不是轻松地进行打印。对于Python,你可以使用pdb


让我们来看看如何将这个理论付诸实践在你的特定问题。

虽然你没有提到它,但你的问题意味着碰撞不会发生。我会进一步假设你可以可靠地重现问题 - 因为你提到它永远不会起作用。

你可能想要做的下一步是设置游戏,使它始终始于相同的初始条件。如果您有任何随机呼叫,请设置随机数生成器以使用固定的种子,并设置种子,以便快速重现您的问题 - 最好是无需用户输入。

你已经隔离了问题发生的地方。

接下来,你应该打印所涉及的变量的内容:精灵的位置,值为eaten。然后,再次运行程序并观看打印件,确保所有内容都符合您的期望。如果是,当(如pygame主循环的数量)时,找出它开始失败。然后,您可以把有条件的在你的代码启动调试器pdb

if number_of_pygame_loop_iterations==PROBLEMATIC_ITERATION: 
    import pdb; pdb.set_trace() 

从那里,你可以调用pygame.sprite.collide_rect用在当前位置的精灵,并检查有什么不对劲。

+0

谢谢你,我会保存这个答案,你一直很有帮助。 – Fatnomen 2015-03-02 15:49:45