⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 item.h.svn-base

📁 坦克大战游戏完整全套源代码
💻 SVN-BASE
字号:
#ifndef GAME_ITEM_H
#define GAME_ITEM_H

#include "curvedani.h"
#include "caPoint2d.h"

#include "common/entity.h"
#include "common/graphicEntity.h"
#include "common/collisionEntity.h"

#include "collisionDef.h"
#include "gameDef.h"
#include "tank.h"

using cAni::Point2f;

class Item : public Entity, public InstanceCount<Item>
{
public:
    Item(cAni::iAnimResManager &arm);
    virtual void step(float gameTime, float deltaTime)
    {
        gameTime, deltaTime;
    }
    virtual bool getStatus(EntityStatusId id, void *p)
    {
        switch(id)
        {
        case Entity::ESI_Position:
            *(Point2f *)p = pos;
            return true;
        }
        return false;
    }
    virtual iEntity* getEntityInterface(EntityInterfaceId id)
    {
        switch(id)
        {
        case EII_GraphicEntity:
            return &graphicEntity;
        case EII_CollisionEntity:
            return &collisionEntity;
        }
        return 0;
    }
    virtual EntityTypeId getTypeId() const
    {
        return ETI_Item;
    }

    virtual void pickedBy(Tank &tank) = 0;
    void setPosition(const Point2f &pos)
    {
        this->pos = pos;
        collisionEntity.resetTransform();
    }
protected:
    Point2f pos;
    class GraphicEntity : public iGraphicEntity
    {
    public:
        GraphicEntity(Item &item, cAni::iAnimResManager &arm);
        ~GraphicEntity();
        void init(const char *xml);
        virtual void render(float gameTime, float deltaTime);
    protected:
        const Item &getEntity() const
        {
            return *(const Item*)&entity;
        }
        cAni::iAnimation *anim;
    };
    class CollisionEntity : public iCollisionEntity
    {
    public:
        CollisionEntity(Item &item) : iCollisionEntity(item)
        {
            verlet::BoxShape *box = new verlet::BoxShape(body, Point2f(30 / 2, 30 / 2));
            body.SetShape(box);
            resetTransform();
        }
        virtual ~CollisionEntity()
        {
            delete body.GetShape();
            body.SetShape(0);
        }
        void resetTransform()
        {
            verlet::BoxShape *box = (verlet::BoxShape *)body.GetShape();
            assert(box);
            body.Reset(getEntity().pos, 0, 0.01f);
            this->setboundingBox(box->GetBoundingBox() + getEntity().pos);
        }
        virtual unsigned long getCollisionCategory() const // 自己的类别标志位
        {
            return CC_Item;
        }
        virtual unsigned long getCollisionBits() const // 与哪种类发生碰撞
        {
            return CB_Item;
        }
        virtual unsigned long getCollisionBlockBits() const // 碰撞可以发生阻挡的类型
        {
            return CBB_Item;
        }

        virtual void onCollision(iCollisionEntity &o, const iContactInfo &contactInfo)
        {
            o, contactInfo;
            switch(o.getCollisionCategory())
            {
            case CC_Tank:
                {
                    Tank &tank = static_cast<Tank &>(o.getEntity());
                    getEntity().pickedBy(tank);
                }
                break;
            }
        }
        virtual verlet::iBody &getBody()
        {
            return body;
        }
        virtual const verlet::iBody &getBody() const
        {
            return body;
        }
        virtual void onAfterPhysics()
        {
            // update boundingBox here
        }
    protected:
        Item &getEntity()
        {
            return *(Item*)&entity;
        }
        const Item &getEntity() const
        {
            return *(const Item*)&entity;
        }
        verlet::Body body;
    };
    GraphicEntity graphicEntity;
    CollisionEntity collisionEntity;
};

#endif//GAME_ITEM_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -