加载NPC或者是物品等地图属性,都是先读取地图的数据到内存,然后再在游戏绘画的时候画到游戏上。

读取地图数据到内存

#include "CommonMapSprite.h"
#include "GameData.h"
#include "CommonTiledMapUtil.h"
#include "CommonUtil.h"

bool CommonMapSprite::init()

bool bRet = false;
do 
{
CC_BREAK_IF(! CCLayer::init());
npccount=0;
maptankeinfcount=0;
shopnpcinfocount=0;
initMap();
getMapInfo();
getMapInfo_UnWalk();

bRet = true;
this->setTag(1986);
} while (0);

return bRet;
}

void CommonMapSprite::initMap(){
map  = CCTMXTiledMap::create(nowscenemap);
CCTMXLayer* layer = map->layerNamed("fugai");
if (layer!=NULL)
{
layer->setZOrder(40);
}

this->addChild(map,0);
blockHeight=map->getTileSize().height;
blockWidth=map->getTileSize().width;
}

//获取地图上的属性对象
void CommonMapSprite::getMapInfo(){
doorinfoCount=0;
CCTMXObjectGroup* mCCTMXObjectGroup = map->objectGroupNamed("objects");

CCArray *objArray = mCCTMXObjectGroup->getObjects();
if (objArray && objArray->count() > 0)
{
CCObject* pObj = NULL;
CCARRAY_FOREACH(objArray, pObj)
{
CCDictionary* mCCDictionary = (CCDictionary*)pObj;
getMapInfo_PlayerStand(mCCDictionary);
getMapInfo_NPC(mCCDictionary);
getMapInfo_BeginDialog(mCCDictionary);
getMapInfo_Door(mCCDictionary);
getMapInfo_Tank(mCCDictionary);
getMapInfo_ShopNPC(mCCDictionary);
}
}
}

//获取主角切换界面站立位置
void CommonMapSprite::getMapInfo_PlayerStand(CCDictionary* mCCDictionary){
if (strcmp(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"name"),"stand")==0)
{
int standindex=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"standindex");
if (standindex!=-1)
{
playerStand[standindex].x=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"x");
playerStand[standindex].y=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"y");
}
}
}

//获取NPC的属性信息
void CommonMapSprite::getMapInfo_NPC(CCDictionary* mCCDictionary){
if (strcmp(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"name"),"npc")==0)
{

CommonTiledMapUtil::copyStrValue(npcinfo[npccount].npcImg,
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"image"));
CommonTiledMapUtil::copyStrValue(npcinfo[npccount].npcDialogHead,
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"head"));
CommonTiledMapUtil::copyStrValue(npcinfo[npccount].npcname,
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"npcname"));

npcinfo[npccount].npcStand.x=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"x");
npcinfo[npccount].npcStand.y=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"y");
npcinfo[npccount].npcKind=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"kind");
npcinfo[npccount].npcmovekind=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"movekind");
npcinfo[npccount].npcmovelength=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"movelength");
npcinfo[npccount].npcTag=1988+npccount;
npcinfo[npccount].eventCount=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"eventcount");
char searchKey[3][255]={"dialog%d","dialog0%d","dialog00%d"};
for (int i=0;i<npcinfo[npccount].eventCount+1;i++)
{
char key[30]; 
sprintf(key,"event%d",i); 
CommonTiledMapUtil::copyStrValue(npcinfo[npccount].eventname[i],
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,key));
npcinfo[npccount].npcDialogCount[i]=0;
for (int j=0;j<10;j++)
{
char key[30]; 
sprintf(key,searchKey[i],j); 
CommonTiledMapUtil::copyStrValue(npcinfo[npccount].npcDialogStr[i][j],
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,key));
if (strlen(npcinfo[npccount].npcDialogStr[i][j])!=0)
{
npcinfo[npccount].npcDialogCount[i]=npcinfo[npccount].npcDialogCount[i]+1;
}

}
}
npccount++;
}
}

