bajan enemigos, esperan...y vuelven a bajar

Started by zfour, January 12, 2012, 06:58:25 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

zfour

wonas wonaas! Acà aprovechando el tiempo de computacion en el cole para preguntar  ;D

tengo una duda pues yo estoy ayudando a un amigo con su juego en bennu
-...............EDITO porque no se entendia bien jajajah

como muevo todos los procesos de un mismo tipo en una x y????
como elimino un proceso en un lugar de pantalla?

gecko

Para la primera pregunta podes crearte unas variables globales que indiquen la posicion xy a la que deben moverse, y una variable mas que indique que tipo de proceso debe moverse. entonces por ejemplo dentro de cada proceso podrias preguntar

if ( global_tipo == 1 )  // para cada proceso deberia ser un numero distinto
    x = global_x;
    y = global_y;
end


y para la segunda opcion podes definir una region, y preguntar si el proceso se encuentra dentro de esa determinada region, y entonces eliminarlo.

Son soluciones simples, posiblemente habria que ver si se pueden aplicar directamente al codigo que ya tengas, o adaptarla un poquito para que funcione.
Torres Baldi Studio
http://torresbaldi.com

Futu-block

bueno, voy a poner un poquito de codigo, que igual es lo que quieres...

Para matar a los procesos, cada vez que crees uno tienes que asignarle una variable, que supongo que lo sabras, para matarlos hay que hacer   signal(id_enemigo,s_kill);

y para que en una zona muera prueba a hacer:

if (x > 100 and x < 200)
    if (y > 400 and y < 500)
        signal(id_enemigo,s_kill)
    end
end

te lo puesto asi de grande para que lo entiendas, es lo que yo uso porque todavia no le he dao caña a lo de region... :D

Anyeos

Yo hace muchos años que no uso DIV2 ni programo en el. Ahora BennuGD me permite retomar el lenguaje.

Pero bueno, voy a aprovechar a ver si te puedo tirar alguna idea de paso yo también practico.

Yo para mover enemigos todos a la vez usaría como dijo el amigo una variable global pero depende el efecto que quieras (y puede gustarte más uno que otro o podés usar una combinación) podrías hacer que siempre se le asignen las variables globales, entonces todos los enemigos se van a mover al mismo tiempo siempre (modificando las variables globales).

Este es el ejemplo de lo que te digo, en cada proceso asignas siempre las variables globales.
Colocas eso en el bucle del proceso enemigo.
    x = global_x;
    y = global_y;


Ahora la otra idea es que cada enemigo tenga su propia variable (como lo normal) y lanzas a todos los enemigos a la vez. De esa forma te aseguras que todos van a moverse igual si programaste de una forma predecible, o sea, sin usar random ni que tenga posibilidad de cambiar por algo. Entonces si generas muchos clones de tus enemigos todos van a moverse igual (o casi igual depende que tan al mismo tiempo los generes).
Eso da otro efecto en pantalla de movimiento de enemigos que también puede ser divertido.
El código sería como siempre pero procurando usar todo predecible, o sea, o valores fijos, o que se sume siempre lo mismo, y nada de random.

Y el último como te explicaron es usar otra variable para decir si el enemigo tiene que usar el valor global o no. Pero eso te puede hacer "teletransportar" los enemigos. Por eso es mejor programar un algoritmo que haga que los enemigos traten de alcanzar el valor de las variables global en lugar de asignárselo directamente.

Eso le daría un efecto de movimiento a tus enemigos pero todos tratarían de quedar en el mismo lugar todos juntos.

El código sería como esto (también lo colocas en el bucle del proceso enemigo):


if (x > global_x)
x--;
end

if (x < global_x)
x++;
end

if (y > global_y)
y--;
end

if (y < global_y)
y++;
end


Ahora si lo que quieres es que todos queden a la misma "altura" pero no mezclados:
Modificas solamente la variable y


if (y > global_y)
y--;
end

if (y < global_y)
y++;
end


Que tu amigo haga las pruebas y que se quede con el que más le guste.


Ahora para eliminar procesos en lugar de regiones yo usaba en mis viejos tiempos el "típico" límite de pantalla. Que lo definía simplemente con el valor máximo que les dejaba estar en pantalla a los proceso. Es el código que ya escribió Futublock.

Si solamente quieres que se eliminen si están abajo de la pantalla, dependerá de la resolución puedes usar:
if (y > 480)
break;
end
Donde 480 es el lugar de la pantalla (abajo) donde quieres que empiecen a desaparecer.

Utilizo break para salir del bucle que estés usando para tu proceso enemigo (de esa forma termina, muere, desaparece). Si usas más de un bucle sobre otro (cosa que lo dudo) no te va a funcionar, vas a tener que salir de todos los bucles del proceso para hacerlo "morir".

Bueno, espero haber sido de ayuda.

Aprovecho y te dejo un ejemplo del DIV2 que tengo:



