PDA

Ver la versión completa : "No entender"



vassink
04/11/2011, 04:27
No logro hacer que mi enemigo camine en forma aleatoria, este codigo está bien? me sale error al compilar..


PROCESS enemigo1()
BEGIN
x=100;
y=100;
z=10;
graph=600;


LOOP
x = x + rand(-7,7);
y = y + rand(-7,7);

FRAME;
END
END

Rivroner
04/11/2011, 04:35
Empieza por quitar esa hache y luego ya vas depurando cosas menos graves.

vassink
04/11/2011, 04:59
Empieza por quitar esa hache y luego ya vas depurando cosas menos graves.

Ahora si... cuál es mi error en el código?

GameMaster
04/11/2011, 06:59
te falta la semilla

juanvvc
04/11/2011, 10:09
Simplemente por tratar de ayudar, porque nunca programé en Bennu:

- Ni si quiera nos has dicho con qué lenguaje programas. ¿Fenix? ¿Bennu?
- Tampoco nos has dicho qué error da al compilar. No somos telépatas.
- Si programas con bennu... ¿has importado la mod_rand al inicio del código?
- ¿rand() admite números negativos? Seguramente sí, pero es por estar seguros

Al contrario de lo que opina GameMaster, no creo que olvidar la semilla sea la causa de un error al compilar.

GameMaster
04/11/2011, 10:25
1 - por suerte su codigo funciona tanto en bennu como fenix.

2 - bueno no me habia fijado que le daba error al compilar, en este caso posiblemente le falte importar la 'mod_rand'

3 - rand admite numeros negativos, y la semilla es necesaria porque dependiendo del procesador, en este caso como es una wiz/caanoo, la primera ejecución le daria siempre el mismo valor si no pone la semilla.

juanvvc
04/11/2011, 10:48
1 - La diferencia entre fenix y bennu es que si en fenix el código que ha puesto probablemente funcione "as is", en bennu hay que importar la mod_rand o tendrá un error al compilar, que es de lo que hablamos. Si programa en Fenix entonces no es este el error y hay que buscar otras cosas.

2 - pues eso. Seguimos hablando de que tu mensaje de hace un rato despista porque no va en la dirección adecuada, y olvidarse el seed() nunca dará un error, ni en compilación ni en ejecución ni en nada.

3 - todos sabemos lo que es una semilla :D En DIV recuerdo que si no se ponía explícitamente, la semilla era siempre la misma (creo que 0) Así que la secuencia de números "aleatorios" era siempre la misma. Era un comportamiento deseado en DIV y Daniel Navarro lo justificó en su día, pero no sé si en Fenix/Bennu sigue siendo así. En cualquier caso, no poner una semilla no da un error en compilación ni en ejecución, así que sea como sea, es imposible que fuese ése el problema.

A lo mejor querías volver loco al pobre vassink, no lo sé :brindis:

GameMaster
04/11/2011, 11:19
A ver, no es el caso, pero imaginate que queria poner una imagen random en un menu de 4 posibles, si no pone la semilla, en wiz le saldria siempre la misma, el vendria, y te diria que tenia un error, no de compilación pero en ejecución, te diria que pone rand y que le sale siempre la misma imagen....

Con lo cual hablar de errores tambien es relativo, le puedes llamar error a algo que realmente no es un error...

futublog
04/11/2011, 11:27
lo de la semilla es verdad, si no la pone el 90% (por no decir 99%) empezará con el mismo numero, e incluso al repetir repetirá con el mismo y asi segruirá una combinacion random muy repetida a la anterior...


en cuanto al codigo, como pones dentro del loop rand(-7,7); cada vez que pinte la imagen la pintará de -7 a 7 desplazada...
esto supone que el enemigo se pondrá a temblar como un loco segun los frameskip que tengas

mi consejo, en una variable llamada ''tal'' y le haces un random antes del loop, ya dentro del loop haces un x = x + tal; y/o y = y + cual; y lo que te hace es que al crear el proceso se mueve a una determinada velocidad pero constante; si eso es lo que buscas.
Si lo que buscas es temblor lo has conseguido

