Tontadas y pamplinas + Otras dudas

Started by Futu-block, August 19, 2016, 01:28:24 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

¡Hey! No digo que no se pueda usar SWITCH, sólo he dicho que SWITCH te hace las 4 comprobaciones, y con IF no :D
De hecho, este código me parece de los más elegantes que he visto:

switch (true)
case key(_up): ...
case key(_down): ...
case key(_left): ...
case key(_right): ...
end //switch


Te diría que puedes comprobar las 4 direcciones de golpe usando máscaras de bits, pero es demasiado avanzado para ti ^^U
Bueno, te lo pongo y ya lo investigas por tu cuenta, sólo necesitas conocer álgebra binaria para entenderlo:

CONST
    _CTE_MOVE_UP = 1;
    _CTE_MOVE_DOWN = 2;
    _CTE_MOVE_LEFT = 4;
    _CTE_MOVE_RIGHT = 8;
END

(...)

byte direcciones;

//Comprobamos y memorizamos las teclas que se han pulsado.
direcciones = 0;
if (key(_up)) direcciones += _CTE_MOVE_UP; end
if (key(_down)) direcciones += _CTE_MOVE_DOWN; end
if (key(_left)) direcciones += _CTE_MOVE_LEFT; end
if (key(_right)) direcciones += _CTE_MOVE_RIGHT; end

//Y ahora hacemos lo que se necesita hacer
if ((direcciones & _CTE_MOVE_UP) == _CTE_MOVE_UP) y--; end
if ((direcciones & _CTE_MOVE_DOWN) == _CTE_MOVE_DOWN) y++; end
if ((direcciones & _CTE_MOVE_LEFT) == _CTE_MOVE_LEFT) x--; end
if ((direcciones & _CTE_MOVE_RIGHT) == _CTE_MOVE_RIGHT) x++; end


Y esto no tiene prioridad y te ahorras más de la mitad de las comprobaciones. Pero ya digo, hay que pensar en binario :P
Y tampoco es que tenga mucho impacto respecto a lo que estabas haciendo... salvo que estés portando a algún dispositivo muy limitado en recursos (GP32, Android2.1...).
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

#46
Otra:

Necesito una bola de demolicion, he buscado el hilo del ejemplo pero no doy con el...
¿será en otro foro? lol

pos eso, en un centro x,y necesito que averigue la distancia de otro proceso y solo le permita moverse en circulo sobre el a una distanca, como la bola de demolición del doctor robotnik en el sonic o un pendulo colgando, etc...

ya me respondo yo con el trozo de codigo que necesito:

    loop
        seno=sin(angulo)*radio;
        coseno = cos(angulo)*radio;
        x = var_relativa_x + coseno; 
        y = var_relativa_y + seno;
        angulo = angulo % 360000;            // se redondea cada vuelta
        angle = -angulo;                        // se orienta la imagen
         
        if(key(_right)) var_relativa_x+=5; end
        if(key(_left)) var_relativa_x-=5; end
        if(key(_up))var_relativa_y-=5; end
        if(key(_down))var_relativa_y+=5; end

        if(key(_1))angulo-=5000;end
        if(key(_2))angulo+=5000;end

        if(key(_esc))exit();end
   frame;


Futu-block

Quote from: Futu-block on February 08, 2017, 08:53:05 AMPara hacer un programa y no un juego yo programo con loop y eso de comprobar 25~50 veces al segundo en un programa que practicamente no variará sino clicas en algun sitio o arrastras como que no es muy util...

¿se puede poner algo como ''until ... mouse.left'' o algo asi? o el until tambien hace 25~50 comprobaciones al segundo??

Pos eso, ¿no es mejor usar en cada proceso un bloque ''until'' en vez un bloque ''loop'' que comprueba N veces por segundo?
o en un bloque ''until'' tambien comprueba en cada frame??

y ya que enstamos en caliente, ¿se puede hacer un bloque ''until mouse.left''

Drumpi

No, Bennu no funciona ni por eventos ni por interrupciones, así que, como mínimo, tendrás que comprobar si mouse.left.
Pero como lo que quieres hacer es para el momento justo cuando haces clic, entonces tienes que recurrir al viejo truco de:
if (!antes_pulsada && mouse.left)
    antes_pulsada = true;
    //tu codigo
elsif (antes_pulsada && !mouse_left)
    antes_pulsada = false;
end


