cocos2d 游戏例子 TiledMap

原文: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());
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值