Saludos, soy nuevo en esto de bennu pero por mas que miro la pagina oficial o me meto en este foro no encuentro la forma de poder ejecutar mi primer programa o juego en bennu, no se compilarlo y no parais de hablar de instalaciones y no he instalado nada, en la web de bennu tampoco me dice nada que instalar o por lo menos no lo veo...
soy muy torpe o no doy con la tecla, necesito explicación para torpisimos porque no doy con la tecla valga la rebundancia
ayuda por favor :-[ :-[ :-[
QuotePara descargar Bennu, tendrás que ir a la sección de "Downloads" de la página oficial:
http://www.bennugd.org . Allí verás que tienes varias opciones a elegir, pero la que ahora nos interesa seleccionar a
nosotros es, obviamente, el instalador para Windows....
Bien, una vez descargado este ejecutable (que ocupa tan sólo 2 MB),
si lo pones en marcha verás cómo aparece una ventana que simula la apariencia de una especie de consola portátil,
donde se pueden apreciar a la izquierda varios botones
esta es la parte que a mi no me aparece...
Lo primero de todo: Bienvenido.
A la izquierda de la página deberías ver una barra gris con una serie de enlaces: "News", "What is Bennu?", "Downloads"... Para que no quede lugar a la duda, deberías ver algo como lo del screenshot (las flechas marcan el lugar).
(http://forum.bennugd.org/index.php?action=dlattach;topic=1023.0;attach=786)
En cualquier caso, el enlace a la página de descargas es:
http://www.bennugd.org/?q=node/2
gracias josebita, lo unico que digo que instalarse no se instala nada...
¿no?
cuando por cmd ejecuto bgdc, me pone que no se reconoce como comando interno o externo...
entonces ¿hay que instalar algo???
bueno bueno, siento daros tanto la lata (suerte que es temprano y alguno anda con resaca... ;D) pero resulta que escribí mal lo del ''bgdc''; al ponerlo correcto me aparece algo como error file not found...
¿estoy llegando al final del camino???
ultima modificacion:
Ya me doy por vencido, he encontrado la manera de compilarlo pero no soy capaz de generar un archivo .dcb, ¿que estoy haciendo mal? trabajo con los bgdc.exe y bgdi.exe en windos y los codigos los he copiado y pegado el Manual bennu, aparte me he bajado el bennu de la zona de descargas. Creo que necesito algo mas, alguna instalacion de algo o algunas librerias de yo que se...
no puedo sin ayuda
Que sistema operativo usas? Linux, xp, vista w7?
Otra opcion es que te bajes y te instales el BennuPack version 1,7 que trae el notepad+ preparado para Bennu.
Haz tu codigo con el programa dale al f6 y a funcionar.
Cuando le hayas cogido el tranquillo empieza a investigar como va todo el tema.
Lo que tu comentas de instalar es porque en versiones anteriores venia un programa escrito en Bennu que te "instalaba" todo el asunto... aunque realmente no se necessita instalar nada.
Saludos
Como dice Hokutoy, es que en versiones anteriores venía un instalador, que lo que hacía es que añadía la carpeta de los comandos de Bennu (bgdc y bgdi) a la lista de comandos de windows (si, esa en donde están cosas como CD, DIR, SCANDISK, etc...). Esta última versión no viene así, vienen directamente los ejecutables y librerías.
Puedes descargar una versión con instalador desde http://betatester.bennugd.org/snapshot/ (concretamente, la última con instalador es http://betatester.bennugd.org/snapshot/bgd-1.0.0RC9(r105)-win32.exe) y luego ir sobreescribiendo las siguientes versiones (cual firms de gp2x ;D).
O bien hacer como yo, y tenerlo en una carpeta aparte, y usar un script (un archivo de texto con extensión .BAT) parecido a este:
set BENNUROOT=c:/BennuGD
set JUEGO=mijuego
set PATH=%BENNUROOT%/binarios/bin;%BENNUROOT%/binarios/externals;%BENNUROOT%/binarios/libs;%BENNUROOT%/binarios/modules;%PATH%
bgdc %JUEGO%.prg
bgdi %JUEGO%.dcb
Suponiendo que bennu lo tengas en C:/BennuGD/binarios/, si cambias la primera linea lo puedes poner donde te venga en gana.
O ya, a lo bestia, hacer como con Fenix: copiar los exes de bennu, las librerías y usar la linea de comandos como siempre.
yo lo que hago es copiar y pegar lo que viene en externals, libs, modules, etc, etc, etc en la carpeta bennugd/bin (o en otra) y luego en mi editor de código favorito le digo que compile e interprete desde esa carpeta. lo que pasa es que antes se agregaban unas lineas al sistema que le decian donde buscar los ejecutables y las dll de bennu, pero ahora no es asi.
saludos
Datos personales:
Trabajo en windo$ directamente, y con el notepad++ creo que se llama así que puede que por eso me dé el prolema, que creo que no :( ... tambien tengo instalado el fenix pack que no sé si me incomoda para trabajar con bennu... ni npi
lo que me dá rabia es que:
-creo en la carpeta en c:\BennuGD\bin un archivo .prg (juego.prg)
-esa carpeta contiene el bgdc.exe y bgdi.exe + un tal libbgdrtm.dll que es una libreria y uno que pone moddesc.exe
-en cmd de windows escribo literalmente con mayusculas incluidas:[code language="bennu"]C:\BennuGD\bin\bgdc juego.prg[/code]
y me aparece el siguiente error:
[code language="bennu"]C:\BennuGD\bin\bgdc juego.prg: file not found <EOF>[/code]
imagen:
(http://img191.imageshack.us/img191/9258/cmd.jpg)
Nota: El juego que he creado se llama en realidad neuvo.prg, pero es que dá el mismo problema que si te inventas el nombre, creo que el fallo es de la ruta o incluso que deberia cambiar de orientación las barras \ y /
En la imagen estas poniendo directamente el nombre del prg sin usar el bgdc.exe... Creo que estas con prisas y te estarás equivocando en algun nombre al compilar, o en su llamada, esa imagen sobra la verdad.
Lo mejor será que pongas el error exacto con una pantalla real.
Será que a lo mejor no hay que abrir el cmd...
te digo lo que he hecho:
-le doy donde pone inicio despues en ejecutar, escribo cmd.exe y ahí es donde escribo lo de [code language="bennu"]C:\BennuGD\bin\bgdc juego.prg[/code]
¿sera que hay que darle a lo de ms-dos????
estoy totalmente en blanco y como no solucione esto me aburro como pasó con fenix, y no quiero
Si usas el bennupack, el notepad++ segun recuerdo tiene el en menu la opcion de compilar / ejecutar
yo uso Flamebird, el notepad++ no me convence mucho
u.u
De esa forma tienes que tener el prg en la misma carpeta del bgcd. Haz como yo no te lies, pones todos los ficheros de Bennu en la misma carpeta (binarios, dll's, etc), creas un Bat llamado Compilar.bat y otro Ejecutar.bat, en el primero escribes: @bgdc juego.prg y en el segundo: @bgdi juego.dcb. Y listo, ya no tendras problemas. Cada vez que edites el prg (el notepad++ es el que yo uso), lo salvas y le das al compilar y despues al ejecutar.
En la imagen pone "jego.prg" no "juego.prg"... Quizás el error sea por eso....
haz CD y ve al directorio donde tienes el bgdc, el bgdi y el prg, luego escribes:
bgdc juego.prg
Así debería compilar, si no lo hace... es posible que sea problema de poner rutas con espacios. De todas formas, yo tengo el notepad++ y no uso nunca el boton de compilar. Como mucho abro la ventana de comandos e invoco el .bat que tengo para compilar y ejecutar (normalmente porque tengo muchas ventanas abiertas y el explorador de windows lo tengo en un directorio de gráficos o similar).
Carajo, que se baje el primer videojuego de ejemplo de mi tutorial, que viene con las DLLs y todo listo para que modifiques, esa es la idea:
http://trinit.es/videojuegos/Videojuego%20Tema%204.zip (http://trinit.es/videojuegos/Videojuego%20Tema%204.zip)
Quote from: Futublog on December 13, 2009, 07:46:31 PM
Datos personales:
Trabajo en windo$ directamente, y con el notepad++ creo que se llama así que puede que por eso me dé el prolema, que creo que no :( ... tambien tengo instalado el fenix pack que no sé si me incomoda para trabajar con bennu... ni npi
lo que me dá rabia es que:
-creo en la carpeta en c:\BennuGD\bin un archivo .prg (juego.prg)
-esa carpeta contiene el bgdc.exe y bgdi.exe + un tal libbgdrtm.dll que es una libreria y uno que pone moddesc.exe
-en cmd de windows escribo literalmente con mayusculas incluidas:[code language="bennu"]C:\BennuGD\bin\bgdc juego.prg[/code]
y me aparece el siguiente error:
[code language="bennu"]C:\BennuGD\bin\bgdc juego.prg: file not found <EOF>[/code]
imagen:
(http://img191.imageshack.us/img191/9258/cmd.jpg)
Nota: El juego que he creado se llama en realidad neuvo.prg, pero es que dá el mismo problema que si te inventas el nombre, creo que el fallo es de la ruta o incluso que deberia cambiar de orientación las barras \ y /
eso que te pasa es normal porque te hacen falta las librerias que se encuentras en modules y en externals dentro de la carpeta bin, cortalas y pegalas en bin, luego arrastra el prg sobre el bgdc, y luego el dcb que se genere sobre el bgdi. cuando te funcione te ayudamos a instalar un editor como el context o el flamebird o algun otro. saludos.
pasos desglosados:
1) entra a la carpeta bennugd/externals, copia o corta todo lo que hay ahí y pégalo en la carpeta bennugd/lib
2) entra a la carpeta bennugd/modules y copia o corta todo lo que hay ahí y pégalo en la carpeta bennugd/lib
3) haz lo mismo con todas las otras carpetas que haya dentro de bennugd, excepto con lib, claro.
4) ahora arrastra como dice atrás tu archivo al bgdc, y el dcb generado al bgdi.
ahora debes tener tu programa compilado y ejecutándose. saludos
Quote from: Rein (K´)ah Al-Ghul on December 13, 2009, 08:11:14 PM
Si usas el bennupack, el notepad++ segun recuerdo tiene el en menu la opcion de compilar / ejecutar
yo uso Flamebird, el notepad++ no me convence mucho
u.u
me he buscado un flamebird pero no me lo abre, ¿sera que tengo fenix instalado en c:\?
Quote from: FreeYourMind on December 13, 2009, 08:16:15 PM
De esa forma tienes que tener el prg en la misma carpeta del bgcd. Haz como yo no te lies, pones todos los ficheros de Bennu en la misma carpeta (binarios, dll's, etc), creas un Bat llamado Compilar.bat y otro Ejecutar.bat, en el primero escribes: @bgdc juego.prg y en el segundo: @bgdi juego.dcb. Y listo, ya no tendras problemas. Cada vez que edites el prg (el notepad++ es el que yo uso), lo salvas y le das al compilar y despues al ejecutar.
Quote from: Windgate on December 14, 2009, 01:09:45 AM
Carajo, que se baje el primer videojuego de ejemplo de mi tutorial, que viene con las DLLs y todo listo para que modifiques, esa es la idea:
http://trinit.es/videojuegos/Videojuego%20Tema%204.zip (http://trinit.es/videojuegos/Videojuego%20Tema%204.zip)
Los ejemplos en .bat me funcionan perfect y no me importaria trabajar en .bat, lo que pasa que al cambiar un grafico por ejemplo no rula, seguiré probando de todas formas...
¿que propiedades necesitan los graficos? que sean .png y que mas guardado en el fpg?? o el fpg se encarga ya de adaptarlos...
Quote from: josebita on December 13, 2009, 09:16:59 PM
En la imagen pone "jego.prg" no "juego.prg"... Quizás el error sea por eso....
je je, eso ha sido un error de imprenta, ya que el juego en cuestion se llama
neuvo.prgQuote from: Drumpi on December 14, 2009, 12:42:28 AM
haz CD y ve al directorio donde tienes el bgdc, el bgdi y el prg, luego escribes:
bgdc juego.prg
Así debería compilar, si no lo hace... es posible que sea problema de poner rutas con espacios. De todas formas, yo tengo el notepad++ y no uso nunca el boton de compilar. Como mucho abro la ventana de comandos e invoco el .bat que tengo para compilar y ejecutar (normalmente porque tengo muchas ventanas abiertas y el explorador de windows lo tengo en un directorio de gráficos o similar).
Yo soy mas torme de lo que parece, porque no entiendo lo que es hacer CD
Quote from: Drumpi on December 14, 2009, 12:42:28 AM
haz CD y...
Quote from: Prg on December 14, 2009, 01:30:41 AM
Quote from: Futublog on December 13, 2009, 07:46:31 PM
Datos personales:
Trabajo en windo$...
imagen:
(http://img191.imageshack.us/img191/9258/cmd.jpg)
Nota: El juego que he creado se llama en realidad neuvo.prg, pero es que dá el mismo problema que si te inventas el nombre, creo que el fallo es de la ruta o incluso que deberia cambiar de orientación las barras \ y /
eso que te pasa es normal porque te hacen falta las librerias que se encuentras en modules y en externals dentro de la carpeta bin, cortalas y pegalas en bin, luego arrastra el prg sobre el bgdc, y luego el dcb que se genere sobre el bgdi. cuando te funcione te ayudamos a instalar un editor como el context o el flamebird o algun otro. saludos.
pasos desglosados:
1) entra a la carpeta bennugd/externals, copia o corta todo lo que hay ahí y pégalo en la carpeta bennugd/lib
2) entra a la carpeta bennugd/modules y copia o corta todo lo que hay ahí y pégalo en la carpeta bennugd/lib
3) haz lo mismo con todas las otras carpetas que haya dentro de bennugd, excepto con lib, claro.
4) ahora arrastra como dice atrás tu archivo al bgdc, y el dcb generado al bgdi.
ahora debes tener tu programa compilado y ejecutándose. saludos
la carpeta pone
libs...
seguiré probando...
[answer]
Chavales, lo del .bat del ejemplo videojuego tema 4 va funcionando, pero seguiré intentando mas por otro lado...
¿eesto ya sirve de videojuego o hay que compilarlo????
Puedes editar el código (Archivo .prg) y volver a darle al .bat para compilar y ejecutar.
La pena es que las DLL que lleva son de una versión de hace un par de meses, pero si acabas de empezar yo creo que te sobra.
OK, la cosa pinta super genial, pero tengo algunos problemillas con un random:
[code language="bennu"]
IF (key(_right))
x=x+rand(1,6);
END
[/code]
creo que está escrito correctamente, me faltará alguna libreria???
el fallo del .bat me pone:
warbubg: Variable redeclared ("ALPHA_STEPS")
:13: error: Undefined procedure ("RAND")
yo, por lo poco ingles que sé pone algo de "variable redeclarada" y procedimiento no definido...
Así en rapido:
El error es, como el mismo error te indica, porque te falta unos ";" EN LA LINEA 8
protagonista();
El proceso enemigo no se crea porque no lo llamas. Pon, en la linea 8:
protagonista();enemigo();
Saludos!
Acostúmbrate a ese error porque vas a verlo trillones de veces, olvidarte el ';' al final de una instrucción.
Y apunta este otro porque además de tenerlo trillones de veces el compilador no es capaz de predecir en qué punto cometiste el fallo:
Las etiquetas BEGIN, LOOP, IF, FROM, WHILE requieren un END para finalizarlas, si en algún momento falta un END (Verás que pronto te pasa) el compilador no puede saber cuál es la etiqueta que falta de cerrar, así que suele dar un error más abajo, generalmente: "Unknown identifier PROCESS".
Hala, a sufrir, tranquilo que llegará un momento en el que ya nunca te vuelvan a pasar esos errores típicos porque acabarás harto de tener siempre los mimos :P
hombre, ahora empezando no está mal, con el game-editor no pasaba, pero si querias hacer algo medio en condiciones tenias que picar codigo, y para picar codigo me paso a fenix, y en este caso a Bennu
je je je
OK, la cosa pinta super genial, pero tengo algunos problemillas con un random:
[code language="bennu"]
IF (key(_right))
x=x+rand(1,6);
END
[/code]
creo que está escrito correctamente, me faltará alguna libreria???
el fallo del .bat me pone:
warbubg: Variable redeclared ("ALPHA_STEPS")
:13: error: Undefined procedure ("RAND")
yo, por lo poco ingles que sé pone algo de "variable redeclarada" y procedimiento no definido...
Quote from: Futublog on December 15, 2009, 05:21:26 PM
OK, la cosa pinta super genial, pero tengo algunos problemillas con un random:
[code language="bennu"]
IF (key(_right))
x=x+rand(1,6);
END
[/code]
creo que está escrito correctamente, me faltará alguna libreria???
el fallo del .bat me pone:
warbubg: Variable redeclared ("ALPHA_STEPS")
:13: error: Undefined procedure ("RAND")
yo, por lo poco ingles que sé pone algo de "variable redeclarada" y procedimiento no definido...
1- Sobre el war
ning: Variable redeclared ("ALPHA_STEPS") NO es un fallo es un warning. Siempre salen, y es un warning que no tiene influencia en tu programa... es mas un aviso para Splinter.
2- Efectivamente te falta cargar la libreria para el rand... mod_rand.dll (import "mod_rand";)
Saludos!
ja ja ja, así que era esa pamplina...
¿donde la consigo?
Hokutoy tu carma va a subir hasta el infinito...
mod_rand viene con Bennu.
Oh claro, lo dice porque está usando las DLL de la plantilla del Tema 4 de mi tutorial y ahí están sólo las más básicas. Si quieres todas las DLL de Bennu las tienes aquí:
http://betatester.bennugd.org/snapshot/ (http://betatester.bennugd.org/snapshot/)
Verás que hay varias versiones de ellas, te recomiendo la r110 (Para Windows, ojo que está también para Linux y Wiz). Simplemente pillas todas las DLL y las copias en la carpeta DLL de la plantilla que estás usando, mano de santo ya verás.
Y así cada vez que te de un error de función no definida tendrás que incluir la DLL correspondiente, al final te resultará hasta placentero.
ok, gracias, ya hacia eso de copiar y pegar librerias, pero como le decia que no sustituyera, al final no hacia nada...
Ante la duda haz como yo, al empezar copiaba todas e incluso llegue a hacer INCLUDE de todas, luego me fijé que en el function_list.txt puedes consultar las funciones de cada librería, y entonces empecé a usar sólo las que hacían falta :P
ok, todo perfect PERO me ha surgido un nuevo polema de programación...
¿lo sigo comentando aqui o abro otro hilo??
yo creo mejor no abrir mas hilos casi innecesarios...
Se sobre entiende mas o menos, al iniciar el juego aparece un ramdom de cuatro graficos;
aqui le pondré una variable porque cada grafico tiene su función y como ahora mismo no me interesa el valor
con el loop - end hacemos que el esprite suba hasta el infinito, pero al salir de la pantalla debe crearse en la posición inicial, cosa que no hace y creo que es porque no mato el proceso y creo otra vez el mismo
codigo:
[code language="bennu"]BEGIN
graph = rand (10,14);
x=100;
y=100;
LOOP
Y = Y-8;
IF (y<0) //Condición: Si salimos por arriba de la pantalla
x=100;
y = 100;
graph = rand (10,14);
END
FRAME;
END
END[/code]
conclusión: creo que deberia crear un proceso que cree el esprite, le dé movimiento y lo destruya, pero cuando lo destruya me cree otro con otro grafico y por lo tanto con otro valor de la variable que vuelva a subir y etc etc
la pregunta es (creo que deberia saberla aunque me gusta hacer incapié en las cosas para recordarlas mejor)
¿como creo un esprite en algun sitio?
hay mas, porque la respuesta es creando un processo... :'(
¿como destruyo el proceso? usando el break??? ¿como?
¿como se crean ''timers'' o temporizadores?? mejor crear un contador antes le FRAME
¿Se pueden cambiar los frames a cada proceso para que cada uno funcione como quiera?
lo siento si os parezco pesado o por escribir estos tocho-post
¿pero quieres que se pare ahi o que vuelva a subir de nuevo?.
Porque por lo que pones ahi estara subiendo todo el rato. Ademas por el avance y eso no se si ira muy rapido :S lo digo porque en 12 fotogramas te has ventilado el proceso subiendo. No se si se vera mucho el movimiento ascendente.
si quieres que se pare tienes que tirar de break que te saldra del bucle loop en el que esta, pero si quieres que el proceso permanezca en pantalla en la posicion 100 100 deberas crear un nuevo bucle con otro frame dentro para seguir viendolo, si no te saldra de la funcion de proceso y se destruira.
Tienes unas funciones de tiempo que te incializan contadores de tiempo pero para ralentizar subidas o movimientos yo tiraria de contadores y cuando lleguen a un valor determinado hacer el movimiento efectivo.
Lo de cambiar los frames no entiendo la pregunta. :S a que te refieres?? los frames los pones tu si pones que dependan de ifs funcionaran como a ti te plazca y cuando a ti te plazca. No se si te refieres a eso, probablemente no ^^
Lo de asignar asi el graph te funciona?? Osea sabes que existen esos graficos??
Con el código que has puesto, al subir arriba del todo volverá a la coordenada 100,100 y seguirá subiendo, lo de subir lo haces de forma incondicional.
Puedes tener una variable int stop=0; y chequearla, si vale 0 subes, si ya has subido la pones a 1 para que no suba más.
Para matar procesos ten en cuenta que BREAK; no mata, simplemente los hace salir del LOOP, siempre y cuando no haya nada después del LOOP el proceso morirá.
La muerte de un proceso bien hecha puede hacerse con signal ( id , S_KILL );
Es una especie de suicidio, aunque cuidado con la destrucción de procesos, si el proceso ha dejado hijos ejecutando y éstos acceden a father se puede dar un error de ejecución, supongo que ya lo comprobarás en tus propias carnes cuando tengas una jerarquía de procesos "grande" que se crean y mueren.
Esto último me paso en Animalicos, un ecosistema que programé en el que las especies se reproducían, se devoraban, morían de viejas, etc... Es un delicioso proyecto que con la colaboración de un alumno estamos pensando programar en 3D y con mayor jugabilidad e interacción del usuario.
En teoría ese código hace lo que quieres, es decir, el proceso sube, y al salirse de pantalla aparece de nuevo por debajo pero con otro gráfico.
Si no hace eso comprueba si realmente ha compilado y no te ha dado un error, porque es posibñe que estés viendo una versión antigua de tu código.
No es necesario que mates al proceso y crees otro nuevo, porque eso no es eficiente, pero si aun así lo quieres hacer, o usas signals como te han dicho o haces que termine de ejecutar su código (es decir, llegar al último end).
En tu caso, basta con poner un break dentro del if, porque eso romperá el LOOP (break rompe la ejecución de los BUCLES, como loop, while, for... y siempre al más interior, pero no afecta a los IF ni a los SWITCH).
Para crear un sprite en cualquier sitio usa parámetros, por ejemplo
process mi_sprite (x,y)
y luego haces la llamada así:
mi_sprite (100,100);
O las coordenadas que quieras.
Tienes 10 temporizadores que cuentan en centésimas de segundo entre timer[0] y timer[9], y los puedes inicializar al valor que quieras. Eso si, cuentan en tiempo real, por lo que, si tu juego se ralentiza, los timers no lo hacen, por eso siempre desaconsejo su uso en facor de los contadores.
Y no, no puedes cambiar los FPS de forma independiente a cada proceso, porque los FPS indican la velocidad a la que se dibuja la pantalla entera, es independiente de los procesos.
Hay varios métodos para ralentizar procesos, uno es indicar el porcentaje de ejecución en el frame. Por ejemplo, FRAME(50) indica que se ha ejecutado un 50% del frame, por lo que seguirá ejecutándose hasta completar una suma de 100% O MÁS (por ejemplo, con un FRAME(40) se ejecutará en el frame 3 y en el 5).
Espero que eso sea a lo que te referias.
a eso es a lo que me referia, drmpi
Quote from: animanegra on December 17, 2009, 11:59:51 AM
Lo de asignar asi el graph te funciona?? Osea sabes que existen esos graficos??
lo del randon en graph?? yo creo que el random vale en todo que tenga que devolver un valor numerico
Quote from: Drumpi on December 17, 2009, 02:18:43 PM
En teoría ese código hace lo que quieres, es decir, el proceso sube, y al salirse de pantalla aparece de nuevo por debajo pero con otro gráfico.
Si no hace eso comprueba si realmente ha compilado y no te ha dado un error, porque es posibñe que estés viendo una versión antigua de tu código.
teoricamente, lo tengo que comprobar bien porque creo que lo he modificao de una forma mas clara y mejor, pero lo que quiero hacer es una flecha que parta de x=100 y=100 y suba para arriba, cuando desaparezca por arriba vuelva a aparecer en x=100 y=100 y vuelva a subir, como si fuera el estepmania...
gracias por la ayuda, preparaos pa recibir karma...
Pd: el que no quiera que lo diga
Para eso que pretendes tu código era correcto, mira en la consola, no vaya a ser que Drumpi tenga razón y tengas un error de compilación, cuando eso pasa lo que se ejecuta es el último .dcb que no había tenido error de compilación.
Quote from: Windgate on December 17, 2009, 09:00:07 PM
Para eso que pretendes tu código era correcto, mira en la consola, no vaya a ser que Drumpi tenga razón y tengas un error de compilación, cuando eso pasa lo que se ejecuta es el último .dcb que no había tenido error de compilación.
Tiene pinta de ser eso que dice. Mira bien que no tengas los nombres de los ficheros en mayusculas y las llamadas a los ficheros en minusculas. Son las tipicas cosas que en el PC funciona igual (windows) pero que en la wiz da error (linux).
Saludos!
Borron y cuenta nueva porque lo que hago es liarme... ;D
empiezo de nuevo con la intencion de hacer un modulo para cada cosa, (lo normal creo)
me ha aparecido un error desconocido que hace que no me cargue el juego, dice que no me identifica ''PROCESS'', he mirado en la carpeta dll y en import.prg pone: import "mod_proc";, creo que todo correcto o me falta alguna libreria???
Codigo import.prg:
[code language="bennu"]import "mod_video";
import "mod_proc";
import "mod_map";
import "mod_key";
import "mod_rand";[/code]
Codigo:
[code language="bennu"]PROGRAM videojuego;
INCLUDE "DLL\import.prg";
GLOBAL
int dir_flecha; //aqui he intentado meterle una variable
//no se como funciona exactamente pero creo que no me afecta a la carga del juego
BEGIN
set_mode(320,240,32,MODE_WINDOW);
load_fpg("images/sonic.fpg"); //el fpg sigue llamandose igual, aunque con graficos nuevos
caracol (); flecha();
dir_flecha = rand(15,17); //aqui le doy valor a la variable para que me sirva como graph
END
PROCESS caracol ()
graph=1;
x=40;
y=140;
LOOP
IF (key(_exc))
exit(0);
END
IF (var_flecha == 1) //esta variable deberia declararla al principio
// es la que verifica si al pulsar la tecla correspondiente devuelve un valor que deberia ser true, aunque ahora mismo me da igual
x=x+5;
BREAK //espero que con este break aqui funcione para que si dejas pulsada la tecla no siga funcionando...
FRAME
END
END
PROCESS flecha()
graph = dir_flecha; //así deberia funcionar perfect
x=100;
y=100;
FRAME
END
[/code]
creo que de codigo no es, aunque no este incompleto...
Venga, una cosita:
Donde pones
INCLUDE "DLL\import.prg";
Usa las otras barras:
INCLUDE "DLL/import.prg";
En windows funciona lo primero y lo segundo, en el resto de sistemas operativos sólo funciona lo segundo.
Y con respecto al error, te faltan los Begin dentro de cada "Process". El código debería quedar así:
[code language="bennu"]PROGRAM videojuego;
INCLUDE "DLL/import.prg";
GLOBAL
int dir_flecha; //aqui he intentado meterle una variable
//no se como funciona exactamente pero creo que no me afecta a la carga del juego
BEGIN
set_mode(320,240,32,MODE_WINDOW);
load_fpg("images/sonic.fpg"); //el fpg sigue llamandose igual, aunque con graficos nuevos
caracol (); flecha();
dir_flecha = rand(15,17); //aqui le doy valor a la variable para que me sirva como graph
END
PROCESS caracol ()
BEGIN
graph=1;
x=40;
y=140;
LOOP
IF (key(_exc))
exit(0);
END
IF (var_flecha == 1) //esta variable deberia declararla al principio
// es la que verifica si al pulsar la tecla correspondiente devuelve un valor que deberia ser true, aunque ahora mismo me da igual
x=x+5;
BREAK //espero que con este break aqui funcione para que si dejas pulsada la tecla no siga funcionando...
FRAME
END
END
PROCESS flecha()
BEGIN
graph = dir_flecha; //así deberia funcionar perfect
x=100;
y=100;
FRAME
END[/code]
¡Ah! y revisando el código, te falta por definir "var_flecha".
Otra cosilla: intenta poner el error específico que te da Bennu, además del código, así será más fácil ayudarte.
Epero que te sirva de ayuda, ánimo. :)
[Edito] Y en el proceso Flecha supongo que quieres hacer un bucle (LOOP) porque si no, se va a mostrar una vez la flecha y luego el proceso se va a acabr, desapareciendo.
joño!!!!!!, por eso me daba problemas, se me olvidaba el begin...
y si, quiero que la flecha al desaparecer aparezca otra vez en la posición de inicio.
la variable dir_flecha deberia ser private y no global ¿no?, solo deberia afectar al proceso de la flecha, con poner:
[code language="bennu"]
PROCESS flecha()
PRIVATE int_flecha;
BEGIN
...etc
...[/code]
¿vale? o la variable debe ir detras del BEGIN ??
Siempre que tengas un error en la linea 0 y te diga que PROCESS es un identificador desconocido es porque te has dejado un END, es uno de los tipicos errores con los que te encontraras durante tus primeros meses xD
Quote from: Futublog on December 20, 2009, 12:38:48 PM
joño!!!!!!, por eso me daba problemas, se me olvidaba el begin...
y si, quiero que la flecha al desaparecer aparezca otra vez en la posición de inicio.
la variable dir_flecha deberia ser private y no global ¿no?, solo deberia afectar al proceso de la flecha, con poner:
[code language="bennu"]
PROCESS flecha()
PRIVATE int_flecha;
BEGIN
...etc
...[/code]
¿vale? o la variable debe ir detras del BEGIN ??
Esta bien así. Mira el código que te he puesto, que es el tuyo corregido.... (aunque con la variable var_flecha sin declarar).
ok, una mas (os voy a dar la tarde, ji ji ji)
¿¿el tema de switch como se declara o escribe??
[code language="bennu"]
SWITCH (var_loquesea)
case 1: lo que sea;
case 2: lo contrario;
case 3: lo que falta;
case 4: lo que se me ha olvidao;
END
[/code]
Así es correctorl??????
Échale un ojo al wiki:
http://wiki.bennugd.org/index.php?title=Switch
¿no os entra ganas de matarme ;D ;D ;D?
otra cosa que me pasa es que mientras tengo pulsada una tecla avanza el personaje, me interesa que ande un poquirto, de forma de juego como la de track & field, de machaca botones...
con el BREAK; no me interrumpe ese proceso...
tendré que ponerlo en otro sitio o de otra forma, o hacer procesos a cada tecla y así rompo el proceso y tracatrá (o sea que funciona)
gracias josebita
Para que ande a medida que aporreas la tecla _SPACE te puede servir algo como esto (No digo que sea la mejor solucion ni mucho menos):
PROCESS track_and_field ( )
PRIVATE
int pulsacion = FALSE;
int velocidad = 0;
BEGIN
IF ( key ( _SPACE ) AND NOT pulsacion )
pulsacion = TRUE;
velocidad += 2;
ELSEIF ( NOT key ( _SPACE ) AND pulsacion )
pulsacion = FALSE;
END
x = x + velocidad;
IF ( velocidad > 0 )
velocidad--;
END
FRAME;
END
Es una solucion dependiente de los fps, ya que se acelera o decelera siempre 1 pixel/FRAME^2.
Tambien se podria limitar el maximo de velocidad.
La verdad es que nunca he programado un sistema como el que dices, seria cuestion de probar, si lo haces comenta resultados.
Es para un menú de inicio, y medio lo tengo;
creo un proceso con una imagen por opcion, las meto en una variable que segun el valor nos muestra en el menú una opción...
que me lio, pongo una imagen mejor:
(http://img94.imageshack.us/img94/5700/fondmenu02.png)
bueno, para que al darle pa bajo no me cree un bucle infinito y no se pare donde quiero, pruebo con dos procesos que mueran cuando se haya movido una opción del menú con este codigo:
[code language="bennu"]PROCESS sube()
BEGIN
LOOP
IF ( key (_UP) )
IF (var_seleccion < 1)
var_seleccion = 4;
BREAK;
END
var_seleccion = var_seleccion - 1;
BREAK;
END
FRAME;
END
END[/code]
uno para subir y otro para bajar, pero como el buen BREAK me dice, se pierde el proceso una vez que mueve y ya no mueve mas, ¿quizas deberia ponerlo en un LOOP de otro proceso para que me corte el LOOP del proceso sube()?
aparte, el primer BREAK no afecta al segundo si no se cumple la condición del primero ¿no?
y pa terminar, ¿el BREAK por lo que veo rompe el LOOP y no se vuelve a repetir a menos que llame al proceso ¿no?
ji ji ji
Si, break sale del LOOP. El ejemplo que pones no lo entiendo bien, var_seleccion es GLOBAL? Cuanto vale al comenzar?
Lo unico que tengo claro es que tu ejemplo hace que el proceso subir ( ) muera tras reducir var_seleccion en 1 al pulsar UP la primera vez.
Aqui falta el típico código de "comprobar que se acaba de pulsar una tecla".
Pongo la "versión clásica":
int pulsada1,pulsada2;
int opcion, max_opcion;
loop
if (key(_up) and !pulsada1)
if (opcion>0) opcion--; else opcion=max_opcion; end
pulsada1=true;
end
if (!key(_up) and pulsada1) pulsada1=false; end
if (key(_down) and !pulsada2)
if (opcion<max_opcion) opcion++; else opcion=0; end
pulsada2=true;
end
if (!key(_down) and pulsada2) pulsada2=false; end
frame;
end
Es decir, creamos una variable por tecla que nos indica el estado de la tecla en el frame anterior. Si antes no estaba pulsada y ahora si, hacemos la accion e informamos de que la tecla está pulsada a partir de ahora. Si antes estaba pulsada y ahora no, pues lo indicamos.
Así no tienes que estar creando y destruyendo procesos continuamente.
El control de teclas usando un proceso externo que lo explique otro, yo me voy a dormir ^^U
si, esto es lo que quiero, lo estaba intentando pero me hacia falta echarle muuuuuuuchisimas horas para sacarlo, dado el nivel que tengo... ;D
a probarlo...
otra cosa, aunque ya creo es tarde... te faltaba el END del IF con el BREAK;
aca
IF (var_flecha == 1) //esta variable deberia declararla al principio
// es la que verifica si al pulsar la tecla correspondiente devuelve un valor que deberia ser true, aunque ahora mismo me da igual
x=x+5;
BREAK //espero que con este break aqui funcione para que si dejas pulsada la tecla no siga funcionando...
END // << ESTE FALTABA
los end se me olvidan una mijita...
otra cosa que no termino de aclararme es con los temporizadores o los timers, me voy al wiki pero no puedo, está en ingles y no consigo sacar nada en claro:
[code language="bennu"]import "mod_timers"
Process Main()
Begin
write_int(0,0,100,0,&timer[0]);
Repeat
frame;
Until(key(_ESC))
End
[/code]
me rayo, alguien que me eche una manita???
Futublog no se que quieres hacer con el code que has pasteado pero para que funcione te falta algun import.
Este sí funciona.
import "mod_timers"
import "mod_key";
import "mod_text";
Process Main()
Begin
write_int(0,0,100,0,&timer[0]);
Repeat
frame;
Until(key(_ESC))
End
Para testear mejor hazte un prg plantilla con todos los imports.
Que duda tienes con los timers? Piensa en ellos como unos cronometro que puedes consultar o reiniciar a tu gusto.
Saludos
si, yo puedo pensar como tu quieras, pero como no lo comprenda y razone como que no lo entiendo...
ejemplo de lo que digo es que quité los otros import, para que sirve el mod_key y el mod_text??
lo que quiero hacer es que aparezca un enemigo (por ejemplo) con un graph aleatorio, cuando pase determinado tiempo (pongo 2 seg. por concretar) si no ha sido destruido cambie el graph, y evidentemente si ha sido destruido al 0.1 seg aparezca a los dos segundos de la primera aparición con otro graph...
a lo mejor estoy liando un poco la cosa, lo escribo en una especie de pseudo-codigo:
-crear el TIMERy empezar a contar;
-cada dos segundos:
- SI (enemigo es destruido o no existe)
--- crear enemigo graph(rand)
- SI NO
--- cambiar el graph a otro (rand)
- FIN
je je je, ojala programar fuera así, pero crearía un cacao que no veas (creo) aparte he querido resaltar o traducir la opcion IF, aunque eso no es lo que quiero, lo que quiero es saber manejar el TIMER
Quote from: Futublog on December 28, 2009, 10:11:50 AM
a lo mejor estoy liando un poco la cosa, lo escribo en una especie de pseudo-codigo:
crear el TIMERy empezar a contar;
-cada dos segundos:
- SI (enemigo es destruido o no existe)
--- crear enemigo graph(rand)
- SI NO
--- cambiar el graph a otro (rand)
- FIN
je je je, ojala programar fuera así, pero crearía un cacao que no veas (creo) aparte he querido resaltar o traducir la opcion IF, aunque eso no es lo que quiero, lo que quiero es saber manejar el TIMER
Los timers no hace falta crearlos... se crean solos al iniciar el programa y se ponen en marcha. Lo que si puedes hacer es reiniciarlos. Te contesto en pseudocodigo que si no uno nunca aprende ;D
cronometro=0;
timer[0]=0; // Reiniciar timer
loop
if(timer[0]==100) cronometro++; timer[0]=0; end // un segundo ha pasado
if cronometro==2 cambio graph enemigo; cronometro=0;
if cronometro==2 and type enemigo no existe; enemigo(); cronometro=0
Espero que este cutre ejemplo te sirva para algo... quizá no es la mejor manera de hacerlo pero es una manera que te puede servir para aprender el uso.
Saludos!
PD: Hay por ahí un listado para que sirve cada "import" pero para el caso:
import "mod_key"; // para que funcione el Until(key(_ESC))
import "mod_text"; // para que funcione el write_int(0...
Lo unico que todavia no tengo claro es lo de ++, eso equivale a algo que no caigo - macuerdo...
Quote from: Futublog on December 28, 2009, 11:10:04 AM
Lo unico que todavia no tengo claro es lo de ++, eso equivale a algo que no caigo - macuerdo...
CRONOMETRO++ EQUIVALE A CORNOMETRO=CRONOMETRO+1 Y TAMBIEN A CRONOMETRO+=1
Explicado de forma rápida, TIMER es un array de 10 posiciones (desde TIMER[0] a TIMER[9]) que contienen el tiempo real que ha transcurrido desde la última vez que se pusieron a cero. Sus valores cambian solos y vienen representados en CENTÉSIMAS de segundo.
Como es un array, puedes asignarles el valor que tu quieras (normalmente cero, para empezar a contar desde ahi), y consultarlo igualmente.
Como miden el tiempo real, no se ralentizan si el rendimiento cae, así que, aunque los fps caigan a 3, los timers contarán un segundo en el mismo periodo de tiempo.
Y un consejo valioso: NUNCA hagais TIMER[0]==xxx, porque es MUY dificil que coincida el timer con un valor exacto, porque ejecutar código consume tiempo y es probable que entre un frame completo y otro pase más de 1 centésima, y nos encontremos que en el primer frame, timer vale 99 y en el siguiente 104, y no llega a pasar por 100. Usad siempre operadores >, <, >= ó <=.
Estos dos últimos párrafos muestran el por qué nunca uso timers para medir el tiempo en mis juegos, mejor usar contadores (variables que definimos nosotros y que incrementamos, manualmente, 1 unidad a cada frame).
Los timers vienen bien para eventos no sincronizados con el juego, o para tareas en tiempo real.
yo los uso mucho para sincronizar cosas como dobleclicks... o tiempos en que algo debe dejar de funcionar o empezar a funcionar... pausas... duraciones de otras cosas...
pero bueno, es a criterio del usuario.
pensandolo bien voy a usar una variable que vaya subiendo en cada frame y al llegar a una cantidad cambie lo que sea
tambien vale...
Futublog, acabas de descubrir los contadores ;D
Level up!!!
¬¬ ya sabia lo de los contadores, ^^U lo que no sabia sabia si en este caso es mejor usarlos o usar un timer, con el game editor era mejor los timer...
cuantos frames por segundo trae por defecto¿¿¿¿
Creo que eran 24 fps. Tendría que comprobarlo por código.
son suficientes, gracias
Para saber el FPS actual, haz un write de la variables global FPS y listo.
¬¬ Estupendo, hay que hacer un write...
No preguntaré como se hace un write porque en parte no me interesa mucho ahora mismo, todo se andará
ji ji ji
mira la wiki, pero básicamente es:
write(fuente, x, y, centrado, texto)
Lo del centrado puede parecer un poco lioso al principio, pero para centrar el texto en la posición que quieras, pon 4 y fuera (mira la wiki, ya te digo).
También puedes hacer un say y mirar lo que sale por la consola.
Lo del write, ante la duda y si es solo para mostrar el valor de una variable, fps en este caso, pon:
write ( 0 , 0 , 0 , 0 , fps );
Y lo tendrás en la esquina superior izquierda.
Ojo con el write, ponlo FUERA del LOOP, ya que es un "marcador" que se actualiza sólo y NO hay que invocarlo sucesivamente. Cuando sólo hay uno no pasa nada, pero si hay varios puedes llegar a saturar mucho la ejecución, con el tiempo controlarás mejor todo lo que conlleva el write, parece sencillito pero tiene sus cositas ::)
PD: Necesario tener importado mod_text
otro tema (ya me ocupare del write mas tarde, es una opcion de la que abusaré considerablemente... je je ) el tema del puntero para wiz o el raton, si quiero hacer unos botones tendré que poner que haciendo click en una determinada zona actue como si clickaras el boton????
o hay que poner colision a un objeto???????
collision ( type mouse )
Para el puntero de Wiz no sé decirte, me da pánico, además tengo parado el proyecto que iba a hacer para el concurso :S
podrias hacer collision con un proceso mouse con su grafico con alpha 0... deberia funcionar
Una variante de lo que dice Splinter es que si sólo quieres detectar colisiones con la punta del puntero (y no con la flecha entera) puedes crear un proceso con x=mouse.x e y=mouse.y con un graph que sólo tenga 1x1 píxeles de tamaño.
Quote from: Windgate on January 05, 2010, 06:54:30 AM
Lo del write, ante la duda y si es solo para mostrar el valor de una variable, fps en este caso, pon:
write ( 0 , 0 , 0 , 0 , fps );
Y lo tendrás en la esquina superior izquierda.
Ojo con el write, ponlo FUERA del LOOP, ya que es un "marcador" que se actualiza sólo y NO hay que invocarlo sucesivamente. Cuando sólo hay uno no pasa nada, pero si hay varios puedes llegar a saturar mucho la ejecución, con el tiempo controlarás mejor todo lo que conlleva el write, parece sencillito pero tiene sus cositas ::)
PD: Necesario tener importado mod_text
No, no es así: write escribe un texto y no cambia, si queremos que se actualice con un valor, se debe usar write_int y pasarle un puntero a dato.
Vamos, que el código es:
begin
write_int(0,0,0,0,&fps);
loop
if (key(_esc) break; end
frame;
end
end
Cierto :o
Se me fue la olla, lo confundí con write_var ( ), es que llevo todas las vacaciones sin tirar una simple línea de código, sorry :S
Haz caso a Drumpi xD
yo diria
0,10,10,0,&fps
0,0,0,0,... va a salir mitad de la letra
entonces habria que asignar un area de un boton o algo correspondiente, algo como si mouse.x estrá entre tal y tal, y mouse.y está entre tal y tal...
así podriamos obtener una cuadricula de trabajo, e incluso varias cuadriculas...
incluso podriamos usar un array
Quote from: SplinterGU on January 06, 2010, 08:25:14 PM
yo diria
0,10,10,0,&fps
0,0,0,0,... va a salir mitad de la letra
No no, con 0,0,0,0 posicionas en el origen de coordenadas de la pantalla, pero el alineamiento hace que el texto "cuelgue" hacia abajo a la derecha, se ve todo todito todo. (Veo que Splinter también se ha colado ;D).
Futublog, no entiendo bien lo último que dices, si quieres detectar colisión con el ratón usa collision ( type mouse ), eso lo puede ejecutar cualquier botón o cualquier "cosa" para comprobar si el ratón la está tocando.
tienes mucha razon... sorry, me confundi...
tan sencillo como asignar una cuadricula, segun en que cuadro le des al boton derecho hará lo que le mandes...
siempre y cuando se pueda, investigaré mas en el wiki...
Otra cosa (razon del doble posteo) quiero hacer girar un graph un cuarto de vuelta a la derecha o a la izquierda...
lo mas normal seria redefinir el angulo una vez girado, ¿mexplico? osea, doy la instruccion de que gire (angle =+500) hasta que llegue al 90.000 (un cuarto de vuelta) o - 90.000 si es para el otro lado; lo mas seguro que sea 270.000...
una vez que llega al angulo deseado, ¿como se define otra vez el angulo? ¿como se pone a cero otra vez??
angle=0;
???
nop porque o si no se pondria otra vez derecho...
imaginate una flecha señalando arriba, cuando yo le digo que gire hasta que apunte hacia la derecha, cuando despues le diga angle = 0; instantaneamente vuelve a apuntar a arriba.
probaré con cuatro graph distintos
podes definir una constante DERECHA = 270000 y cuando quieras dejarlo, pones ANGLE = DERECHA.
El tema es que si el grafico original no mira a la derecha, cuando pones Angle = 0 vuelve al original, no hay otra forma.
No entiendo lo que intentas, futublog, si ya lo has girado ¿por qué volver a ponerlo derecho? lo dejas así y listo.
Mientras no te lies con los valores positivos y negativos...
Y hablando de angle: me ha pasado una cosa rarísima, tengo un gráfico de 8x1, con angle 0º y 180º va bien, pero si giro -90º (hacia abajo) el gráfico tiene 2x8 pixels, y si lo giro hacia arriba no se ve (0x8) y me fastidia el uso de collision ¿alguien lo había notado?
Quote from: Drumpi on January 08, 2010, 01:40:47 AM
No entiendo lo que intentas, futublog, si ya lo has girado ¿por qué volver a ponerlo derecho? lo dejas así y listo.
Mientras no te lies con los valores positivos y negativos...
Y hablando de angle: me ha pasado una cosa rarísima, tengo un gráfico de 8x1, con angle 0º y 180º va bien, pero si giro -90º (hacia abajo) el gráfico tiene 2x8 pixels, y si lo giro hacia arriba no se ve (0x8) y me fastidia el uso de collision ¿alguien lo había notado?
lol, pues no lo había notado no, manda webs que no nos enteremos de esos fallitos hasta ahora... Para el caso de anchuras/alturas de un sólo pixel quizás el uso de angle debería emular el algoritmo de una recta y dibujar los píxeles sobre ella... Curioso curioso...
Otra opción es que cambies a gráficos iguales pero de 2 píxeles de anchura en esos ángulos "críticos", aunque personalmente veo como mejor remedio a largo plazo modificar la aplicación de angle... Esperemos que algún entendido arroje luz sobre el tema, me extraña que nadie se haya dado cuenta antes de algo así :P
Quote from: Drumpi on January 08, 2010, 01:40:47 AM
No entiendo lo que intentas, futublog, si ya lo has girado ¿por qué volver a ponerlo derecho? lo dejas así y listo.
Mientras no te lies con los valores positivos y negativos...
lo que quiero es que cada vez que gire, que sean 90º...
creo que mejor dejarlo, porque lo que habria que hacer es sumar el angulo y tener siempre constancia de la inclinacion o lo girado que este...
paranoyas que salen :)
ya está aqui el pegiguera otra vez...
je je je
volviendo a los frames, como los cambio??
si quisiera un juego a 2 frames por segundo; ¿¿¿me haria falta un import + librerias + una instruccion al principio???
otra:
¿se puede poner que una variable sea igual que la otra? ejemplo:
[code language="bennu"]IF ( var_A == var_B)
pasa algo bueno... o no
END[/code]
Sí en ambas preguntas.
Te recomiendo encarecidamente que te mires estos tutoriales de iniciacion a Bennu para hacerte con las bases del lenguaje:
http://iespuigcastellar.xeill.net/departaments/informatica/fitxers/programacio/manualbennu.pdf (http://iespuigcastellar.xeill.net/departaments/informatica/fitxers/programacio/manualbennu.pdf)
http://trinit.es/tutoriales/ (http://trinit.es/tutoriales/)
No paro de miralos, releerlos y rereleerlos, lo que pasa que como no comprenda el lenguaje no me entero de nada, y a base de probar y probar y probar...
A mis tutoriales les faltan algunos apéndices sobre erorres típicos de compilación al empezar, sobre FRAME y sus curiosidades y sobre las diferencias entre programar con PROCESS y programar de forma imperativa. De todas formas sigue por ahí que todos empezamos como tú xD
El metodo de prueba y fallo, es el metodo del aprendizaje del programador, hasta que no pruebas tus cosas y ves sus fallos, no sabes bien como funcionan las cosas.
¿y se puede cargar un fondo en un color sin que sea un graph?...
Puedes dibujar un cuadrado con draw_box ( ) del tamaño de la resolución de juego, te devuelve un id de gráfico generado, puedes usarlo como graph o ponerlo con put_screen ( ). Para establecer el color se hace con drawing_color ( ), si dudas del uso de alguna de esas funciones busca en la wiki, son ultra simples de usar :P
vale, ya me temia eso...
en otra ocasión abusaré de ello, tengo pensado hacer un juego infantil para la wiz
y por ultimo, si tengo varios juegos por separados y lo que quiero es que en un menú me cargue uno de los tres ¿se pueden hacer por modulos????
Quote from: Windgate on January 13, 2010, 12:20:22 PM
Puedes dibujar un cuadrado con draw_box ( ) del tamaño de la resolución de juego, te devuelve un id de gráfico generado, puedes usarlo como graph o ponerlo con put_screen ( ). Para establecer el color se hace con drawing_color ( ), si dudas del uso de alguna de esas funciones busca en la wiki, son ultra simples de usar :P
Mmmm, no, draw_box, como todos los draw, te devuelve un id, pero no el ID de un mapa nuevo, que se puede usar para moverlo (move_draw) o borrarlo (delete_draw) independientemente de cualquier draw, pero se dibuja en el mapa especificado en "drawing_map(file,graph)" y con el color "drawing_color(rgb)".
Puedes usar put_screen para "pegar" un mapa que hayas cargado sobre el fondo (que es un mapa más, concretamente el GRAPH=0 del FILE=0), y si quieres tenerlo en una tonalidad de color usar rgb_scale.
Respecto a lo de separar juegos, si, se puede. No se exactamente cómo va, pero puedes invocar desde Bennu un comando del sistema con parámetros, y en tu caso podría ser "bgdi mi_otro_juego.dcb". Creo que era con exec ¿no?
¿No se había implementado la opción de llamar a otro dcb, o función de este, desde un dcb?
La forma "sencilla" es que diseñes los juegos en el mismo código y hagas un menú de selección. Puedes separar los códigos en varios ficheros usando la palabra "include".
A mi me viene de miedo para hacer "subrutinas" algo complejas o largas y no andar con copy/paste, lo estoy usando para pegar el código de detección de durezas a varios enemigos del Doggy, que tiene unas 2000 lineas de código y usa unas 14 variables (demasiadas para pasarlas por parámetros).
Soy un vicioso de este foro y lo de tener varios .dcb compilados e invocarlos a tu antojo es algo que sólo Prg domina bien y a mí me gustaría aprender.
Lo de trabajar con módulos, por supuesto, es el placer de Bennu, yo no tengo proyecto con menos de 20 archivos .prg distintos, cada uno con su función, puedes echar un vistazo a los últimos ejemplos de mis tutoriales, el tema 19 explica el uso de módulos y es uno de los temas más sencillos que hay, te lo recomiendo, se puede leer y entender tranquilamente mientras uno planta un pino :P
ya lo tengo, gracias al tema 19... je je
pues muy facil, hago un pseudo-juego con sus propias variables y lo guardo cada uno como un modulo, y en el juego principal, segun la variable de seleccion trabajará con un modulo u otro.
no debe de dar problemas porque no son juegos grandisimos sino minijuegos que no ocupan mucha memoria
chavales, otro problem...
je je
resulta que el juego me pide un write_var, recapitulemos:
ejecuto un proceso y le hago un write_var con respecto a los puntos que lleva, pero al salir del juego rompo el proceso con un break (no se si deberia matarlo...) pero el write_var sigue ahí
¿hay alguna forma de hacerlo desaparecer para que aparezca de nuevo con la ejecucion otra vez del proceso??
y tamien:
al ejecutar un proceso ejecuto otro, osea que ejecuto dos independientes de una vez, y tienen instrucciones en comun...
no creo que afecte nada mas que en que el programa es mas largo por tener las ordenes en duplicado, ¿se podria asignar al segundo proceso como hijo del primero? entonces si le afecta el break al padre, por consiguiente le afecta al hijo ¿no?
¿le afecta todo? osea la posicion x,y + graph o todo lo que me interese????
¿pero como sabe un proceso quien es el padre? (suena gracioso en la vida real, je je)
bueno, esta ya la he averiguado mirando un momento los tutos, pero no queria borrarla...
se puede crear el proceso hijo dentro del BEGIN del padre??
mientras respondeis lo voy a probar, para confirmarlo
Veamos, hay un truco:
Siempre que hagas write_var guarda el identificador que te devuelve en una PRIVATE.
Antes del último END del proceso puedes poner la sentencia ONEXIT (Ver manual de Osk)
De forma que quedaría:
ONEXIT
delete_text ( identificador );
END
Y ya que miras el manual de OSK repasate lo de padres e hijos porque creo que no lo tienes muy claro.
Todos los procesos son independientes de cada uno, todos tienen su propia x, y, z, graph, Begins, etc... Sean padres, hijos o abuelos.
Cuando hagas el programa tu tendras el en tu prg:
Process a();
BEgin
x=160;
y=120;
Graph=1;
etc etc etc
end
Process b()
BEgin
x=10;
y=15;
Graph=2;
etc etc etc
End
Estos dos procesos, como todos los que hagas, no tienen ninguna relacion entre ellos, por lo que todos son independientes y todos tienen sus propios valores de x,y,z etc...
Como hacer que el proceso B sea hijo de A... o lo que es lo mismo, como hacer que el proceso A sea el padre de B?
Muy sencillo, dentro del proceso A, haz que este llame al proceso B y así este pasara a ser su hijo... ya que el ha sido quien lo ha invocado.
code]Process a();
BEgin
x=160;
y=120;
Graph=1;
If key(_SPACE==1) B(); END
etc etc etc
end
Lo interesante de padres e hijos es que el proceso hijo, por ejemplo, puede definir su X como x=father.x o acceder a cualquiera de sus variable... algo muy util para segun que cosas. Hay muchas mas cosas pero si te miras los tutos creo que esto esta explicado bastante mejor que aquí.
Saludos
PD: Respondiendo a tu pregunta, logicamente un Break en el padre no influye en nada al hijo ya que este funciona en paralelo al padre. Si quisieras, si podrías hacer que si el padre muere tambien muera su descendencia, pero lo tienes que hacer tú.
ok, ok ok...
por lo que he podido comprobar haciendo pruebas pruebas y mas pruebas es dos o tres cosas:
1º Si un proceso llama al mismo proceso se vá todo al garete en ''ejecutar en .bat'', muy util si le quieres gastar un bromazo a alguien cuando esté testando un juego tuyo...
2º Un proceso puede ''parir'' otro proceso y así convertirse en padre e hijo respectivamente por medio de el sistema:
[code language="bennu"]
BEGIN proceso1()
x= lo que tu quieras
y= etc etc...
proceso2(); //puede ir aquí e incluso arriba de la "x=" o "y=" para crearlo solamente una vez o dentro
//del LOOP por si interesa crearlo mas de una vez
LOOP
IF (key(_SPACE))
proces3(); //aqui creamos un proceso dentro del LOOP
END
FRAME;
END
END[/code]
3º Puedes asignarle al hijo lo que quieras del padre (tiene gracia porque para mí eso de los padres e hijos se me hacia un mundo...) lo mismo dá que sea "x" "y" "graph" "flag" "angle" o etcetera...
je je
Quote from: Windgate on January 21, 2010, 01:35:39 PM
Veamos, hay un truco:
Siempre que hagas write_var guarda el identificador que te devuelve en una PRIVATE.
Antes del último END del proceso puedes poner la sentencia ONEXIT (Ver manual de Osk)
De forma que quedaría:
ONEXIT
delete_text ( identificador );
END
es que no hago un exit(), hago un BREAK;...
¿valdria un "ONBREAK"? o:
¿como hago exit() de algo en cuestion?? que por el parentesis veo que se puede hacer exit a algunas cosas...
a empollar el tuto ¬¬
karma = karma + 1; para ambos, je je
edito:
al poner un write_var en una variable con random (1,4) me dá un numero to alto de vez en cuando, en concreto el 11859288.
cuando le pongo un break si sale ese numero me sale otro...
que cosa mas rara, habrá que asignar a esa variable es un byte ¿se puede?
Como siempre... ha empollar el wiki y hacer/ver/probar codigos para entender mejor las cosas!!!
Es lo que tiene esto de la programacion... vale mas un trial & error que mil explicaciones.
Yo creo que confundes cosas... el comando Break(); lo unico que hace es "romper" el bucle en el que se encuentra el proceso y continuar desde el END del bucle. Si el proceso en cuention no tiene mas bucles (Loops, Whiles, Fors, etc...) llegara a su fin y morira. El comando Break por si solo no mata al proceso que lo invoca.
El comando onexit();end lo que hace es que una vez el programa muera, se ejecutan las lineas que hay en su interior... ideal para descargar recursos o matar hijos o descendencia.
Puede parecer que este comando no tiene sentido si el proceso muere de forma natural (por acabar las lineas de su programa) pero es muy muy util cuando te lias a matar processos desde otros procesos (Mirate los SIGNAL (TYPE PROCESSO, S_KILL); y derivados).
Ejemplo: Al morir el proceso padre (Heroe) el texto puesto en Onexit(); se encarga de matar tambien a todos sus hijos y a resetear, por ejemplo los stats o la vida/magia, etc...
Onbreak no existe.
La mejor forma de matar a un proceso es por finalizacion de su codigo... para ello lo mejor es usar el comando Break().... Dentro del Loop/end si se cumple la condicion que tu digas (vidas==0) haces un Break para salir del Loop y si no tienes nada mas el processo finaliza y se muere.
Si lo que quieres es matar forzosamente un proceso has de usar lo de SIGNAL (Int, S_KILL); que te he comentado.
Testealo y si te salen dudas vuelve a preguntar.
Si no te acalaras, explica exactamente lo que quieres conseguir... matar a un proceso, al padre, solo al hijo, a todos, etc....
Saludos!
Quoteal poner un write_var en una variable con random (1,4) me dá un numero to alto de vez en cuando, en concreto el 11859288.
cuando le pongo un break si sale ese numero me sale otro...
Te refieres a:
variable = rand(1,4);
write_var (0,0,0,0,variable);
// Esto último es correcto y debería escribirte un valor entre 1 y 4
O bien a:
write_var (0,0,0,0,rand(1,4));
// Esto último NO es correcto porque write_var recibe una variable, no un retorno de función.
Futublog: cada texto que escribes (con write, write_var, wirte_int...) devuelve un ID de ese texto, por lo que con ese número puedes borrarlo desde cualquier punto del programa. Si ese valor lo guardas en una variable global, cualquiera podrá borrarlo, no solo el propio proceso, al igual que moverlo con move_text().
Ojo, ten cuidado de no borrar un texto ya borrado, las consecuencias pueden ser imprevisibles.
Otro comando útil es DELETE_TEXT(ALL_TEXT), que borra todos los textos de pantalla.
Quote from: Windgate on January 22, 2010, 12:23:09 PM
Quoteal poner un write_var en una variable con random (1,4) me dá un numero to alto de vez en cuando, en concreto el 11859288.
cuando le pongo un break si sale ese numero me sale otro...
Te refieres a:
variable = rand(1,4);
write_var (0,0,0,0,variable);
// Esto último es correcto y debería escribirte un valor entre 1 y 4
O bien a:
write_var (0,0,0,0,rand(1,4));
// Esto último NO es correcto porque write_var recibe una variable, no un retorno de función.
es lo primero, y al efectuar el break del proceso tambien me pone otra vez el numero, creo que es lo que dice drumpi, que tengo que borrar el write_var en vez de hacerle el break al proceso
A ver colega, el BREAK no se lo haces al proceso, BREAK sólamente "rompe" el bucle actual ya sea LOOP, FROM, WHILE o FOR. Si hay algo después del bucle se ejecuta (Podrías aprovechar para eliminar ahí el texto).
Algo que es importante y que yo descubrí tarde: Cuando un proceso muere, la sentencia ONEXIT puede encargarse de ejecutar cualquier tarea previa a la eliminación del proceso. Especialmente eliminar identificadores de texto para evitar el problema que tienes... Y alguna utilidad más compleja.
Es algo que estoy seguro que se trata en mi tutorial, hay procesos enemigos que tienen sobre sus cabezas sus puntos de vida, y al matarlos desaparecen, te recomiendo que eches un vistazo a cómo lo hago, pena que no sé decirte cuál tema era, pero supongo que será alguno de los de textos :P
Quote from: Windgate on January 22, 2010, 09:24:03 PM
A ver colega, el BREAK no se lo haces al proceso, BREAK sólamente "rompe" el bucle actual ya sea LOOP, FROM, WHILE o FOR. Si hay algo después del bucle se ejecuta (Podrías aprovechar para eliminar ahí el texto).
correcto, eso es a lo que me referia, borrar el texto, aunque el break no sirve para borrarlo, si es de utilidad
karma +=1;
que vá, os explico una mijita el codigo porque no para de hacerme un random con un numero no correspondiente:
[code language="bennu"]PROCESS ejemplo()
PRIVATE
int cambia; //variable a la que se le va actuar el random
BEGIN
x = etc...
cambia = rand (0,3); //cada vez que se ejecuta este proceso se hace un random para designar grafico
LOOP
SWITCH (cambia)
CASE 1: grafico tal, avancar tantos pasos etc... BREAK; END
CASE 2: grafico tal, avancar tantos pasos etc... BREAK; END
CASE 3: grafico tal, avancar tantos pasos etc... BREAK; END
CASE 0: grafico tal, avancar tantos pasos etc... BREAK; END
END
write_var (letris, 160, 220,5, cambia); /aqui es donde pongo para que me escriba la variable, aunque si omitimos ese paso sigue dando el mismo error
FRAME;
END
END[/code]
en refinitiva, al hacer el random al inicio del proceso me dá el problema, el random pone que escoja un numero entre cero a tres, he probado antes entre uno y cuatro y seguia dando el mismo problema;
el problema es que me dá el numero 11859288 en dos ocasiones, la primera es cuando se ejecuta el break del loop y la segunda es cuando el random le parece...
quizas tendré que darle un valor inicial a la variable... no creo
a lo mejor será que la variable no deberia ser privada o algo
No puede ser... Sólo se me ocurre que al hacer write_var ( ) e inmediatamente salir del proceso sus datos PRIVATE son liberados y ocupados por otro proceso. Write_var ( ) auto-refresca el texto con el valor de la variable, si ha sido sobreescrita es lógico que veas "cosas raras".
Te recomendaría que mantengas activo el proceso mientras el write_var ( ) queda activo, sería lo correcto ya que si el proceso lo ha generado debería ser también el proceso el que lo elimine. Por supuesto el proceso debería almacenar el ID del texto escrito en otra variable PRIVATE.
También te recomiendo poner un say ( "La puta variable aleatoria vale: " + cambia ); inmediatamente después de generar el valor con rand, para que veas que devuelve un valor correcto.
Creo que así lo solucionarás todo créeme, los textos en Bennu tienen muchas cositas raritas, pero una vez los comprendes todo va estupendamente, es bueno "cagarla" varias veces al principio para entender todo lo que conllevan xD
Dos cosas:
1) Haces write_var en un bucle y no veo el delete_text correspondiente, por lo que en unos 255 frames te va a salir el típico error de "demasiados textos en pantalla".
2)Aunque se muera el proceso, el texto sigue ahí, es una "instancia" independiente. Y al morir el proceso, la variable queda libre y se puede escribir cualquier valor (puede ser hasta un comando en lugar de un dato).
No sabía que wirte_var usase una variable en lugar de un puntero a una variable como último parámetro. Normal, la última vez que usé esa función aún había que indicarle el tipo de variable con otro parámetro más, ahora sólo uso write y write_int.
Juer, estoy espesísimo, debo acostarme yaaaa......
se me estan yendo las cabras,
write_var (letris, 160, 220,5, cambia); /aqui es donde pongo para que me escriba la variable, aunque si omitimos ese paso sigue dando el mismo error
eso es lo importante chavales, olvidaos del texto, le quito al codigo los renglones correspondiente al texto y lo que me dá es el mismo problema, no me hace el random bien...
ahora va a ser que tenga que cambiar el DLL del random o asignar como byte a la variable....
no se si esto ultimo se puede hacer, lo voy a probar...
edito: ya le he puesto el byte delante (que guay que se puede... mhuahaha) y seguimos en las mismas, cada cierto tiempo me falla, os repito que NO tengo puesto el weite_var...
¿al morir el proceso muere la variable???
explicacion del proceso (por si estoy haciendolo mal) :
cada vez que inicio el proceso debe de salir con un grafico (flecha simulando una tecla) entre cuatro disponibles, cuando aparece se mueve a la dcha. y llegado a un cierto punto el proceso se ''BREAK''... je je
si pulsamos la tecla correspondiente a la que sale el proceso se ''BREAK'' otra vez y crea uno nuevo...
acabo de probar poniendo la variable a 0 (claro, cero es un valor...) antes del break pero no furula...
como he dicho antes, cero es un valor posible...
¿hay alguna forma de hacer desaparecer la variable en el ''BREAK''?
« Última modificación: a las 12:01:21 por Futublog »
edito por ultima vez:
No comerse mas el coco que pa eso estoy yo...
je je jej
al parecer tenia puesto un ''ELSE'' por otro lado que me creaba otra vez el proceso y por eso me desmontaba todo el codigo...
je je je
<<agradezco la lectura de este super - tocho matutino...>>
Ahora leo todo lo que dices xD
Bien, por lo último que escribes del ELSE, te diré un "secreto", los ELSE a 60 frames por segundo son peligrosísimos... Piensa que "en caso de que no se cumpla lo anterior" lo que haya en el ELSE se ejecutará 60 veces por segundo...
Por mi experiencia, la mayoría de las veces los ELSE pasan a ser ELSEIFs
todavia estoy en socorro, aunque tampoco tanto peligro....
je je je
lo de FOR END ¿es una cosa que vá aparte del LOOP END ??
¿tiene que haber solo uno en el programa? es decir que si una cosa puede entorpecer a la otra...
y al grano:
Mi intencion es hacer un movimiento de personaje durante un determinado numero de pixeles (32 exactamente, porque este juego va a ir por tiles, :) ) por cada vez que se pulse una tecla, y mientras se mueve que no funcionen las demas teclas de movimiento, creo que con un FOR END lo soluciono, pero no se si el bloque FOR END acepta pulsaciones de tecla; lo probé en otro juego y al parecer no sabia usarlo bien, o tambien hay que incluir el bloque LOOP END para relentizar el movimiento con respecto a los frames...
buf que lio... ¿un ejemplito por ahí aparte del de OSK? que es muy basico...
Puede haber tantos FROM y tantos LOOP anidados unos dentro de otros como quieras, comprúebalo, son simples bucles, LOOP es "infinito", tú tienes que indicar la condición para romperlo (BREAK), FROM en cambio especifica un número determinado de iteraciones, por lo que es "finito", por supuesto, también puedes hacer BREAK dentro del FROM.
Pero un consejo: Te aconsejo que, salvo excepciones muy excepcionales, todo procesa tenga 1 y sólo 1 LOOP y haga 1 y sólo 1 FRAME, si consigues una solución así no pasa nada, con el tiempo y la experiencia encontrarás ese tipo de soluciones, que suelen ser más elegantes.