zoukankan      html  css  js  c++  java
  • cocos2dx游戏 地图


    #include "HelloWorld.h"
    
    USING_NS_CC;
    
    CCScene* MyHelloWorld::scene()
    {
    	// 'scene' is an autorelease object
    	CCScene *scene = CCScene::create();
    
    	// 'layer' is an autorelease object
    	MyHelloWorld *layer = MyHelloWorld::create();
    
    	// add layer as a child to scene
    	scene->addChild(layer);
    
    	// return the scene
    	return scene;
    }
    
    // on "init" you need to initialize your instance
    bool MyHelloWorld::init()
    {
    	//////////////////////////////
    	// 1. super init first
    	if ( !CCLayer::init() )
    	{
    		return false;
    	}
    
    	initdefalut();
    
    	initmap();
    
    	return true;
    }
    
    
    void MyHelloWorld::menuCloseCallback(CCObject* pSender)
    {
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
    	CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
    #else
    	CCDirector::sharedDirector()->end();
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    	exit(0);
    #endif
    #endif
    }
    
    void MyHelloWorld::initmap()
    {
    	this->scheduleUpdate();
    	map=CCTMXTiledMap::create("my.tmx");
    	CCTMXObjectGroup* obj1= map->objectGroupNamed("object1");
    	wall=map->layerNamed("wall");
    	floor=map->layerNamed("floor");
    	meta=map->layerNamed("meta");
    	CCDictionary* dict=obj1->objectNamed("sprite");
    	float x=dict->valueForKey("x")->floatValue();
    	float y=dict->valueForKey("y")->floatValue();
    	float width=dict->valueForKey("width")->floatValue();
    	float height=dict->valueForKey("height")->floatValue();
    	int i=dict->valueForKey("key")->intValue();
    	sprite=CCSprite::create("Player.png");
    	sprite->retain();
    	sprite->setAnchorPoint(ccp(0,0));
    	sprite->setPosition(ccp(x,y));
    	this->addChild(map,10,1);
    
    	map->addChild(sprite,0);
    	CCLOG("%d",map->getChildren()->count());
    		CCLOG("%d",floor->getZOrder());CCLOG("%d",wall->getZOrder());
    			CCLOG("%d",meta->getZOrder());
    			CCLOG("%d",sprite->getZOrder());
    	CCLOG("%f.%f,%d",x,y,i);
    	CCLOG("%f.%f,%d",width,height,i);
    
    }
    
    void MyHelloWorld::initdefalut()
    {
    	CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    	CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
    
    	/////////////////////////////
    	// 2. add a menu item with "X" image, which is clicked to quit the program
    	//    you may modify it.
    
    	// add a "close" icon to exit the progress. it's an autorelease object
    	CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
    		"CloseNormal.png",
    		"CloseSelected.png",
    		this,
    		menu_selector(MyHelloWorld::menuCloseCallback));
    
    	pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
    		origin.y + pCloseItem->getContentSize().height/2));
    
    	// create menu, it's an autorelease object
    	CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    	pMenu->setPosition(CCPointZero);
    	this->addChild(pMenu, 20);
    
    	/////////////////////////////
    	// 3. add your codes below...
    
    	// add a label shows "Hello World"
    	// create and initialize a label
    
    	CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "", 24);
    
    	// position the label on the center of the screen
    	pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
    		origin.y + visibleSize.height - pLabel->getContentSize().height));
    
    	// add the label as a child to this layer
    	this->addChild(pLabel, 1);
    
    	// add "HelloWorld" splash screen"
    	CCSprite* pSprite = CCSprite::create("HelloWorld.png");
    
    	// position the sprite on the center of the screen
    	pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    
    	// add the sprite as a child to this layer
    	this->addChild(pSprite, 0);
    }
    
    void MyHelloWorld::onEnter()
    {
    	CCLayer::onEnter();
    	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);
    }
    
    bool MyHelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
    {
    	CCPoint pointtemp= pTouch->getLocation();  //返回的是相当屏的本地坐标
    	CCPoint touchPoint= this->convertTouchToNodeSpace(pTouch); //返回的是相对layer
    	CCLOG("pointtemp:%f,%f",pointtemp.x,pointtemp.y);
    	CCLOG("touchPoint:%f,%f",touchPoint.x,touchPoint.y);  
    
    	//
    	////图块的惟一标识
    	//
    	//CCPoint mapTieldPoint=getTileCoordinate(point);
    	//CCLOG("mapTieldPoint:%f,%f",mapTieldPoint.x,mapTieldPoint.y);
    	//CCSize contentSize=map->getContentSize();
    	//CCLOG("contentSize:%f,%f",contentSize.width,contentSize.height);
    	//unsigned int tieldGid=floor->tileGIDAt(mapTieldPoint);
    	//if(tieldGid!=0){
    	//	CCDictionary* dict=wall->propertiesForGID(tieldGid);
    	//	if(dict!=NULL){
    	//		/*int keyvalue=dict->valueForKey("key")->intValue();
    	//		CCLOG("keyvalue%d",keyvalue);
    	//		if(keyvalue==100){*/
    	//			return true;
    	//		//}
    	//	}
    	//}
    	CCPoint playerPoint = sprite->getPosition();
    	CCLOG("playerPoint:%f,%f",playerPoint.x,playerPoint.y);  
    	CCPoint diff = ccpSub(touchPoint, playerPoint);
    	if (abs(diff.x) > abs(diff.y))
    	{
    		if (diff.x > 0)
    		{
    			playerPoint.x += map->getTileSize().width;
    		}
    		else
    		{
    			playerPoint.x -= map->getTileSize().width;
    		}
    	}
    	else
    	{
    		if (diff.y > 0 )
    		{
    			playerPoint.y += map->getTileSize().height;
    		}
    		else
    		{
    			playerPoint.y -= map->getTileSize().height;
    		}
    	}
    	setPlayerPosition(playerPoint);
    	setViewpointCenter(playerPoint);
    
    	return true;
    }
    
    MyHelloWorld::~MyHelloWorld()
    {
    	sprite->release();
    }
    
    void MyHelloWorld::update(float)
    {
    	/*CCLOG("update");
    	float x,y;
    	sprite->getPosition(&x,&y);
    	CCLOG("%f,%f",x,y);*/
    }
    
    /************************************************************************/
    /* 參数是精灵的位置                                                                     */
    /************************************************************************/
    void MyHelloWorld::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, map->getMapSize().width * map->getTileSize().width	- winSize.width / 2);
    	y = MIN(y, map->getMapSize().height *map->getTileSize().height- winSize.height/2);
    	CCPoint actualPosition = ccp(x, y);
    
    
    	CCPoint centerOfView = ccp(winSize.width/2, winSize.height/2);
    	CCPoint viewPoint = ccpSub(centerOfView, actualPosition);
    	CCLOG("viewPoint:%f,%f",viewPoint.x,viewPoint.y);  
    	this->setPosition(viewPoint);
    
    	/*CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    	int x = MAX(position.x, winSize.width / 2);
    	int y = MAX(position.y, winSize.height / 2);
    
    	x = MIN(x, map->getTileSize().width * map->getMapSize().height - winSize.width / 2);
    	y = MIN(y, map->getTileSize().height * map->getMapSize().height - winSize.height / 2);
    	CCPoint acutalPoint = ccp(x, y);
    	CCPoint centerOfView = ccp(winSize.width / 2, winSize.height / 2);
    	CCPoint ViewOfPoint = ccpSub(centerOfView, acutalPoint);
    	this->setPosition(ViewOfPoint);*/
    
    }
    
    CCPoint MyHelloWorld::getTileCoordinate(CCPoint& point){
    	float width=map->getTileSize().width;
    	float height=map->getTileSize().height;
    	CCLOG("getContentSize:%f",map->getContentSize().height);
    	CCPoint re=ccp((int)(point.x/width),(int)((map->getContentSize().height-point.y)/height));
    	return re;
    }
    
    
    /************************************************************************/
    /* position 目标点 相对于layer的                                                                     */
    /************************************************************************/
    void MyHelloWorld::setPlayerPosition(cocos2d::CCPoint position)
    {
    
    	CCPoint tileCoord2 = this->tileCoordForGid(position);
    	CCPoint tileCoord = this->getTileCoordinate(position);
    	CCLOG("tileCoord:%f,%f",tileCoord.x,tileCoord.y);
    	CCLOG("tileCoord2:%f,%f",tileCoord2.x,tileCoord2.y);
    	int theGid = meta->tileGIDAt(tileCoord);
    
    	if (theGid)
    	{
    		CCLOG("gid:%d",theGid);
    		CCDictionary* properties = map->propertiesForGID(theGid);
    
    		if (properties)
    		{
    			CCSprite* tempSprite=meta->tileAt(tileCoord);
    			CCLOG("%d,",tempSprite->getZOrder());
    				CCLOG("%d,",sprite->getZOrder());
    				//sprite->setZOrder(0);
    				//const CCString* str = properties->valueForKey("key");
    				//CCLOG("STR:%d",str->intValue());
    				//if (str && str->compare("200") == 0)
    				////if (str !=NULL)
    				//{
    				//	return;
    				//}
    
    
    				/*const CCString* tempstr = properties->valueForKey("Eat");
    				if (tempstr && tempstr->compare("true") == 0)
    				{
    				_numCollected++;
    				_hud->numCollectedChanged(_numCollected);
    				_meta ->removeTileAt(tileCoord);
    				_foodLayer->removeTileAt(tileCoord);
    
    				}*/
    
    		}
    
    
    
    	}
    	//else{sprite->setZOrder(11);}
    	sprite->setPosition(position);
    }
    
    /************************************************************************/
    /返回的要转成int                                                                 */
    /************************************************************************/
    CCPoint MyHelloWorld::tileCoordForGid(CCPoint position)
    {
    	int x = position.x / map->getTileSize().width;
    	CCLOG("tiled:%f",map->getMapSize().height * map->getTileSize().height);
    	int y = ((map->getMapSize().height * map->getTileSize().height) - position.y) / map->getTileSize().height ;
    	return ccp(x, y);
    
    }
    








  • 相关阅读:
    Linux内核TSS的使用
    DPL, CPL及RPL之间的关系
    Linux内存管理(深入理解Linux内核)
    Windows下安装PIL进行图像处理
    内存Zone中的pageset成员分析
    导出符号的意义
    GDI及Windows的消息机制
    kmalloc vs vmalloc
    Linux Kernel Development有关内存管理
    STL sort
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6770571.html
Copyright © 2011-2022 走看看