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?
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.
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
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
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!