Buen juego DarkKRuler, me gusta el ambiente y la música. Ya logré pasar 2 batallas, no me parecieron tan difíciles, creo que no he llegado con un jefe. Al principió me desconcertó que no podía moverme y tardé un rato en descubrir que el globo de diálogo se debe pulsar, después logré avanzar con pocos inconvenientes, hasta que llegué a la zona donde se obtiene el poder de corte, no encuentro la forma de regresar, hacer un puente con el cubo parece imposible, tienes que darme una pista, estoy a punto de darme por vencido.
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.
1067
Juegos completos / Re:Super Metroid Mini
Noviembre 11, 2015, 10:37:55 PM
Ya logré terminar el juego, está muy bueno, aunque el final no resultó tan épico como en Super Metroid.
Encontré otro bug: en algunas habitaciones (de la parte superior del mapa), el tanque de energía reaparece al entrar a la habitación, así es posible conseguir energía infinita.
Encontré otro bug: en algunas habitaciones (de la parte superior del mapa), el tanque de energía reaparece al entrar a la habitación, así es posible conseguir energía infinita.
1068
Juegos completos / Re:Super Metroid Mini
Noviembre 07, 2015, 09:32:56 PM
Por fin lo encontré, desde que vi la lava nunca se me ocurrió bajar más, está bien escondido, me gusta, se parece a un camino secreto del primer Metroid.
Ya casi termino el juego, pero cuando se activa la cuenta regresiva, al entrar a la sala 71 me aparece este error
Otros errores son que a veces puedes atravesar puertas cerradas, como la puerta a la derecha del jefe que es un monstruo acuático en el juego original, y hay una habitación sin enemigos que le hace falta una parte del piso.
Ya casi termino el juego, pero cuando se activa la cuenta regresiva, al entrar a la sala 71 me aparece este error
Código [Seleccionar]
ERROR in
action number 1
of Other Event: Room Start
for object obj_pl:
Error in code at line 8:
{x=obj_p3.x+40
^
at position 16: Unknown variable x
Otros errores son que a veces puedes atravesar puertas cerradas, como la puerta a la derecha del jefe que es un monstruo acuático en el juego original, y hay una habitación sin enemigos que le hace falta una parte del piso.
1069
Preguntas y respuestas / Re:Con sprite o con game maker
Noviembre 07, 2015, 04:25:51 PM
Si se pueden dibujar degradados con primitivas, sólo se deben poner colores diferentes a los vértices

eso lo dibujé con este código
[gml]
for( a=0; a<360; a+=36 ) //se dibujan 10 rayos
{
d3d_transform_set_rotation_z( a ); //cambiar angulo
d3d_transform_add_translation( x,y,0 );
draw_primitive_begin( pr_trianglestrip ); //rayo
draw_vertex_colour( 20 , 5, c_yellow,1 );
draw_vertex_colour( 20 , -5, c_yellow,1 );
draw_vertex_colour( 300, 20, c_yellow,0 );
draw_vertex_colour( 300,-20, c_yellow,0 );
draw_primitive_end();
}
d3d_transform_set_identity(); //eliminar transformaciones
draw_circle_colour( x,y,30, c_white,c_yellow, false ); //dibujar sol
[/gml]
Como han mencionado, la calidad gráfica sería mejor con sprites: puedes tener bordes suavizados y degradados más elaborados, y todo se dibuja más rápido. El único inconveniente es que se aumentaría el peso del juego, sin embargo, para sprites simples como los que quieres usar, el aumento es insignificante.

eso lo dibujé con este código
[gml]
for( a=0; a<360; a+=36 ) //se dibujan 10 rayos
{
d3d_transform_set_rotation_z( a ); //cambiar angulo
d3d_transform_add_translation( x,y,0 );
draw_primitive_begin( pr_trianglestrip ); //rayo
draw_vertex_colour( 20 , 5, c_yellow,1 );
draw_vertex_colour( 20 , -5, c_yellow,1 );
draw_vertex_colour( 300, 20, c_yellow,0 );
draw_vertex_colour( 300,-20, c_yellow,0 );
draw_primitive_end();
}
d3d_transform_set_identity(); //eliminar transformaciones
draw_circle_colour( x,y,30, c_white,c_yellow, false ); //dibujar sol
[/gml]
Como han mencionado, la calidad gráfica sería mejor con sprites: puedes tener bordes suavizados y degradados más elaborados, y todo se dibuja más rápido. El único inconveniente es que se aumentaría el peso del juego, sin embargo, para sprites simples como los que quieres usar, el aumento es insignificante.
1070
Preguntas y respuestas / Re:Con sprite o con game maker
Noviembre 07, 2015, 04:43:14 AM
Para encontrar la respuesta hice un "profile" de este código:
[gml]
draw_sprite( sprite0,0, 0,0 );
draw_rectangle( 0,0, 1280,720, false );
[/gml]
el sprite dibujado mide 1280x720. Dibujar el sprite es ligeramente más rápido que la otra función, al parecer todas las funciones de dibujo de "formas básicas" y primitivas son más lentas que las de sprites y backgrounds.
Si simplemente quieres llenar la pantalla con un color sólido, entonces es mejor usar draw_clear, como demuestra la imagen adjunta.
[gml]
draw_sprite( sprite0,0, 0,0 );
draw_rectangle( 0,0, 1280,720, false );
[/gml]
el sprite dibujado mide 1280x720. Dibujar el sprite es ligeramente más rápido que la otra función, al parecer todas las funciones de dibujo de "formas básicas" y primitivas son más lentas que las de sprites y backgrounds.
Si simplemente quieres llenar la pantalla con un color sólido, entonces es mejor usar draw_clear, como demuestra la imagen adjunta.
1071
Preguntas y respuestas / Re:Cambiar todo un juego de 30 a 60 fps
Noviembre 07, 2015, 04:22:11 AM
Tienes que cambiar todo a mano, no hay otra opción. Aunque puedes ayudarte con la herramienta "search and replace" del editor de scripts: http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/006_scripts.html
El consejo de Marth es muy bueno, procura usarlo con frecuencia. Otro consejo es usar constantes o macros para guardar valores como la gravedad, fricción, velocidad de salto, estados, etc., de esa forma cuando quieras ajustar los valores no tendrás que buscar en todo el código. http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/010_macros.html
Si no quieres usar macros, también puedes definir variables en el evento Create, el objetivo es tener todas los valores constantes definidos en un sólo lugar.
El consejo de Marth es muy bueno, procura usarlo con frecuencia. Otro consejo es usar constantes o macros para guardar valores como la gravedad, fricción, velocidad de salto, estados, etc., de esa forma cuando quieras ajustar los valores no tendrás que buscar en todo el código. http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/010_macros.html
Si no quieres usar macros, también puedes definir variables en el evento Create, el objetivo es tener todas los valores constantes definidos en un sólo lugar.
1072
Preguntas y respuestas / Re:Como hacer que las camaras sigan a 3 jugadores
Noviembre 06, 2015, 07:12:32 PM
Algunas referencias:
http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/more%20about%20rooms/views.html
http://www.inventati.org/estupidezartificial/web/papers/multivistas.html
http://gmc.yoyogames.com/index.php?showtopic=323778
En resumen, en el editor de rooms activa 3 vistas marcando la casilla "visible when room starts". Todas pueden tener el mismo tamaño y posición dentro de la room, pero el "port" debe ser distinto en cada una. El port indica el tamaño y la posición dentro de la ventana. Cada vista debe tener asignado un objeto diferente en "object following".
http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/more%20about%20rooms/views.html
http://www.inventati.org/estupidezartificial/web/papers/multivistas.html
http://gmc.yoyogames.com/index.php?showtopic=323778
En resumen, en el editor de rooms activa 3 vistas marcando la casilla "visible when room starts". Todas pueden tener el mismo tamaño y posición dentro de la room, pero el "port" debe ser distinto en cada una. El port indica el tamaño y la posición dentro de la ventana. Cada vista debe tener asignado un objeto diferente en "object following".
1073
Preguntas y respuestas / Re:Sprite mirando siempre a la cámara en 3D con cualquier eje
Noviembre 05, 2015, 08:05:36 PM
Lo único que debes cambiar es calcular la posición relativa de la cámara respecto al eje:
[gml]
//coordenadas relativas de la camara
Ax = x - vrX;
Ay = y - vrY;
Az = z - vrZ;
//rotar sobre z
Bx = lengthdir_x(Ax,-phi) - lengthdir_y(Ay,-phi);
By = lengthdir_x(Ay,-phi) + lengthdir_y(Ax,-phi);
Bz = Az; //este valor no cambia
//rotar sobre y
Cx = lengthdir_x(Bx,-theta) + lengthdir_y(Bz,-theta);
Cy = By; //este valor no cambia
//Cz = lengthdir_x(Bz,-theta) - lengthdir_y(Bx,-theta);
//angulo
alpha = point_direction( 0,0, Cx,Cy );
[/gml]
[gml]
//coordenadas relativas de la camara
Ax = x - vrX;
Ay = y - vrY;
Az = z - vrZ;
//rotar sobre z
Bx = lengthdir_x(Ax,-phi) - lengthdir_y(Ay,-phi);
By = lengthdir_x(Ay,-phi) + lengthdir_y(Ax,-phi);
Bz = Az; //este valor no cambia
//rotar sobre y
Cx = lengthdir_x(Bx,-theta) + lengthdir_y(Bz,-theta);
Cy = By; //este valor no cambia
//Cz = lengthdir_x(Bz,-theta) - lengthdir_y(Bx,-theta);
//angulo
alpha = point_direction( 0,0, Cx,Cy );
[/gml]
1074
Preguntas y respuestas / Re:Sprite mirando siempre a la cámara en 3D con cualquier eje
Noviembre 05, 2015, 07:00:22 PM
Tal vez no entendí bien. Dejo un ejemplo de cómo lo entiendo
El ángulo inicial lo he calculado como mostré en el mensaje anterior (en el evento End Step) y se aplica en el evento Draw:
[gml]
d3d_transform_set_rotation_z( alpha );
d3d_transform_add_rotation_y( theta );
d3d_transform_add_rotation_z( phi );
draw_set_color( c_white );
d3d_draw_wall( 0,25,50, 0,-25,0, tx1,1,1 );
draw_set_color( c_yellow );
d3d_primitive_begin( pr_linelist );
d3d_vertex( 0,0,0 );
d3d_vertex( 0,0,99 );
d3d_primitive_end();
d3d_transform_set_identity();
[/gml]
- camina con WASD
- gira la vista con el ratón
- cambia theta con los dígitos 1 y 2
- cambia phi con los dígitos 3 y 4
El ángulo inicial lo he calculado como mostré en el mensaje anterior (en el evento End Step) y se aplica en el evento Draw:
[gml]
d3d_transform_set_rotation_z( alpha );
d3d_transform_add_rotation_y( theta );
d3d_transform_add_rotation_z( phi );
draw_set_color( c_white );
d3d_draw_wall( 0,25,50, 0,-25,0, tx1,1,1 );
draw_set_color( c_yellow );
d3d_primitive_begin( pr_linelist );
d3d_vertex( 0,0,0 );
d3d_vertex( 0,0,99 );
d3d_primitive_end();
d3d_transform_set_identity();
[/gml]
1075
Preguntas y respuestas / Re:Sprite mirando siempre a la cámara en 3D con cualquier eje
Noviembre 05, 2015, 06:40:16 AM
Se me ocurren dos formas para calcular el ángulo:
Una es resolver un triángulo esférico.

Primero se deberían calcular las coordenadas esféricas de la cámara (Ecuaciones para transformar de Rectangulares a Esféricas)
En el diagrama a=theta, b=theta de la cámara y C=diferencia de los ángulos phi, del eje y de la cámara. Con esos datos se pueden obtener los otros tres, el ángulo que buscas es el suplemento del ángulo B.
Tengo un script para resolver el triángulo:
[spoiler]
[gml]
///Triángulo Esférico
//Una vez definidos los lados a y b, y el águlo comprendido C,
//se obtienen los ángulos A y B, y el lado c.
//Los datos de entrada y salida se dan en radianes.
var d,D;
if (C == 0) //en dirección del polo norte
{
if (a < b) {A=0; B=pi; c=b-a;}
else {A=pi; B=0; c=a-b;}
}
else if (C == pi) //en dirección del polo sur
{
if (a+b > pi) {A=pi; B=pi; c=2*pi-a-b;}
else {A=0; B=0; c=a+b;}
}
else if (a == b) //es un triángulo isóceles
{
D = C/2;
d = arcsin( sin(a) * sin(D) );
B = arctan( 1 / cos(a) / tan(D) );
A = -B;
c = abs( 2*d );
}
else //es un triángulo oblicuo
{
d = arctan( cos((a-b)/2) / cos((a+b)/2) / tan(C/2) );
D = arctan( sin((a-b)/2) / sin((a+b)/2) / tan(C/2) );
A = -d - D;
B = d - D;
c = 2*arctan( tan((a-b)/2) * sin(d) / sin(D) );
}
[/gml]
[/spoiler]
El segundo método es más sencillo. Rotar el vector de posición de la cámara en el orden inverso a las rotaciones del plano, es decir, primero rotar sobre z un ángulo -phi y después rotar sobre y un ángulo -theta. Una vez rotado se obtiene el ángulo de la proyección sobre el plano xy. El código sería así:
[gml]
//coordenadas de la camara
Ax = obCamara.x;
Ay = obCamara.y;
Az = obCamara.z;
//rotar sobre z
Bx = lengthdir_x(Ax,-phi) - lengthdir_y(Ay,-phi);
By = lengthdir_x(Ay,-phi) + lengthdir_y(Ax,-phi);
Bz = Az; //este valor no cambia
//rotar sobre y
Cx = lengthdir_x(Bx,-theta) + lengthdir_y(Bz,-theta);
Cz = lengthdir_x(Bz,-theta) - lengthdir_y(Bx,-theta);
Cy = By; //este valor no cambia
//angulo
a = point_direction( 0,0, Cx,Cy );
[/gml]
No estoy completamente seguro de los signos en la rotación sobre y, si no funciona, entonces hay que cambiar + por -
Una es resolver un triángulo esférico.

Primero se deberían calcular las coordenadas esféricas de la cámara (Ecuaciones para transformar de Rectangulares a Esféricas)
En el diagrama a=theta, b=theta de la cámara y C=diferencia de los ángulos phi, del eje y de la cámara. Con esos datos se pueden obtener los otros tres, el ángulo que buscas es el suplemento del ángulo B.
Tengo un script para resolver el triángulo:
[spoiler]
[gml]
///Triángulo Esférico
//Una vez definidos los lados a y b, y el águlo comprendido C,
//se obtienen los ángulos A y B, y el lado c.
//Los datos de entrada y salida se dan en radianes.
var d,D;
if (C == 0) //en dirección del polo norte
{
if (a < b) {A=0; B=pi; c=b-a;}
else {A=pi; B=0; c=a-b;}
}
else if (C == pi) //en dirección del polo sur
{
if (a+b > pi) {A=pi; B=pi; c=2*pi-a-b;}
else {A=0; B=0; c=a+b;}
}
else if (a == b) //es un triángulo isóceles
{
D = C/2;
d = arcsin( sin(a) * sin(D) );
B = arctan( 1 / cos(a) / tan(D) );
A = -B;
c = abs( 2*d );
}
else //es un triángulo oblicuo
{
d = arctan( cos((a-b)/2) / cos((a+b)/2) / tan(C/2) );
D = arctan( sin((a-b)/2) / sin((a+b)/2) / tan(C/2) );
A = -d - D;
B = d - D;
c = 2*arctan( tan((a-b)/2) * sin(d) / sin(D) );
}
[/gml]
[/spoiler]
El segundo método es más sencillo. Rotar el vector de posición de la cámara en el orden inverso a las rotaciones del plano, es decir, primero rotar sobre z un ángulo -phi y después rotar sobre y un ángulo -theta. Una vez rotado se obtiene el ángulo de la proyección sobre el plano xy. El código sería así:
[gml]
//coordenadas de la camara
Ax = obCamara.x;
Ay = obCamara.y;
Az = obCamara.z;
//rotar sobre z
Bx = lengthdir_x(Ax,-phi) - lengthdir_y(Ay,-phi);
By = lengthdir_x(Ay,-phi) + lengthdir_y(Ax,-phi);
Bz = Az; //este valor no cambia
//rotar sobre y
Cx = lengthdir_x(Bx,-theta) + lengthdir_y(Bz,-theta);
Cz = lengthdir_x(Bz,-theta) - lengthdir_y(Bx,-theta);
Cy = By; //este valor no cambia
//angulo
a = point_direction( 0,0, Cx,Cy );
[/gml]
No estoy completamente seguro de los signos en la rotación sobre y, si no funciona, entonces hay que cambiar + por -
1076
Juegos completos / Re:Super Metroid Mini
Noviembre 04, 2015, 03:16:45 AM
Yo avancé hasta la parte donde salen metroids y después hay unas puertas bloqueadas, supongo que tengo que encontrar un tótem para abrirlas ,pero ¿dónde está?
Me gustó el método que usas para optimizar las colisiones (cuadros escalados), pero me imagino que debe ser difícil poner código independiente a cada uno, deberías usar GMS que permite escalar los objetos de forma gráfica en el editor.
Me gustó el método que usas para optimizar las colisiones (cuadros escalados), pero me imagino que debe ser difícil poner código independiente a cada uno, deberías usar GMS que permite escalar los objetos de forma gráfica en el editor.
1077
Preguntas y respuestas / Re:¿Script para comprobar un punto (x,y) en un área rectangulular rotada?
Noviembre 03, 2015, 08:26:57 PM
Lo más sencillo sería agregar un sprite al árbol de recursos antes de compilar el juego. De todos modos hice dos scripts, uno para dibujar un rectángulo rotado y el otro para detectar si un punto está adentro:
[gml]
///draw_rectangle_rotated( cx,cy, w,h, ang );
// 0 1 2 3 4
d3d_transform_set_rotation_z( argument4 );
d3d_transform_add_translation( argument0,argument1,0 );
draw_rectangle( -argument2/2, -argument3/2, argument2/2, argument3/2, false );
d3d_transform_set_identity();
[/gml]
[gml]
///point_in_rectangle_rotated( cx,cy, w,h, px,py, ang );
// 0 1 2 3 4 5 6
/* PUNTO EN RECTANGULO ROTADO
cx, cy: centro del rectangulo
w, h: anchura y altura
px, py: punto de prueba
ang: angulo de rotacion
*/
var cx,cy, w,h, px,py, angulo, Ax,Ay, Bx,By;
cx = argument0;
cy = argument1;
w = argument2;
h = argument3;
px = argument4;
py = argument5;
ang = argument6;
//Vector A
Ax = px-cx;
Ay = py-cy;
//Rotar A alrededor del eje z
Bx = lengthdir_x(Ax,ang) + lengthdir_y(Ay,ang);
By = lengthdir_x(Ay,ang) - lengthdir_y(Ax,ang);
//Resultado
return abs(Bx) < w/2 and abs(By) < h/2;
[/gml]
Existen muchas formas de resolver el problema, pero esta es compatible con :GM8: y :GMS:
El script anterior se puede optimizar de esta forma:
[gml]
var Ax,Ay, Bx,By;
Ax = argument4 - argument0;
Ay = argument5 - argument1;
Bx = lengthdir_x(Ax,argument6) + lengthdir_y(Ay,argument6);
By = lengthdir_x(Ay,argument6) - lengthdir_y(Ax,argument6);
return abs(Bx) < argument2/2 and abs(By) < argument3/2;
[/gml]
Adjunto un ejemplo.
[gml]
///draw_rectangle_rotated( cx,cy, w,h, ang );
// 0 1 2 3 4
d3d_transform_set_rotation_z( argument4 );
d3d_transform_add_translation( argument0,argument1,0 );
draw_rectangle( -argument2/2, -argument3/2, argument2/2, argument3/2, false );
d3d_transform_set_identity();
[/gml]
[gml]
///point_in_rectangle_rotated( cx,cy, w,h, px,py, ang );
// 0 1 2 3 4 5 6
/* PUNTO EN RECTANGULO ROTADO
cx, cy: centro del rectangulo
w, h: anchura y altura
px, py: punto de prueba
ang: angulo de rotacion
*/
var cx,cy, w,h, px,py, angulo, Ax,Ay, Bx,By;
cx = argument0;
cy = argument1;
w = argument2;
h = argument3;
px = argument4;
py = argument5;
ang = argument6;
//Vector A
Ax = px-cx;
Ay = py-cy;
//Rotar A alrededor del eje z
Bx = lengthdir_x(Ax,ang) + lengthdir_y(Ay,ang);
By = lengthdir_x(Ay,ang) - lengthdir_y(Ax,ang);
//Resultado
return abs(Bx) < w/2 and abs(By) < h/2;
[/gml]
Existen muchas formas de resolver el problema, pero esta es compatible con :GM8: y :GMS:
El script anterior se puede optimizar de esta forma:
[gml]
var Ax,Ay, Bx,By;
Ax = argument4 - argument0;
Ay = argument5 - argument1;
Bx = lengthdir_x(Ax,argument6) + lengthdir_y(Ay,argument6);
By = lengthdir_x(Ay,argument6) - lengthdir_y(Ax,argument6);
return abs(Bx) < argument2/2 and abs(By) < argument3/2;
[/gml]
Adjunto un ejemplo.
1078
Preguntas y respuestas / Re:DETENER MOVE_TOWARDS
Noviembre 03, 2015, 08:18:24 PM
El equivalente a marcar el cuadro central es
[gml]speed = 0;[/gml]
[gml]speed = 0;[/gml]
1079
Preguntas y respuestas / Re:¿Script para comprobar un punto (x,y) en un área rectangulular rotada?
Noviembre 03, 2015, 03:29:22 PM
Podrías construir el rectángulo con dos triángulos y usar la función point_in_triangle:
http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/point_in_triangle.html
También podrías usar este script:
http://www.gmlscripts.com/script/point_in_polygon
Para calcular las posiciones de los vértices se tienen que usar las funciones lengthdir_*
Deberías dar información más detallada sobre cómo se va a usar el script, seguro se puede escribir uno más eficiente.
http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/point_in_triangle.html
También podrías usar este script:
http://www.gmlscripts.com/script/point_in_polygon
Para calcular las posiciones de los vértices se tienen que usar las funciones lengthdir_*
Deberías dar información más detallada sobre cómo se va a usar el script, seguro se puede escribir uno más eficiente.
1080
Preguntas y respuestas / Re:¿Cómo devolver el ángulo más grande con angle_difference?
Noviembre 01, 2015, 05:27:57 PM
Podría ser así:
[gml]
d = angle_difference( a,b );
if( d > 0 ) d -= 360;
else d += 360;
[/gml]
[gml]
d = angle_difference( a,b );
if( d > 0 ) d -= 360;
else d += 360;
[/gml]