SFML2与每个对象发生冲突

时间:2014-04-03 18:33:33

标签: c++ collision-detection game-engine sfml

我是SFML的初学者,我想学习碰撞..我制作了游戏类,实体类和实体管理器来保持正确的事情我做了一个碰撞功能来检测碰撞两个对象之间,但我的问题是:如何检查场景中每个对象的碰撞?我的意思是..我有一个派生自Entity的Player类,我想测试它是否与场景中的每个对象发生碰撞,这个对象是一个实体而不是一个玩家,你能帮助我吗?

Entity.h

#ifndef ENTITY_H_INCLUDED
#define ENTITY_H_INCLUDED
class Entity {
    public:
        Entity();
        ~Entity();
        virtual void Draw(sf::RenderWindow& mWindow);
        virtual void Update();
        virtual void Load(std::string file);
        virtual sf::Sprite GetEntity();
        bool IsLoaded();
        bool mIsLoaded;
        std::string mFile;
        sf::Texture mTexture;
        sf::Sprite mSprite;
};
#endif

EntityManager.h

#ifndef ENTITYMANAGER_H_INCLUDED
#define ENTITYMANAGER_H_INCLUDED
#include "Entity.h"
class EntityManager {
    public:
        void Add(std::string name, Entity* entity);
        void Remove(std::string name);
        Entity* Get(std::string name) const;
        int GetEntityCount() const;
        void DrawAll(sf::RenderWindow& mWindow);
        void UpdateAll();

    private:
        std::map <std::string, Entity*> mEntityContainer;
};
#endif

PlayerPlane.h

#ifndef PLAYERPLANE_H_INCLUDED
#define PLAYERPLANE_H_INCLUDED
#include "Entity.h"
class PlayerPlane : public Entity {
    public:
        PlayerPlane();
        ~PlayerPlane();
        void Update();
        void Draw(sf::RenderWindow& mWindow);
};
#endif

Game.h

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED
#include "EntityManager.h"

class Game {
    public:
        static void Run();
        static void GameLoop();

    private:
        static sf::RenderWindow mWindow;
        static EntityManager mEntityManager;
};
#endif

我希望有人能理解我的意思并给出一些建议或例子。

1 个答案:

答案 0 :(得分:1)

你可以做的是遍历所有实体并检查它不是播放器,然后检查是否发生了碰撞。

我猜你是在Game类中的某个地方创建了PlayerPlane对象,那么你应该保存一个指向它的指针,因为它是你游戏中的特殊实体。

然后你可以在你的GameLoop中做:

for (std::<std::string, Entity*>::iterator it = mEntityContainer.begin(); it != mEntityContainer.end(); ++it)
{
    if (it->second != pointerToPlayer)
    {
        checkCollision(it->second, pointerToPlayer);
    }
}

或者,在C ++ 11中更简洁(gcc和clang的-std=c+11,自VS2012以来默认支持):

for (const auto& entity : mEntityContainer)
{
    if (entity.second != pointerToPlayer)
    {
        checkCollision(it.second, pointerToPlayer);
    }
}

另一个想法是在碰撞函数中验证作为参数传递的两个实体不具有相同的地址(作为不同的对象)。