De todas formas ten en cuenta una cosa:
- Un procesador de 500MHz puede hacer 500.000.000 de ifs por segundo (y en el código que te he puesto sólo hay 4 comprobaciones y una asignación, aun puedes ejecutar 499.999.750 instrucciones más en ese segundo, suponiendo un set_fps(50,0)).
- A diferencia de Visual Basic, el código no está en ejecución continua: se ejecuta hasta que todos los procesos llegan a frame, y luego espera a que pasen el 1/25 o 1/50 de segundo restante, no hace nada en esa espera e incluso la CPU podría ejecutar otras tareas mientras llega el siguiente frame. No sé si Visual Basic implementa un sistema de interrupciones por HW o hace esa comprobación continua de la que hablas.

Respecto a ese bloque ¡Ojalá! Estaríamos implementando un sistema básico de señales. Si en lugar de ser "until mouse.left", pudieramos poner la etiqueta que quisiéramos, podríamos poner el proceso en freeze, y sólo se ejecutaría el bloque que dijéramos cuando lo dijéramos... pero eso sería ya casi implementar un sistema de clases. También puedes usar funciones, y actuar sobre una estructura global.

Siento no poder explicarme con más claridad, pero hoy he dormido poco ^^U
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

me doy por respondido, muchas gracias

Futu-block

Otra, pa no abrir un hilo nuevo

·Quiero que cuando se mueva el personaje no se mueva en diagonal en otras direcciones asi que uso el esleif:

if (key (_up)) y--;
elseif (key (_down)) y++;
elseif (key (_left)) x--;
elseif (key (_down)) x++;
end


Ahora bien, que cuando dejo de pulsar una dirección avance una mijita, ¿como lo hago?
·¿Doy un valor diferente en cada tecla pulsada y luego ''switcheo'' cual deja de pulsar para avanzar en esa dirección?
·¿Bloqueo de alguna forma las otras tres teclas para que no se pulsen?
·¿Hay algo asi pa eso de alguna forma mas ''facil''?

warrior_rockk

Si avanzar una "mijita" te refieres a que tenga inercia, tienes que utilizar variables de aceleración. La pulsación de teclas de dirección no actuaría sobre la variable x e y si no sobre unas variables vX o vY sumando o restando. Si no se pulsa ninguna dirección, vas disminuyendo esa variable hasta 0 (esa sería la fricción) y por último, actualizas las posiciones x e y con esa variable de aceleración.
De memoria, algo asi:



if (key(_right))
   vX++;
if (key(_left))
   vX--;


if ( !key(_right) && !key(_right) )
   vX*= friction; //friction debe ser una constante inferior a 1


x = x+vX;



Te quedaría limitar cuanto sumas o restas de aceleración cada vez que pulsas...

Futu-block

no es eso lo que pregunto, lo que pregunto es que cuando deje de pulsar es cuando ''derrapa'' y claro, no es lo mismo dejar de pulsar arriba que derecha, entonces no puedo usar el elseif...

if (key (_up)) y--;
elseif (key (_down)) y++;
elseif (key (_left)) x--;
elseif (key (_down)) x++;
else //avanzo segun seguia avanzando
end


y lo que no quiero hacer es


if (key(_up) and !key(_down) and !key(_left) and !key(_right))
    tal y cual, pascual;
end


Pregunto si hay alguna forma mas facil.
De todas formas, de mientras estoy currandome un motor de movimiento para hacer algo en plan Lolo de nes, que tiene un suelo de cuadricula y siempre que se mueve termina en el centro de la losa

Futu-block

#53
Otra cuestion ''more''

Ya tengo hecho el motor de movimiento que se basa en un simple bloque for dentro de un if lol, es gracioso pero funciona:

      if (key(_right))         // yendo a la derecha
         for (a = 0; a < 8; a++)
            x++;
            frame 250;
         end
      end
etc etc


Ahora bien, entre terminar el movimiento y empezar otro se pierde un frame, que a 60 por segundos no deberia pasar nada, pero hay una pequeña pausa ahí que me incomoda una jartá (y mas porque soy el que lo progamo) ¿como se podria quitar?

Una de las soluciones que veo es ponerle un 'if (key (_up)) go to 30' como se hacia en antiguamente, pero no se si se podría en bennu, o quedaría ''muy etico''
Otra es preguntar mientras el a del bloque for no llegue a 8 ponerlo a 0, pero lo he comprobado y me como una caquita, por no decir que me como un mojon
Otra mas es antes del end del if de la tecla tal se pregunte si está pulsada otra vez y empiece a 0 a del bloque for para hacerlo otra vez, pero habria otra vez que hacer una comprobación y no terminar nunca        Total, que cuando termino el bloque for necesito volver a saber si sigue pulsada la tecla...

