Agosto 09, 2015, 03:31:36 PM Ultima modificación: Agosto 09, 2015, 04:35:30 PM por denvzla
 :'(
Buenas, estoy creando mi primer videojuego y quiero colocar un modo oleada el problema es cuando quiero que los enemigos aparezcan aleatoriamente en el escenario sin que aparezca encima de otro objeto es decir sin colisionar, lo he intentado de mil maneras y no logra funcionar algunos aparecen bien otros si colisionan

Este es el codigo : se ejecuta 5 veces (para aparecer 5 enemigos) en un lugar aleatorio verificando que no exista colision, no funciona :'( >:( :'(

for  (i = 0; i < 5; i += 1)   
        {
        xx = random(room_width);
        yy = random(room_height);
        if  !(collision_circle(xx,yy,1500,cama_09+cama_011+Planta3+Estante2+Estante6+Estante3+obj_san_deco_01+obj_san_deco_03
        +Obj_silla_04+oobj_mesa_02+Personaje+Pared1_0+Pared_3_0+Pared_3_1+Pared1_1+Pared2_1+Pared2_2+Pared2_3+Pared2_4+pared_abajo1,0,0))
        {
        instance_create(xx,yy,Zombi_01)
        }


En primer lugar, el cuarto argumento de la función collision_crircle debe ser un solo objeto; no puedes "sumar" objetos para indicar que quieres hacer la prueba de colisión con varios tipos de objeto. En este caso te sugeriría que agrupes los objetos bajo el mismo parent, por ejemplo un objeto "escenario" que sea parent de todos los objetos del escenario que representan obstáculos a la hora de encontrar un espacio para colocar al zombie.

En segundo lugar, dado que buscas coordenadas aleatorias para el zombie, nada te garantiza que en 5 ciclos de for vas a encontrar siquiera una posición libre. Lo que debieras hacer es, por ejemplo, usar un do/until dentro del for de esta manera:

for(i=0;i<5;i+=1)   
    {
    do
        {
        xx=random(room_width);
        yy=random(room_height);
        }
    until !collision_circle(xx,yy,1500,escenario,0,0)
    instance_create(xx,yy,Zombi_01)
    }


Por cierto, una distancia libre de 1500 a la redonda de cada obstáculo es bastante grande.


Cita de: Guacusio en Agosto 09, 2015, 04:07:25 PM
En primer lugar, el cuarto argumento de la función collision_crircle debe ser un solo objeto; no puedes "sumar" objetos para indicar que quieres hacer la prueba de colisión con varios tipos de objeto. En este caso te sugeriría que agrupes los objetos bajo el mismo parent, por ejemplo un objeto "escenario" que sea parent de todos los objetos del escenario que representan obstáculos a la hora de encontrar un espacio para colocar al zombie.

En segundo lugar, dado que buscas coordenadas aleatorias para el zombie, nada te garantiza que en 5 ciclos de for vas a encontrar siquiera una posición libre. Lo que debieras hacer es, por ejemplo, usar un do/until dentro del for de esta manera:

for(i=0;i<5;i+=1)   
    {
    do
        {
        xx=random(room_width);
        yy=random(room_height);
        }
    until !collision_circle(xx,yy,1500,escenario,0,0)
    instance_create(xx,yy,Zombi_01)
    }


Por cierto, una distancia libre de 1500 a la redonda de cada obstáculo es bastante grande.
:o ;D ;D amigo muchas gracias funciono, es mi primer juego y estoy aprendiendo muchas gracias  :love: