Program auto;
Global
graficos; puntaje; vidas; tiempo; velocidad;
Begin
set_mode(640, 480, 32);
set_fps(30,0);
graficos=load_fpg("0001.fpg");
start_scroll(0, graficos, 0, 2, 0, 4);
cargar_nivel();
scroll.camera=auto(320,9900);
End
process auto(x,y)
begin
graph=1; ctype=c_scroll;
loop
if (key(_up)) y=y-25; end
if (key(_left)) x=x-5; end
if (key(_right)) x=x+5; end
if (key(_down)) y=y+5; end
frame;
end
end
process cargar_nivel();
private
contador;
begin
from contador=1 to 30;
enemigo();
end
from contador= 1 to 5;
amigo();
end
from contador= 1 to 5;
turbo();
end
end
process enemigo();
begin
graph=5; x=rand(50,600); y=rand(50,9000); ctype=c_scroll;
loop
if (collision(type auto)) puntaje=puntaje+500; break; end
frame;
end
end
process amigo();
begin
graph=4; x=rand(50,600); y=rand(50,9000); ctype=c_scroll;
loop
if (collision(type auto)) puntaje=puntaje-1000; break; end
frame;
end
end
process turbo();
begin
graph=3; x=rand(50,600); y=rand(50,9000); ctype=c_scroll;
loop
if (collision(type auto)) break; end
frame;
end
end
Me da este error, lo empece en gemix a este juego y ahora estoy viendo si lo que hice hasta ahora es compatible con bennu. Uso ubuntu y supuestamente tengo la version 1.0 de bennu. me fije en la wiki de bennu pero segun eso lo estoy haciendo bien.
12: error: Unknown identifier, found "SCROLL"
Gracias.
La referencia a la camara del scroll debería ser así:
scroll[0].camera=auto(320,9900);
La razón es que estás accediendo al scroll 0, y hay que concretarlo
Te falta poner los corchetes después de scroll (scroll[0]).
Uno de los últimos cambios EXIGE que en todo array se añada el índice del mismo o dará error (en este caso, el array predefinido de estructuras SCROLL).
Por cierto, cuando digas qué versión te has descargado, indica la release en lugar de la versión, ya que siempre es la misma. Son tres números después de una r (r223 creo que es la actual).
EDIT: leches, por culpa del error de envío se me ha adelantado pixel :D :D :D
Quote from: PiXeL on February 15, 2011, 07:18:15 PM
La referencia a la camara del scroll debería ser así:
scroll[0].camera=auto(320,9900);
La razón es que estás accediendo al scroll 0, y hay que concretarlo
Quote from: Drumpi on February 15, 2011, 07:21:21 PM
Te falta poner los corchetes después de scroll (scroll[0]).
Uno de los últimos cambios EXIGE que en todo array se añada el índice del mismo o dará error (en este caso, el array predefinido de estructuras SCROLL).
Por cierto, cuando digas qué versión te has descargado, indica la release en lugar de la versión, ya que siempre es la misma. Son tres números después de una r (r223 creo que es la actual).
EDIT: leches, por culpa del error de envío se me ha adelantado pixel :D :D :D
nunca mas equivocados ambos... eso fue un error de 1 version en concreto, ya hace varias versiones esta solventado... el problema seguramente es que te falta importar el modulo de scroll.
te digo mas, para que el ejemplo en cuestion fuincione te faltan todas estas lineas despues de program.
import "mod_scroll";
import "mod_key";
import "mod_video";
import "mod_screen";
import "mod_map";
import "mod_rand";
import "mod_grproc";
Muchas gracias, puse los IMPORT que me dijiste y compilo perfectamente.
Ahora cuando ejecuto el juego.dcb, se aparece la ventana pero esta toda en negro y no pasa de ahi.
¿Sera que los .fpg hechos con Gemix no son compatibles con Bennugd?
Gracias por la ayuda.
Efectivamente, los fpg de Gemix pueden no ser compatibles. De todas formas, no intentes mezclar ambos entornos en tus proyectos, o eres de uno o de otro, o de los dos pero por separado xDDD
Quote from: Woody on February 15, 2011, 08:39:52 PM
Muchas gracias, puse los IMPORT que me dijiste y compilo perfectamente.
Ahora cuando ejecuto el juego.dcb, se aparece la ventana pero esta toda en negro y no pasa de ahi.
¿Sera que los .fpg hechos con Gemix no son compatibles con Bennugd?
Gracias por la ayuda.
no son compatibles, claro.
Quote from: SplinterGU on February 15, 2011, 08:08:00 PMnunca mas equivocados ambos... eso fue un error de 1 version en concreto, ya hace varias versiones esta solventado... el problema seguramente es que te falta importar el modulo de scroll.
te digo mas, para que el ejemplo en cuestion fuincione te faltan todas estas lineas despues de program.
import "mod_scroll";
import "mod_key";
import "mod_video";
import "mod_screen";
import "mod_map";
import "mod_rand";
import "mod_grproc";
Leches, era mi primera opción, pero la descarté por ser demasiado obvia, pensaba que tendría un fichero BGDC.import por ahí ^^U
Volvi a hacer el FPG con el editor del usuario PRG. Todo desde Bennu, ya no uso Gemix y la pantalla se sigue quedando en negro como les comente en el post anterior. Ahora no se me ocurre que podra ser.
Lo volvi a compilar, y todo. Lo tenia en 32 bits al FPG y lo pase a 16 para ver si era eso, pero nada.
Uso el BGDC 1.0.0 (Feb 2 2011 17:04:13).
Gracias
si queres mandame un paquetito con todo lo necesario para correr el programa, y lo pruebo y te digo cual es el problema.
Aca te lo dejo.
EDIT: Probe desinstalando bennu e instalandolo desde los repositorios pero sigue igual.
proba con este codigo
Program autos;
import "mod_scroll";
import "mod_key";
import "mod_video";
import "mod_screen";
import "mod_map";
import "mod_rand";
import "mod_grproc";
Global
graficos; puntaje; vidas; tiempo; velocidad;
Begin
set_mode(640, 480, 16);
set_fps(30,0);
graficos=load_fpg("0001.fpg");
start_scroll(0, graficos, 2, 0, 0, 4);
cargar_nivel();
scroll.camera=auto(320,9900); //seguir al auto
End
process auto(x,y)
begin
file=graficos;graph=1; ctype=c_scroll;
loop
if (key(_up)) y=y-25; end
if (key(_left)) x=x-5; end
if (key(_right)) x=x+5; end
if (key(_down)) y=y+5; end
frame;
end
end
process cargar_nivel();
private
contador;
begin
from contador=1 to 30;
enemigo();
end
from contador= 1 to 5;
amigo();
end
from contador= 1 to 5;
turbo();
end
end
process enemigo();
begin
file=graficos;graph=5; x=rand(50,600); y=rand(50,9000); ctype=c_scroll;
loop
if (collision(type auto)) puntaje=puntaje+500; break; end
frame;
end
end
process amigo();
begin
file=graficos;graph=4; x=rand(50,600); y=rand(50,9000); ctype=c_scroll;
loop
if (collision(type auto)) puntaje=puntaje-1000; break; end
frame;
end
end
process turbo();
begin
file=graficos;graph=3; x=rand(50,600); y=rand(50,9000); ctype=c_scroll;
loop
if (collision(type auto)) break; end
frame;
end
end
Anduvo, muchas gracias. Era el scroll. :P
de nada...
y tambien tenes que meter los file en los procesos que usen graph... es una mala costumbre no hacerlo...
si puedo preguntar aqui tambien sobre los escroles para no abrir un hilo nuevo...
si empiezo el juego con un scrol con grafico pongamos que 501, en el begin del inicio del juego y quiero que al pasar de pantalla como se haria???
[code language="bennu"]begin
set_mode(320,240,32,mode_window);
una_var = load_fpg("carpeta/imagenes.fpg");
id_prota = prota(); // Almacenamos en ella el identificador del proceso
start_scroll ( 0 , 0 , 501 , 0 , 0 , 0 ); // Iniciamos el scroll <=--=== ese es el que quiero modificar al pasar de pantalla, el 501
scroll [ 0 ].camera = id_prota; // Centramos la cámara del scroll en el proceso
end
[/code]
basta con poner una variable en vez del numero y cambiarla al antojo?????
que al pasar de pantalla que?
te falto escribir algo.
ahi veo en el codigo, no, pues no... tienes que hacer otro start_scroll.
como está en el begin del inicio, mejor ponerlo en cada proceso el scrol necesario ¿no?
si el scroll cambia deberias, ahora si el nuevo scroll usa el mismo id de grafico no es necesario.
¿Pero habría que meter un stop_scroll primero o al usar start_scroll en el mismo índice del array se reinicia todo?
Que pregunte estas cosas yo... ;)
no hace falta.
lo que dije del mismo id no es asi, si se modifica el mismo map funciona, ahora si se cambia el grafico aunque use el mismo id ahi no funcionara.
que vá, me estoy rayando a tope y no tengo ni zorra de como cambiar el scroll al pasar de fase
Cada vez que quieras cambiar de gráfico en el scroll tienes que llamar a start_scroll con un valor de graph (y opcionalmente, de fondo) distinto.
Otra cosa es que quieras modificar el mapa que esté usando en ese momento, por ejemplo, con comandos put, entonces debería aceptar los cambios (para hacer agujeros al escenario estilo worms con draw_circle)
pero ese star_scroll puede ir en un loop o que??
Quote from: Futublock on February 17, 2011, 09:55:06 AM
pero ese star_scroll puede ir en un loop o que??
no tiene mucho sentido llamarla constantemente.
Hombre, podría ir, pero el rendimiento bajaría escandalosamente ^^U
No sé qué quieres hacer pero dudo mucho que quieras estar cambiando de imagen de scroll a cada frame. En ese caso es más efectivo dibujar sobre el propio mapa o crearte tu propio motor de scroll.
no, voy a empezar del principio y nos entenderemos:
inicio un proceso juego() con su begin que ejecuta un scroll con grafico '501'
paso de pantalla o fase y ya no necesito el grafico '501' sino el '502'
donde deberia ir tol royo del scroll?? cada scroll en un proceso que se inicie en cada pantalla y se destruya al final de ella????
En este caso te aconsejo que, aparte de juego, tengas un proceso que se llame "ejecutar_nivel" y le pases el número de nivel por parámetro (créeme, a la larga es mejor, por si luego haces selector de niveles, para depuración, o símplemente no se ejecutan en el mismo orden), que se encargue de cargar los recursos, inicializar las variables del nivel y de descargar y cerrar recursos al terminarlo.
Te lo digo porque en el Echo no lo hice y ahora tengo que reescribir el proceso entero si quiero hacer el Doggy!!!, que usa una estructura de mapas no lineal (estilo Metroid).
Y respecto al scroll, lo correcto es que cierres el scroll cuando acabes con él y lo vuelvas a abrir en el nuevo nivel (si sigues mi consejo, más que necesario es obligatorio), porque, en teoría, hace limpieza de variables internas al cerrar.
Creo que es la forma correcta y elegante de proceder, pero que puedes iniciar un nuevo nivel con un nuevo start_scroll, por supuesto, pero luego a ver cuándo lo cierras ;)
(http://3.bp.blogspot.com/_-IC5HUwYohA/S8gmES1vsLI/AAAAAAAAC50/03C7bNEZ4vk/s400/ladrillo.jpg)
puf, al final no sé que hacer para ponerlo, si en un proceso nuevo o yo que se...
mandamé un ejemplito anda, aunque sea por mp, por basico que sea
futu, no necesitas un proceso... lo pones en la logica de inicio (start_scroll) y fin (stop_scroll) del nivel, no se porque te enrollaste tanto en esto.
¿antes del end final?
ya...
Quote from: Futublock on February 17, 2011, 10:56:05 PM
¿antes del end final?
ya...
donde quieras... cuando termina tu nivel (salir al menu, pasar a otro nivel, etc) haces un stop... cuando empieza tu nivel (inicio del juego, nuevo nivel, etc) haces un start
Futu, te diría que mirases el código de cierto juego que conocemos bien tu y yo (SBT), concretamente el nivel 6, pero como sé que no lo vas a hacer, te lo copio aquí, simplificado:
[code language="bennu"]process level_6 ()
private
int l6_graficos[2];
int l6_loaded_music;
int l6_music_id;
int l6_instr;
int l6_room;//,l6_room_ant;
int hijos[4];
int cont;
begin
//CARGA DE RECURSOS*************************************************
l6_graficos[0]=load_fpg("graf/level06/prota.fpg");
l6_graficos[1]=load_fpg("graf/level06/tiles.fpg");
l6_loaded_music=load_song("sound/level06/level06.ogg");
//inicialización final de datos
exit_mode=0;
//l6_room_ant=0;
l6_room=1;
prota_info.energia=4;
//interfaz
hijos[0]=level_6_miss( 20,20,-20,l6_graficos[0],150,151,4);
hijos[1]=level_6_miss( 60,20,-20,l6_graficos[0],150,151,3);
hijos[2]=level_6_miss(100,20,-20,l6_graficos[0],150,151,2);
hijos[3]=level_6_miss(140,20,-20,l6_graficos[0],150,151,1);
hijos[4]=l6_vidas_restantes(l6_graficos[0]);
//ponemos la música
l6_music_id=l6_music(l6_loaded_music);
//**********************************************************************
while (exit_mode==0)
switch (l6_room)
case 0..19:
//LINEA IMPORTANTE
l6_play_platform_room(l6_graficos[0],l6_graficos[1],l6_room);
//ESPERA A QUE TERMINE EL NIVEL, DEVUELVE UN VALOR EN LA VARIABLE GLOBAL exit_mode
//0: no ha terminado
//1: termina con éxito
//2: termina pero ha muerto
//3: termina porque le ha dado a la opción de salir
signal(id,s_sleep);
frame;
if (exit_mode==1)
exit_mode=0;
if (l6_room==10)
l6_room=99;
else
l6_room++;
end
end
end
case 99: //fase especial del paracaidas
l6_dificultad=6;
l6_play_falling_room(l6_graficos[0],l6_graficos[1]);
//la salida del nivel aquí cambia un poco
//signal(id,s_sleep);
//frame;
while ((id_tscroll.camera_y<5000) && (exit_mode==0))
frame;
end
if (exit_mode==0)
exit_mode=1;
signal(id,s_freeze);
frame;
end
if (exit_mode==1)
exit_mode=0;
l6_room=11;
end
end
case 20: //monstruo
if (exists(l6_music_id)) signal(l6_music_id,s_kill); end
fade_music_off(1000);
unload_song(l6_loaded_music);
l6_loaded_music=load_song("sound/level06/boss1.ogg");
l6_music_id=l6_music(l6_loaded_music);
l6_graficos[2]=load_fpg("graf/level06/boss.fpg");
l6_play_boss_room (l6_graficos[0],l6_graficos[1],l6_graficos[2]);
signal(id,s_sleep);
frame;
unload_fpg(l6_graficos[2]);
if (exit_mode==1)
//loop frame; end
end
end
default: exit_mode=3; end
end //switch
frame;
end
//FIN DEL NIVEL, DESCARGA DE RECURSOS*****************************************
for (cont=0;cont<=1;cont++)
unload_fpg(l6_graficos[cont]);
end
//quitamos la musica
if (exists(l6_music_id)) signal(l6_music_id,s_sleep); end
fade_music_off(1000);
frame(5000);
if (exists(l6_music_id)) signal(l6_music_id,s_kill); end
unload_song(l6_loaded_music);
if (exists(hijos[0])) signal(hijos[0],s_kill); end
if (exists(hijos[1])) signal(hijos[1],s_kill); end
if (exists(hijos[2])) signal(hijos[2],s_kill); end
if (exists(hijos[3])) signal(hijos[3],s_kill); end
if (exists(hijos[4])) signal(hijos[4],s_kill_tree); end
//***********************************************************************
//fade(100,100,100,3);
signal(father,s_wakeup);
frame;
end[/code]
Como ves, este proceso es independiente del resto del programa, basta con llamarlo para ejecutar el nivel 6, sólo necesita saber el número de vidas y algún detalle extra, pero esto se lo pasan los procesos:
-Que ejecuta el modo historia, cuando el jugador llega al nivel 6.
-Que ejecuta sólo este nivel desde el level_select.
-Proceso de debug, que debe andar por ahí todavía.
Además, si te fijas, este proceso llama a
l6_play_platform_room(l6_graficos[0],l6_graficos[1],l6_room);
que sólo necesita saber los gráficos que debe usar y el número de nivel, y ejecuta sólo uno de los niveles (el proceso está justo encima del que te he escrito), o puede llamar a otros minijuegos como el falling_room o el mostruo final en mitad del desarrollo del nivel.
Pero el scroll se inicializa y se termina cada vez, en el proceso l6_play_platform_room.
que vá, si eso lo miré y no lo entiendo muy bien, y empecé con la inteligencia artificial de los enemigos
de todas formas repasaré bien lo que mas puesto a ver que comprendo
edito:
al fin lo he calao, jo el trabajo que me ha costao una pamplina tan enorme; joño, es que hay que comprenderolo, si no lo razono lo pongo por poner y si vá va, y no me gusta