vassink
04/11/2011, 20:05
Bueno tienen razón la verdad no expliqué bien. Estoy usando bennu, y como nunca antes había programado, estoy leyendo el manual mas básico (Curso de Trinit). He ido paso a paso, pero al llegar al tema de los numeros aleatorios me he quedado pegado, segun yo, el código estaba bien,
Incluso despues de escribirlo varias veces, copié el código directo desde el videojuego que trae de muestra.. tampoco pasó nada.

Esto me sale...

http://thumbs.subefotos.com/7e6f825f3d48f0e7c8a288d3804506dbo.jpg (http://subefotos.com/ver/?7e6f825f3d48f0e7c8a288d3804506dbo.jpg)

supongo que hay algo que el manual no dice, y que yo debería saber.
Por ejemplo, ¿qué es una semilla? en el manual no lo dice, y si es necesario para que funcione el codigo, pues entonces habría que corregir el manual.

Reitero que es mi primer acercamiento a un lenguaje de programación, espero me tengan paciencia.

futublog
04/11/2011, 20:25
vale, eso solo quiere decir que has puesto en la linea 135 un rand sin tener el punto y coma al final o en el renglon anterior, solo eso

o igual le falta los datos de los parentesis, solo error de sintaxis

juanvvc
04/11/2011, 20:51
Dice que no encuentra la función rand().

En bennu algunas colecciones de funciones especiales y "poco usadas" tienes que importarlas antes de poder usarlas. Eso se hace con una línea al principio del programa:



import "mod_rand";


Hay muchos más módulos con muchas funciones especiales. Mira aquí: http://wiki.bennugd.org/index.php?title=Modules

La "semilla" es literalmente eso. El ordenador es una máquina y como todas las máquinas hace siempre cálculos exactos. "Obtener un número aleatorio" en principio va en contra de lo que hacen las máquinas, porque no saben hacer cosas "aleatorias". Para ayudarle, le das un número aleatorio y a partir de ahí la máquina te saca los demás. Ese número aleatorio inicial se llama "semilla" ("seed" en inglés) Si siempre le das la misma semilla, el ordenador siempre te dará la misma secuencia de números aleatorios.

En Bennu puedes poner una semilla con el comando rand_seed(): http://wiki.bennugd.org/index.php?title=Rand_seed Como normalmente querrás números realmente aleatorios y que no se repitan cada vez que ejecutas el programa, una semilla muy usada y bastante aleatoria es el reloj del sistema. Para ello, añade una línea así al principio de tu programa (por ejemplo, después de cargar los gráficos):



rand_seed(timer());


Y así te aseguras de que los números aleatorios cambian cada vez que ejecutas el programa. Si quieres tener números aleatorios, pero siempre los mismos, usa esta línea con una semilla fija (puede ser el número que tú quieras):




rand_seed(16533);

vassink
06/11/2011, 04:14
Muchas gracias, al parecer era lo que decía juanvvc , ahora el personaje se mueve :D, sin embargo me sale el mensaje ABSOLUTELY NO WARRANTY; al compilar.

Además, ¿por qué en el videojuego que viene de ejemplo del tema 10 no incluyen el comando
import "mod_rand"; y aún así funciona?

futublog
06/11/2011, 11:38
no warranty es lo que trae el software libre, imaginate que se te jode el pc y se lo reclamas al creador del software te lo paga...

un mundo perfecto :D


<->

en el videojuego del tema 10 vendrá, lo mas seguro, un import dll donde estará importado el modo rand

juanvvc
06/11/2011, 13:55
Además, ¿por qué en el videojuego que viene de ejemplo del tema 10 no incluyen el comando
import "mod_rand"; y aún así funciona?

Sí que lo incluye ;)

Mira la segunda línea del videojuego del tema 10:



INCLUDE "DLL\import.prg"; //Incluye las DLL necesarias para que todo funcione


(el comando "include" incluye un archivo en el código como si estuviese ahí puesto entero. Es muy útil para organizar códigos muy largos en varios archivos y no volverte loco. En este ejemplo concreto el código que incluye es tan corto que probablemente hubiese sido mejor no usarlo para no confundir a la gente)

