cocos2dx 3.6 UI 之 Button

本文介绍了一个Cocos2d-x项目中ButtonTest类的实现细节,并记录了一个奇怪的问题:只有当GLView尺寸设置为960x640时,按钮才能正常响应触摸事件。文章提供了完整的代码示例并寻求解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然只是一个简简单单的按钮,但在阅读源码的时候,还是出了错误,而其中一个错误,真是让我莫名其妙!

代码基本上是从官方实例中拿过来的,本人是新手。这里只不过是新建了一个继承自Layer的ButtonTest类而已……

首先不能忘了包含头文件“ui/CocosGUI.h”……,还是直接贴上代码吧!

// ButtonTest.h
#ifndef __ButtonTest_H__
#define __ButtonTest_H__

#include "cocos2d.h"
#include "ui/CocosGUI.h"

USING_NS_CC;
using namespace ui;

class ButtonTest : public Layer
{
public:
    ButtonTest();
    ~ButtonTest();

    static Scene* createScene();
    CREATE_FUNC(ButtonTest);
    virtual bool init();
    // Button事件回调函数
    void touchEvent(Ref* sender, Widget::TouchEventType type);

protected:
    Text* _displayValueLabel;
};

#endif
#include "ButtonTest.h"

ButtonTest::ButtonTest():_displayValueLabel(nullptr)
{
}

ButtonTest::~ButtonTest()
{

}

Scene* ButtonTest::createScene()
{
    auto scene = Scene::create();
    auto layer = ButtonTest::create();
    scene->addChild(layer);
    return scene;
}

bool ButtonTest::init()
{
    if (!Layer::init())
    {
        return false;
    }

    auto Size = Director::getInstance()->getVisibleSize();

    // 创建Text文本,用于按钮事件的提示
    _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32);
    _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f));
    _displayValueLabel->setPosition(Vec2(Size.width / 2.0f, Size.height / 2.0f));
    addChild(_displayValueLabel);

    // 标记……
    auto alert = Text::create("Button", "fonts/Marker Felt.ttf", 30);
    alert->setColor(Color3B(159, 168, 176));
    alert->setPosition(Vec2(Size.width / 2.0f, Size.height / 2.0f - alert->getContentSize().height*1.75));
    addChild(alert);

    // 主角在这儿
    Button* button = Button::create("buttonnormal.png",
                                  "buttonpressed.png");
    button->setPosition(Vec2(Size.width / 2.0f, Size.height / 2.0f));
    button->addTouchEventListener(CC_CALLBACK_2(ButtonTest::touchEvent, this));
    button->setZoomScale(0.4f);
    button->setPressedActionEnabled(true);
    addChild(button);
    button->setOpacity(100);

    // 一个ImageView控件,但这里并不加载图片,当你点击Button之后会有一个淡入淡出的动画出现
    auto imageView = ImageView::create();
    imageView->setPosition(Vec2(Size.width / 2.0f + 50 + button->getContentSize().width / 2.0f, Size.height / 2.0f));
    imageView->setTag(12);
    addChild(imageView);

    return true;
}

void ButtonTest::touchEvent(Ref* sender, Widget::TouchEventType type)
{
    switch (type)
    {
    case Widget::TouchEventType::BEGAN:
        _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString());
        break;

    case Widget::TouchEventType::MOVED:
        _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString());
        break;

    case Widget::TouchEventType::ENDED:
    {
        // 先设置不可见,加载图片,再设置可见,执行动作,结束点击后恢复按钮的正常贴图
        _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString());
        auto imageView = (ImageView*)this->getChildByTag(12);
        imageView->setVisible(false);
        imageView->loadTexture("ccicon.png");
        imageView->setOpacity(0);
        imageView->setVisible(true);
        imageView->runAction(Sequence::create(FadeIn::create(0.5), DelayTime::create(1.0f), FadeOut::create(0.5), nullptr));
        auto btn = (Button*)sender;
        btn->loadTextureNormal("buttonnormal.png");
    }

    case Widget::TouchEventType::CANCELED:
        _displayValueLabel->setString(String::createWithFormat("Touch Canceled")->getCString());
        break;

    default:
        break;
    }
}

最后呢,在AppDelegate.cpp中修改一下,就运行了:

#include "ButtonTest.h"
// ……
auto scene = ButtonTest::createScene();
// ……

现在的问题是:
当 且仅有glview->setFrameSize(960, 640);时,button才响应,设置成其他的值的时候,不响应!

这是为毛啊,不懂,求解!

感兴趣的请帮忙看看,源码和资源都已准备好!

https://github.com/xianglin-love/UI-Cocos2dx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值