¿alguna idea?     

Futu-block

#54
Otra con el tema map_put y con graficos del fpg:

resulta que meto en un bloque for y empiezo a meterle en un array a cargar imagenes con map_put en la cuadricula correspondiente un grafico que despues no sale porque al parecer he hecho con un programa ''incompatible'' (vamos a dejarlo ahí) luego cambio a una imagen añadida otro dia de las que llamo antiguas y carga, si vuelvo a la nueva, nada, si le cambio el numero tampoco, si cojo una imagen antigua si...
si uso creo una imagen nueva y la cargo en el fpg , pues tampoco

con imagen nueva:


con imagen antigua:


las castas de bil gay y su puta mare del window$


Peeeeero no hay nada que se solucione sin editar la imagen desde el mismo fpg editor...
Y para mas inri, hoy pruebo con otra imagen hecha de cero y funciona, lo dicho, el Billy Gay tiene toa la culpa

Futu-block

#55
Otra:
quiero retrasar una animación o un movimiento y me acuerdo que habia una opción donde la ponias y te relantizaba o de aceleraba, pero no me acuerdo como se llama, no se si era delay o era resolución o yo que se...
¿alguien sabe de que hablo?

Vale, ya lo he ''descubierto'' mas bien me lo han chivao,  pero que lo expongo aqui para que no se me olvide:

La idea era simple, muchos enemigos, creados todos al mismo tiempo y con el mismo grafico + animación. Al crearse todos a la par, todos se mueven a la par y la animación es igual toda en perfecta sincronia y aburre tela, asi que si variamos la frecuencia ya cada enemigo irá a su bola, ya que es el mismo proceso creado muchas veces. Si al final del codigo, en lo de frame le ponemos entre parentesis un numero ya cambiamos la frecuencia. Cada enemigo se moverá o cambiará la animación distintamente a lo seleccionado con respecto al seteo de frames

Futu-block

Otra...
bueno, antes reporto un bug del fpg editor v4.0.2 en ubuntu 17.10 con wine, me repite los graficos...


y ahora la pregunta: ¿puedo de alguna manera preguntar si existe algun archivo?
es para mi juego de la mariquita, como las pantallas son ''editables'' quiero que pregunte si existe el archivo de la siguiente pantalla, sino game over, ¿se puede?

Drumpi

Quote from: Futu-block on October 11, 2017, 06:13:45 PM
Otra cuestion ''more''

Ya tengo hecho el motor de movimiento que se basa en un simple bloque for dentro de un if lol, es gracioso pero funciona:

      if (key(_right))         // yendo a la derecha
         for (a = 0; a < 8; a++)
            x++;
            frame 250;
         end
      end
etc etc


Ahora bien, entre terminar el movimiento y empezar otro se pierde un frame, que a 60 por segundos no deberia pasar nada, pero hay una pequeña pausa ahí que me incomoda una jartá (y mas porque soy el que lo progamo) ¿como se podria quitar?

Una de las soluciones que veo es ponerle un 'if (key (_up)) go to 30' como se hacia en antiguamente, pero no se si se podría en bennu, o quedaría ''muy etico''
Otra es preguntar mientras el a del bloque for no llegue a 8 ponerlo a 0, pero lo he comprobado y me como una caquita, por no decir que me como un mojon
Otra mas es antes del end del if de la tecla tal se pregunte si está pulsada otra vez y empiece a 0 a del bloque for para hacerlo otra vez, pero habria otra vez que hacer una comprobación y no terminar nunca        Total, que cuando termino el bloque for necesito volver a saber si sigue pulsada la tecla...

¿alguna idea?     

Te voy a ir respondiendo poco a poco, porque... por lo de siempre, me falta tiempo hasta de ir al baño, y tus dudas hay que explicártelas con todo lujo de detalles y no son tan sencillas.

El código que has puesto, es normal que haga una pausa, ya que haces FRAME(250), lo que significa que después de moverse tiene que esperar entre un frame a un frame y medio, antes de ejecutar la siguiente instrucción.
Creo que ya te lo explicó DCelso por Telegram, pero si quieres que un personaje vaya más despacio, no uses frame con porcentajes altos ni modifiques los FPS: usa la variable RESOLUTION con ese proceso y modifica cuánto debe sumarse a X o a Y.

