coco2d-x添加手柄


auto joystick = Joystick::create();
//设置透明度
joystick->setOpacity(150);
// 将node变成需要接收通知的
Director::getInstance()->setNotificationNode(joystick);
#pragma once

#include "cocos2d.h"

USING_NS_CC;

/* 虚拟手柄(包含键盘)类 */
class Joystick : public Layer {
 public:
  Joystick();
  ~Joystick();
  CREATE_FUNC(Joystick);
  virtual bool init();

 private:
  /* 设置触摸(虚拟手柄) */
  void setTouch(Sprite* target, Vec2 location, bool state);
  /* 设置按键状态(键盘) */
  void setKeyState(EventKeyboard::KeyCode keyCode, bool state);
};
#include "Joystick.h"
#include "global.h"

enum KeyTag  // 虚拟手柄每个按钮精灵的tag
{ kKeyUpTag,
  kKeyRightTag,
  kKeyDownTag,
  kKeyLeftTag,
  kKeySelectTag,
  kKeyStartTag,
  kKeyBTag,
  kKeyATag };

Joystick::Joystick() { Layer::onEnter(); }

Joystick::~Joystick() { Layer::onExit(); }

bool Joystick::init() {
  bool bRet = false;
  do {
    Layer::init();

    auto up = Sprite::create("key1.png");
    up->setOpacity(100);
    up->setPosition(90, 150);
    this->addChild(up, 0, kKeyUpTag);

    auto right = Sprite::create("key1.png");
    right->setOpacity(100);
    right->setRotation(90);
    right->setPosition(150, 90);
    this->addChild(right, 0, kKeyRightTag);

    auto down = Sprite::create("key1.png");
    down->setOpacity(100);
    down->setRotation(180);
    down->setPosition(90, 30);
    this->addChild(down, 0, kKeyDownTag);

    auto left = Sprite::create("key1.png");
    left->setOpacity(100);
    left->setRotation(270);
    left->setPosition(30, 90);
    this->addChild(left, 0, kKeyLeftTag);

    auto select = Sprite::create("key2.png");
    select->setOpacity(100);
    select->setPosition(SCREEN_CX - 35, 23);
    this->addChild(select, 0, kKeySelectTag);

    auto start = Sprite::create("key2.png");
    start->setOpacity(100);
    start->setPosition(SCREEN_CX + 35, 23);
    this->addChild(start, 0, kKeyStartTag);

    auto b = Sprite::create("key3.png");
    b->setOpacity(100);
    b->setPosition(SCREEN_WIDTH - 135, 40);
    this->addChild(b, 0, kKeyBTag);

    auto a = Sprite::create("key4.png");
    a->setOpacity(100);
    a->setPosition(SCREEN_WIDTH - 45, 40);
    this->addChild(a, 0, kKeyATag);

    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = [=](Touch* touch, Event* event) {
      auto target = static_cast<Sprite*>(event->getCurrentTarget());
      this->setTouch(target, touch->getLocation(), true);
      return true;
    };
    listener->onTouchEnded = [=](Touch* touch, Event* event) {
      auto target = static_cast<Sprite*>(event->getCurrentTarget());
      this->setTouch(target, touch->getStartLocation(), false);
    };
    listener->onTouchCancelled = listener->onTouchEnded;

    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

    auto keyboardEventListener = EventListenerKeyboard::create();
    keyboardEventListener->onKeyPressed = [=](EventKeyboard::KeyCode keyCode, Event* event) {
      this->setKeyState(keyCode, true);
    };
    keyboardEventListener->onKeyReleased = [=](EventKeyboard::KeyCode keyCode, Event* event) {
      this->setKeyState(keyCode, false);
    };
    _eventDispatcher->addEventListenerWithSceneGraphPriority(keyboardEventListener, this);

    bRet = true;
  } while (false);
  return bRet;
}

void Joystick::setTouch(Sprite* target, Vec2 location, bool state) {
  // 触摸的位置的坐标系与节点的坐标系不同需要转换
  auto locationInNode = target->convertToNodeSpace(location);
  for (auto child : this->getChildren()) {
    // 遍历所有的按键的boundingBox 看是否包含了这个点位置
    if (child->getBoundingBox().containsPoint(locationInNode)) {
      auto tag = child->getTag();
      switch (tag) {
        case kKeyUpTag:
          g_keyUp = state;
          break;
        case kKeyRightTag:
          g_keyRight = state;
          break;
        case kKeyDownTag:
          g_keyDown = state;
          break;
        case kKeyLeftTag:
          g_keyLeft = state;
          break;
        case kKeySelectTag:
          g_keySelect = state;
          break;
        case kKeyStartTag:
          g_keyStart = state;
          break;
        case kKeyBTag:
          g_keyB = state;
          break;
        case kKeyATag:
          g_keyA = state;
          break;
      }
    }
  }
}

void Joystick::setKeyState(EventKeyboard::KeyCode keyCode, bool state) {
  switch (keyCode) {
      // 如果是kyhit这个就很容易解决
    case EventKeyboard::KeyCode::KEY_W:
      g_keyUp = state;
      break;
    case EventKeyboard::KeyCode::KEY_S:
      g_keyDown = state;
      break;
    case EventKeyboard::KeyCode::KEY_A:
      g_keyLeft = state;
      break;
    case EventKeyboard::KeyCode::KEY_D:
      g_keyRight = state;
      break;
    case EventKeyboard::KeyCode::KEY_V:
      g_keySelect = state;
      break;
    case EventKeyboard::KeyCode::KEY_B:
      g_keyStart = state;
      break;
    case EventKeyboard::KeyCode::KEY_J:
      g_keyB = state;
      break;
    case EventKeyboard::KeyCode::KEY_K:
      g_keyA = state;
      break;
    default:
      break;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值