首页 > 解决方案 > 列表冲突不起作用

问题描述

我目前正在使用一个列表来生成在屏幕上运行的敌人,并想知道我在代码中做错了什么。我希望篮球与坏名单相撞。当我跑步时没有错误,篮球不会与坏名单发生冲突。

death = pygame.Rect.collidelist(badlist, basketball)
if death:
    myfont = pygame.font.SysFont('Comic Sans MS', 50)
    textsurface = myfont.render('The Baddies got you', True, (0, 0, 0))
    screen.blit(textsurface,(700,700))

标签: pythonlistpygamecollision

解决方案


首先,您必须调用collidelist一个Rect实例,而不是Rect类型本身。1

假设basketball是 a Rect,并且badlistRects 的列表,并且您正在尝试查看是否basketball与 中的任何矩形发生碰撞badlist

death = basketball.collidelist(badlist)

其次,collidelist不返回布尔值告诉您是否发生碰撞,它返回第一次碰撞的索引。如果篮球与第一个矩形碰撞,则该索引将是假的(即为零),但如果它与任何其他矩形碰撞或根本没有碰撞,则该索引将为真(即非零)。所以,你真正想要检查的是:

death = basketball.collidelist(badlist) != -1

最后:

pygame.font.init() # you have to call this at the start, 
# if you want to use this module.

您实际上在这里发表了评论,解释了这一行有什么问题。您必须在程序开始时调用它,而不是每次要加载字体时。


1.您没有立即TypeError告诉您这一点的原因是,从技术上讲,您所做的并不是非法的,而是对“未绑定方法”的调用。您可以直接在类上调用方法,但是您必须将实例(self您要在其上调用方法)作为第一个参数传递。所以,Rect.collidelist(basketball, badlist)实际上会做同样的事情basketball.collidelist(badlist)。但是你的论点倒退了,所以不是要求它检查每个矩形badlist以查看哪个碰撞basketball,而是要求它检查每个矩形basketball以查看哪个碰撞badlist- 这是无稽之谈,但也许不是 Python 或PyGame 测试。


推荐阅读