cocos2d-x 旅程開始--(实现单击与长按)
??? 小菜鳥一枚,學習cocos2d-x已經有一段時間了,感覺進度非常慢那,CSDN也再次拾了起來。近期自己還在學習做小游戲,跟著前輩做了《忍者打怪物》的小游戲,又學習了瓦片游戲《吃西瓜》,打算自個做個坦克大戰,剛剛起步,希望自己盡力的完畢那。開個帖子記錄一下。
??? 前段時間的進度:
??? 下載了各種素材文件,用TileMap制作地圖,這里出現了錯誤,眼下發現“磚塊”和“鐵塊”必須放在不同的圖層以下才干執行
否則就會出錯,tmx格式的地圖不能全然顯示出來,要么僅僅顯示磚頭要么僅僅顯示鐵塊。
??? 然后寫代碼:去掉HelloWord其中init()函數中不必要的部分,自己開始寫。
??? 先導入地圖
??? tank_war = CCTMXTiledMap::create("tank_war.tmx");???????????? //增加地圖
?? ?this->addChild(tank_war);
??? 創建主角而且放到合適的位置
??? playerBornGroup = tank_war->objectGroupNamed("born");??? //在地圖中找到主角的圖層
?? ?CCDictionary* playerPosition = playerBornGroup->objectNamed("player_1");?? //依據名稱找到本圖層的player_1位置
?? ?int x = playerPosition->valueForKey("x")->intValue();
?? ?int y = playerPosition->valueForKey("y")->intValue();????????????????????? //得到object的坐標
?? ?
?? ?player_1 = CCSprite::create("p1tank1.png");????????????????????? //創建player精靈
?? ?player_1->setPosition(ccp(x, y));???????????????????????????????????????? ?
?? ?this->addChild(player_1);
??? 然后實現player_1的移動,本來使用的是CCMenuItemImage,發現僅僅能實現點擊一次才干移動一次,不點擊就不動了,不能實現按住button不停移動的狀態,折騰了兩天也搞不定,放棄之。
??? 舍棄代碼:
??? // ?? ?CCMenuItemImage* moveLeft = CCMenuItemImage::create("arrow-leftx.png", "arrow-left.png", this,??? menu_selector(HelloWorld::howToMoveL)); ????????????????????????????
??? // ?? ?moveLeft->setPosition(ccp(30,80));
??? // ?? ?moveLeft->boundingBox();
??? //
??? // ?? ?CCMenuItemImage* moveRight = CCMenuItemImage::create("arrow-rightx.png", "arrow-right.png", this, menu_selector(HelloWorld::howToMoveR));
??? // ?? ?moveRight->setPosition(ccp(120, 80));
??? //
??? // ?? ?CCMenu* menu = CCMenu::create();
? ? // ?? ?menu->setPosition(origin);
??? // ?? ?menu->addChild(moveLeft);menu->addChild(moveRight);
? ? // ?? ?this->addChild(menu);
??? // void HelloWorld::howToMoveR(CCObject* pMove)
??? // {
??? // ?? ?player_1->setRotation(90);??????????????????????????????????? //cocos2d-x直接給了一個旋轉精靈的函數,都用不到其它的圖片了
??? // ?? ?CCPoint origPo = player_1->getPosition();
??? // ?? ?CCPoint newPo = origPo + ccp(10, 0);
??? // ?? ?newPo.x = newPo.x < WIN_WIDTH - 30 ? newPo.x : WIN_WIDTH - 30;
??? // ?? ?player_1->setPosition(newPo);
??? // ?? ?return;
??? // }
今天的進度:
???于是使用新的方法,不再用menu,將button中的normalImage與selectImage拿出來用Sprite實現,在CCTouchBegan、CCTouchMoved、CCTouchEnded中實現單擊與長按,用schedule和update()函數實現player_1不停運動:
init()函數:
??? turnLeftx = CCSprite::create("arrow-leftx.png");
?? ?turnLeftx->setPosition(ccp(30, 80));
?? ?this->addChild(turnLeftx);
??? boolleft = false; reallyMoved = false;
CCTouchBegan()函數:
??? bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
??? if (turnLeftx->boundingBox().containsPoint(pTouch->getLocation()))?? //點擊處坐標在左轉button區域中(這里末尾加分號的話,會導致點哪里都左移的情況)
?? ?{
?? ??? ?turnLeft->setVisible(true);?????????????????????????????????????? //背景button顯現
?? ??? ?turnLeftx->setVisible(false);???????????????????????????????????? //上層左轉button消失
?? ??? ?boolleft = true;????????????????????????????????????????????????? //在update中推斷運動方向
?? ??? ?this->schedule(schedule_selector(HelloWorld::update),0.1f);?????? //使用schedule每隔0.1秒運行一次update
?? ?}
?? ?if (reallyMoved == false)???????????????????????????????????????????? //假設運行了update,reallyMoved會設為true
?? ?{???????????????????????????????????????????????????????????????????? //假設沒運行,就實現點擊一下就移動一次
?? ??? ?player_1->setRotation(-90);?????????????????????????????????????? //player_1圖片左轉90度
?? ??? ?CCPoint origPo = player_1->getPosition();???????????????????????? //獲得player_1原始的坐標?
?? ??? ?CCPoint newPo = origPo - ccp(10, 0);????????????????????????????? //設定新的坐標,左移10個像素
?? ??? ?newPo.x = newPo.x > 30 ? newPo.x : 30;??????????????????????????? //假設跑到屏幕邊緣就動了,player_1為30*30
?? ??? ?player_1->setPosition(newPo);
?? ?}
? ? return true;
}
CCTouchEnded()函數:
??? void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) //點擊結束時還原一些參數
{
?? ?this->unschedule(schedule_selector(HelloWorld::update));????????????? //結束update
?? ?turnLeft->setVisible(false);??????????????????????????
?? ?turnLeftx->setVisible(true);
?? ?boolleft = false;
?? ?return;
}
update()函數:
??? void HelloWorld::update(float alpha)
{
?? ?reallyMoved = true;??????????????????????????????????????????????? //推斷是否是長時間按住button(0.1秒)
?? ?if (boolleft==true)
?? ?{
?? ??? ?player_1->setRotation(-90);?
?? ??? ?CCPoint origPo = player_1->getPosition();
?? ??? ?CCPoint newPo = origPo - ccp(10, 0);
?? ??? ?newPo.x = newPo.x > 30 ? newPo.x : 30;
?? ??? ?player_1->setPosition(newPo);
?? ?}
}
OK!最后要加上(用來實現點擊):
??? void HelloWorld::onEnter()
{
?? ?CCLayer::onEnter();
?? ?CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}
??? void HelloWorld::onExit()
{
?? ?CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
?? ?CCLayer::onExit();
}
實現單擊,長按的方法有非常多,好像還能夠用button,可惜捯飭了一下午也沒實現。
轉載于:https://www.cnblogs.com/gcczhongduan/p/3984287.html
總結
以上是生活随笔為你收集整理的cocos2d-x 旅程開始--(实现单击与长按)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 完整国内城市js级联选择
- 下一篇: Akka2使用探索2(Con?gurat