装甲逆袭-加载NPC

加载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);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值