当前位置: 首页 > news >正文

装甲逆袭-加载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);
}
}


http://www.taodudu.cc/news/show-6105772.html

相关文章:

  • CSDN如何在个人主页开启自定义模块|微信公众号
  • 从零到屎山系列-游戏开发(序章)
  • Ubuntu彻底卸载删除cuda12.1
  • 字典及GitHub字典爬取工具
  • PostgreSQL 把多余字段转JSON
  • 0066__使用GDBServer进行远程调试
  • robomaster(1)装甲板识别
  • 装甲逆袭-资源加载
  • 视觉组考核——装甲板识别
  • 装甲逆袭-玩家移动处理
  • 开机后我的计算机打不开,电脑开机后图标打不开怎么办
  • 电脑开不了机的原因和解决办法
  • Proe转Solidworks
  • proe5.0插件在windows7 64系统预览模型
  • proe常用c语言语句,proe关系式(大全).doc
  • proe5.0启动失败,光标转了几圈后没有任何反应
  • proe常用c语言语句,Proe如何使用if条件语句?
  • proe常用c语言语句,带你轻松搞懂Proe条件语句
  • 【MFC】基于OpenCV的魔镜
  • 魔镜魔镜告诉我谁是世界上最美的人 语音唤醒,百度语音识别。从装系统开始
  • 制作魔镜页
  • 魔镜连接本地mysql_打造属于你的树莓派“魔镜”—硬件篇
  • 旧电脑利用:windows网页版魔镜【不需树莓派】
  • 笔记1 第11课 贪心初步 ——柠檬水找零,分发饼干,跳跃游戏,完成所有任务所需最小能量——极客时间算法
  • 学完教程,不知道接下去从哪里开始做自己的第一个APP,怎么办?酷课堂iOS交流群问答(201902期)
  • 贪心相关:柠檬水找零、买卖股票的最佳时机、分发饼干、跳跃游戏 ...
  • 干货来了 | SQL 进阶技巧
  • 干货 | SQL 进阶技巧
  • 【LeetCode】两道贪心算法题目-455分发饼干,860柠檬水找零
  • LeetCode455分发饼干
  • 柠檬模拟群面复盘
  • 7-7 快速求和
  • 1.神奇的字符串之快速求和
  • 奔波真是辛苦啊,然而生命终将逝去,只希望当一切都结束的时候,能够没有遗憾吧。
  • 热爱可抵岁月漫长,温柔可挡艰难时光—2020年终总结
  • 经典S Q L语句大全