Cocos2d-x 版本 3.17
//创建按钮:类型 - 1
{
Sprite *spr1 = Sprite::createWithSpriteFrameName(FRAME_MM_PLAY);
Sprite *spr2 = Sprite::createWithSpriteFrameName(FRAME_MM_PLAY);
spr2->setColor( Color3B(200, 200, 200) );
auto *playButton = MenuItemSprite::create(spr1, spr2, CC_CALLBACK_1(CBirdMainMenu::playBtnPress, this));
playButton->setScale(1.0f);
playButton->setEnabled(true);
auto playMenu = Menu::create(playButton, nullptr);
}
//创建按钮:类型 - 2
Button *infoButton
{
infoButton = Button::create(FRAME_MM_INFO,FRAME_MM_INFO,FRAME_MM_INFO,Widget::TextureResType::PLIST);
infoButton->setZoomScale(0.2f);
infoButton->setPressedActionEnabled(true);
infoButton->addTouchEventListener([&](Ref* sender, cocos2d::ui::Widget::TouchEventType type){
switch (type)
{
case ui::Widget::TouchEventType::BEGAN:
break;
case ui::Widget::TouchEventType::ENDED:
this->infoButtonPress();
break;
default:
break;
}
});
This->addChild(infoButton, 2);
}
在 Type-2 中如何在点击时改变按钮的颜色。我对所有状态都使用了单个图像。我不喜欢使用单独的图像。是否可以更改 Type2 中所选 Sprite 的颜色?在 Type1 中,对于 MenuItemSprite ,我们可以轻松地为所选图像设置颜色……在 Type-2 中,如果我在 Button 上调用 setColor,那么它会崩溃。
infoButton->setColor(Color3B(200, 200, 200)); //Crashed on this
不知道如何在按下时改变按钮的颜色。
最佳答案
您正在创建按钮并分配给 InfoButton 指针。
infoButton = Button::create(FRAME_MM_INFO,FRAME_MM_INFO,FRAME_MM_INFO,Widget::TextureResType::PLIST);
问题是虽然您的 infoButton 是本地指针。
Button *infoButton;
{
...
...
从您提供的屏幕截图中,我可以看到它是在 CBirdMenu::SetupMenu() 中本地创建的。
然后,您将 info 按钮 作为一个子对象添加到一个名为 toolBar 的指针所指向的对象中,但是 CBirdMenu::SetupMenu() 结束,您的 infoButton 将不再被 lambda 表达式识别。
一种可能也是最简单的解决问题的方法是对 lambda 表达式中的 lambda 参数 Ref* sender 使用动态转换。
InfoButton->addTouchEventListener([&](Ref* sender, cocos2d::ui::Widget::TouchEventType type)
{
cocos2d::ui::Button * infButton = dynamic_cast<cocos2d::ui::Button*>(sender);
if(infButton)//check if casting done properly
infButton->setColor(Color3B(0, 200, 0)); //colour set to green.
});
或者替代地,不使用本地指针infoButton,而是将其存储为CBirdMenu 的类成员。这样,当 cBirdMenu 存在时,infoButton 永远不会丢失。
这是一个快速演示。
头文件;
#include "cocos2d.h"
#include "ui\CocosGUI.h"
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
private:
cocos2d::ui::Button * InfoButton; //member of HelloWorld.
};
注意私有(private)成员 cocos2d::ui::Button * InfoButton;
最后是按钮实例化并分配给 infoButton 指针的源文件。
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
return false;
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
InfoButton = cocos2d::ui::Button::create("HelloWorld.png", "HelloWorld.png", "HelloWorld.png", ui::Widget::TextureResType::LOCAL);
InfoButton->setColor(Color3B(255, 0, 0)); //colour is set to red as suppose to.
InfoButton->setTitleFontSize(InfoButton->getTitleFontSize() * 0.7);
InfoButton->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
InfoButton->addTouchEventListener([&](Ref* sender, cocos2d::ui::Widget::TouchEventType type)
{
InfoButton->setColor(Color3B(0, 200, 0)); //colour set to green.
});
// add the button as a child to this layer
this->addChild(InfoButton, 2);
return true;
}
如果您将相同的原则应用于您的代码,这应该可以解决您当前与 lambda 相关的问题。但是,我仍然不确定您的toolBar 类是做什么的,因为它不包含在代码中。如果 toolBar 是自定义类,我建议您将 infoButton 从 CBirdMenu 移至 toolBar使用第二种方法来解决您的问题。
关于ios - Cocos2d-x 按钮 - MenuItemSprite 与按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52399960/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
基本上,我试图在用户单击链接(或按钮或某种类型的交互元素)时执行Rails方法。我试着把它放在View中:但这似乎没有用。它最终只是在用户甚至没有点击“添加”链接的情况下调用该函数。我也用link_to试过了,但也没用。我开始认为没有一种干净的方法可以做到这一点。无论如何,感谢您的帮助。附言。我在ApplicationController中定义了该方法,它是一个辅助方法。 最佳答案 View和Controller是相互独立的。为了使链接在Controller内执行函数调用,您需要对应用程序中的端点执行ajax调用。该路由应调用rub
我在ruby表单中有一个提交按钮f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id"我想在不使用任何javascript的情况下通过ruby禁用此按钮 最佳答案 添加disabled:true选项。f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id",disabled:true 关于ruby-on-rails-如何在Rails中添加禁用的提交按钮,我们在St
我在事件管理员编辑页面中有嵌套资源,但我只想允许管理员编辑现有资源的内容,而不是添加新的嵌套资源。我的代码看起来像这样:formdo|f|f.inputsdof.input:authorf.input:contentf.has_many:commentsdo|comment_form|comment_form.input:contentcomment_form.input:_destroy,as::boolean,required:false,label:'Remove'endendf.actionsend但它在输入下添加了“添加新评论”按钮。我怎样才能禁用它,并只为主窗体保留f.ac
当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#
正如标题所暗示的那样,我只是在寻找一种无需单击即可按下Shoes中的按钮的方法。我已经搜索了论坛,但不幸的是找不到任何东西。谢谢 最佳答案 这在Windows下的红色鞋子中不起作用,因为Windows控件窃取了所有事件。不过,我设法在window下穿着绿鞋工作。举个例子['green_shoes'].each(&method(:require))Shoes.app{e=edit_linebutton("Clickme!"){alert("Youclickedme.")}keypress{|k|alert("YoupressedEnt