【问题标题】:Colorkey collision between Rects in Pygame, Python 3Pygame,Python 3中Rects之间的Colorkey冲突
【发布时间】:2016-07-17 08:21:40
【问题描述】:

我目前正在开发一款基于 Pygame、Python 3 的游戏,游戏的重要部分之一是 Rects 在子弹目标情况下的碰撞。

这很容易使用colliderect 函数实现,但必须不计算与颜色键相同颜色的像素。

例如,如果其中一个精灵(角色)是一个大的等边三角形,其底部是水平的,并且一颗子弹从左上角射出,colliderect 会立即检测到碰撞,即使虽然左上角的像素是玩家精灵的透明的。

我需要创建一个函数,仅当子弹到达与颜色键颜色不同的像素时才会检测到碰撞。如果子弹只有一个像素,这很容易:

if player.get_at((bullet[0] - player.left, bullet[1] - player.top)) != player.get_colorkey():

我尝试为项目符号中的每个像素迭代上述语句,但是,当然,这会导致大量滞后。有没有其他更高效的方法?

提前致谢!!

【问题讨论】:

    标签: python python-3.x pygame pygame-surface color-key


    【解决方案1】:

    看看collide_mask函数:

    http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_mask

    简而言之,你给每个精灵一个 self.mask 属性(使用 pygame.mask.from_surface()) - 你可以使用颜色键或每像素 alpha 来完成。然后将其作为 spritecollide 函数的回调包含在内,如下所示:

    pygame.sprite.spritecollide(player, bullets, True, pygame.sprite.collide_mask)

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      我设法制作了一个算法来查看每个矩形的角:

      def rectsCollideSimple (rect1, surf1, rect2, surf2):
          collide = False
          try:
              if surf1.get_at((rect2.left - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey():
                  collide = True
          except IndexError:
              useless = None
          try:
              if surf1.get_at((rect2.right - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey():
                  collide = True
          except IndexError:
              useless = None
          try:
              if surf1.get_at((rect2.left - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey():
                  collide = True
          except IndexError:
              useless = None
          try:
              if surf1.get_at((rect2.right - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey():
                  collide = True
          except IndexError:
              useless = None
          return collide
      
      def rectsCollide (rect1, surf1, rect2, surf2):
          if rectsCollideSimple(rect1, surf1, rect2, surf2) or rectsCollideSimple(rect2, surf2, rect1, surf1):
              return True
          else:
              return False
      

      可能不是最有效的方法,但它解决了我的问题:)

      【讨论】:

        猜你喜欢
        • 2014-10-28
        • 2021-09-29
        • 2019-06-15
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 2023-02-09
        相关资源
        最近更新 更多