//获取地图上不能通过的地方的坐标
void CommonMapSprite::getMapInfo_UnWalk(){
unwalkcount=0;

CCTMXObjectGroup* mCCTMXObjectGroup = map->objectGroupNamed("unwalk");

CCArray *objArray = mCCTMXObjectGroup->getObjects();
if (objArray && objArray->count() > 0)
{
CCObject* pObj = NULL;
CCARRAY_FOREACH(objArray, pObj)
{
CCDictionary* mCCDictionary = (CCDictionary*)pObj;
//if (strcmp(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"name"),"unwalk")==0)
{
float x,y,width,height;
x=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"x");
y=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"y");
width=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"width");
height=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"height");
unwalkCCRect[unwalkcount].setRect(x,y,width,height);
unwalkcount=unwalkcount+1;
}
}
}

}

//获取地图上场景开始的对话
void CommonMapSprite::getMapInfo_BeginDialog(CCDictionary* mCCDictionary){
sceneBeginDialog.eventname[0]='\0';
if (strcmp(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"name"),"begindialog")==0)
{
sceneBeginDialog.dialogCount=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"dialogcount");
for (int i=0;i<sceneBeginDialog.dialogCount;i++)
{
char key[30]; 
sprintf(key,"dialog%d",i); 
CommonTiledMapUtil::copyStrValue(sceneBeginDialog.dialogStr[i],
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,key));
}
CommonTiledMapUtil::copyStrValue(sceneBeginDialog.eventname,
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"eventname"));
}
}

//获取地图上界面转换的坐标即门
void CommonMapSprite::getMapInfo_Door(CCDictionary* mCCDictionary){
if (strcmp(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"name"),"door")==0)
{
CommonTiledMapUtil::copyStrValue(doorinfo[doorinfoCount].toNextSceneStr,
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"toscene"));
doorinfo[doorinfoCount].toNextSceneIndex=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"tosceneindex");
float x,y,width,height;
x=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"x");
y=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"y");
width=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"width");
height=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"height");
doorinfo[doorinfoCount].doorCCRect.setRect(x,y,width,height);
doorinfoCount=doorinfoCount+1;
}
}

//获取地图上坦克的信息
void CommonMapSprite::getMapInfo_Tank(CCDictionary* mCCDictionary){
if (strcmp(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"name"),"tank")==0)
{
if (!CommonUtil::isExistSavedEventByKey(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"event")))
{
maptankinfo[maptankeinfcount].tankStand.x=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"x");
maptankinfo[maptankeinfcount].tankStand.y=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"y");
maptankinfo[maptankeinfcount].tankeid=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"tankid");
CommonTiledMapUtil::copyStrValue(maptankinfo[maptankeinfcount].event,
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"event"));
CommonTiledMapUtil::copyStrValue(maptankinfo[maptankeinfcount].saveevent,
CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"saveevent"));
maptankinfo[maptankeinfcount].tag=2088+maptankeinfcount;
maptankeinfcount=maptankeinfcount+1;
}
}
}

//获取地图上商店NPC的信息
void CommonMapSprite::getMapInfo_ShopNPC(CCDictionary* mCCDictionary){
if (strcmp(CommonTiledMapUtil::getValueStringFromCCDictionaryByKey(mCCDictionary,"name"),"shop")==0)
{
char value[255];
shopnpcinfo[shopnpcinfocount].fangxiang=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"fangxiang");
shopnpcinfo[shopnpcinfocount].shopnpckind=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,"kind");

shopnpcinfo[shopnpcinfocount].npcStand.x=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"x");
shopnpcinfo[shopnpcinfocount].npcStand.y=CommonTiledMapUtil::getValueFloatFromCCDictionaryByKey(mCCDictionary,"y");

shopnpcinfo[shopnpcinfocount].tag=2188+shopnpcinfocount;

