这个项目写到现在所有的功能都在HelloWorldScene中完成,代码非常臃肿,所以需要对代码进行重构:
(1)分离场景和图层
新建两个类GameScene,继承CCScene,负责场景的创建以及对场景中的对象进行管理。GameLayer继承CCLayer负责绘制地图,Hero,战斗动画等
#pragma once
#include "header.h"
#include "GameLayer.h"
using namespace cocos2d;
class GameScene : public CCScene
{
public:
GameScene();
virtual ~GameScene();
//用静态方法创建变量
static CCScene *playNewGame();
//初始化 场景
virtual bool init();
//使用COCOS2D-X预定义宏,可以自动释放对象
CREATE_FUNC(GameScene);
};
bool GameScene::init()
{
GameLayer * gameLayer=GameLayer::create();
addChild(gameLayer);
return true;
}
CCScene *GameScene::playNewGame()
{
CCScene * scene=NULL;
do
{
scene=GameScene::create();
CC_BREAK_IF(!scene);
} while (0);
return scene;
}
#pragma once #include "header.h" #include "GameMap.h" using namespace cocos2d; class GameLayer : public CCLayer { public: GameLayer(); ~GameLayer(); virtual bool init(); CREATE_FUNC(GameLayer); public: //自定义类 继承CCTMXTieldMap GameMap * m_gameMap; };
暂时只创建GameMap
bool GameLayer::init() { m_gameMap=GameMap::gameMapWithTMXFile("1.tmx"); addChild(m_gameMap); }
自定义类GameMap继承CCTMXTiledMap
#pragma once #include "header.h" using namespace cocos2d; typedef enum{ Moveble=0, Wall=1, Enemy=2 }CollisionType; class GameMap : public cocos2d::CCTMXTiledMap { //cocos2d-x自定义宏,相当于声明变量,并且声明Get,Set方法 CC_PROPERTY_READONLY(CCTMXLayer*,floorLayer,FloorLayer); CC_PROPERTY_READONLY(CCTMXLayer*,wallLayer,WallLayer); public: GameMap(); ~GameMap(); //坐标转换 static GameMap * gameMapWithTMXFile(const char * tmxFile); cocos2d::CCPoint positionToCocos2d(cocos2d::CCPoint tileCoord); cocos2d::CCPoint positionToTileCoord(cocos2d::CCPoint cocosCoord );//碰撞检测 CollisionType checkCollision(CCPoint heroPotion);protected: //其他的初始化部分 void extraInit(); //开启抗锯齿 void enableAntiAliasTex(); };
部分函数GameMap * GameMap::gameMapWithTMXFile(const char * tmxFile) { GameMap * gameMap = new GameMap(); if (gameMap->initWithTMXFile(tmxFile)) { gameMap->extraInit(); gameMap->autorelease(); return gameMap; } CC_SAFE_DELETE(gameMap); return NULL; } void GameMap::extraInit() { enableAntiAliasTex(); floorLayer=this->layerNamed("floor"); wallLayer=this->layerNamed("wall"); } void GameMap::enableAntiAliasTex() { CCArray * pchildArray=this->getChildren(); CCSpriteBatchNode *child=NULL; CCObject * pobject=NULL; CCARRAY_FOREACH(pchildArray,pobject) { child=(CCSpriteBatchNode*)pobject; if(!child) break; child->getTexture()->setAntiAliasTexParameters(); } }