Y el contenido del archivo "DLL\import.prg" es este:



import "mod_video";
import "mod_proc";
import "mod_map";
import "mod_key";
import "mod_rand";
import "mod_grproc";


Como ves, no solo importa la mod_rand, además importa muchas otras funciones adicionales.

vassink
06/11/2011, 23:32
Gracias, excelente explicación. :rever:

SplinterGU
07/11/2011, 15:13
1 - La diferencia entre fenix y bennu es que si en fenix el código que ha puesto probablemente funcione "as is", en bennu hay que importar la mod_rand o tendrá un error al compilar, que es de lo que hablamos. Si programa en Fenix entonces no es este el error y hay que buscar otras cosas.

2 - pues eso. Seguimos hablando de que tu mensaje de hace un rato despista porque no va en la dirección adecuada, y olvidarse el seed() nunca dará un error, ni en compilación ni en ejecución ni en nada.

3 - todos sabemos lo que es una semilla :D En DIV recuerdo que si no se ponía explícitamente, la semilla era siempre la misma (creo que 0) Así que la secuencia de números "aleatorios" era siempre la misma. Era un comportamiento deseado en DIV y Daniel Navarro lo justificó en su día, pero no sé si en Fenix/Bennu sigue siendo así. En cualquier caso, no poner una semilla no da un error en compilación ni en ejecución, así que sea como sea, es imposible que fuese ése el problema.

A lo mejor querías volver loco al pobre vassink, no lo sé :brindis:

por no haber usado nunca bennugd, sabes demasiado del mismo... ;)


A ver, no es el caso, pero imaginate que queria poner una imagen random en un menu de 4 posibles, si no pone la semilla, en wiz le saldria siempre la misma, el vendria, y te diria que tenia un error, no de compilación pero en ejecución, te diria que pone rand y que le sale siempre la misma imagen....

Con lo cual hablar de errores tambien es relativo, le puedes llamar error a algo que realmente no es un error...

es cierto que no fue muy claro con el tema, y en un primer momento al leer error pense en lo mismo que vos, que quizas se referia a que no se movia... pero dijo "error de compilacion"... asi que no intentes justificar lo injustificable... has respondido otra cosa... :)


Dice que no encuentra la función rand().

En bennu algunas colecciones de funciones especiales y "poco usadas" tienes que importarlas antes de poder usarlas. Eso se hace con una línea al principio del programa:



import "mod_rand";


Hay muchos más módulos con muchas funciones especiales. Mira aquí: http://wiki.bennugd.org/index.php?title=Modules

La "semilla" es literalmente eso. El ordenador es una máquina y como todas las máquinas hace siempre cálculos exactos. "Obtener un número aleatorio" en principio va en contra de lo que hacen las máquinas, porque no saben hacer cosas "aleatorias". Para ayudarle, le das un número aleatorio y a partir de ahí la máquina te saca los demás. Ese número aleatorio inicial se llama "semilla" ("seed" en inglés) Si siempre le das la misma semilla, el ordenador siempre te dará la misma secuencia de números aleatorios.

En Bennu puedes poner una semilla con el comando rand_seed(): http://wiki.bennugd.org/index.php?title=Rand_seed Como normalmente querrás números realmente aleatorios y que no se repitan cada vez que ejecutas el programa, una semilla muy usada y bastante aleatoria es el reloj del sistema. Para ello, añade una línea así al principio de tu programa (por ejemplo, después de cargar los gráficos):



rand_seed(timer());


Y así te aseguras de que los números aleatorios cambian cada vez que ejecutas el programa. Si quieres tener números aleatorios, pero siempre los mismos, usa esta línea con una semilla fija (puede ser el número que tú quieras):




rand_seed(16533);


lo dicho.

juanvvc
07/11/2011, 15:29
Tengo muchas horas de DIV encima y no han cambiado tanto las cosas :D

Drumpi
08/11/2011, 20:44
¡¡¡Tenemos un infiltrado en el foro!!! ¡¡¡Llamad al comité de linchamiento!!! :lol:

GameMaster
08/11/2011, 21:02
Hahhahahaah