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.

Mensajes - Clamud

196
Juegos en desarrollo / Re:Cee Ann - Copycat
Abril 14, 2019, 09:23:13 PM
Los nuevos gráficos detallan mejor las caracterísiticas del personaje, pero el diseño no me gusta mucho.
La pantalla de introducción debería poder saltarse.
El sprint no es muy notorio. Al ser una caracterísitca que se usa mucho, podría ser el movimiento por defecto, y que caminar lento se active de otra forma.
Los controles son poco intuitivos. La tecla Enter debería poder seleccionar opciones del menú, estuve presionando varias teclas hasta encontrar la correcta.
¿Es posible saltar desde el agua? También es poco intuitivo nadar hacia abajo con el botón de saltar. Creo que solo puedes nadar hacia abajo si inicias desde la superficie, si quieres nadar hacia abajo desde otra posición no se puede.
Es difícil evadir los enemigos, aparecen de forma inesperada y no hay tiempo para reaccionar.
No encuentro mucho sentido al marco en modo pantalla completa.
Ya no recuerdo bien, pero creo que la demo anterior mostraba más movimientos del personaje. En esta demo se deben desbloquear, pero no entendí cómo se ganan los puntos.
197
Varias instancias pueden usar la misma.
198
El problema en el script es el return. La estructura with es un ciclo que recorre las instancias una a una, cuando utilizas return se termina el ciclo y devulve el id de una sola instancia.

Podrías cambiar el script de esta forma
[gml]
with (argument2) {
   if argument0 > z1 and argument1 < z2 {
      solid = true;
   }
   else {
      solid = false;
   }
}
[/gml]

incluso se puede hacer más simple
[gml]
with (argument2)
solid = (argument0 > z1 and argument1 < z2);
[/gml]

En la función mp_step_potential, el último argumento solo debe ser true o false. Para evadir sólidos utiliza false.
[gml]
mp_potential_step_object(jugador_obj.x, jugador_obj.y, velocidad, false);
[/gml]
199
Puedes usar una path creada previamente en el árbol de recursos.
Antes de agregar nuevos puntos elimina los anteriores con path_clear_points(path)
200
Lo mejor sería que toda la física y lectura de controles se haga a 60 fps. Por lo general lo que toma más tiempo de procesamiento es dibujar en pantalla, y más si es 3D, cuando sea necesario puedes no actualizar el dibujo en pantalla, usando la función draw_enable_drawevent. Para determinar cuándo un step va a tardar más de lo normal puedes usar la variable delta_time.
201
Preguntas y respuestas / Re:Se me ralentiza el juego
Abril 11, 2019, 03:01:17 AM
¿Cada vez que juegas la misma sección se ralentiza?
La mejor forma de saber qué está ocurriendo es ejecutar el juego en modo debug y hacer un profile.
202
Existen muchas formas de hacer el juego, sobre todo muchas formas de programar la física.
Solo googlea "sonic engine gamemaker 8" y encontrarás muchos ejemplos.
203
Escribí un ejemplo y quedó un poco más complicado de lo que esperaba.
En el evento Create define la variable inclinacion, que después podría servir para asignar el ángulo de movimiento de las balas.
[gml]
inclinacion = 0; //angulo de inclinacion
[/gml]
Crea un script "approach" para cambiar gradualmente el valor de inclinación. El script es útil en muchas situaciones
[gml]
/// scApproach(valor, meta, incr);
//if( valor < meta )return min( valor + incr, meta );
//if( valor > meta )return max( valor - incr, meta );
if (argument0 < argument1) return min(argument0 + argument2, argument1);
if (argument0 > argument1) return max(argument0 - argument2, argument1);
return argument0;
[/gml]
En el evento Step cambia la inclinación y asigna el sprite
[gml]
kU = keyboard_check(vk_up); //tecla arriba
kD = keyboard_check(vk_down); //tecla abajo

//si no se presionan las teclas, regresar a posicion horizontal
if (!kU and !kD) inclinacion = scApproach(inclinacion, 0, 3);

//si se presiona arriba o abajo, inclinar
if (kU) inclinacion = scApproach(inclinacion, 15, 3);
if (kD) inclinacion = scApproach(inclinacion, -15, 3);

