在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
喜欢上极限编程的乐趣了吗