如何使用 cocos2d 的 collision_model

How to use cocos2d's collision_model

最近用cocos2dPython做了个游戏。但是我在 collision_model 上遇到了麻烦。我读了 documentation but I still can't use the CollisionManager to add the CollidableSprite as in the example.

事实上,我必须将 ActorSprite 更改为 CollidableSprite 以避免错误。可能是什么问题?

import cocos.euclid as eu
import cocos.collision_model as cm

class CollidableSprite(cocos.sprite.Sprite):
    def __init__(self, image, center_x, center_y, radius):
        super(ActorSprite, self).__init__(image)
        self.position = (center_x, center_y)
        self.cshape = cm.CircleShape(eu.Vector2(center_x, center_y), radius)

class ActorModel(object):
    def __init__(self, cx, cy, radius):
        self.cshape = cm.CircleShape(eu.Vector2(center_x, center_y), radius)

文档显示了这个初始化可碰撞精灵的例子。但是 ActorSprite 是从哪里来的呢?我必须将其更改为 CollidableSprite 才能使 class 起作用。我声明了一个碰撞管理器来添加精灵。但是当我调用函数 CollisionManeger.known_objs().

时它 returns None
 def __init__(self):
    super(page,self).__init__()
    self.collision_manager = CollisionManager()
    self.collision_manager.add(self.sprite1)
    self.collision_manager.add(self.sprite2)
    print self.collision_manager.known_objs()

所以,文档有问题吗?还是我误会了?

看起来该示例确实应该初始化 CollidableSprite 而不是 ActorSprite

CollisionManager class 只是一个接口。它什么都不做。 collision_model中有两个实现:CollisionManagerBruteForceCollisionManagerGrid。所以你可以使用例如:

self.collision_manager = CollisionManagerBruteForce()

但请注意 CollisionManagerGrid is more efficient.