//asignar sprite
if (inclinacion == 0) {
    sprite_index = spShip;
}
else if (inclinacion > 0) {
    sprite_index = spShipUp;
    image_index = inclinacion / 15;
}
else if (inclinacion < 0) {
    sprite_index = spShipDown;
    image_index = abs(inclinacion / 15);
}
[/gml]
Probé con estos sprites



Puedes ver el código completo aquí: GMLive
204
Bien, primero quiero entneder la organización del juego.
Estás usando 3 sprites para la nave, uno para cada inclinación.
¿Qué código tienes en el evento Draw?
205
Preguntas y respuestas / Re:Juego memoria
Abril 05, 2019, 02:21:08 PM
Aún no entiendo bien cómo es que va a funcionar el juego. Si puedes muestra una captura o un dibujo de cómo se vería.
Creo que necesitas un objeto controlador con 2 estados. En el primer estado reproduce los sonidos y al terminar crea otros objetos con sonidos asignados y pasa a un estado inactivo.
206
¿Qué sprites y código has utilizado?
207
Me faltó escribir el contenido del script sc_actualizar_estado (es algo muy simple)
[gml]
estado = estado_siguiente;
[/gml]
La razón por la que utilizo la variable estado_siguiente es para ejecutar un solo script de estado en cada step. Imagina que al inicio del step el estado es PARADO, entonces el primer if se cumple
[gml]if (estado == EC.PARADO)[/gml]
en ese estado podría cambiar el estado CORRIENDO, la condición del siguiente script también se cumple
[gml]if (estado == EC.CORRIENDO)[/gml]
En los dos scripts hay partes de código iguales, por lo que evito ejecutar el mismo código dos veces.

Otra forma de ejecutar un solo script en cada Step y no usar la variable estado_siguiente es usar switch
[gml]
switch (estado)
{
  case EC.PARADO: sc_estado_parado(); break;
  case EC.CORRIENDO: sc_estado_corriendo(); break;
  case EC.MUERTO: sc_estado_muerto(); break;
}
sc_colisiones();
[/gml]
208
¿Cómo haces el cambio de estado?
¿Es una enumeración de scrips?

Yo he usado algo como esto:

Create
[gml]
// Enumeracion de estados
enum EC {
  PARADO,
  CORRIENDO,
  MUERTO
}
// Estado inicial
estado = EC.PARADO;

// Otras variables de la maquina de estados
estado_siguiente = EC.PARADO;
estado_inicia = true;
[/gml]

Step
[gml]
// Scripts para cada estado
sc_estado_parado();
sc_estado_corriendo();
sc_estado_muerto();
sc_colisiones();
sc_actualizar_estado();
[/gml]
Cada script controla al personaje de manera diferente.

En el script sc_colisiones se realiza el cambio al estado muerto
[gml]
/// sc_colisiones()
//...
if (estado == EC.PARADO or estado == EC.CORRIENDO) {
  if instance_place(x, y, bala) {
    estado_siguiente = EC.MUERTO;
    estado_inicia = true;
  }
}
//...
[/gml]

En el script sc_estado_muerto se realiza la animacion
[gml]
/// sc_estado_muerto()
if (estado = EC.MUERTO)
begin

// Este bloque solo se ejecuta en el primer frame
if (estado_inicia) {
   estado_inicia = false;
   sprite_index = spDead; //cambiar sprite
   image_index = 0; //animacion desde el inicio
   image_speed = 0.1; //velocidad de la animacion
   vx = 0; //velocidad 0
   vy = 0;
}
// Al terminar la animacion, el sprite queda estatico
if (image_index >= image_number-image_speed) {
   image_speed = 0; //detener en la ultima imagen
}

end
[/gml]
209
Existen dos formas
[gml]
with (objeto) instance_destroy();
instance_destroy(objeto);
[/gml]
Si "objeto" es el nombre del objeto, se destruyen todas las instancias de ese objeto. Si quieres destruir solo una instancia, debes obtener el id primero.
210
Los últimos argumentos no deben ser todos 1. Algunos valores deben ser 0, 1 o valores intermedios, dependiendo de cómo quieres que se distribuya la textura. Puedes ahorrar algunas líneas de código usando el tipo pr_trianglelist. También puedes crear los modelos y poner textura con ModelCreator https://www.maartenbaert.be/model-creator/