看了很多教程和文檔,無論2d還是2d-x都推薦使用開源的SneakInput作為其觸屏的手柄組件。
因此我也下載了它的源碼並將其融合到自己的游戲裡,整個演示的源碼下載地址為:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2012年資料/8月/11日/SneakInput在cocos2d-x下的示例/
我的環境為vs2010 + cocos2d-1.0.1-x-0.12.0
另外SneakInput c++的源碼下載地址為:https://github.com/Ntran013/SneakyInput
經過自己的試驗,發現在我的環境下並不需要修改SneakInput的源碼,將源碼解壓後,放在自己的項目裡就可以正常使用。
SneakInput主要由2部分組成joystick和button。
使用button的代碼:
- float buttonRadius=50;
-
- buttonA=new SneakyButton();
- buttonA->autorelease();
- buttonA->initWithRect(CCRectZero);
- buttonA->setIsToggleable(false);
- buttonA->setIsHoldable(true);
-
- SneakyButtonSkinnedBase *buttonASkin=new SneakyButtonSkinnedBase();
- buttonASkin->autorelease();
- buttonASkin->init();
- buttonASkin->setPosition(ccp(size.width-buttonRadius,buttonRadius));
- buttonASkin->setDefaultSprite(CCSprite::spriteWithFile("button-default.png"));
- // buttonASkin->setDisabledSprite(CCSprite::spriteWithFile("button-disabled.png"));
- buttonASkin->setPressSprite(CCSprite::spriteWithFile("button-pressed.png"));
- buttonASkin->setActivatedSprite(CCSprite::spriteWithFile("button-activated.png"));
- buttonASkin->setButton(buttonA);
-
- this->addChild(buttonASkin);
使用jostick的代碼:
- float joystickRadius=50;
-
- joystick=new SneakyJoystick();
- joystick->autorelease();
- joystick->initWithRect(CCRectZero);
- joystick->setAutoCenter(true);
- joystick->setHasDeadzone(true);
- joystick->setDeadRadius(10);
-
- SneakyJoystickSkinnedBase *joystickSkin=new SneakyJoystickSkinnedBase();
- joystickSkin->autorelease();
- joystickSkin->init();
- joystickSkin->setBackgroundSprite(CCSprite::spriteWithFile("button-disabled.png"));
- joystickSkin->setThumbSprite(CCSprite::spriteWithFile("button-disabled.png"));
- joystickSkin->getThumbSprite()->setScale(0.5f);
- joystickSkin->setPosition(ccp(joystickRadius,joystickRadius));
- joystickSkin->setJoystick(joystick);
-
- this->addChild(joystickSkin);
然後在update函數中獲取按鈕狀態:
- #define FIRE_INTERVAL 0.3f
- float HelloWorld::fireTime=0;
- void HelloWorld::update(ccTime dt)
- {
- CCPoint velocity=joystick->getVelocity();
- if(velocity.x!=0||velocity.y!=0)
- {
- CCLOG("joystick:[%f,%f]",velocity.x,velocity.y);
- }
-
- fireTime+=dt;
-
- if(buttonA->getIsActive()&&fireTime>=FIRE_INTERVAL)
- {
- CCLOG("buttonA pressed.");
- fireTime=0;
- }
- }