虽然只是一个简简单单的按钮,但在阅读源码的时候,还是出了错误,而其中一个错误,真是让我莫名其妙!
代码基本上是从官方实例中拿过来的,本人是新手。这里只不过是新建了一个继承自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才响应,设置成其他的值的时候,不响应!
这是为毛啊,不懂,求解!
感兴趣的请帮忙看看,源码和资源都已准备好!