Как создать подкласс Clutter.Actor (включая Cairo/Clutter.Canvas)

Может ли кто-нибудь помочь мне запустить это? Я стремлюсь к пользовательскому Актеру. (Я только начал заниматься хакерством с Валой в последние несколько дней, и Клаттер тоже для меня загадка.)

Метод drawme запускается (когда вызывается недействительность), но, похоже, никакого рисования не происходит (через контекст 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;
}

person Donn    schedule 10.04.2013    source источник


Ответы (1)


вам также нужно назначить размер актеру, а не только холсту.

размер холста не зависит от размера актера, которому назначен холст, поскольку вы можете назначить один и тот же экземпляр холста нескольким актерам.

если вы позвоните:

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

person ebassi    schedule 10.04.2013
comment
Большое спасибо. Я забыл об отправленных примерах, обязательно пойду посмотрю. - person Donn; 11.04.2013