华容道开发02---角色类的设计与数据读取

游戏中会出现的角色有曹操,将军(赵云等),兵三种类型,但是,将军有多种贴图,而且,将军还有横竖之分。

属性:

IDid 
贴图image_name 
类型type

四种类型

boss,曹操

general_hor将军横向,

general_ver,将军竖向

soldier士兵
宽度width横向占的格子数
高度height竖向占的格子数


 xml文档截图:

代码:

Role.h

#ifndef _ROLE_H_
#define _ROLE_H_

#include "cocos2d.h"
#include "tinyxml2/tinyxml2.h"

#define  IF_NULL_RETURN_FALSE(_x_) if(_x_ == nullptr) return false 

using namespace tinyxml2 ;
USING_NS_CC ;
typedef enum 
{
	kRoleTypeNone = 0,
	kRoleTypeBoss,//<曹操
	kRoleTypeArmyGeneralHorizontal,//<横向的将军
	kRoleTypeArmyGeneralVertical,//<竖直的将军
	kRoleTypeSoldier,//<士兵
}RoleType;
class Role : public Ref
{
public:
	static  cocos2d::Vector<Role*> s_roleVec ;
	static const char * XML_FILE_NAME ;
	static bool initStatic();
	static bool parseData(XMLElement * pElement) ;
	static void finalizeStatic();
public:
	Role();
	~Role();

	bool init(XMLElement * pElement);
	RoleType getTypeByChar(const char * pType);
private:
	CC_SYNTHESIZE_READONLY(int ,m_id,ID) ;
	CC_SYNTHESIZE_READONLY(int ,m_width,Width) ;
	CC_SYNTHESIZE_READONLY(int ,m_height,Height) ;
	CC_SYNTHESIZE_READONLY(RoleType,m_type,Type);
	CC_SYNTHESIZE_READONLY(cocos2d::__String *,m_pImageName,ImageName) ;
};

#endif

Role.cpp

#include "Role.h"

const char * Role::XML_FILE_NAME = "roles.xml" ;
Vector<Role*> Role::s_roleVec ;
bool Role::initStatic()
{
	std::string filePath = FileUtils::getInstance()->fullPathForFilename(XML_FILE_NAME) ;

	tinyxml2::XMLDocument pDoc;

	FileUtils::getInstance()->setPopupNotify(false) ;
	ssize_t fileSize = 0 ;
	std::string data = FileUtils::getInstance()->getStringFromFile(filePath.c_str()); 
	FileUtils::getInstance()->setPopupNotify(true) ;

	pDoc.Parse(data.c_str()) ;

	XMLElement * pEle = pDoc.RootElement() ;

	return parseData(pEle) ;
}

bool Role::parseData(XMLElement * pElement)
{
	s_roleVec.clear() ;
	XMLElement * child = pElement->FirstChildElement() ;
	for (;child;child = child->NextSiblingElement())
	{
		if (strcmp(child->Value(),"role") == 0)
		{
			Role * pRol = new Role() ;
			if (!pRol->init(child))
			{
				CC_SAFE_RELEASE_NULL(pRol); 
				return false ;
			}
			s_roleVec.pushBack(pRol) ;
			pRol->release() ;
		}
	}

	return true ;
}

void Role::finalizeStatic()
{
	s_roleVec.clear() ;
}
Role::Role()
	:m_id(-1)
	,m_pImageName(nullptr)
	,m_type(kRoleTypeNone)
	,m_width(0)
	,m_height(0)
{

}

Role::~Role()
{
	CC_SAFE_RELEASE_NULL(m_pImageName) ;
}

bool Role::init(XMLElement * pElement)
{
	const char * pId = pElement->Attribute("id") ;
	IF_NULL_RETURN_FALSE(pId) ;
	m_id = atoi(pId) ;

	const char * pImageName = pElement->Attribute("image_name") ;
	IF_NULL_RETURN_FALSE(pImageName) ;
	m_pImageName = new __String(pImageName) ;

	const char* pType = pElement->Attribute("type") ;
	IF_NULL_RETURN_FALSE(pType);
	m_type = getTypeByChar(pType) ;

	const char * pWidth = pElement->Attribute("width") ;
	IF_NULL_RETURN_FALSE(pWidth);
	m_width = atoi(pWidth); 
	
	const char * pHeight = pElement->Attribute("height") ;
	IF_NULL_RETURN_FALSE(pHeight);
	m_height = atoi(pHeight); 


	log("Role:%d----%d-----%d",m_id,m_width,m_height);
	return true;
}

RoleType Role::getTypeByChar(const char * pType)
{
	if (strcmp("boss",pType) == 0)
	{
		return kRoleTypeBoss ;
	}
	else if (strcmp("soldier",pType) == 0)
	{
		return kRoleTypeSoldier ;
	}
	else if (strcmp("general_ver",pType) == 0)
	{
		return kRoleTypeArmyGeneralVertical;
	}
	else if (strcmp("general_hor",pType) == 0)
	{
		return kRoleTypeArmyGeneralHorizontal;
	}

	return kRoleTypeNone ;
}



 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值