2

谁能帮我让它运行?我的目标是自定义演员。(最近几天我才刚刚开始使用 Vala 进行黑客攻击,而 Clutter 也是一个谜。)

drawme 方法正在运行(当调用 invalidate 时),但似乎没有发生任何绘图(通过 Cairo 上下文)。

ETA:我在构造函数中添加了一行来显示修复 - this.set_size。

/*

Working from the sample code at:
https://developer.gnome.org/clutter/stable/ClutterCanvas.html

*/

public class AnActor : Clutter.Actor {

    public Clutter.Canvas canvas;

    public AnActor() {
        canvas = new Clutter.Canvas();
        canvas.set_size(300,300);

        this.set_content( canvas );
        this.set_size(300,300);

        //Connect to the draw signal.
        canvas.draw.connect(drawme);
    }

    private bool drawme( Cairo.Context ctx, int w, int h) {
        stdout.printf("Just to test this ran at all: %d\n", w);

        ctx.scale(w,h);
        ctx.set_source_rgb(0,0,0);

        //Rect doesn't draw.
        //ctx.rectangle(0,0,200,200);
        //ctx.fill();

        //paint doesn't draw.
        ctx.paint();

        return true;
    }
}



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();
    stage.destroy.connect(Clutter.main_quit);

    //Make my custom Actor:
    var a = new AnActor();

    //This is dodgy:
    stage.add_child(a);


    //This works:
    var r1 = new Clutter.Rectangle();
    r1.width = 50;
    r1.height = 50;
    r1.color = Clutter.Color.from_string("rgb(255, 0, 0)");
    stage.add_child(r1);

    a.canvas.invalidate();

    stage.show_all();

    Clutter.main();
    return 0;
}
4

1 回答 1

2

您还需要为 Actor 指定大小,而不仅仅是 Canvas。

Canvas 的大小与 Canvas 分配到的 Actor 的大小无关,因为您可以将相同的 Canvas 实例分配给多个 Actor。

如果你打电话:

a.set_size(300, 300)

你会看到演员和绘图的结果。

Clutter 还附带了各种示例,例如如何使用 Cairo 制作带圆角的矩形:https ://git.gnome.org/browse/clutter/tree/examples/rounded-rectangle.c - 或者如何制作一个简单的时钟:https ://git.gnome.org/browse/clutter/tree/examples/canvas.c

于 2013-04-10T10:19:44.183 回答