2013-11-02 122 views
0

我正在做一个简单的2D平台游戏,我需要找到所有创建的对象的所有值,这些对象将代表游戏中的collidables。所以我需要所有的x/y坐标,宽度和高度,以便我可以检查它们中的任何一个是否与玩家发生碰撞。C++查找一个类中所有对象的所有值

类是什么样子:

class CollidableObject 
{ 
    public: 

    CollidableObject(); 
    virtual ~CollidableObject(); 

    int Height; 
    int Width; 
    DirectX::SimpleMath::Vector2 position; 
    bool collidable; 
}; 

这显然是一个非常简单的类,我只是需要一种方法来找出如果球员位置与任何可碰撞的对象价值观碰撞,我不需要碰撞码只是一种方法来一次获得所有可碰撞的对象值。希望我已经说清楚了。

+0

制作一个包含这些对象的'vector'或'list'。遍历它并检查每个元素是否与玩家碰撞。 –

回答

0
class CollisionPred(
public: 
    CollisionPred(Player p) : p_(p) {} 
    bool operator()(const ColiidableObject& o) { 
     // process object and return true if there is a collision, i.e: 
     return o.Height*o.Height + o.Width*o.Width > p_.distance; 
    } 
    private: 
     Player p_; 
; 

int main() { 
    //... 
    std::vector<CollidableObject> v(100); 
    std::vector<CollidableObject>::iterator it = 
          std::find_if(v.begin(), v.end(), CollisionPred()); 
    //... 
} 
0

最简单的,然而,这样做的最流行的方式,它是刚刚经历collidables集合遍历检查,如果有任何球员碰撞。

vector<CollidableObject> objects; 

for(CollidableObject& obj: objects) 
{ 
    if (obj.position.x - obj.width < player.position.x + player.radius 
    && obj.position.x + obj.width > player.position.x - player.radius 
    && obj.position.y - obj.height < player.position.y + player.radius 
    && obj.position.y + obj.height > player.position.y - player.radius 
    ) 
    // collision happened 

} 
+0

改变自动obj:CollidableObject为auto obj:对象,你也不会以这种方式得到一个partiular对象,find_if返回一个迭代器到一个对象 – 4pie0

+0

是的,当然:) –

+0

谢谢:)但我没有看到任何对象在调试的向量中,我只是创建这样的新对象:CollidableObject CollidableBox – Rob