Febrero 09, 2016, 02:55:44 PM Ultima modificación: Febrero 09, 2016, 03:43:01 PM por cesar561
Hola que tal en mi juego endless runner tengo un problema con mi generador de obstaculos
funciona mediante un objeto controlador que genera cada 4 o x segundos  objetos obstaculo
estos se encuentran en  scripts diferentes en posiciones diferentes. Dejo mi código para que
quede más claro

//OBJETO CONTROL
    //Create
    script_execute(generate);
    //alarm[0]
    script_execute(generate);

//SCRIPT GENERATE
alarm[0] = 120;
randomize();
i= choose(sob1,sob2,sob3);
script_execute(choose(i,i,i),i=random(1));


//SCRIPTS
  //script sob1
  instance_create(room_width+500, y, ob1);
  instance_create(room_width+1000, y, ob1);
  instance_create(room_width+1500, y, ob1);
  instance_create(room_width+2000, y, ob1);

  //script sob2
  instance_create(room_width+500, y, ob2);
  instance_create(room_width+500, y, ob2);



  //script sob3
  instance_create(room_width+500, y, ob3);


Como veran cada script consta de diferente numero de objetos y en diferentes posiciones , el problema esta en que esto provoca que cada vez que se ejecute el script los objetos chocan o aparecen uno ensima de otro  y me gustaría que aparecieran en orden Alguna idea de como hacer esto o mejorar mi código gracias..

Hola. En primer lugar, no es necesario escribir script_execute, mejor solo escribe el nombre del script:
[gml]
///Create o Alarm 0
generate();
[/gml]

Esta es mi sugerencia para el script generate, los demás scripts se encuentran dentro de este:
[gml]
///Script generate
alarm[0] = 120; //reactivar alarma
randomize(); //secuencia aleatoria

x = room_width + 100; //posicion horizontal fija

switch irandom(2) //elegir una posibilidad
{
    case 0: //primera opcion
        repeat( 3 ) //generar 3 objetos
        {
            while not place_free( x,y ) //si no hay lugar vacio
            y = irandom( room_height ); //posicion vertical aleatoria
            instance_create( x,y, ob1 ); //crear instancia
        }
        break;
    case 1: //segunda opcion
        repeat( 2 ) //generar 2 objetos
        {
            while not place_free( x,y ) //si no hay lugar vacio
            y = irandom( room_height ); //posicion vertical aleatoria
            instance_create( x,y, ob2 ); //crear instancia
        }
        break;
    case 2: //tercera opcion
        y = irandom( room_height ); //posicion vertical aleatoria
        instance_create( x,y, ob3 ); //crear instancia
}
[/gml]
Si es un endless runner, lo que debería cambiar es la altura de los obstáculos y la posición horizontal inicial no debería cambiar. El while se va a ejecutar hasta encontrar un punto vacio, después se crea el obstáculo. Aun es posible que los obstaculos queden encimados, porque solo se revisa la colision de un punto, para mejorar el resultado, es mejor que el objeto creador tenga máscara de colision y se use la función place_meeting

#2 Febrero 09, 2016, 07:43:54 PM Ultima modificación: Febrero 09, 2016, 07:51:41 PM por cesar561
Muchas gracias Clamud , funciona muy bien. Sin embargo mi intención es que funcione creando  objetos ya acomodados de cierta manera. Ejemplo. monedas acomodadas tipo zic zac o por columnas ,o moneda obstaculo- moda obstaculo. Etc.... Por eso lo fui estructurando  en diferentes scripts como lo tengo en mi código.Algo como esto...
  //Script1
  instance_create(room_width+1000, y, obstaculo);
  instance_create(room_width+1500, y, moneda );
  instance_create(room_width+2000, y, obstaculo);
  instance_create(room_width+2500, y, moneda );

//Script2

  instance_create(room_width+1000, y, moneda);
  instance_create(room_width+1500, y, moneda );
  instance_create(room_width+2000, y, moneda);
  instance_create(room_width+2500, y, moneda );

Alguna sugerencia para hacer esto?, sin que los objetos de cada script choquen  .En orden????  :(

No se cómo funciona tu proyecto, pero hice un ejemplo suponiendo que la vista es fija y las instancias se desplazan.
Al inicio del juego, el objeto creador genera las estructuras necesarias para llenar un área determinada, después, en cada step se desplazan todas las instancias (incluyendo al creador).
Si las instancias llegan a la izquierda de la pantalla, se destruyen, y si el creador llega a una posición en el lado derecho, se genera otra estructura. Las posiciones donde se crean y se destruyen las instancias se deben modificar para que queden fuera de la vista, las puse así a modo de ejemplo.
Usando este método es posible variar la velocidad de desplazamiento, usa la tecla derecha para avanzar más rápido y la iquierda para frenar.
(Los sprites fueron sacados de http://unluckystudio.com/)


¿Qué versión de GM utilizas? Si es 8.0 prueba con el archivo de abajo.