Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Temas - DarkKRuleR

21
¡Buenas! Pues tengo una duda gorda matemáticamente que no logro sacarme...

Quiero tener un sistema libre de cámara 3D en que literalmente pueda moverme con total libertad por el espacio sin estar anclado al suelo. Lo más fácil hasta ahora es tener 2 ángulos: cuánto sube/baja la cámara y si apunto a derecha e izquierda, y combinando estos ángulos puedo mirar en todas direcciones, pero siempre estás "pegado al suelo". Yo quiero tener total libertad. Que si miro hacia arriba, el techo sea el nuevo suelo. Que no haya suelo. Que pueda rotar la cámara con un tercer ángulo: rotación respecto al eje de visión.

https://www.youtube.com/watch?v=2xATkQBVidU

Como en este juego. Ahí si tú quieres, si te da la gana, puedes hacer que el suelo sea techo. Puedes volar sobre un suelo vacío, sobre un precipicio infinito, con un techo. O si quieres, puedes volar haciendo que el suelo sea una pared. O sea, rotar la cámara, girando, con total voluntad, y maniobrar de forma normal totalmente independiente de ello...

Para eso necesito 3 grados de libertad, rotar sobre los 3 ejes a la vez, y no sólo sobre los ejes z (profundidad/altura, theta) e y (longitud, phi). Pero no consigo que funcione lo anterior... ya que sigue funcionando como si estuvieras siempre pegado al suelo.

No sé si me he explicado bien y alguien capta a qué me refiero, es un concepto complicado... mi ejemplo era el sencillo:

x -> cos(phi)*cos(theta)
y -> sin(phi)*cos(theta)
z -> sin(theta)

Haciendo que el aumento en x/y sea cos/sin de phi, al mirar a los lados, giro de forma normal. Sin embargo, esto sólo aplica si theta vale 0, o sea, si estoy mirando al frente. Si comienzo a mirar arriba, la coordenada z comienza a aumentar para mirar arriba (sin(theta)) y cancela las horizontales.

Esto funciona para una cámara para mirar en todas direcciones 3D, pero no con la sensación de "poder hacer que el suelo sea techo", ya que siempre miras respecto a que el personaje tiene los pies pegados al suelo, y el suelo siempre será suelo...

Por no hablar que si intento hacer cambios, los sistemas de coordenadas se me invierten y no responden bien...

No haría la pregunta si no fuera algo realmente complejo, pero me está superando...  :'(
22
Estoy pensando en volver a desarrollar en mi antiguo GM Studio, ando recién iniciando. Es una versión gratuita que dieron hace tiempo... ¿Qué tal está el panorama para desarrollar? Habiendo un GM Studio 2, de cara a... soporte, legalidad, mil temas que no tengo ni idea. Llevo años desconectado de todo esto, pero realmente tengo muchísimas ganas de volver a desarrollar aquí. Para mí el entorno es muy cómodo y potente, así que quiero darle duro.
23
¡Buenas! Pues este tema me tiene jodido y dudando. Ando haciendo mi juego, que es un plataformas de jugabilidad 2D y personajes y objetos 2D, pero los escenarios son cubos 3D de una sola profundidad. O sea, los PJs se mueven por cubos. Éstos son simples cubos, con 4 vértices para dibujar cada cara. Un problemilla es que cada cara está formada por 5-6 planos para formar una animación. Igual, no dejan de ser PLANOS. A demás, tengo el culling activado, dibujando sólo las caras frontales de los triángulos, el hidden, para dibujar sólo lo que se ve, y no dibujo las cosas que estén fuera de la view. También creo las texturas en los eventos create y no a la hora de dibujar en cada step. Con todo esto, debería ser jodidamente eficiente... pues no. Los fps bajan de 60 a... algunas veces 40 en momentos críticos aleatorios, a veces 50.

Lo peor es cuando implanté la iluminación. Puse las normales a los vértices y todo el rollo, y probé con una pequeña luz. 15 fps constantes... es un infierno. Son sólo cubos, por dios... he visto cosas más complejas, y GM debería estar preparado... ¿Alguna idea de qué puede ocurrir? Lo peor es que mi PC es medianamente eficiente, puede correr cualquier juego del nivel de PS3 con gráficos al mínimo a 60/60.

En un ataque de eficiencia, y recordando lo que pregunté en el pasado, he quitado el evento draw de cada objeto cubo y, en el controlador, me he hecho un bucle que, para cada cubo, lee sus coordenadas y el propio objeto controlador dibuja el cubo en esas coordenadas, sin ningún "with". Así, TODOS los cubos se dibujan en UN solo evento draw, sin ejecutar código del objeto cubo. Pensé que esto aumentaría tanto la eficiencia como me pasó en mi anterior proyecto, pero sigue estancada en 20/60 fps... lo cual no tiene ningún sentido.

¿Qué cosas pueden dejar en la mierda los fps hasta este punto, más cuando sólo dibujo planos y con tanto control de eficiencia? Los personajes también son varios planos (sprites) superpuestos...
24
¡Buenas! Pues tan simple como eso. Al iniciar en pantalla completa, se ve todo el juego en negro y no se ve nada... tanto si inicia desde la opción del menú, como si inicia en modo ventana y manualmente la activo. En modo ventana todo se ve perfectamente. He comprobado que los objetos están ahí porque cierto evento sí reacciona, así que parece ser sólo visual, pero no sé qué hacer.
25
No me creo que esto me vuelva a ocurrir... me ocurrió en el pasado, pero... vuelve, y realmente estoy estancado (;n;)

Básicamente quiero hacer un plataformas con toques 3D de profundidad. Como si la cámara estuviera en el plano z positivo, mirando hacia el plano xy, dibujando por lo tanto todo tal cual se vería en el editor de rooms, 2d (ir a la derecha/izquierda, arriba para saltar), pero la coordenada z para jugar.

El problema ya no es sólo que se dibujen los sprites boca abajo, sino que todo se VE boca abajo. No se trata de dibujar, eso lo tengo resuelto. Se trata de la CÁMARA. Yo COLOCO varios objetos solidos haciendo una escalera hacia arriba, y al ejecutar se ven haciendo una escalera hacia abajo. Y el personaje boca abajo. Es decir, que cada solido dibuja donde le toca, pero realmente están los objetos invertidos verticalmente en la room, como si la cámara estuviera boca abajo.

d3d_set_projection( obPer.x, obPer.y, 100, obPer.x, obPer.y, -25, 0, -1, 0 );

Uso ese código para la proyección. Ya he intentado a cambiar el "-1" por un "1", CREO que eso debería ser. O probar -1 y 1 en el tercer argumento. O cambiar el 100 por -100. He probado de todo, y nada funciona...
26
Preguntas y respuestas / Qué versión de GM usar
Julio 31, 2017, 08:53:14 PM
¡Buenas! Llevo años usando GM Studio, y realmente me siento cómodo en la plataforma. Sin embargo, me enteré de GMS2, que el anterior perderá el soporte, etc etc. Soy noob en estas cosas y... no sé qué consecuencias traería. ¿Se puede seguir desarrollando con GMS1, o habrá problemas de cara a continuar en el futuro y publicar juegos? ¿Es recomendable subir a GMS2? Yo me conformo con la versión free, pues trae todo lo que necesito (a menos que GMS2 lo cambiase), cosas como images_angle y 3D que antes eran de pago, en GMS1 eran para los gratis, y con llegar a ese nivel me basta. Recién voy a iniciar un proyecto y me gustaría informarme, así como no cambiar a GMS2 si no es necesario.
27
Buenas! Querría hacer algo como...

vrArray = [
     0,1,2,
     3,4,5
]


etc. Alguna forma de crear un array 2D para maximizar el visualizar fácilmente los datos como si fueran una matriz

Sé que puedo hacer:

vrArray[0,0] = 0; vrArray[0,1] = 1;...
vrArray[1,0] = 3; ...

pero es extremadamente cansino, feo e ineficiente... quiero poder ver los datos en forma de matriz 2D fácilmente interpretable y editable en el propio evento create. Alguna idea?

Lo haría con un script, pero sólo permite 12 argumentos, y la matriz puede sobrepasar las 50 columnas...
28
Buenas! Pues veréis, yo tengo varias luces, y el objetivo es que su iluminación sea más potente. Que al ver una textura iluminada tenga prácticamente el mismo tono que la textura real en cuanto a claridad, pero las luces son débiles, y tengo que poner 2 luces iguales en la misma posición para lograr esta claridad (y la logro). Están un poco lejos de la textura, quizás a la mitad que el rango de la luz, quizás sea eso. El tema es cómo lograr que cada luz individual tenga el mismo efecto que tendría el poner dos luces juntas, es decir, una mayor intensidad de luz incluso a medida que te acercas al límite del rango de iluminación. Al tener un límite de 8 luces a la vez (las más cercanas) no quiero tener que quedarme con sólo 4, al tener que duplicarlas para obtener la claridad que quiero. La luz es blanca, así que ese no es el problema
29
Buenas! Pues tengo varios objetos que hacen de luz, obLuz, y este script:

obCtrl.vrLuzIndex = 0;

with( obLight ) {
    d3d_light_enable( obCtrl.vrLuzIndex, true );
    d3d_light_define_point( obCtrl.vrLuzIndex, vrXDraw, vrYDraw, vrZDraw, 90, c_white );
    obCtrl.vrLuzIndex += 1;
}


Ese script lo llamo 1 vez al comenzar y ya me coloca todas las luces, y queda funcionando sin hacer nada más. El problema es que constantemente, CONSTANTEMENTE se rota todo el escenario, y ahí las luces dejan de funcionar, porque éstas también DEBERÍAN moverse con el escenario para que la iluminación no cambie.

Sería eficiente llamar a esa función en cada step? O al menos a una subfunción. El enable creo que no haría falta, el tema es que debo REPOSICIONAR las coordenadas de cada luz en cada step. Hay forma de hacerlo sin define_point en cada step? Y si lo hago, puede ser ineficiente? (mi PC es potente así que no puedo saberlo). Intuyo que no pasa nada, pues no es más que modificar unas simples variables, todo el trabajo pesado de iluminación se ejecuta en cada vértice en draw, para calcular su iluminación, no a la hora de definir dónde están las luces, pero quiero estar seguro
30
Intercambio / Buscamos ilustrador para un proyecto
Marzo 01, 2016, 06:06:43 PM
Buenas! Ahora somos tres personas que estamos iniciando un juego. Sin nombre de grupo ni líderes, simplemente gente con ganas de crear algo. El juego será una novela visual, y tenemos ya bastante pensado sobre la historia y los géneros. Los géneros serán Ciencia ficción, Sobrenatural, Drama, Acción y comedia, en ese orden.

Tenemos un ilustrador, un programador (yo) y un compositor de música. El compositor y yo hacemos de escritores (y el cuarto miembro que entre también si quiere), por lo tanto necesitamos el cuarto, un ilustrador, porque una novela visual requiere mucho trabajo gráfico, y a demás sería un cuarto punto de vista y apoyo para la historia. Sólo uno.

Si tienes conocimientos de inglés está bien, porque el compositor (y uno de los escritores) es inglés, y hacemos llamadas en inglés, aunque si no tampoco pasa nada, podrías igual aportar a la historia. El ilustrador debe poder hacer dibujos del estilo manga/anime. No queremos, por ejemplo, dibujos estilo cartoon (demasiado cartoon), hyper realistas, etc.

Buscamos gente que tenga ganas y tiempo de hacer una buena novela visual, dedicación. Se tiene intención de colgar el juego en steam (y posiblemente iOS/Android) y ponerlo a un precio razonable y pequeño. Si tienes paypal podrás cobrar una parte. La verdadera intención del proyecto es hacerlo porque quieres, tienes tiempo y ganas, no por el dinero (será un extra), tenlo en cuenta.
31
Buenas! Pues veréis, yo tengo un objeto con coordenadas x, y, vrZ. Originalmente, tras hacer ciertas transformaciones desde el centro del objeto, es decir, el objeto NO SE MUEVE, hago esto:

d3d_transform_add_translation( x, y, vrZ );

Es decir, dibujo el objeto en el centro de coordenadas, hago transformaciones, y luego lo devuelvo a sus coordenadas originales. Entonces cambié esa línea por ésta:

d3d_transform_add_translation( x - obUnk.x, y - obUnk.y, vrZ - obUnk.vrZ );
d3d_transform_add_rotation_z( -obUnk.vrAngAgarre );
d3d_transform_add_rotation_y( obCtrl.vrEscalaAng );
d3d_transform_add_rotation_z( obUnk.vrAngAgarre )
d3d_transform_add_translation( obUnk.x, obUnk.y, obUnk.vrZ );


