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

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

Windgate

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

kim-elet-o

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.
|/
|\im-elet-o el yayo programador.

Futu-block

¿y se puede cargar un fondo en un color sin que sea un graph?...

Windgate

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

Futu-block

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

Drumpi

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

Windgate

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

Futu-block

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

Futu-block

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

Windgate

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

#101
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ú.

Futu-block

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

Hokutoy

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!


Windgate

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