if (shopnpcinfo[shopnpcinfocount].shopnpckind==1)
{
shopnpcinfo[shopnpcinfocount].equipmentcount=0;
for (int i=0;i<255;i++)
{
sprintf(value,"id%d",i);
int id=CommonTiledMapUtil::getValueIntFromCCDictionaryByKey(mCCDictionary,value);
if (id!=-1)
{
shopnpcinfo[shopnpcinfocount].equipmentid[shopnpcinfo[shopnpcinfocount].equipmentcount]=id;
shopnpcinfo[shopnpcinfocount].equipmentcount=shopnpcinfo[shopnpcinfocount].equipmentcount+1;
}
}

}
shopnpcinfocount=shopnpcinfocount+1;

}
}

游戏绘画中加载这些数据

//加载地图上的NPC
void RpgGameScene::initNPC(){
for (int i=0;i<map->npccount;i++)
{
MoveNPCSprite *mMoveNPCSprite=MoveNPCSprite::create();
mMoveNPCSprite->setValueInfo(map->npcinfo[i]);
mMoveNPCSprite->initSprite(map->npcinfo[i].npcImg);
mMoveNPCSprite->setPosition(map->npcinfo[i].npcStand);

//判断是否与PLAYER碰撞,如果碰撞 NPC就移动位置
CCNode *playerNode=map->map->getChildByTag(1987);
if(CommonCollisonUtil::isNPCCollidesWithPlayer((CommonNPCSprite*)mMoveNPCSprite,
(CommonNPCSprite*)playerNode,((MoveNPCSprite*)mMoveNPCSprite)->getNowRunDirection()))
{
mMoveNPCSprite->setPosition(map->npcinfo[i].npcStand.x,map->npcinfo[i].npcStand.y-map->blockHeight);
}

map->map->addChild(mMoveNPCSprite,2);
}

}

//加载地图上的坦克
void RpgGameScene::initTank(){
for (int i=0;i<map->maptankeinfcount;i++)
{

TankSprite *mTankSprite=TankSprite::create();
char tankimg[255];
CommonTankUtil::searchTankImgByID(map->maptankinfo[i].tankeid,tankimg);
mTankSprite->widthUitl=4;
mTankSprite->initSprite(tankimg);
mTankSprite->setPosition(map->maptankinfo[i].tankStand);
mTankSprite->setTag(map->maptankinfo[i].tag);
mTankSprite->sprite->setTag(1985);
map->map->addChild(mTankSprite,2);

}
}

//加载地图上的商店NPC
void RpgGameScene::initShopNpc(){
for (int i=0;i<map->shopnpcinfocount;i++)
{
ShopNPCSprite *mShopNPCSprite=ShopNPCSprite::create();
mShopNPCSprite->initShopNPCSprite(map->shopnpcinfo[i].fangxiang,map->shopnpcinfo[i].shopnpckind);
mShopNPCSprite->setPosition(map->shopnpcinfo[i].npcStand);
map->map->addChild(mShopNPCSprite,2,map->shopnpcinfo[i].tag);
}
}