Como véis es casi lo mismo, sólo que hago ciertas rotaciones entre medio... eso no devuelve el objeto a su posición real actual, sino que lo mueve un poco según las rotaciones.

El problema es, que tengo un script que calcula su depth, que utiliza su x, y, vrZ. Antes iba bien, pero AHORA que sus coordenadas REALES son diferentes a las coordenadas dónde se dibuja (debido a que en el segundo caso le hago rotaciones cuando el objeto NO ESTÁ en el 0,0,0, lo cual lo desplaza), funciona mal. Necesito SABER las coordenadas exactas del objeto. Es decir, las resultantes de aplicar esas transformaciones. Debo saber DÓNDE está dibujando el objeto.

Antes el objeto se dibujaba en 0,0,0, se hacían rotaciones, y luego lo trasladaba a x,y,vrZ, así que el objeto estaba situado en la misma posición en la cual se dibujaba, TODO CORRECTO. Ahora, antes del final, hago una rotación al objeto mientras éste está ALEJADO de x,y,z, por lo tanto la rotación LO DESPLAZA, así que aunque lo envíe de nuevo a x,y,vrZ, se dibuja en una posición DISTINTA a su posición real. El problema es saber en qué posición está, es decir, saber la x,y,vrZ después de aplicar las transformaciones del segundo código.
32
d3d_primitive_begin_texture( pr_trianglestrip, sprite_get_texture( spMuestra, 0 ) );
    d3d_vertex_normal_texture( x-100 - obTrucos.vrGradual, y+100, vrZ+5, 0, 0, 1, 0, 1 );
    d3d_vertex_normal_texture( x-100, y-100, vrZ+5, 0, 0, 1, 0, 0 );
    d3d_vertex_normal_texture( x+100 + obTrucos.vrGradual, y+100, vrZ+5, 0, 0, 1, 5, 1 );
    d3d_vertex_normal_texture( x+100, y-100, vrZ+5, 0, 0, 1, 5, 0 );
d3d_primitive_end();


Buenas! Pues tiene un comportamiento muy extraño... creo que tengo desconocimiento sobre algún aspecto de las primitivas.

