您好,登錄后才能下訂單哦!
因為iOS,Android設備使用觸摸屏來輸入,沒有傳統移動游戲設備配備的按鈕,十字按鈕或者模擬手柄,我們需要一個虛擬手柄來控制游戲。你可以使用虛擬手柄對游戲物體進行操控,就像使用實際的手柄一樣。
SneakyInput控制手柄源碼: 點我下載
把×××下來,加入到你的項目中,別忘了在android.mk添加相關內容哦!
我們首要目標是添加一個可以讓玩家進行飛船射擊的按鈕,他們點擊按鈕的時候 會發射×××,
----------------------
接下來 我會在項目中添加一個新的類InputLayer ,這個類繼承自CCLayer,他會被添加到MainScene
- CCScene *MainScene::scene() {
- CCScene *pScene = NULL;
- do {
- pScene = CCScene::create();
- MainScene *main = MainScene::create();
- pScene->addChild(main, -1);
- InputLayer *input = InputLayer::create();
- pScene->addChild(input, 0);
- } while (0);
- return pScene;
- }
將SneakyInput添加到InputLayer的頭文件中
- #include "SneakyInput/SneakyButton.h"
- #include "SneakyInput/SneakyJoystick.h"
- #include "SneakyInput/SneakyButtonSkinnedBase.h"
- #include "SneakyInput/SneakyJoystickSkinnedBase.h"
另外,我在頭文件中加了一個SneakyButton成員變量,因為我們馬上就會用到。
- class InputLayer: public CCLayer {
- public:
- InputLayer();
- virtual ~InputLayer();
- SneakyButton *snkBtn;
- void update(ccTime time);
- bool init();CREATE_FUNC(InputLayer)
- ;
- };
在init方法中 我們生成了一個SneakyButton
- bool InputLayer::init() {
- bool bRet = false;
- do {
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- float buttonRadius = 42;
- snkBtn = new SneakyButton();
- snkBtn->autorelease();
- snkBtn->initWithRect(CCRectZero);
- snkBtn->setPosition(CCPointMake(size.width-buttonRadius,buttonRadius));
- snkBtn->setRadius(buttonRadius);
- this->addChild(snkBtn);
- this->scheduleUpdate();
- bRet = true;
- } while (0);
- return bRet;
- }
因為SneakyButton沒有用到initWithRect方法中的CGRect參數,所以我傳了一個CGRectZero給這個方法。實際的處理觸摸事件的代碼是使用radius(半徑)這個屬性來決定按鈕是否要響應觸摸。 |
InputLayer類通過以下代碼預約更新
- this->scheduleUpdate();
更新方法是用來測試按鈕是否已被點擊
- void InputLayer::update(ccTime time) {
- if (snkBtn->getIsActive()) {
- CCLog("按下按鈕");
- }
- }
運行程序,你會發現屏幕上沒有任何按鈕 不過你可以點擊屏幕右下角 然后可以在log日志中正在打印“按下按鈕”
接下來 我們將讓按鈕可見,也就是添加皮膚
這里 我們使用到了SneakyButtonSkinnedBase
- bool InputLayer::init() {
- bool bRet = false;
- do {
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- float buttonRadius = 42;
- snkBtn = new SneakyButton();
- snkBtn->autorelease();
- snkBtn->initWithRect(CCRectZero);
- // 這個屬性可以讓玩家按住按鈕不放的時候,×××會持續地射擊出去
- snkBtn->setIsHoldable(true);
- SneakyButtonSkinnedBase *sbsb = SneakyButtonSkinnedBase::create();
- //默認狀態
- sbsb->setDefaultSprite(CCSprite::create("nor.png"));
- //點擊狀態
- sbsb->setPressSprite(CCSprite::create("tou.png"));
- //激活狀態
- sbsb->setActivatedSprite(CCSprite::create("tou.png"));
- sbsb->setPosition(CCPointMake(size.width-buttonRadius,buttonRadius));
- sbsb->setButton(snkBtn);
- this->addChild(sbsb);
- this->scheduleUpdate();
- bRet = true;
- } while (0);
- return bRet;
- }
我們不需要設置按鈕的半徑屬性了,因為SneakyButtonSkinnedBase類會使用提供的按鈕圖片來確定按鈕半徑的大小 |
控制動作
接下來我們在游戲中添加搖桿
- bool InputLayer::init() {
- bool bRet = false;
- do {
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- float buttonRiadus = 75;
- snkJs = new SneakyJoystick();
- snkJs->autorelease();
- // 決定虛擬手柄的半徑大小
- snkJs->initWithRect(CCRectMake(0,0,buttonRiadus,buttonRiadus));
- //自動回到中心
- snkJs->setAutoCenter(true);
- //是否支持死亡區域,該區域不會觸發
- snkJs->setHasDeadzone(true);
- //死亡區域的半徑
- snkJs->setDeadRadius(15);
- SneakyJoystickSkinnedBase *sjssb =SneakyJoystickSkinnedBase::create();
- sjssb->setPosition(CCPointMake(buttonRiadus*1.5,1.5*buttonRiadus));
- //搖桿的背景圖
- sjssb->setBackgroundSprite(CCSprite::create("handle1.png"));
- //搖桿的圖片
- sjssb->setThumbSprite(CCSprite::create("handle2.png"));
- sjssb->setJoystick(snkJs);
- this->addChild(sjssb);
- this->scheduleUpdate();
- bRet = true;
- } while (0);
- return bRet;
- }
完成搖桿的添加 接下來要實現搖桿事件的監聽
- void InputLayer::update(ccTime time) {
- // getVelocity()到的數值很小 需要放大 800是估算的
- CCPoint velocity = ccpMult(snkJs->getVelocity(), 800);
- if (velocity.x != 0 && velocity.y != 0) {
- CCLog("x=%f,y=%f", velocity.x, velocity.y);
- }
- }
接下來一章將開發一個小游戲,如有問題,請提出
本教程根據Cocos2d教程翻譯過來
使用的cocos2d-x版本為2.02
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。