cocos2d-x mruby学习笔记 CCUI库的一个小BUG

今天有点时间,准备试试cocos2d-x v3开始出来的ui,结果又发现了一个小错误
在ruby-bindings/auto/ruby_cocos2dx_ui_auto.cpp中。从widght开始都定义了
mrb_define_method(mrb, rclass, "initialize", ruby_cocos2dx_ui_Widget_constructor, ARGS_NONE());
这本身没有什么,问题出现在CCUI::Widght#create方法中也有一个习惯性的调用,比如ScrollView#Create中是这样的
mrb_value ruby_cocos2dx_ui_ScrollView_create_static(mrb_state* mrb, mrb_value self)
{
    mrb_value* argv;
    int argc;
    mrb_get_args(mrb, "*", &argv, &argc);

    do {
        if (argc == 0) {
            std::map<std::string, mrb_value> callbacks;
            cocos2d::ui::ScrollView* retval = cocos2d::ui::ScrollView::create();
            mrb_value ret;
            RClass* rclass = mrb_class_ptr(self);
            ret = object_to_rubyval<cocos2d::ui::ScrollView>(mrb, "CCUI::ScrollView", (cocos2d::ui::ScrollView*)retval, rclass);
            mrb_funcall(mrb, ret, "initialize", 0); 
            return ret;
        }
    } while (0);

    mrb_raise(mrb, E_RUNTIME_ERROR, "undefined static method : cocos2d::ui::ScrollView#create");

    return mrb_nil_value();
}


ret = object_to_rubyval<cocos2d::ui::ScrollView>(mrb, "CCUI::ScrollView", (cocos2d::ui::ScrollView*)retval, rclass);
在成功的创建了ScrollView对象,并且封装好了之后,
mrb_funcall(mrb, ret, "initialize", 0); 
会再次调用mrb_value.initialize 这儿会再次初始化Widget对象,当然原来创建的CC对象已经失去了引用,去掉这些对象的initialize应该是合适的,虽然CCUI::ScrollView.new会创建一个mrb->object_class对象会让人不知所措。但cocos本身并不提倡new一个ref对象,这和cocos2dx的习惯是一致的,如果你有耐心,也可以在所有的Widget.create/create_instance方法里面去除掉 mrb_funcall(mrb, ret, "initialize", 0); 的重复初始化过程。


嗯嗯。现在我们可以试试CCUI Module了

class MainScene < CC::Layer
  def self.scene
    scene = CC::Scene.create 
    layer = MainScene.create
    scene.add_child(layer)
    return scene
  end
    
  def initialize
      begin
          visible_size = $Director.get_visible_size
          origin = $Director.get_visible_origin
          sv=CCUI::ScrollView.create
          sv.set_position(visible_size.width / 2 ,visible_size.height / 2 + origin.y)
          sv.set_anchor_point(CC::Vec2.new(0.5,0.5))
          sv.set_content_size(CC::Size.new(300,200))
          sv.set_inner_container_size(CC::Size.new(300,30*50))
          sv.set_back_ground_color_type(CCUI::Layout::BackGroundColorType.GRADIENT)
          sv.set_back_ground_color(CC::Color3B.BLUE,CC::Color3B.RED)
          sv.set_bounce_enabled(true)
          sv.set_clipping_enabled(true)
          sv.set_direction(CCUI::ScrollView::Direction::VERTICAL)
          self.add_child(sv)
          layer_size=CC::Size.new(20,100)
        
          30.times do |i|
              r,g,b,a = rand(255),rand(255),rand(255),rand(100)+155
              color=CC::Color4B.new(r,g,b,a)
              label=CC::Label.create_with_system_font("CC::Label#%d"%[i],"fonts/arial.ttf",40)
              label_size=label.get_content_size
              px =label_size.width() / 2 
              py=label_size.height() / 2  + i  * 50 
              label.set_position(px,py)
              label.set_text_color(color)
              sv.add_child(label,i)
          end

      rescue RuntimeError=>exp
        p "RuntimeError:%s"%[exp]
      rescue StandardError=>exp
        p "StandardError:%s"%[exp]
      end #begin rescue end
  end #def initialize
end #  class MainScene 


看看样子还是挺酷的。。。。是的,我们正在使用全脚本工作,体验一下吗?随便改动一点内容,然后
adb push src /storage/sdcard0/blackant
adb shell am force-stop com.blackant.mytest;sleep 1;adb shell am start -n com.blackant.mytest/org.cocos2dx.ruby.AppActivity
喜欢上极限编程的乐趣了吗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值