只是用到皮毛,各位大神不喜勿喷,有什么好的建议,请指出
对象池: 主要 是为了 避免在程序的生命周期中,大量的创建与删除对象.
如果同一类型的对象,需要大量创建 和 删除 : 如 子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的对象池 小结所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)