不能让我的精灵碰撞?

时间:2015-03-02 15:03:07

标签: python pygame sprite collision

我觉得我已经尝试了所有的东西,而且我现在已经非常厌倦了这个....我是一个python和pygame noob试图从头开始制作我自己的游戏而不看教程,但我不知道怎么解决这个问题,我一定错过了什么。

以下是检查碰撞的声明:

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()

因此游戏基本上是“抓住堕落的东西” - 游戏。 我不知道我错过了什么......

这是Cake-class,它看起来与玩家类几乎相同:

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

我不是在寻找一个明确或直接的答案,只是在正确的方向上轻推,先谢谢。

1 个答案:

答案 0 :(得分:0)

既然你提到你是python的新手,我就会出局并假设你是一般的编程新手。

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

对于不同语言有多种调试技术,但一般理论是验证程序是否正常运行。由于与最初可见问题完全无关的原因,程序通常会失败。

以下是帮助您调试程序的一些基本步骤:

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

  • 以结构化方式解决问题。对程序失败的原因做出有根据的假设,然后用...进行测试

  • <强>打印即可。打印变量的内容,函数参数的值,函数调用的结果。仔细检查输出,看看它是否符合您的期望。一旦没有,停止并弄清楚它为什么没有。在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,并查看有什么不妥。