我目前正在使用一个列表生成在屏幕上运行的敌人,并想知道我在代码中做错了什么。我希望篮球与坏名单相撞。当我跑步时没有任何错误,篮球只是不会与坏名单发生冲突。
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))
答案 0 :(得分:3)
首先,您必须在Rect
实例上调用collidelist
,而不是在Rect
类型本身上调用。 1
假设basketball
是Rect
,而badlist
是Rect
的列表,而您试图查看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
中的每个rect来查看哪个冲突basketball
,而是要它检查basketball
中的每个rect来查看哪个会与badlist
发生冲突-这是无稽之谈,但也许不是Python或PyGame测试的废话。