0

在过去的几天里,我一直在阅读有关 Vala 的文章,并决定深入研究它并在此过程中制作一些 Clutter 小部件。我目前正在尝试从我的自定义演员子类中绘制一个私人演员。这是我到目前为止所获得的简化版本。

public class MyContainer : Clutter.Actor, Clutter.Container {
    private Clutter.Group group;

    public MyContainer() {
        group = new Clutter.Group();
        group.set_parent(this);
    }

    public void add_actor(Clutter.Actor actor) {
        group.add_actor(actor);
        actor.show();
        set_size(group.width, group.height);

        actor_added(actor);
        queue_redraw();
    }

    public void foreach(Clutter.Callback callback) {
        group.foreach(callback);
        queue_redraw();
    }

    public override void get_preferred_height(
            float for_width,
            out float min_height_p,
            out float natural_height_p) {
        group.get_preferred_height(
                for_width,
                out min_height_p,
                out natural_height_p);
    }

    public override void get_preferred_width(
            float for_height,
            out float min_width_p,
            out float natural_width_p) {
        group.get_preferred_width(
                for_height,
                out min_width_p,
                out natural_width_p);
    }

    public override void paint() {
        group.paint();
    }

    public void remove_actor(Clutter.Actor actor) {
        group.remove_actor(actor);
        set_size(group.width, group.height);

        actor_removed(actor);
        queue_redraw();
    }

    public void sort_depth_order() {
        group.sort_depth_order();
        queue_redraw();
    }
}

int main(string [] args) {
    // Start clutter.
    var result = Clutter.init(ref args);
    if (result != Clutter.InitError.SUCCESS) {
        stderr.printf("Error: %s\n", result.to_string());
        return 1;
    }
    var stage = Clutter.Stage.get_default();

    // Build a MyCollection object.
    var myc = new MyContainer();
    myc.x = 100;
    myc.y = 100;
    var r1 = new Clutter.Rectangle();
    r1.width = 50;
    r1.height = 50;
    r1.color = Clutter.Color.from_string("rgb(255, 0, 0)");
    var t1 = new Clutter.Text();
    t1.text = "The red square.";
    t1.y = r1.height;

    // Build a Group object similar to the previous.
    var group = new Clutter.Group();
    group.x = 300;
    group.y = 100;
    var r2 = new Clutter.Rectangle();
    r2.width = 50;
    r2.height = 50;
    r2.color = Clutter.Color.from_string("rgb(255, 0, 0)");
    var t2 = new Clutter.Text();
    t2.text = "The red square.";
    t2.y = r2.height;

    // Display.
    myc.add_actor(r1);
    myc.add_actor(t1);
    group.add_actor(r2);
    group.add_actor(t2);
    stage.add_actor(myc);
    stage.add_actor(group);
    stage.show_all();

    Clutter.main();
    return 0;
}

该示例绘制直接添加到舞台的组,而不是由添加到舞台的自定义集合包装的组。我怎样才能让它工作,上面有什么问题?

我一直在 ubuntu 11.10 上工作valac --pkg clutter-1.0 above_code_example.vala

4

1 回答 1

1

这个答案来自 gnome.irc 的 #clutter room 上的 buz。问题是分配函数缺少覆盖。

于 2012-01-01T22:52:18.920 回答