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.

Drumpi

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

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

Windgate

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

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

Windgate

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

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

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

Windgate

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

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

Windgate

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