#ifndef __CONFIG_H__
#define __CONFIG_H__ #include "GameFrameHead.h" //图片信息
struct ImageInfo
{
int nId; //ID标识
string strKey; //key标识
string strFile; //文件路径
}; //资源信息
struct ResourceInfo
{ }; //ui
//控件信息
struct CtrlInfo
{
int nId;
CCPoint tPos; //坐标
CCPoint tAnchor; //锚点
CCRect rRect;
string strPic; //图片
string strText; //文本内容
string strFont; //文本字体
string strAudioFile;//声音文件
unsigned int nFontSize; //文本字体大小
unsigned int wLabelType; //文本类型
string strItem; //rollView条款
unsigned short wRollType;//roll控件类型
float fBounds; //拖动速率
string strWord; //
unsigned short wType;//控件类型
unsigned short wAlignment;//文本对齐方式
unsigned short btnState;//按钮状态
unsigned short btnType; //按钮类型
ccColor3B color3B; //文本颜色
unsigned short notType; //屏蔽消息框类型
int nPriority;//消息优先级
enum WTYPE
{
_IDC_IMG = , //图片
_IDC_STA = , //文本
_IDC_BTN = , //按钮
_IDC_SROLL = , //Sroll
_IDC_NOT = , //屏蔽消息框
_IDC_ROLL= , //滚动框
}; enum BTN_TYPE
{
_BT_Normal = , //正常
_BT_Select = , //选择
}; enum LabelType
{
_LableTTF = ,
_LabelBMFont = ,
_LabelAtlas = ,
}; }; //部件配置
struct WidgetInfo
{
int nId;
CCPoint tPos; //坐标
CCPoint tAnchor; //锚点
CCRect rRect;
string strPic; //图片
vector<CtrlInfo> m_vecCtrlInfo;
}; //场景配置
struct SceneInfo
{
int nId;
int nPosX;
int nPosY;
unsigned short wType; //条款(item)类型
unsigned short order; //层次
string strFile;
CCRect rRect;
enum WTYPE
{
_ITEM_IMG = , //图片
_ITEM_DLG = , //对话框
_ITEM_EFT = , //效果
_ITEM_STA = , //文本
_ITEM_BTN = , //按钮
};
}; //元素配置 struct PlistInfo
{
string strPlist;
string strImage;
};
struct ElementInfo
{
int nItem;
vector<PlistInfo> vecPlistInfo;
}; //动画配置
struct AnimationInfo
{
int nId; //物体ID(动画相关的物体)
int nBegan; //开始帧数
int nCount; //动画帧数
int nInterval;//帧之间的间隔
string strName; //动画名字
string plistpath; //plist路径
string texturePath;//静态贴图文件路径
string picPrefix; //资源目录--默认(或空)为物体的ID
}; //文字配置
struct WordInfo
{
string strKey;
string strLetter; //文字
}; //滚动项配置
//struct SrollInfo
//{
// int nId;
// int nPosX;
// int nPosY;
// CCRect rRect;
// string strPic;
//
// CtrlInfo ctrlInfo;
//
// unsigned short wType;//类型
//
// vector<SrollInfo> vecRollSub;
//};
//
//struct SrollViewInfo
//{
// string strKey;
// vector<SrollInfo> vecRollInfo;
//}; //滚动项配置
struct SrollInfo
{
string strKey;
vector<WidgetInfo> vecWidgetInfo;
}; //效果配置
struct EffectInfo
{
string strKey;
int nId;
int nPosX;
int nPosY;
CCRect rRect;
string strFile;
unsigned int wType;
vector<EffectInfo> vecEffectSub; enum WTYPE
{
_Particle = ,
_Action = ,
_Animation = ,
};
}; //动作配置
struct ActionInfo
{
string strKey;
int nAction;
string strDepict; //动作名字
string strParm; //参数
bool bReverse; //是否反动作
string strFile; //动作文件 enum ActionType
{
_Particle = ,
_Action = ,
_Animation = ,
}; ActionType eType; //动作类型
}; //音效配置
struct AudioInfo
{
string strKey;
unsigned int wType;
string strFile;
}; class GAMEFRAME_API CConfig
{
public:
CConfig();
~CConfig(); static CConfig* getInstance();
static void destroy();
void release(); bool loadConfig(); //读取配置文件
bool loadResourceInfo();//
bool loadImageInfo();//图片信息
bool loadAnimationInfo();//动画信息
bool loadSceneInfo();//场景信息
bool loadElementInfo();//元素 (plist)文件形式
bool loadWidgetInfo();// 控件信息
bool loadSrollInfo(); //滚动项信息
bool loadEffectInfo();//效果配置
bool loadAudioInfo();//声音配置
bool loadWordInfo();//文字配置
bool loadActionInfo();//动作配置
bool loadNumberInfo();//数字配置 bool readConfig(); //设置资源路径 一开始就要设定
void setResourcePath(const char* psPath);
string getResourcePath(); vector<ImageInfo>* getImageInfo();
ImageInfo* getImageInfoById(int nId);
ImageInfo* getImageInfoByKey(const char* psKey); vector<WidgetInfo>* getWidgetInfo();
WidgetInfo* getWidgetInfoById(int nId); vector<ElementInfo>* getElementInfo();
vector<PlistInfo>* getElementInfoByItem(int nId); map<int,vector<SceneInfo> >* getSceneInfo(); vector<AnimationInfo>* getAnimationInfo(); vector<EffectInfo>* getEffectInfo();
EffectInfo* getEffectInfoByKey(const char* psKey); vector<WidgetInfo>* getSrollInfoByKey(const char* psKey); AudioInfo* getAudioInfoByKey(const char* psKey); WordInfo& getWordInfoByKey(const char* psKey);
string getWordBykey(const char* psKey); ActionInfo* getActionInfoByKey(const char* psKey); float getNumberByKey(const char* psKey); private:
vector<string> m_vceConfigStr;
//资源路径
string m_strResourcePath;
static CConfig* g_pConfig; //图片资源配置标识
vector<ImageInfo> m_vecImageInfo; //场景配置标识
map<int, vector<SceneInfo> > m_mapSceneInfoVec; //元素(plist)配置标识
vector<ElementInfo> m_vecElement; //windget配置标识
vector<WidgetInfo> m_vecWidgetInfo; //动画配置标识
vector<AnimationInfo> m_vecAnimationInfo; //Sroll配置标识
vector<SrollInfo> m_vecSrollInfo; //效果配置
vector<EffectInfo> m_vecEffectInfo; //音效配置
vector<AudioInfo> m_vecAudioInfo; //文字配置
map<string, WordInfo> m_mapWordInfo; //动作配置
vector<ActionInfo> m_vecActionInfo; map<string, float> m_mapNumber;
}; #endif //__XCONFIG_H__
#include "Config.h"
#include "XXmlReader.h" CConfig* CConfig::g_pConfig = NULL; CConfig::CConfig()
{
m_strResourcePath.clear();
m_vecImageInfo.clear();
m_mapSceneInfoVec.clear();
m_vecElement.clear();
m_vecWidgetInfo.clear();
m_vecAnimationInfo.clear();
m_vecEffectInfo.clear();
} CConfig::~CConfig()
{ } CConfig* CConfig::getInstance()
{
if (!g_pConfig)
{
g_pConfig = new CConfig();
}
return g_pConfig;
} void CConfig::destroy()
{
g_pConfig->release();
SAFE_DELETE(g_pConfig);
} void CConfig::release()
{
m_strResourcePath.clear();
m_vecImageInfo.clear();
m_mapSceneInfoVec.clear();
m_vecElement.clear();
m_vecWidgetInfo.clear();
m_vecAnimationInfo.clear();
} bool CConfig::loadConfig()
{ return false;
} void CConfig::setResourcePath( const char* psPath )
{
m_strResourcePath = psPath;
} string CConfig::getResourcePath()
{
return m_strResourcePath;
} bool CConfig::readConfig()
{ return true;
} bool CConfig::loadImageInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/image.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
} do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "images", pRootNode->name))
{
break;
} //读取节点
xmlNodePtr pCurNode = pRootNode->xmlChildrenNode;
while (NULL != pCurNode)
{
if ( != xmlStrcmp(pCurNode->name, BAD_CAST "image"))
{
pCurNode = pCurNode->next;
continue;
} ImageInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id");
info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key");
info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file");
m_vecImageInfo.push_back(info);
pCurNode = pCurNode->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} vector<ImageInfo>* CConfig::getImageInfo()
{
return &m_vecImageInfo;
} bool CConfig::loadSceneInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/scene.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
} do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "scenes", pRootNode->name))
{
break;
} //读取节点
xmlNodePtr pElement = pRootNode->xmlChildrenNode;
while (pElement)
{
if ( != xmlStrcmp(pElement->name, BAD_CAST "scene"))
{
pElement = pElement->next;
continue;
} xmlNodePtr pItemNode = pElement->xmlChildrenNode;
vector<SceneInfo> vecSceneInfo;
while (pItemNode)
{
if ( != xmlStrcmp(pItemNode->name, BAD_CAST "item"))
{
pItemNode = pItemNode->next;
continue;
} SceneInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "id");
info.wType = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "type");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pItemNode, "pos");
int nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&info.nPosX,&info.nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.rRect.setRect(nRectX,nRectY,nRectW,nRectH);
info.order = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "order");
info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pItemNode, "file"); vecSceneInfo.push_back(info);
pItemNode = pItemNode->next;
} int nKey = CCXmlReader::getXMLNodeAttribInt(&pElement, "id");
m_mapSceneInfoVec[nKey] = vecSceneInfo; pElement = pElement->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} bool CConfig::loadElementInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/element.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
} do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "elements", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pItemNode = pRootNode->xmlChildrenNode;
while (NULL != pItemNode)
{
if ( != xmlStrcmp(pItemNode->name, BAD_CAST "item"))
{
pItemNode = pItemNode->next;
continue;
} ElementInfo elemInfo;
elemInfo.nItem = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "id"); xmlNodePtr pElemNode = pItemNode->xmlChildrenNode;
while(pElemNode)
{
if ( != xmlStrcmp(pElemNode->name, BAD_CAST "element"))
{
pElemNode = pElemNode->next;
continue;
}
PlistInfo info;
info.strPlist = CCXmlReader::getXMLNodeAttribStrs(&pElemNode, "plist");
info.strImage = CCXmlReader::getXMLNodeAttribStrs(&pElemNode, "image");
elemInfo.vecPlistInfo.push_back(info);
pElemNode = pElemNode->next;
} m_vecElement.push_back(elemInfo);
pItemNode = pItemNode->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} bool CConfig::loadWidgetInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/widget.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
} do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "widgets", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pElement = pRootNode->xmlChildrenNode;
while (NULL != pElement)
{
if ( != xmlStrcmp(pElement->name, BAD_CAST "widget"))
{
pElement = pElement->next;
continue;
} WidgetInfo widgetInfo;
widgetInfo.nId = CCXmlReader::getXMLNodeAttribInt(&pElement, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pElement,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
widgetInfo.tPos.setPoint(nPosX, nPosY);
widgetInfo.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pElement, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
widgetInfo.tAnchor.setPoint(fAnchorX, fAnchorY);
widgetInfo.strPic = CCXmlReader::getXMLNodeAttribStrs(&pElement, "pic"); xmlNodePtr pCtrlNode = pElement->xmlChildrenNode;
while (pCtrlNode)
{
//图片控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "img"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic");
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_IMG;
widgetInfo.m_vecCtrlInfo.push_back(info);
} //按钮控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "btn"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.wType = CtrlInfo::_IDC_BTN;
info.btnType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type");
info.btnState = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "state");
info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic");
info.strAudioFile = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "audio"); widgetInfo.m_vecCtrlInfo.push_back(info);
} //文本控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "sta"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_STA; info.wLabelType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type");
info.strText = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "text");
info.nFontSize = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "fontsize");
info.strFont = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "font");
info.wAlignment = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "aligning");
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "color");
int nR = , nG = , nB = ;
sscanf(strBuf.c_str(), "%d %d %d",&nR, &nG, &nB);
info.color3B.r = (char)nR;
info.color3B.g = (char)nG;
info.color3B.b = (char)nB;
widgetInfo.m_vecCtrlInfo.push_back(info);
} //Sroll控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "srl"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
info.tAnchor.setPoint(fAnchorX, fAnchorY); info.strItem = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "item");
info.wRollType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type");
info.fBounds = CCXmlReader::getXMLNodeAttribfloat(&pCtrlNode, "bounds");
info.wType = CtrlInfo::_IDC_SROLL; widgetInfo.m_vecCtrlInfo.push_back(info);
} //禁用触摸控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "not"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
info.notType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
info.tAnchor.setPoint(fAnchorX, fAnchorY); info.nPriority = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "priority");
info.wType = CtrlInfo::_IDC_NOT; widgetInfo.m_vecCtrlInfo.push_back(info);
} pCtrlNode = pCtrlNode->next;
} m_vecWidgetInfo.push_back(widgetInfo); pElement = pElement->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} vector<WidgetInfo>* CConfig::getWidgetInfo()
{
return& m_vecWidgetInfo;
} vector<ElementInfo>* CConfig::getElementInfo()
{
return& m_vecElement;
} map<int,vector<SceneInfo> >* CConfig::getSceneInfo()
{
return& m_mapSceneInfoVec;
} bool CConfig::loadAnimationInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/animation.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
} do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "animations", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pCurNode = pRootNode->xmlChildrenNode;
while (NULL != pCurNode)
{
if ( != xmlStrcmp(pCurNode->name, BAD_CAST "animation"))
{
pCurNode = pCurNode->next;
continue;
} AnimationInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id");
info.nBegan = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "began");
info.nCount = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "count");
info.nInterval = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "interval");
info.strName = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "name"); m_vecAnimationInfo.push_back(info); pCurNode = pCurNode->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false; } vector<AnimationInfo>* CConfig::getAnimationInfo()
{
return &m_vecAnimationInfo;
} ImageInfo* CConfig::getImageInfoById( int nId )
{
for (vector<ImageInfo>::iterator it = m_vecImageInfo.begin(); it != m_vecImageInfo.end(); it++)
{
if (it->nId == nId)
{
return &(*it);
}
}
CCLog("error: CConfig::getPlanInfoById");
return NULL;
} WidgetInfo* CConfig::getWidgetInfoById( int nId )
{
for (vector<WidgetInfo>::iterator it = m_vecWidgetInfo.begin(); it != m_vecWidgetInfo.end(); it++)
{
if (it->nId == nId)
{
return &(*it);
}
}
CCLog("error: CConfig::getWidgetInfoById");
return NULL;
} bool CConfig::loadSrollInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/sroll.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
} do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "srolls", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pElement = pRootNode->xmlChildrenNode;
while (NULL != pElement)
{
if ( == xmlStrcmp(pElement->name, BAD_CAST "item"))
{
SrollInfo srollInfo;
srollInfo.strKey = CCXmlReader::getXMLNodeAttribStrs(&pElement, "key"); xmlNodePtr pWidgetNode = pElement->xmlChildrenNode;
while(pWidgetNode)
{
if ( == xmlStrcmp(pWidgetNode->name, BAD_CAST "widget"))
{
WidgetInfo widgetInfo;
widgetInfo.nId = CCXmlReader::getXMLNodeAttribInt(&pWidgetNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pWidgetNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
widgetInfo.tPos.setPoint(nPosX, nPosY);
widgetInfo.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
widgetInfo.strPic = CCXmlReader::getXMLNodeAttribStrs(&pWidgetNode, "pic"); xmlNodePtr pCtrlNode = pWidgetNode->xmlChildrenNode;
while(pCtrlNode)
{
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "btn"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.wType = CtrlInfo::_IDC_BTN;
info.btnType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type");
info.btnState = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "state");
info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic");
info.strAudioFile = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "audio"); widgetInfo.m_vecCtrlInfo.push_back(info);
} //图片控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "img"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic");
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_IMG;
widgetInfo.m_vecCtrlInfo.push_back(info);
} //文本控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "sta"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_STA; info.wLabelType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type");
info.strText = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "text");
info.nFontSize = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "fontsize");
info.strFont = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "font");
info.wAlignment = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "aligning");
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "color");
int nR = , nG = , nB = ;
sscanf(strBuf.c_str(), "%d %d %d",&nR, &nG, &nB);
info.color3B.r = (char)nR;
info.color3B.g = (char)nG;
info.color3B.b = (char)nB;
widgetInfo.m_vecCtrlInfo.push_back(info);
} //禁用触摸控件
if ( == xmlStrcmp(pCtrlNode->name, BAD_CAST "not"))
{
CtrlInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos");
int nPosX = , nPosY = , nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH);
info.tPos.setPoint(nPosX, nPosY);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor");
float fAnchorX = , fAnchorY = ;
sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY);
info.tAnchor.setPoint(fAnchorX, fAnchorY); info.nPriority = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "priority");
info.wType = CtrlInfo::_IDC_NOT; widgetInfo.m_vecCtrlInfo.push_back(info);
} pCtrlNode = pCtrlNode->next;
} srollInfo.vecWidgetInfo.push_back(widgetInfo);
}
pWidgetNode = pWidgetNode->next;
} m_vecSrollInfo.push_back(srollInfo);
}
pElement = pElement->next;
} xmlFreeDoc(pDoc);
return true;
}while(); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str()); return false;
} bool CConfig::loadEffectInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/effect.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
} do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "effects", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pElement = pRootNode->xmlChildrenNode;
while (NULL != pElement)
{
if ( != xmlStrcmp(pElement->name, BAD_CAST "effect"))
{
pElement = pElement->next;
continue;
} EffectInfo effectInfo;
effectInfo.strKey = CCXmlReader::getXMLNodeAttribStrs(&pElement, "key");
string strEffectPosBuf = CCXmlReader::getXMLNodeAttribStrs(&pElement, "pos");
int nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strEffectPosBuf.c_str(), "%d %d %d %d %d %d", &effectInfo.nPosX, &effectInfo.nPosY,
&nRectX, &nRectY, &nRectW, &nRectH);
effectInfo.rRect.setRect(nRectX, nRectY, nRectW, nRectH); xmlNodePtr pCurNode = pElement->xmlChildrenNode;
while (pCurNode)
{
if ( == xmlStrcmp(pCurNode->name, BAD_CAST "particle"))
{
EffectInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "pos");
int nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(), "%d %d %d %d %d %d", &info.nPosX, &info.nPosY,
&nRectX, &nRectY, &nRectW, &nRectH);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
info.wType = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type");
info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); effectInfo.vecEffectSub.push_back(info);
} if ( == xmlStrcmp(pCurNode->name, BAD_CAST "action"))
{ } if ( == xmlStrcmp(pCurNode->name, BAD_CAST "Animate"))
{
EffectInfo info;
info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id");
string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "pos");
int nRectX = , nRectY = , nRectW = , nRectH = ;
sscanf(strBuf.c_str(), "%d %d %d %d %d %d", &info.nPosX, &info.nPosY,
&nRectX, &nRectY, &nRectW, &nRectH);
info.rRect.setRect(nRectX, nRectY, nRectW, nRectH);
info.wType = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type");
info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); effectInfo.vecEffectSub.push_back(info);
} pCurNode = pCurNode->next;
} m_vecEffectInfo.push_back(effectInfo);
pElement = pElement->next;
}
xmlFreeDoc(pDoc);
return true;
} while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} EffectInfo* CConfig::getEffectInfoByKey(const char* psKey)
{
for (vector<EffectInfo>::iterator it = m_vecEffectInfo.begin(); it != m_vecEffectInfo.end(); it++)
{
if ( == strcmp(it->strKey.c_str(), psKey))
{
return &(*it);
}
}
CCLog("error: CConfig::getEffectInfoByKey");
return NULL;
} vector<EffectInfo>* CConfig::getEffectInfo()
{
return &m_vecEffectInfo;
} vector<WidgetInfo>* CConfig::getSrollInfoByKey( const char* psKey )
{
for (vector<SrollInfo>::iterator it = m_vecSrollInfo.begin(); it != m_vecSrollInfo.end(); it++)
{
if (it->strKey == psKey)
{
return & it->vecWidgetInfo;
}
}
CCLog("error: CConfig::getSrollInfoByKey");
return NULL;
} bool CConfig::loadAudioInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/audio.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
}
do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "audios", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pCurNode = pRootNode->xmlChildrenNode;
while (NULL != pCurNode)
{
if ( != xmlStrcmp(pCurNode->name, BAD_CAST "audio"))
{
pCurNode = pCurNode->next;
continue;
} AudioInfo info;
info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key");
info.wType = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type");
info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file");
m_vecAudioInfo.push_back(info); pCurNode = pCurNode->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} AudioInfo* CConfig::getAudioInfoByKey( const char* psKey )
{
for (vector<AudioInfo>::iterator it = m_vecAudioInfo.begin(); it != m_vecAudioInfo.end(); it++)
{
if ( == strcmp(it->strKey.c_str(), psKey))
{
return &(*it);
}
} CCLog("error: CConfig::getAudioInfoByKey");
return NULL;
} vector<PlistInfo>* CConfig::getElementInfoByItem( int nId )
{
for (vector<ElementInfo>::iterator it = m_vecElement.begin(); it != m_vecElement.end(); it++)
{
if (it->nItem == nId)
{
return &it->vecPlistInfo;
}
}
CCLog("error: CConfig::getElementInfoById");
return NULL;
} ImageInfo* CConfig::getImageInfoByKey( const char* psKey )
{
for (vector<ImageInfo>::iterator it = m_vecImageInfo.begin(); it != m_vecImageInfo.end(); it++)
{
if ( it->strKey == psKey)
{
return &(*it);
}
}
CCLog("error: CConfig::getImageInfoByKey");
return NULL;
} bool CConfig::loadWordInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/word.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
}
do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "words", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pCurNode = pRootNode->xmlChildrenNode;
while (NULL != pCurNode)
{
if ( != xmlStrcmp(pCurNode->name, BAD_CAST "word"))
{
pCurNode = pCurNode->next;
continue;
} WordInfo info;
info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key");
info.strLetter = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "letter");
m_mapWordInfo[info.strKey] = info; pCurNode = pCurNode->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} WordInfo& CConfig::getWordInfoByKey( const char* psKey )
{
return m_mapWordInfo[psKey];
} string CConfig::getWordBykey( const char* psKey )
{
for (map<string, WordInfo>::iterator it = m_mapWordInfo.begin(); it != m_mapWordInfo.end(); it++)
{
if (it->first == psKey)
{
return it->second.strLetter;
}
}
CCLog("warning: CConfig::getWordByKey");
return "";
} bool CConfig::loadActionInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/action.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
}
do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "actions", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pCurNode = pRootNode->xmlChildrenNode;
while (NULL != pCurNode)
{
if ( == xmlStrcmp(pCurNode->name, BAD_CAST "action"))
{
ActionInfo info;
info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key");
info.nAction = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type");
info.strParm = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "parm"); info.eType = ActionInfo::_Action; m_vecActionInfo.push_back(info);
}
if ( == xmlStrcmp(pCurNode->name, BAD_CAST "particle"))
{
ActionInfo info;
info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key");
info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); info.eType = ActionInfo::_Particle; m_vecActionInfo.push_back(info);
} pCurNode = pCurNode->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false;
} ActionInfo* CConfig::getActionInfoByKey( const char* psKey )
{
for (vector<ActionInfo>::iterator it = m_vecActionInfo.begin(); it != m_vecActionInfo.end(); it++)
{
if (it->strKey == psKey)
{
return &(*it);
}
} CCLog("error: CConfig::getActionInfoByKey");
return NULL;
} bool CConfig::loadNumberInfo()
{
string strFile = m_strResourcePath;
strFile += "/config/number.xml"; //读取文档
xmlDocPtr pDoc = NULL;
LOAD_XML_DOC(strFile.c_str(), pDoc); if (NULL == pDoc)
{
CCLog("can not read %s", strFile.c_str());
return false;
}
do
{
xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
if (NULL == pRootNode)
{
break;
} if( != xmlStrcmp(BAD_CAST "numbers", pRootNode->name))
{
break;
}
//读取节点
xmlNodePtr pCurNode = pRootNode->xmlChildrenNode;
while (NULL != pCurNode)
{
if ( == xmlStrcmp(pCurNode->name, BAD_CAST "number"))
{
m_mapNumber[CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key")]
= CCXmlReader::getXMLNodeAttribfloat(&pCurNode, "num");
} pCurNode = pCurNode->next;
} xmlFreeDoc(pDoc);
return true; } while (); xmlFreeDoc(pDoc);
CCLog("read xml error : %s", strFile.c_str());
return false; } float CConfig::getNumberByKey( const char* psKey )
{
return m_mapNumber[psKey];
}

CConfig类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

随机推荐

  1. [Linux] du-查看文件夹大小-并按大小进行排序

    reference : http://blog.csdn.net/jiaobuchong/article/details/50272761# 某天,我想检查一下电脑硬盘的的使用情况,作为一个命令控,废 ...

  2. 为Hadoop创建JAR包文件Creating a JAR for Hadoop

    We've seen the internals of MapReduce in the last post. Now we can make a little change to the WordC ...

  3. Mongodb 官网驱动2.2.4.26版本 增,删 改,查

    Mongodb是3.2.7版本 最近在学习mongodb数据库在网上找到的都不是2.X版本以下的,因为驱动从2.X以后修改了很多,以前不支持linq现2.X也支持了, Mongodb 启动服务就不说了 ...

  4. DOS命令:列出某目录下的所有文本文件名并重定向到某文件

    命令如下: >dir /b *.txt>output.txt dir无需说,/b 是只要文件名,>是重定向. 2013年11月7日13:36:57

  5. 论文笔记《Feedforward semantic segmentation with zoom-out features》

    [论文信息] <Feedforward semantic segmentation with zoom-out features> CVPR 2015 superpixel-level,f ...

  6. Xcode5 打包 发布配置

    http://www.cnblogs.com/zhaoqingqing/p/3553750.html 主题 Unity导出Xcode项目,使用Xocde打包ipa并提交到AppStore 步骤 1.设 ...

  7. Python 整数和浮点数运算

    和数学运算不同的地方是,Python的整数运算结果仍然是整数,浮点数运算结果仍然是浮点数:1 + 2 # ==> 整数 31.0 + 2.0 # ==> 浮点数 3.0 整数和浮点数混合运 ...

  8. Linux 监测内存常用的工具sar free vmstat

    Linux 检测内存常用的工具sar free vmstat free 内存统计信息解释 total 内存总量used 内存使用的大小free 内存剩余大小shared 共享内存大小buffers 块 ...

  9. Android 常用的性能分析工具详解:GPU呈现模式, TraceView, Systrace, HirearchyViewer(转)

    此篇将重点介绍几种常用的Android性能分析工具: 一.Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗.当我们打开一个Activit ...

  10. 娓娓道来c指针 (4)解析c的声明语句

    (4)解析c的声明语句 在继续探索c指针之前.有必要来解析下c语言中复杂的声明语法. 仅仅须要记住两则:一个原则,一个规则. 原则:先看标示符. 规则:运算符优先级是规则. 举例说明 1.最简单的 i ...