Si quieres hacer como se hacía antiguamente, o como en Pokemon, que pulsas una dirección y no hace otra cosa hasta que llega al destino, el bucle que has hecho es perfecto, pero no te sirve para meterlo en el personaje directamente, porque si es atacado en medio del movimiento, el prota lo va a ignorar hasta que llegue a su destino. Puedes tenerlo como un proceso aparte, que modifique la X y la Y desde fuera.
Lo ideal es tener lo que ya te expliqué hace tiempo: una máquina de estados. Tendrías que tener un estado de "esperando", que al pulsar una tecla pasase al estado "moviendo hacia arriba"/"moviendo hacia derecha"..., y que sólo salga de ese estado al llegar al destino, momento en el que vuelve a "esperando". Tiene la pega de que debes poder interrumpir el proceso para recibir un ataque, por ejemplo, y retomar el estado anterior por donde se quedó, pero nadie dijo que programar fuera sencillo.
Te digo lo de antes, esto necesita de tiempo para explicarse, con esquemas, dibujos y demás. Si no, ya sabes: papel, lápiz y a rascarse la cabeza.

Es que no tengo ningún ejemplo a mano, lo siento.
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

Quote from: Futu-block on October 15, 2017, 08:49:36 PM
Otra con el tema map_put y con graficos del fpg:

resulta que meto en un bloque for y empiezo a meterle en un array a cargar imagenes con map_put en la cuadricula correspondiente un grafico que despues no sale porque al parecer he hecho con un programa ''incompatible'' (vamos a dejarlo ahí) luego cambio a una imagen añadida otro dia de las que llamo antiguas y carga, si vuelvo a la nueva, nada, si le cambio el numero tampoco, si cojo una imagen antigua si...
si uso creo una imagen nueva y la cargo en el fpg , pues tampoco

con imagen nueva:


con imagen antigua:


las castas de bil gay y su puta mare del window$


Peeeeero no hay nada que se solucione sin editar la imagen desde el mismo fpg editor...
Y para mas inri, hoy pruebo con otra imagen hecha de cero y funciona, lo dicho, el Billy Gay tiene toa la culpa

Macho, qué lío has armado, no me entero de nada. ¿Cómo que metes una imágen otro día? ¿Qué otro día? ¿Tienes el programa ejecutándose y modificas el FPG de un día para otro?

Primero, comprueba que los FPGs se han cargado correctamente: que devuelven un valor >= 0, que la ruta es la correcta, que el FPG contiene lo que dices...
Segundo, comprueba que el mapa existe, que se puede asignar a un proceso y que se ve en pantalla.
Tercero, mira a ver si puedes pintar SÓLO ESA IMÁGEN en el fondo de la pantalla.
Si todo eso está correcto, es que hay alguna diferencia entre los dos FPGs que hace que deje de funcionar: tal vez los puntos de control, la numeración, la versión, la profundidad de color, algún bug del editor...
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

Quote from: Futu-block on October 29, 2017, 08:44:32 AM
Otra:
quiero retrasar una animación o un movimiento y me acuerdo que habia una opción donde la ponias y te relantizaba o de aceleraba, pero no me acuerdo como se llama, no se si era delay o era resolución o yo que se...
¿alguien sabe de que hablo?

Vale, ya lo he ''descubierto'' mas bien me lo han chivao,  pero que lo expongo aqui para que no se me olvide:

La idea era simple, muchos enemigos, creados todos al mismo tiempo y con el mismo grafico + animación. Al crearse todos a la par, todos se mueven a la par y la animación es igual toda en perfecta sincronia y aburre tela, asi que si variamos la frecuencia ya cada enemigo irá a su bola, ya que es el mismo proceso creado muchas veces. Si al final del codigo, en lo de frame le ponemos entre parentesis un numero ya cambiamos la frecuencia. Cada enemigo se moverá o cambiará la animación distintamente a lo seleccionado con respecto al seteo de frames

Lo dicho antes y lo dicho por el "chivato" por telegram: no uses FRAME con porcentajes distintos de 100. Usa la variable RESOLUTION, y dales a cada uno de los enemigos un valor de velocidad diferente:

process enemigo (int velocidad)
begin
    resolution = 100;
    loop
        if (mover_derecha) x += velocidad; end
        if (mover_izquierda) x -= velocidad; end
        ...
        frame;
    end
end


Y llamas a enemigo con, por ejemplo:
enemigo(rand(50,200))

De esta forma, generas enemigos que pueden ir entre el 50%-200% de la velocidad normal. Como resolution vale 100, significa que X debe valer 100 para que se desplace el proceso un pixel. Por lo general, resolution vale 1.
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)