EDIT: He reproducido y resubido el error de una forma simple. Como véis el comportamiento es MUY feo. Primero tenemos el cuadrado, y abajo tenemos el mismo, pero los dos vértices inferiores han sido estirados hacia los lados. Querría que las líneas se estirasen de una forma uniforme, pero se ve claramente una línea digonal que lo separa, y... sólo medio dibujo es estirado de una forma brusca. Cómo se podría estirar de una forma más uniforme, más "smooth"? Siguen siendo 4 vértices y las coordenadas de textura están bien, no sé por qué falla. Debería verse como un ABANICO en que las lineas van rotando un poquito más respecto a las anteriores, NO ESO :(
33
Buenash! Pues veréis, yo dibujo muchas primitivas con 4 vértices formando un cubo. Tenemos los 4 muros, rotados 0, 90, 180 y 270º respecto al eje z, pero nada más (100% verticales), luego la primitiva del techo, mirando hacia arriba, y la del suelo, hacia abajo. Son 6 primitivas cuadradas formando un cubo, para simplificar el problema. Todo el tema de la iluminación ya lo tengo montado y funciona, yo pongo varias luces puntuales en el escenario e ilumina las caras. Aquí viene el problema...

Supongamos, para ejemplificar, el cubo centrado en 0,0,0, y las caras a 100 píxeles de distancia (la arista sería de 200)

Quiero, para cada primitiva (para cada cara del cubo), decir si está "lo suficientemente iluminada". Yo tengo acceso a cada cara y sé cuál de ellas es. Por ejemplo, para la cara superior, que estaría en z=100 (hacia arriba), si yo pongo una luz en 0,0,200, la cara está totalmente iluminada. Si la luz está en 100,0,200, la iluminaría parcialmente, pues no viene de frente.

Y así para cada cara. El objetivo es, para cada cara, teniendo en cuenta todas las luces del escenario (cada una es un objeto que puedes ubicar en el espacio), darle a ESA cara un número entre 0 (totalmente oscura) y 255 (totalmente iluminada). Poder decir la cantidad de luz que recibe esa cara teniendo en cuenta todos los focos de luz, ya que después necesitaré filtrar aquellas que estén bastante oscuras (por ejemplo por debajo de 30) para usarlas en el gameplay (digamos que el prota tiene un poder especial si está mirando a una pared o techo "poco iluminado", es decir, por debajo de 30)

He probado a hacerlo manualmente, pero me he hecho un lío. El tema es que quizás hay una forma más sencilla y rápida de encontrarlo. Quizás relacionado con las matrices de transformación o iluminación, las normales de los vértices... algo. Al fin y al cabo Game Maker coge, para cada vértice, su normal, y la ilumina acorde al ángulo que forma con TODOS los focos de luz. Quizás puedo aprovechar lo que hace y coger ese número y ya. Alguna idea?
34
Buenash! Pues yo tengo 6 bloques, cada uno con mucho código, pero tienen que ser bloques separados. Hay alguna forma de poner al inicio del primer bloque un:

if ( a ) {

y al final del último:

}

Es decir, que el código de los 6 bloques se cuenten como todo un conjunto encerrado dentro del if, pero MANTENIÉNDOLOS separados en los 6 bloques? Sé que podría juntar el código en un sólo bloque, pero quedaría fatal en cuanto a organizarme
35
Buenash! Pues veréis, tengo UN objeto que dibuja MUCHAS primitivas, y me es "imposible" saber en qué orden se dibujarán todas, pues depende de dónde esté la cámara, y al estar todas juntas... el precioso algoritmo del pintor peta y se ve todo fatal. He probado a trabajar con d3d_set_depth pero no funciona, aún así sería un lío calcular en qué orden debería dibujarlas

Sea como sea, quiero ver si se puede solucionar con d3d_set_zwriteenable. Quiero desactivar el zwrite sólo para ESE objeto del enemigo, para poder dibujar todas las primitivas ignorando el z buffer, pero que SÓLO afecte a ESE objeto. Desactivo d3d_set_zwriteenable al inicio, dibujo, y luego lo activo. Funciona, el problema es que también afecta a otros objetos (a otros enemigos e incluso a los suelos y paredes). Hay forma de que sólo funcione para ESE objeto? Es decir, dibujar todas las primitivas ignorando el zbuffer pero sólo ENTRE ELLAS, sí teniendo en cuenta el zbuffer de los demás objetos.

PD: Me doy cuenta que es parecido a una duda que puse hace poco que creí resuelta, aunque en ese caso el problema resultó ser otro, este es concretamente ESTE problema del zbuffer
36
Buenas! Pues en GMStudio, quiero poder dibujar dos objetos en 3D sin tener en cuenta el z buffer. Es decir, que si dibujo un PLANO en z=0, y luego otro PLANO en z=0, que no ocurra esto...


(Lo negro debería verse bien, sin esas líneas horizontales)

z fighting. Quiero que EL SEGUNDO PLANO QUE DIBUJE se vea POR ENCIMA DEL PRIMERO, aunque estén en la misma posicion.

En otro objeto tengo, al inicio de Draw: d3d_set_zwriteenable( false );, y al final lo vuelvo a poner a true. Creo que esa es la solución pero...

Al hacer lo mismo en ESTE objeto de AHORA (dibujar dos planos superpuestos), poner el zrwiteenable a false, dibujar los dos, y luego ponerlo a true, funciona, pero TODO EL ESCENARIO ENTERO queda con el zwrite desactivado, viéndose todo rarísimo y bugueado, y quiero que sólo suceda para ESAS DOS LÍNEAS DE CÓDIGO. ya desactivo justo antes del primero y activo tras el segundo, pero afecta a todo el escenario. Por qué? Con otro objeto no pasa esto...
37
Buenas! Pues estoy usando el 3D en GM Studio, y quiero que SIEMPRE ocupe TODA la pantalla con resolución 1:1: Independientemente del tamaño del monitor, ya sea desde un 1280x720 a un 1920x1024, el juego ocupe TODA la pantalla, sin bordes negros, pero sin estirar la imagen: MANTENIENDO una resolución de gráficos 1:1. Qué variables y opciones tengo que tocar para ello? Lo intenté pero estoy mareado xD

Creo que la idea sería que, en una misma posición y momento, verías mucho más con un monitor grande que con uno pequeño. Quizás más campo de visión, o más espacio para poner el HUD y ver más del escenario 3D, pero que todas las pantallas sean ocupadas al 100% sin perder resolución ni apretar o estirar la imagen.
38
Buenas! Pues veréis, hay objetos que se ven bastante cerca de la cámara, y la textura que tengo es 256x256, es un tanto grande, pero teniendo en cuenta que puede ocupar toda la pantalla... se ven los píxeles. Pensé en hacer una segunda textura de 512x512, y si el jugador elige el modo máxima calidad, usar esa, dejando la opción de usar la anterior para PCs más lentos. El problema es que Game Maker cargaría ambas texturas, y usaría la que tocara según la situación.

Debido a que,  según me dijeron, GM studio ya NO PERMITE cargar recursos de forma externa, es más, sería ineficiente... es CORRECTO cargar TODAS las texturas (las pequeñas y grandes), mantenerlas en memoria, y usar una u otra según las opciones gráficas del jugador? Ralentizaría el juego tener TANTAS texturas (y grandes) cargadas en memoria aunque no se usen? O incluso usándolas, no sé si una textura de 512x512 es demasiado...

PD: Me estoy dando cuenta que aún con la textura a 512x512, se vería pixelado si te acercas mucho... y en ciertos casos es inevitable. Debería asumir la pixelación y dejar las texturas como están?
39
Preguntas y respuestas / [ Resuelto ] Animar tentáculo
Diciembre 30, 2015, 02:59:58 AM
Buenas! Tengo este tentáculo:


Número de conexiones N. Cada conexión tiene un ángulo en valor absoluto, que no depende de las conexiones anteriores. Cambiar el ángulo de una NO afecta a las siguientes, como podéis ver en la imagen. Está planteado en 2D sobre un papel, así que cada conexión tiene sólo 1 ángulo.

Cómo puedo hacer una animación de tentáculo? Que parezca que realmente se está moviendo como tal de una forma interesante. Qué algoritmo hacer para dar valores a cada ángulo en cada step y hacer una animación. El sistema ya lo tengo montado, sólo necesito calcular el valor de los N ángulos en cada instante.

Ah, y si se puede, como limitación quiero que el tentáculo siempre mire hacia arriba. A la hora de crearlo y dar valor inicial tengo esto:

for ( i = 0; i < vrLong; ++i ) {
    if ( vrAngA < 70 ) vrAngA += round( random_range( 20, 40 ) );
    else if ( vrAngA > 160 ) vrAngA += round( random_range( -20, -40 ) );
    else {
        if ( scProb( 50 ) ) vrAngA += round( random_range( 20, 40 ) );
        else vrAngA += round( random_range( -20, -40 ) );
    }
    vrTentaculoAng[i] = vrAngA;
}


Inicia en 0, y para cada ángulo, en orden desde la base, sumo a vrAngA, esa variable la uso en cada step para dar valor a los ángulos de forma acumulativa, y TIENDE HACIA 90. Como resultado el tentáculo acaba con valores aleatorios, pero tendiendo a mirar hacia arriba. Quiero que la animación también tienda hacia arriba (90), o sea, que no vaya el tentáculo y se ponga boca abajo mientras hace sus cosas de tentáculo.

Alguna pista, idea o código?
40
Buenas! Adjuntamente véis el sprite que dibujo. Su origen está en x=0, y=719 (abajo del todo), así que tiene el origen en la esquina inferior izquierda. Evento draw:

draw_sprite_ext( spHUDOjo, 0, 0, display_get_height()/2 - 1, display_get_width()/960, display_get_height()/720, 0, noone, 1 );
draw_sprite_ext( spHUDOjo, 0, 0, display_get_height()/2 + 1, display_get_width()/960, -display_get_height()/720, 0, noone, 1 );


Sólo dibuja un ojo, el superior, ignorando la segunda llamada. Si os fijáis, dibujando el sprite arriba, y redibujándolo abajo pero invertido verticalmente, debería formar un ojo. Al tener el punto de origen en la y inferior, tengo que dibujarlos en la mitad de la pantalla verticalmente. El ojo se escala y adapta a la pantalla, pero el segundo tiene un negativo en su image_yscale, debería invertirse pero... simplemente desaparece, y no le veo el sentido.

Sí, tienen que ser dos sprites separados. No, no quiero duplicar el sprite en el editor, quiero hacerlo por código :D