//-------------------------------------------------------------------
// TITULO: Tutorial 1
// AUTOR:  Antonio Marchal
// FECHA:  10/10/97
//-------------------------------------------------------------------

PROGRAM Tutorial_1;

GLOBAL
    puntuación=0;     // Variable para guardar la puntuación

BEGIN
    load_fpg("tutorial\tutor1.fpg");  // Se carga el fichero de gráficos
    load_fnt("tutorial\tutor1.fnt");  // Se carga el tipo de letras

    set_mode(m640x480);               // Pone el modo de video 640 x 480
    set_fps(24,0);                    // Número de imágenes por segundo
    put_screen(0,63);                 // Pone la pantalla de fondo
    nave(320,240,41);                 // Crea el proceso nave

    write_int(1,320,0,1,OFFSET puntuación); // Muestra la puntuacion
    FROM x=1 TO 4; asteroide(1); END        // Crea 4 asteroides grandes
    FROM x=1 TO 4; asteroide(21); END       // Crea 4 asteroides pequeños
END

//-------------------------------------------------------------------
// Maneja la nave protagonista
// Entradas: Coordenadas y código del gráfico
//-------------------------------------------------------------------

PROCESS nave(x,y,graph)
BEGIN
    LOOP
        // Comprueba si se pulsan las teclas de izquierda o derecha
        // Y modifica el ángulo si están pulsadas
        IF (key(_left)) angle=angle+10000; END
        IF (key(_right)) angle=angle-10000; END
        // Si se pulsa la tecla de arriba, la nave avanza
        IF (key(_up)) advance(8); END
        // Si se pulsa la tecla control crea un proceso del tipo disparo
        IF (key(_control)) disparo(x,y,angle); END
        // Corrige las coordenadas, para que la nave no desaparezca
        // de pantalla
        corrige_coordenadas();
        FRAME;  // Hace aparecer el gráfico de la nave en pantalla
    END
END

//-------------------------------------------------------------------
// Proceso disparo
// Crea los disparos de la nave protagonista
// Entradas: Coordenadas y ángulo del gráfico
//-------------------------------------------------------------------

PROCESS disparo(x,y,angle)
BEGIN
    // Hace un avance inicial y define el gráfico a usar
    advance(24); graph=42;
    // Mientras el gráfico este dentro de pantalla
    WHILE (NOT out_region(id,0))
        // Hace que avance en el angulo que tenga predeterminado
        advance(16);
        FRAME;  // Hace que el gráfico aparezca en pantalla
    END
END

//-------------------------------------------------------------------
// Proceso asteroide
// Maneja todos los asteroides del juegos tanto grandes como pequeños
// Entradas: Codigo del tipo de asteroide que es su gráfico inicial
//-------------------------------------------------------------------

PROCESS asteroide(código)
BEGIN
    LOOP
        // Crea el asteroide en la esquina superior izquierda
        // (Coordenadas: 0,0) y asigna el código de gráfico
        x=0; y=0; graph=código;
        // Elige un angulo al azar
        angle=rand(-180000,180000);
        LOOP
            // Anima el gráfico, sumando uno a su código
            graph=graph+1;
            // Si sobrepasa el limite de la animación, la reinicia
            IF (graph==código+20) graph=código; END
            // Hace avanzar el gráfico en la direccion determinada
            advance(4);
            // Si colisiona con el gráfico del disparo sale
            // del bucle, que de otra manera no tiene final
            IF (collision (TYPE disparo)) BREAK; END
            // Corrige las coordenadas para que no desaparezca de
            // pantalla, haciendole aparecer por el otro lado
            corrige_coordenadas();
            FRAME;      // Hace que el gráfico salga en pantalla
        END
        puntuación=puntuación+5;    // Suma 5 puntos a la puntuación
        // Pone la animación de la explosion mediante un bucle
        FROM graph=43 TO 62; FRAME; END
    END
END

//-------------------------------------------------------------------
// Proceso corrige_coordenadas
// Corrige las coordenadas del proceso que los llama haciendo
// que dichas coordenadas sean ciclicas en pantalla
//-------------------------------------------------------------------

PROCESS corrige_coordenadas()
BEGIN
    // Si se sale por la izquierda hace que aparezca por la derecha
    // restando para ello el ancho de pantalla
    IF (father.x<-20) father.x=father.x+680; END
    // Si se sale por la derecha hace que aparezca por la izquierda
    IF (father.x>660) father.x=father.x-680; END
    // Si se sale por la arriba hace que aparezca por la abajo
    IF (father.y<-20) father.y=father.y+520; END
    // Si se sale por la abajo hace que aparezca por la arriba
    IF (father.y>500) father.y=father.y-520; END
END



Arcontus

Mira Anyeos, no es para mi la respuesta, pero te lo has currao tanto y como no tienes ningún Karma, pues te estreno yo, ya que con explicaciones como esa da gusto. :D

Por cierto Zfour, lo que buscas no será un scroll?

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com