cocos2s-x 子d的对象池 小结

cocos2s-x 子d的对象池 小结,第1张

概述只是用到皮毛,各位大神不喜勿喷,有什么好的建议,请指出 对象池: 主要 是为了 避免在程序的生命周期中,大量的创建与删除对象. 如果同一类型的对象 ,需要大量创建 和 删除 : 如 子d 则需要创建一个对象池来 管理这些对象 对象池主要分为两个部分: 使用中的池 和 闲置中的池 创建:在DelPool中需要有没有空闲的对象,有的话,取出对象 创建需要使用的对象(子d), 之后将 对象加入到使用中的

只是用到皮毛,各位大神不喜勿喷,有什么好的建议,请指出

对象池: 主要 是为了 避免在程序的生命周期中,大量的创建与删除对象.
如果同一类型的对象,需要大量创建 和 删除 : 如 子d 则需要创建一个对象池来 管理这些对象

对象池主要分为两个部分: 使用中的池 和 闲置中的池

创建:在DelPool中需要有没有空闲的对象,有的话,取出对象
创建需要使用的对象(子d),之后将 对象加入到使用中的池中(AddUsePool)

获取:特殊情况需要获取到 现阶段使用中的池时,通过(GetUsePool)来获取到,使用池中的对象,
如实现暂停,集体销毁等 *** 作

移除:当需要移除的时候,将现在用着的对象,移除关键信息,并放到删除后的池中;

具体思路: 创建一个类,继承sprite,作为对象池的基类;
基类中包含
空闲中的 对象map

std::map<int,std::List <voID *>> DelPool;

使用中的 对象map

std::map<int,std::List<voID*>> UsePool;

分别对应 函数的字义

voID AddDelPool(int type,voID * res);     voID * GetDelPool(int type);     voID AddUsePool(int type,voID * res);     std::List<voID *> GetUsePool(int type);

对应CPP

BaseResMgr::BaseResMgr(){    DelPool.clear();    UsePool.clear();}BaseResMgr::~BaseResMgr(){    DelPool.clear();    UsePool.clear();}voID BaseResMgr::AddDelPool(int type,voID * res){    for (List<voID*>::iterator it = UsePool[type].begin(); it != UsePool[type].end(); it++)    {        if (*it == res)//找到有         {            UsePool[type].erase(it);//在List 中删除            DelPool[type].push_back(res); //在 添加到 删除的对象池中            return;        }    }    DelPool[type].push_back(res);//没找到也添加到对象中}voID * BaseResMgr::GetDelPool(int type){    for (List<voID*>::iterator it = DelPool[type].begin(); it != DelPool[type].end();it++)    {        if (DelPool[type].empty())        {            return nullptr;        }        else        {            voID * res = DelPool[type].front();//将第一个罗出来            DelPool[type].pop_front();//删除第一个            return res;        }    }    return nullptr;}voID BaseResMgr::AddUsePool(int type,voID * res){    UsePool[type].push_back(res);//将 res 添加到 对象池中的末尾}std::List<voID *> BaseResMgr::GetUsePool(int type){    return UsePool[type];//返回整个List 的对象}

使用注意事项:
对象池>>子d类(继承对象池)>>专门管理对象池的MyPool类(此类不能加入cocos2d-x中的CREATE_FUNC()中,后果是cocos2d-x会自动释放你的对象池中的对象)

专门管理对象池中的Mypool类,创建一个实例,到你所需要的类中(gamelayer)

对象池目的是将已经创建好的对象进行管理,在使用时千万避免重复创建对象(别问我为什么知道)

子d属性的类.h因为只作为属性的类,不需要cpp

#pragma once#include "GameMacros.h"class ClassBullet :public Sprite{public:    ClassBullet()    {        sBulletVec = Vec2(1,1);    };    ~ClassBullet()    {    };public:    Vec2 sBulletVec;    CREATE_FUNC(ClassBullet);};

以下代码并不能直接运行到项目中,请根据实际情况参考,或留言加QQ进行交流

子d使用的类 cpp

#include "CBullets.h"#include "GameLayer.h"#include "GameConfig.h"#include "ClassBullet.h"USING_NS_GAME;CrazyFishing::CBullets::CBullets(){}CrazyFishing::CBullets::~CBullets(){}voID CrazyFishing::CBullets::UPdate(float dt){    std::List <voID*> mList = GetUsePool(EnGameResIDleType_Bullets);    if (!mList.empty())    {        for (List<voID*>::iterator it = mList.begin(); it != mList.end(); it++)        {            ClassBullet * bullets = (ClassBullet*)*it;            if (bullets != nullptr)            {                if (bullets->isVisible())                {                    if (bullets->getpositionX() <= 0 || bullets->getpositionX() >= DESIGN_RESolUTION_WIDTH)                    {                        bullets->sBulletVec.x = -bullets->sBulletVec.x;                    }                    if (bullets->getpositionY() <= 0 || bullets->getpositionY() >= DESIGN_RESolUTION_HEIGHT)                    {                        bullets->sBulletVec.y = -bullets->sBulletVec.y;                    }                    float BulletAngle = bullets->sBulletVec.getAngle(Vec2::UNIT_Y);                    float degrees = CC_radians_TO_degrees(BulletAngle);//将弧度转换成角度                    bullets->setRotation(degrees);                    if (bullets->getpositionX() < 0)                    {                        bullets->setpositionX(0);                    }                    else if (bullets->getpositionX() > DESIGN_RESolUTION_WIDTH)                    {                        bullets->setpositionX(DESIGN_RESolUTION_WIDTH);                    }                    if (bullets->getpositionY() < 0)                    {                        bullets->setpositionY(0);                    }                    else if (bullets->getpositionY() > DESIGN_RESolUTION_HEIGHT)                    {                        bullets->setpositionY(DESIGN_RESolUTION_HEIGHT);                    }                    float dis = dt*BulLETSPEED;                    Vec2 Nowposition = bullets->getposition() + bullets->sBulletVec*dis;                    bullets->setposition(bullets->getposition() + bullets->sBulletVec*dis);                    *it = bullets;//东西拿错来要放好                }            }        }    }}voID CrazyFishing::CBullets::CreatBullet(Vec2 createposition,float mCannonRotation,Layer *layer){    ClassBullet * bullets = GetBullet();    if (bullets == nullptr)    {        bullets = ClassBullet::create();        bullets->setSpriteFrame("bullet1.png");//创建子d图片        auto body = PhysicsBody::createBox(bullets->getContentSize(),PhysicsMaterial(0.1f,1,0.0f));        body->setEnable(true);        bullets->setPhysicsBody(body);        bullets->getPhysicsBody()->setcategoryBitmask(BulLETcategoryBM);//种类        bullets->getPhysicsBody()->setContactTestBitmask(BulLETContactTestBM); //接触        bullets->getPhysicsBody()->setCollisionBitmask(BulLETCollisionBM);//碰撞        layer->addChild(bullets,BulLET);    }    bullets->setVisible(true);    bullets->getPhysicsBody()->setEnable(true);    bullets->setRotation(mCannonRotation);//设置子d角度    bullets->setposition(createposition);    bullets->sBulletVec = Vec2::UNIT_Y.rotateByAngle(Vec2::ZERO,CC_degrees_TO_radians(-1 * mCannonRotation)); //创建子d向量    //角度转 弧度     // 长度为1(Vec2::UNIT_Y) 原点为(Vec2::ZERO),弧度为(旋转60 (-为右转)) 的向量 (包含角度,与长度)    bullets->sBulletVec.normalize();//    AddUsePool(EnGameResIDleType_Bullets,bullets);}voID CrazyFishing::CBullets::DeleteEmptyBullet(){    if (!UsePool[EnGameResIDleType_Bullets].empty())    {        List<ClassBullet*> ListBullet;        ListBullet.clear();        for (List<voID*>::iterator it = UsePool[EnGameResIDleType_Bullets].begin(); it != UsePool[EnGameResIDleType_Bullets].end(); it++)        {            if (ClassBullet* bullet = (ClassBullet*)(*it))            {                if (bullet->isVisible() == false)//发现已经隐藏的子d                {                    bullet->getPhysicsBody()->setEnable(false);                    bullet->stopAllActions();                    ListBullet.push_back(bullet);                }            }        }        if (!ListBullet.empty())        {            for (List<ClassBullet*>::iterator it = ListBullet.begin(); it != ListBullet.end(); it++)            {                AddDelPool(EnGameResIDleType_Bullets,*it);            }        }    }}ClassBullet * CrazyFishing::CBullets::GetBullet(){    voID * res = GetDelPool(EnGameResIDleType_Bullets);    if (ClassBullet * bullet = (ClassBullet*)res)    {        return bullet;    }    return nullptr;}

子d使用类.h

#pragma once#include "GameMacros.h"#include "BaseResMgr.h"#include "ClassBullet.h"NS_GAME_BEGINclass CBullets :    public BaseResMgr{public:    CBullets();    ~CBullets();    static voID CreatBullet(Vec2 createposition,Layer *layer);    static voID UPdate(float dt);    static voID DeleteEmptyBullet();    static ClassBullet *GetBullet();//从对象池中获取 子dprotected:};NS_GAME_END
总结

以上是内存溢出为你收集整理的cocos2s-x 子d的对象池 小结全部内容,希望文章能够帮你解决cocos2s-x 子d的对象池 小结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1067357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存