Dibujar un Clutter::Actor personalizado utilizando cairo.
Quiero crear un actor personalizado usando la biblioteca gráfica Cairo.
Estoy utilizando cluttermm y clutter-gtkmm.
Según algunas recomendaciones y códigos de amigos, esto se puede implementar en clutter (no cluttermm).
Un ejemplo en Vala:
using Clutter;
void main(string[] args)
{
Clutter.init(ref args);
// Nota: la API Clutter.Texture está obsoleta, pero la API que la reemplazó es muy engorrosa, por lo que continuamos utilizando Clutter.Texture
var linus = new Texture.from_file("Linus_Torvalds.jpeg");
int width, height;
linus.get_base_size(out width, out height);
var stage = new Stage() {
width = width,
height = height
};
stage.add_child(linus);
var canvas = new Canvas() {
width = width,
height = height
};
canvas.draw.connect((cr, width, height) => {
cr.set_line_width(10);
cr.set_source_rgba(0, 0, 0, 1);
cr.move_to(310, 355);
cr.line_to(260, 340);
cr.stroke();
return true;
});
var canvasActor = new Actor() {
x = 0,
y = 0,
width = width,
height = height,
content = canvas
};
stage.add_child(canvasActor);
canvas.invalidate();
stage.show();
stage.destroy.connect(Clutter.main_quit);
Clutter.main();
}
Sin embargo, cuando intento hacer esto en cluttermm y clutter-gtkmm, obtengo un error.
No se puede inicializar un miembro subobjeto de tipo ‘Clutter::Content *’ con un rvalor de tipo ‘Clutter::Canvas *’.
Sé que puedo usar la API COGL, pero creo que Cairo es una mejor opción para el dibujo en 2D.
Por favor, ayúdeme.
davy.ai
Para crear un actor personalizado utilizando gráficos Cairo en cluttermm y clutter-gtkmm, puedes utilizar la clase Clutter::Canvas. Aquí tienes un ejemplo de fragmento de código en C++:
En este código, definimos un actor personalizado llamado MyActor que consiste en un Clutter::Canvas. El objeto Clutter::Canvas se crea y se añade a los hijos del actor en el constructor. También conectamos la señal signal_draw() del canvas a una función miembro llamada on_draw() que toma un Cairo::Context como parámetro. En la función on_draw(), utilizamos Cairo para dibujar una línea diagonal en el canvas.
Para utilizar este actor personalizado en una aplicación clutter-gtkmm, puedes crear un widget Gtk::ClutterEmbed y añadir el escenario (stage) a él. Aquí tienes un ejemplo:
En este código, creamos un widget Gtk::ClutterEmbed y añadimos el escenario a él utilizando el método add() del widget. Luego, creamos una ventana Gtk::Window y añadimos el widget Gtk::ClutterEmbed a ella. Finalmente, llamamos a Gtk::Main::run() para iniciar el bucle principal de eventos.</gtkmm.h></cluttermm.h></cluttermm.h>