交互

玩游戏的时候,我们需要用输入设备和游戏进行交互,那么游戏需要对玩家做出相应,比如说按下键盘的上下左右,角色就朝着对应的方向移动,按下技能键,角色就释放技能

键盘监听

响应

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);

运行程序,点击鼠标测试功能

点击了接近右上角和左下角的两个位置,可以发现鼠标事件中存的坐标是游戏世界中的坐标,范围也是和游戏分辨率有关的。

版权声明:本文为NightFrost原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/NightFrost/p/11704179.html