中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【cocos2d-x】橫向滾屏射擊游戲②----虛擬控制手柄

發布時間:2020-06-20 14:49:48 來源:網絡 閱讀:1968 作者:包灬子 欄目:游戲開發

  因為iOS,Android設備使用觸摸屏來輸入,沒有傳統移動游戲設備配備的按鈕,十字按鈕或者模擬手柄,我們需要一個虛擬手柄來控制游戲。你可以使用虛擬手柄對游戲物體進行操控,就像使用實際的手柄一樣。


SneakyInput控制手柄源碼: 點我下載

把×××下來,加入到你的項目中,別忘了在android.mk添加相關內容哦!

我們首要目標是添加一個可以讓玩家進行飛船射擊的按鈕,他們點擊按鈕的時候 會發射×××,

----------------------

接下來  我會在項目中添加一個新的類InputLayer ,這個類繼承自CCLayer,他會被添加到MainScene

  1. CCScene *MainScene::scene() { 
  2.     CCScene *pScene = NULL; 
  3.     do { 
  4.         pScene = CCScene::create(); 
  5.         MainScene *main = MainScene::create(); 
  6.         pScene->addChild(main, -1); 
  7.         InputLayer *input = InputLayer::create(); 
  8.         pScene->addChild(input, 0); 
  9.     } while (0); 
  10.     return pScene; 

將SneakyInput添加到InputLayer的頭文件中

  1. #include "SneakyInput/SneakyButton.h" 
  2. #include "SneakyInput/SneakyJoystick.h" 
  3. #include "SneakyInput/SneakyButtonSkinnedBase.h" 
  4. #include "SneakyInput/SneakyJoystickSkinnedBase.h" 

另外,我在頭文件中加了一個SneakyButton成員變量,因為我們馬上就會用到。

  1. class InputLayer: public CCLayer { 
  2. public
  3.     InputLayer(); 
  4.     virtual ~InputLayer(); 
  5.  
  6.     SneakyButton *snkBtn; 
  7.  
  8.     void update(ccTime time); 
  9.  
  10.     bool init();CREATE_FUNC(InputLayer) 
  11.     ; 
  12. }; 

在init方法中 我們生成了一個SneakyButton

  1. bool InputLayer::init() { 
  2.     bool bRet = false
  3.     do { 
  4.  
  5.         CCSize size = CCDirector::sharedDirector()->getWinSize(); 
  6.  
  7.         float buttonRadius = 42; 
  8.  
  9.         snkBtn = new SneakyButton(); 
  10.         snkBtn->autorelease(); 
  11.         snkBtn->initWithRect(CCRectZero); 
  12.         snkBtn->setPosition(CCPointMake(size.width-buttonRadius,buttonRadius)); 
  13.         snkBtn->setRadius(buttonRadius); 
  14.         this->addChild(snkBtn); 
  15.  
  16.         this->scheduleUpdate(); 
  17.         bRet = true
  18.     } while (0); 
  19.     return bRet; 

 

  因為SneakyButton沒有用到initWithRect方法中的CGRect參數,所以我傳了一個CGRectZero給這個方法。實際的處理觸摸事件的代碼是使用radius(半徑)這個屬性來決定按鈕是否要響應觸摸。

InputLayer類通過以下代碼預約更新

  1. this->scheduleUpdate(); 

 

更新方法是用來測試按鈕是否已被點擊

  1. void InputLayer::update(ccTime time) { 
  2.     if (snkBtn->getIsActive()) { 
  3.         CCLog("按下按鈕"); 
  4.     } 

運行程序,你會發現屏幕上沒有任何按鈕  不過你可以點擊屏幕右下角 然后可以在log日志中正在打印“按下按鈕”


接下來  我們將讓按鈕可見,也就是添加皮膚

 這里 我們使用到了SneakyButtonSkinnedBase

  1. bool InputLayer::init() { 
  2.     bool bRet = false
  3.     do { 
  4.  
  5.         CCSize size = CCDirector::sharedDirector()->getWinSize(); 
  6.  
  7.         float buttonRadius = 42; 
  8.  
  9.         snkBtn = new SneakyButton(); 
  10.         snkBtn->autorelease(); 
  11.         snkBtn->initWithRect(CCRectZero); 
  12. //      這個屬性可以讓玩家按住按鈕不放的時候,×××會持續地射擊出去 
  13.         snkBtn->setIsHoldable(true); 
  14.  
  15.         SneakyButtonSkinnedBase *sbsb = SneakyButtonSkinnedBase::create(); 
  16.         //默認狀態 
  17.         sbsb->setDefaultSprite(CCSprite::create("nor.png")); 
  18.         //點擊狀態 
  19.         sbsb->setPressSprite(CCSprite::create("tou.png")); 
  20.         //激活狀態 
  21.         sbsb->setActivatedSprite(CCSprite::create("tou.png")); 
  22.         sbsb->setPosition(CCPointMake(size.width-buttonRadius,buttonRadius)); 
  23.         sbsb->setButton(snkBtn); 
  24.         this->addChild(sbsb); 
  25.  
  26.         this->scheduleUpdate(); 
  27.         bRet = true
  28.     } while (0); 
  29.     return bRet; 
  我們不需要設置按鈕的半徑屬性了,因為SneakyButtonSkinnedBase類會使用提供的按鈕圖片來確定按鈕半徑的大小

控制動作

接下來我們在游戲中添加搖桿

  1. bool InputLayer::init() { 
  2.     bool bRet = false
  3.     do { 
  4.  
  5.         CCSize size = CCDirector::sharedDirector()->getWinSize(); 
  6.  
  7.         float buttonRiadus = 75; 
  8.  
  9.         snkJs = new SneakyJoystick(); 
  10.         snkJs->autorelease(); 
  11. //      決定虛擬手柄的半徑大小 
  12.         snkJs->initWithRect(CCRectMake(0,0,buttonRiadus,buttonRiadus)); 
  13.         //自動回到中心 
  14.         snkJs->setAutoCenter(true); 
  15.  
  16.         //是否支持死亡區域,該區域不會觸發 
  17.         snkJs->setHasDeadzone(true); 
  18.         //死亡區域的半徑 
  19.         snkJs->setDeadRadius(15); 
  20.  
  21.         SneakyJoystickSkinnedBase *sjssb =SneakyJoystickSkinnedBase::create(); 
  22.         sjssb->setPosition(CCPointMake(buttonRiadus*1.5,1.5*buttonRiadus)); 
  23.         //搖桿的背景圖 
  24.         sjssb->setBackgroundSprite(CCSprite::create("handle1.png")); 
  25.         //搖桿的圖片 
  26.         sjssb->setThumbSprite(CCSprite::create("handle2.png")); 
  27.         sjssb->setJoystick(snkJs); 
  28.         this->addChild(sjssb); 
  29.         this->scheduleUpdate(); 
  30.         bRet = true
  31.     } while (0); 
  32.     return bRet; 

 完成搖桿的添加  接下來要實現搖桿事件的監聽 

  1. void InputLayer::update(ccTime time) { 
  2.  
  3. //  getVelocity()到的數值很小 需要放大  800是估算的 
  4.     CCPoint velocity = ccpMult(snkJs->getVelocity(), 800); 
  5.     if (velocity.x != 0 && velocity.y != 0) { 
  6.         CCLog("x=%f,y=%f", velocity.x, velocity.y); 
  7.     } 


 

接下來一章將開發一個小游戲,如有問題,請提出

本教程根據Cocos2d教程翻譯過來

使用的cocos2d-x版本為2.02

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

托里县| 岳普湖县| 平塘县| 敦化市| 靖远县| 宾阳县| 炎陵县| 淳安县| 怀柔区| 雅安市| 米易县| 巨鹿县| 渝中区| 和静县| 安阳市| 尖扎县| 拜泉县| 宿迁市| 柳江县| 革吉县| 延长县| 军事| 肥乡县| 正蓝旗| 昭平县| 岑巩县| 和硕县| 繁峙县| 丰宁| 海原县| 丰台区| 昌吉市| 新竹市| 内乡县| 靖宇县| 高碑店市| 西乡县| 铅山县| 贡觉县| 东山县| 阳曲县|