用pygame在Python中进行Space Invaders游戏的屏障盾牌碰撞检测

时间:2017-01-20 22:51:52

标签: python pygame collision-detection

我目前正在使用pygame在Python中制作Space Invaders游戏。

我目前有3个基础障碍,都是用1 x 1像素块('扩展'pygame.sprite.Sprite class)构建的。对于碰撞检测,我检查导弹是否与障碍物发生碰撞。 现在,一切正常,当我发射并击中其中一个障碍时,被击中的像素被消除。

现在困扰我的是在最初的太空入侵者中,当船的导弹(或外星人的导弹) 击中屏障,它会引起影响屏障多个像素的“爆炸”。我想实现这一点 在我的python / pygame代码中。我该怎么做呢?

这是我的导弹类中的碰撞检测代码('扩展'pygame.sprite.Sprite):

baseBarrier_hit_list = pygame.sprite.spritecollide(self, all_baseBarrier_group, True)

    for pixel in baseBarrier_hit_list:
        self.kill() # I kill the missile after collision so that the other barrier pixels are unaffected.
        break #so that the other pixels in the column are unaffected.  

我想到'人工'将'随机'像素添加到baseBarrier_hit_list但我无法将元素添加到baseBarrier_hit_list。

这是原始太空入侵者的视频链接,看看我的意思: https://www.youtube.com/watch?v=axlx3o0codc

这里还有一个指向太空入侵者的python / pygame版本的链接,它表明在导弹和基础障碍之间发生碰撞时只有一个像素受到影响。 (注意,这不是我的游戏版本)。 https://www.youtube.com/watch?v=_2yUP3WMDRc

编辑:(见图片说明评论) enter image description here

编辑:TemporalWolf的建议奏效了。这是我添加到我的函数中的代码。

shield_hit_list_random = pygame.sprite.spritecollide(self, all_blockShields_group, False, pygame.sprite.collide_rect_ratio(2))

向函数传递一个False可以防止精灵被杀死。然后,我随机杀死shield_hit_list_random组中的一些精灵,如下所示:

for shield in shield_hit_list_random:
    pourcentage =randint(0,3)
    if pourcentage == 2:
        shield.kill()

1 个答案:

答案 0 :(得分:1)

我会尝试使用is the same as C long或等效的圆圈:

  

pygame.sprite.collide_rect_ratio()两者之间的碰撞检测   精灵,使用缩放比例的rects。

     

collide_rect_ratio(ratio) -> collided_callable

     

一个可调用的类,用于检查之间的冲突   两个精灵,使用精灵版本的精灵。

     

使用比率创建,然后将实例作为传递   *碰撞函数的碰撞回调函数。

     

比率是浮点数 - 1.0是相同的大小,2.0是   两倍大,0.5大小一半。

     

pygame 1.8.1中的新功能

将作为spritecollide函数的第4个参数