Socorroooooo

Started by Futu-block, December 13, 2009, 08:59:19 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

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

animanegra

¿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  ^^
"PoCoYo es dios!!"

animanegra

Lo de asignar asi el graph te funciona?? Osea sabes que existen esos graficos??
"PoCoYo es dios!!"

Windgate

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.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

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

Windgate

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.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Hokutoy

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!

Futu-block

#39
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...

josebita

#40
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.

Futu-block

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

Windgate

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
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

josebita

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).

Futu-block

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