装甲逆袭-加载NPC相关推荐

  1. 装甲逆袭-NPC移动处理

    处理NPC的移动,目前采取的方式是预设一段移动方式,然后在地图中编辑,然后NPC读取之后通过该方式移动. #include "MoveNPCSprite.h" bool MoveN ...

  2. 装甲逆袭-NPC对话处理

    NPC对话其实就是在地图上一个点击事件,然后触摸到该位置的时候,显示一个界面.至于NPC对话的内容,可以放到地图上. bool RpgGameScene::npcTouch(CCTouch *pTou ...

  3. 装甲逆袭-玩家碰撞处理

    玩家碰撞处理,其实就是矩形碰撞检测,然后会将本身的位置通过移动方式增加几位来进行判断,因为写了比较久了,所以只贴代码. #include "CommonCollisonUtil.h" ...

  4. 装甲逆袭-玩家移动处理

    玩家移动目前采取的是摇杆方式,A星会在后期开始加入,后期会专门写一篇关于在游戏中加入A星. 摇杆的部分代码是用HIMI的那个,然后稍微修改. #include "HRocker.h" ...

  5. 装甲逆袭-获取坦克界面

    游戏中获取坦克的界面,其实就是拿到坦克后的处理方式.界面上来说就是贴图,所以就贴下效果图了,自己设计的UI..

  6. android图片加载过程,教你写Android ImageLoader框架之图片加载与加载策略

    在教你写Android ImageLoader框架之初始配置与请求调度中,我们已经讲述了ImageLoader的请求配置与调度相关的设计与实现.今天我们就来深入了解图片的具体加载过程以及加载的策略(包 ...

  7. AuToCAD启动自定义加载程序研究(转)

    AuToCAD启动自定义加载程序研究(转) AuToCAD启动自定义加载程序研究(转) 2009年06月02日 星期二 下午 12:28 CAD文件加载顺序:       acad2006.lsp ( ...

  8. AuToCAD启动自定义加载程序研究

    CAD文件加载顺序: acad2006.lsp (AutoCAD使用) acad.rx (用户自定义的*.arx文件加载清单) 注:在CAD2006中,由错误提示怀疑:*.arx文件检测先于acad2 ...

  9. 移动架构-图片加载框架设计

    图片加载核心就那些东西,这里设计一个图片加载框架,涉及到本地加载和网络加载,内存缓存和硬盘缓存,等等 思路 在getView的时候开始框架的调用 配置一系列环境,包括加载策略,缓存策略,线程数量 调用 ...

最新文章

  1. java获取屏幕图像_Java捕获当前屏幕图像
  2. python用format保留三位小数_关于Python 保留小数使用format、%、round()、Decimal函数及format和%只能保留到六位问题...
  3. 洛谷P1709 [USACO5.5]隐藏口令Hidden Password
  4. 中input怎么接受后台传值_[vue3]如何在vue3中优雅地使用vmodel?
  5. 数据集怎么导出_PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击...
  6. 关于@Import注解的几个问题
  7. IWorkbook 引入_如果引入国内,你会买单吗?日产全新小型SUV亮相|小型suv|日产|轩逸|新车|本田|丰田...
  8. 林肯android auto,林肯mkz仪表盘怎么设置中文
  9. Redis RU330课程 Redis Security 第3周学习笔记
  10. android adb shell chmod,adb shell 修改用户权限 删除App
  11. 分享使用谷歌Colab 常用小tips, 玩转Google Colab
  12. cad图纸怎么看懂_快速看懂cad图纸的教程全解
  13. Leetcode No.198 打家劫舍(动态规划)
  14. 罗技无线网卡linux,Linux Kernel 5.2将改进对Logitech无线设备的支持
  15. 分频器 | 二分频,三分频,n分频
  16. 【笔记】H5跳转手机应用商店(指定应用页/第三方应用商店)
  17. 计算机usb接口是一种通用,USB接口大科普,你用的是哪一种?
  18. 在iOS中调用C语言的国密算法SM2以替换RSA
  19. redis分布式锁实践 并实现看门狗锁续期机制
  20. SpringBoot通过RestTemplate远程调用其他微服务

热门文章

  1. 造梦师的梦想是什么样的?
  2. 关于文本编辑器的一点思考
  3. GCS_SERVER_PROCESSES
  4. 掌握模电必需阅读的几本书
  5. Linux下打包压缩war和解压war包
  6. 《数据解构》HashMap源码解读
  7. 医疗大数据平台的标准化通迅协议构建和架构
  8. Day 41多表查询以及pymysql相关操作 完善
  9. Android studio创建虚拟设备
  10. 联想小新520新品实测,对比当贝投影D3X竟无还手之力