原文:http://www.raywenderlich.com/39113/cocos2d-x-tile-map-tutorial-part-1
这次原文本来就是C++写的,代码也差不多没改过什么。
打包的APK + resources:http://download.csdn.net/detail/u010639508/5875945
代码:https://github.com/serika00/android/tree/master/cocos2d-x/TileMapExample
cocos2d-x-2.14 + vs2010
运行截图:
HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
#include "HudLayer.h"
USING_NS_CC;
class HelloWorld : public cocos2d::CCLayer
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
void setViewPointCenter(CCPoint position);
void registerWithTouchDispatcher();
void setPlayerPosition(CCPoint position);
bool ccTouchBegan(CCTouch* touch, CCEvent* event);
void ccTouchEnded(CCTouch* touch, CCEvent* event);
CCPoint tileCoordForPosition(CCPoint position);
private:
CCTMXTiledMap* _tileMap;
CCTMXLayer* _background;
CCSprite* _player;
CCTMXLayer* _meta;
CCTMXLayer* _foreground;
HudLayer* _hud;
int _numCollected;
};
#endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
#include "HelloWorldScene.h"
//#include "SimpleAudioEngine.h"
USING_NS_CC;
CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
HudLayer* hud = new HudLayer();
hud->init();
scene->addChild(hud);
layer->_hud = hud;
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
// CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("pickup.caf");
// CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("hit.caf");
// CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("move.caf");
// CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("TileMap.caf");
this->setTouchEnabled(true);
_numCollected = 0;
_tileMap = new CCTMXTiledMap();
_tileMap->initWithTMXFile("TileMap.tmx");
_background = _tileMap->layerNamed("Background");
this->addChild(_tileMap);
_foreground = _tileMap->layerNamed("Foreground");
_meta = _tileMap->layerNamed("Meta");
_meta->setVisible(false);
CCTMXObjectGroup* objectGroup = _tileMap->objectGroupNamed("Objects");
if (objectGroup == NULL) {
CCLog("tile map has no objects object layer.");
return false;
}
CCDictionary* spawnPoint = objectGroup->objectNamed("SpawnPoint");
int x = ((CCString)*spawnPoint->valueForKey("x")).intValue();
int y = ((CCString)*spawnPoint->valueForKey("y")).intValue();
_player = new CCSprite();
_player->initWithFile("Player.png");
_player->setPosition(ccp(x, y));
this->addChild(_player);
this->setViewPointCenter(_player->getPosition());
return true;
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
void HelloWorld::setViewPointCenter(CCPoint position) {
CCSize winSize = CCDirector::sharedDirector()->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*this->_tileMap->getTileSize().height) - winSize.height/2);
CCPoint actualPosition = ccp(x, y);
CCPoint centerOfView = ccp(winSize.width/2, winSize.height/2);
CCPoint viewPoint = ccpSub(centerOfView, actualPosition);
this->setPosition(viewPoint);
}
void HelloWorld::registerWithTouchDispatcher() {
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}
bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event) {
return true;
}
void HelloWorld::setPlayerPosition(CCPoint position) {
CCPoint tileCoord = this->tileCoordForPosition(position);
int tileGid = _meta->tileGIDAt(tileCoord);
if (tileGid) {
CCDictionary* properties = _tileMap->propertiesForGID(tileGid);
if (properties) {
CCString* collision = new CCString();
*collision = *properties->valueForKey("Collidable");
if (collision && (collision->compare("True") == 0)) {
// CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("hit.caf");
return;
}
CCString *collectible = new CCString();
*collectible = *properties->valueForKey("Collectable");
if (collectible && (collectible->compare("True") == 0)) {
_meta->removeTileAt(tileCoord);
_foreground->removeTileAt(tileCoord);
_numCollected++;
_hud->numCollectedChanged(_numCollected);
// CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pickup.caf");
}
}
}
// CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("move.caf");
_player->setPosition(position);
}
void HelloWorld::ccTouchEnded(CCTouch* touch, CCEvent* event) {
CCPoint touchLocation = touch->getLocationInView();
touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);
touchLocation = this->convertToNodeSpace(touchLocation);
CCPoint playerPos = _player->getPosition();
CCPoint diff = ccpSub(touchLocation, playerPos);
if (abs(diff.x) > abs(diff.y)) {
if (diff.x > 0) {
playerPos.x += _tileMap->getTileSize().width;
} else {
playerPos.x -= _tileMap->getTileSize().width;
}
} else {
if (diff.y > 0) {
playerPos.y += _tileMap->getTileSize().width;
} else {
playerPos.y -= _tileMap->getTileSize().height;
}
}
if (playerPos.x <= (_tileMap->getMapSize().width*_tileMap->getTileSize().width)
&& playerPos.y <= (_tileMap->getMapSize().height*_tileMap->getTileSize().height)
&& playerPos.y >= 0
&& playerPos.x >= 0)
{
this->setPlayerPosition(playerPos);
}
this->setViewPointCenter(_player->getPosition());
}
CCPoint HelloWorld::tileCoordForPosition(CCPoint position) {
int x = position.x / _tileMap->getTileSize().width;
int y = ((_tileMap->getMapSize().height*_tileMap->getTileSize().height) - position.y)
/_tileMap->getTileSize().height;
return ccp(x, y);
}
HudLayer.h
#ifndef __HUDLAYER_H__
#define __HUDLAYER_H__
#include "cocos2d.h"
USING_NS_CC;
class HudLayer: public CCLayer {
private:
CCLabelTTF* _label;
public:
virtual bool init();
static CCScene* scene();
void menuCloseCallBack(CCObject* pSender);
CREATE_FUNC(HudLayer);
void numCollectedChanged(int numCollected);
};
#endif
HudLayer.cpp
#include "HudLayer.h"
USING_NS_CC;
bool HudLayer::init() {
if (CCLayer::init()) {
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
_label = new CCLabelTTF();
_label->initWithString("0", "Verdana-Bold", 18.0);
_label->setColor(ccc3(0, 0, 0));
int margin = 10;
_label->setPosition(ccp(winSize.width - (_label->getContentSize().width/2)
- margin, _label->getContentSize().height/2 + margin));
this->addChild(_label);
}
return true;
}
void HudLayer::numCollectedChanged(int numCollected) {
CCString* labelCollected = new CCString();
labelCollected->initWithFormat("%d", numCollected);
_label->setString(labelCollected->getCString());
}