上一篇地址:http://www.cocoachina.com/bbs/read.php?tid=196632&page=1&toread=1#tpc
- Upload the map
载入地图就像OC语言一样。C++同样也有头文件和完成文件(我先学的OC语言。)我们现在在头文件中注册那些我们将会用到的文件。打开“HelloWorldScene.h”增加一些成员变量:
// 制作地图的图片素材,要和tmx地图文件一起放在resource文件夹中!!!
class HelloWorld : public cocos2d::Layer
{
``````
private:
cocos2d::TMXTiledMap *_tileMap;
cocos2d::TMXLayer *_background;
``````
};
//然后打开‘HelloWorldScene.cpp’做一些更改(你可以删除掉“bool HelloWorld::init()”里原本的老代码。)
bool HelloWorld::init()
{
``````
if ( !Layer::init() )
{
return false;
}
std::string file = "01.tmx";
auto str = String::createWithContentsOfFile (FileUtils::getInstance()->fullPathForFilename(file.c_str()).c_str());
_tileMap = TMXTiledMap::createWithXML(str->getCString(),"");
_background = _tileMap->layerNamed("Background");
addChild(_tileMap, -1);
return true;
``````
}
```
在这里,我们引用了TMXTileLayer类来上传我们的地图。现在运行VS2012调试功能。我们就能获得我们创建的地图,或者更准确的说是部分地图。(因为我们创建的地图太大了,窗口尺寸不能将它全部显示。默认设置只能展示瓦片地图的左下角)所以如果在调试的过程中没有报错,那就OK。接下来我们要创建精灵,我们的人物,让窗口的视角设置到我们的人物身上。(这会解决上面看不到人物或看不到我们创建的地图的问题,或者你直接把你建设的地图放置在左下角)
Part of the map
4. Character and the View
人物和视角右键点击瓦片地图编辑器的“图层区域”。选择“对象图层”创建一个新的对象图层。然后选择“矩形”按钮。然后在你想让人物出现的地方画出这个矩形。右键点击这个矩形并给他设置一些属性。(只改名字)
Character position & Properties回到VS。在“HelloWorldScene.h”中,我们输入一些代码:
class HelloWorld : public cocos2d::Layer
{
``````
private:
cocos2d::Sprite *_player;
``````
};
// 在“HelloWorldScene.cpp”里
bool HelloWorld::init()
{
``````
TMXObjectGroup *objects = _tileMap->getObjectGroup("Object-Player");
CCASSERT(NULL != objects, "'Object-Player' object group not found");
auto playerShowUpPoint = objects->getObject("PlayerShowUpPoint");
CCASSERT(!playerShowUpPoint.empty(), "PlayerShowUpPoint object not found");
int x = playerShowUpPoint"x"].asInt();
int y = playerShowUpPoint"y"].asInt();
_player = Sprite::create("029.png");
_player->setPosition(x + _tileMap->getTileSize().width / 2, y + _tileMap->getTileSize().height / 2);
_player->setScale(0.5);
addChild(_player);
setViewPointCenter(_player->getPosition());
``````
}
```
我们添加了判断语句来决定是否这些对象已经被加载。通过使用“getObjectGroup”方法,我们获取到了对象层。并且从地图上获取了位置并设置到了我们的精灵上。接下来,我们添加一个新的方法“setViewPointCenter”:In the ‘HelloWorldScene.h’:在“HelloWorldScene.h”中
class HelloWorld : public cocos2d::Layer
{
``````
public:
void setViewPointCenter(cocos2d::Point position);
``````
}
In the ‘HelloWorldScene.cpp’:
在“HelloWorldScene.cpp”中
void HelloWorld::setViewPointCenter(Point position) {
auto winSize = Director::getInstance()->getWinSize();
int x = MAX(position.x, winSize.width / 2);
int y = MAX(position.y, winSize.height / 2);
x = MIN(x, (_tileMap->getMapSize().width * this->_tileMap->getTileSize().width) - winSize.width / 2);
y = MIN(y, (_tileMap->getMapSize().height * _tileMap->getTileSize().height) - winSize.height / 2);
auto actualPosition = Point(x, y);
auto centerOfView = Point(winSize.width / 2, winSize.height / 2);
auto viewPoint = centerOfView - actualPosition;
this->setPosition(viewPoint);
}
```
View correct & Character show up现在,视角已经被矫正,人物也已经出现。但是主角却不能移动。屏幕也是静止不动的。
5. The Movement:
移动
bool HelloWorld::init()
{
``````
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = &](Touch *touch, Event *unused_event)->bool {return true;};
listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
``````
}
```
And:
并且:
void HelloWorld::onTouchEnded(Touch *touch, Event *unused_event)
{
auto actionTo1 = RotateTo::create(0, 0, 180);
auto actionTo2 = RotateTo::create(0, 0, 0);
auto touchLocation = touch->getLocation();
touchLocation = this->convertToNodeSpace(touchLocation);
auto playerPos = _player->getPosition();
auto diff = touchLocation - playerPos;
if (abs(diff.x) > abs(diff.y)) {
if (diff.x > 0) {
playerPos.x += _tileMap->getTileSize().width / 2;
_player->runAction(actionTo2);
}
else {
playerPos.x -= _tileMap->getTileSize().width / 2;
_player->runAction(actionTo1);
}
}
else {
if (diff.y > 0) {
playerPos.y += _tileMap->getTileSize().height / 2;
}
else {
playerPos.y -= _tileMap->getTileSize().height / 2;
}
}
if (playerPos.x <= (_tileMap->getMapSize().width * _tileMap->getMapSize().width) &&
playerPos.y <= (_tileMap->getMapSize().height * _tileMap->getMapSize().height) &&
playerPos.y >= 0 &&
playerPos.x >= 0)
{
this->setPlayerPosition(playerPos);
}
this->setViewPointCenter(_player->getPosition());
}
```
void HelloWorld::setPlayerPosition(Point position)
{
_player->setPosition(position);
}
```
别忘了“HelloWorldScene.h”:
class HelloWorld : public cocos2d::Layer
{
public:
``````
void onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *unused_event);
void setViewPointCenter(cocos2d::Point position);
void setPlayerPosition(cocos2d::Point position);
``````
}
```
Sprite & View move
未完待续~(一日一更)下一篇地址:http://www.cocoachina.com/bbs/read.php?tid=196836&page=1&toread=1#tpc

)