Color de pixel y/o seteado concreto de pixel

¡Hola a todos! Retomando una vieja idea, he vuelto a pilas y, pensando, me preguntaba si hay un modo sencillo de averiguar el color de un pixel (digamos en el actor Pizarra) concreto. Para dibujar un pixel sí que veo que tenemos la función dibujar_circulo usando radio 1…
Qué bueno es ver la excelente evolución de Pilas :slight_smile:

¡Hola @fsalamero!, ¡Que bueno encontrarte por aquí nuevamente!.

Estuve investigando la documentación de phaser del el objeto graphics que usamos internamente para crear el actor pizarra pero no logré dar con una función para obtener el pixel desde la pizarra.

Sin embargo, encontré una forma de obtener un pixel directamente desde la pantalla del juego, ¿eso te serviría para hacer el juego que tienes en mente?.

De todas formas te comento cómo se haría: tendrías que comenzar con una coordenada a consultar, por ejemplo la coordenada (x, y) del mouse. Luego tendrías que llamar a una función interna del motor llamada this.pilas.game.renderer.snapshotPixel con la coordenada y una función que recibirá el pixel separado en 3 componentes de color.

Hice un ejemplo para mostrar cómo se podría implementar en un juego sencillo, con una pizarra y un color de fondo. Cuando abras el ejemplo, vas a notar que en la parte de arriba de la pantalla se muestra el color debajo del mouse y se dibuja un círculo de ese color en la pizarra.

Abrir este proyecto en el editor de pilas

El código más importante está en la función cuando_mueve de la escena. Ten en cuenta que aquí la función snapshotPixel es una función interna de Phaser, así que necesita que la coordenada se convierta al sistema de phaser:

  cuando_mueve(x1: number, y1: number) {
    let { x, y } = this.pilas.utilidades.convertir_coordenada_de_pilas_a_phaser(x1, y1);

    this.pilas.game.renderer.snapshotPixel(x, y, (pixel: any) => {
      this.pilas.observar("x", x1);
      this.pilas.observar("y", y1);

      this.pilas.observar("rojo", pixel.r);
      this.pilas.observar("verde", pixel.g);
      this.pilas.observar("azul", pixel.b);
      this.pilas.observar("alpha", pixel.a);

      this.pilas.enviar_mensaje_global("pintar_color", pixel)
    });

Avisame si te sirve esta función, me gustaría incluirla en la próxima versión de pilas así es más fácil de usar.

¡Abrazo grande!

¡Genial, Hugo, me sirve muy bien!
La idea que tengo en mente es hacer un jueguecillo aprovechando que este año es el 40 aniversario del ZX Spectrum, el microordenador con el que muchos de mi generación nos adentramos en la programación. La verdad es que cuando pienso en ello, me entra mucha añoranza.
Había pensado hacer un juego sencillo conversacional, tipo ‘El Hobbit’ o ‘Yenght’. Aquellos se manejaban escribiendo comandos de texto, y las imágenes que mostraban en el escenario no eran mapas de bits, si no que se dibujaban vectorialmente, usando un algoritmo tipo ‘floodfill’; para escribir la rutina necesito detectar el color del pixel de turno, para hacer los rellenos de color.
https://www.youtube.com/watch?v=XJ9LuK5Tcgg
Hacerlo así da un look&feel muy de aquella época y me parece que es un buen homenaje :slight_smile:

1 Like

uhhh, ¡se ve muy bien ese juego!, aparte me encanta la idea de homenajear la Spectrum, yo nunca tuve una, apenas corrí emuladores y probé algunos juegos. Si tuve una Commodore 64 durante varios años junto a mi hermano, pero no me había picado la curiosidad por la programación en aquella época; sí se veía interesante, me acuerdo que había revistas que venían con código impreso para que puedas leer y escribir en la computadora (en lenguaje basic si no me equivoco) y tener un juego andando. Ush, ¡cuántos recuerdos!, voy a ver si me instalo un emulador más tarde y juego un poco :slight_smile:

¡Avisame si necesitas ayuda con el juego o si te puedo ayudar en algo!, abrazo grande!