使用Cocos2d-x-3.0游戏引擎。编写一个瓦片地图游戏 part02

上一篇地址:http://www.cocoachina.com/bbs/read.php?tid=196632&page=1&toread=1#tpc

  1. 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

先顶一下楼主
我有个疑问
你建立背景那些代码
为何不用 auto _tileMap= TMXTiledMap::create(“01.tmx”);

这里是要载入一个外部的TMX文件,不是自己用代码新建一个。我试了下你的那行代码,然后:“game Module 已停止工作”

每篇一顶:2:

你好,为啥,读取TMX文件的时候会出现异常嘞?
处的第一机会异常(在 game1.exe 中): 0xC0000005: 读取位置 0x00000030 时发生访问冲突。

:2: :2: :2: :2: :2:

我也是这个问题

:2: 多谢楼主分享

楼主的代码中setPlayerPosition这个成员函数未定义啊,而且不知道是用什么移动精灵的?鼠标?还是键盘的按键?

鼠标点击屏幕。setPlayerPositon的定义漏了,其实下一章的定义也是可以的。(我的失误···:5:
void HelloWorld::setPlayerPosition(Point position)
{
_player->setPosition(position);
}

制作地图的图片文件(那些素材)要跟着地图tmx文件一起放在resource文件夹里···(感谢提醒:2:

制作地图的图片文件(那些素材)要跟着地图tmx文件一起放在resource文件夹里···(感谢提醒:2:······)

同样的问题。。。。解决了吗?

制作地图的图片文件(那些素材)要跟着地图tmx文件一起放在resource文件夹里···=0 =

请问移动的实现 ,是点哪里 人物直接setposition 到那个点
还是移动到那个点?

移动到那个点,鼠标每点一下地图(你要它去的地方),精灵前进半个瓦片单位长

按照你的方法来了,制作地图的图片文件也和地图tmx文件一起放在resource文件夹里了,但是还是没显示:6::6:

这个“没显示”应该怎么理解?报错?还是地图编辑后没保存仍然一片黑?

LZ你好,我把那些素材和tmx文件一起放在resource文件夹里,代码就跟着你的教程第二章,但运行后是黑屏,win7+vs2012+cocos2dx beta版本,请问LZ这是什么原因?

看一下"addChild(_tileMap, -1);"这句代码有没有漏