互動
玩游戲的時候,我們需要用輸入設備和游戲進行互動,那么游戲需要對玩家做出相應,比如說按下鍵盤的上下左右,角色就朝著對應的方向移動,按下技能鍵,角色就釋放技能
鍵盤監聽
回應
cocos2d-x中要實作鍵盤監聽,首先先撰寫游戲對鍵盤做成回應的函式
"HelloWorldScene.h"
void Press(EventKeyboard::KeyCode keycode, Event *event);//按下
void Release(EventKeyboard::KeyCode keycode, Event *event);//釋放
將這兩個函式宣告在HelloWorldScene.h
接下來是兩個函式的定義
"HelloWorldScene.cpp"
void HelloWorld::Press(EventKeyboard::KeyCode keycode, Event* event)
{
using KC = EventKeyboard::KeyCode;
switch (keycode)
{
case KC::KEY_UP_ARROW:
log("up press");
break;
case KC::KEY_DOWN_ARROW:
log("down press");
break;
case KC::KEY_RIGHT_ARROW:
log("right press");
break;
case KC::KEY_LEFT_ARROW:
log("left press");
break;
case KC::KEY_Z:
log("Explosion!");
break;
default:
break;
}
}
void HelloWorld::Release(EventKeyboard::KeyCode keycode, Event* event)
{
using KC = EventKeyboard::KeyCode;
switch (keycode)
{
case KC::KEY_UP_ARROW:
log("up release");
break;
case KC::KEY_DOWN_ARROW:
log("down release");
break;
case KC::KEY_RIGHT_ARROW:
log("right release");
break;
case KC::KEY_LEFT_ARROW:
log("left release");
break;
case KC::KEY_Z:
log("Boom!");
break;
default:
break;
}
}
這兩個函式對鍵盤的上下左右和z鍵做出相應
注冊監聽
在HelloWorld::init()函式中加入這段代碼
"HelloWorldScene.cpp"
auto *dispatcher = Director::getInstance()->getEventDispatcher();
auto* keyListener = EventListenerKeyboard::create();//創建鍵盤按鍵監聽器
keyListener->onKeyPressed = CC_CALLBACK_2(HelloWorld::Press, this);//設定按鍵按下的回應
keyListener->onKeyReleased = CC_CALLBACK_2(HelloWorld::Release, this);//設定按鍵釋放的回應
//鍵盤按鍵被彈回時回應
dispatcher->addEventListenerWithSceneGraphPriority(keyListener,this);
編譯,如果出現這樣的錯誤的話

不要慌,是HelloWorldScene.h中沒有使用cocos2d命名空間,在#include "cocos2d.h"這行代碼下面加上USING_NS_CC;就好了,USING_NS_CC;是一個宏,相當于using namespace cocos2d
"HelloWorldScene.h"
#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Scene
{
...
}
改成這樣,或者直接用作用域決議符來宣告形參
"HelloWorldScene.h"
#include "cocos2d.h"
//USING_NS_CC;
class HelloWorld : public cocos2d::Scene
{
public:
...
void Press(cocos2d::EventKeyboard::KeyCode keycode, cocos2d::Event* event);//按下
void Release(cocos2d::EventKeyboard::KeyCode keycode, cocos2d::Event* event);//釋放
...
};
程式成功運行起來了,按下按鍵查看視窗輸出

成功實作了互動
滑鼠監聽
回應
和鍵盤監聽一樣的步驟,我們首先在HelloWorldScene.h宣告兩個滑鼠回應的函式,當然,如果我們只需要一個按下的功能,那么釋放的功能不需要寫也可以的,這兩個函式不存在捆綁關系
"HelloWorldScene.h"
void MouseDown(cocos2d::Event* event);
void MouseUp(cocos2d::Event* event);
在HelloWorldScene.cpp中定義這兩個函式
"HelloWorldScene.cpp"
void HelloWorld::MouseDown(cocos2d::Event* event)
{
EventMouse* e = static_cast<EventMouse*>(event);
log("press (%f, %f)", e->getCursorX(), e->getCursorY());
}
void HelloWorld::MouseUp(cocos2d::Event* event)
{
EventMouse* e = static_cast<EventMouse*>(event);
log("release (%f, %f)", e->getCursorX(), e->getCursorY());
}
這兩個函式的功能是輸出按下或者釋放滑鼠的位置
注冊監聽
在HelloWorld::init()函式中加入這段代碼注冊監聽,原理和鍵盤監聽基本一樣,只不過回呼的型別是CC_CALLBACK_1而不是鍵盤的CC_CALLBACK_2, 回呼的型別根據引數型別和數量作區別
"HelloWorldScene.cpp"
auto listener = EventListenerMouse::create();
listener->onMouseDown = CC_CALLBACK_1(HelloWorld::MouseDown,this);
listener->onMouseUp = CC_CALLBACK_1(HelloWorld::MouseUp,this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
運行程式,點擊滑鼠測驗功能

點擊了接近右上角和左下角的兩個位置,可以發現滑鼠事件中存的坐標是游戲世界中的坐標,范圍也是和游戲解析度有關的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14568.html
標籤:其他
