Autor Tema: Tontadas y pamplinas + Otras dudas  (Leído 2927 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Drumpi

  • Hero Member
  • *****
  • Mensajes: 6107
  • Karma: 156
  • Sexo: Masculino
  • Odio el periodo "entre proyectos"
    • Ver Perfil
    • La web de Drumpi
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #45 en: Enero 02, 2017, 05:31:35 am »
¡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:

Código: [Seleccionar]
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:

Código: [Seleccionar]
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)

Conectado Futu-block

  • Hero Member
  • *****
  • Mensajes: 2587
  • Karma: 32
  • Sexo: Masculino
  • Superviviente marciano
    • Ver Perfil
    • futublock
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #46 en: Febrero 02, 2017, 03:25:45 pm »
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:

Código: [Seleccionar]
    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;

« última modificación: Febrero 03, 2017, 04:32:35 am por Futu-block »


Conectado Futu-block

  • Hero Member
  • *****
  • Mensajes: 2587
  • Karma: 32
  • Sexo: Masculino
  • Superviviente marciano
    • Ver Perfil
    • futublock
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #47 en: Febrero 08, 2017, 01:15:28 pm »
Para 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''


Desconectado Drumpi

  • Hero Member
  • *****
  • Mensajes: 6107
  • Karma: 156
  • Sexo: Masculino
  • Odio el periodo "entre proyectos"
    • Ver Perfil
    • La web de Drumpi
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #48 en: Febrero 10, 2017, 09:46:25 am »
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:
Código: [Seleccionar]
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)

Conectado Futu-block

  • Hero Member
  • *****
  • Mensajes: 2587
  • Karma: 32
  • Sexo: Masculino
  • Superviviente marciano
    • Ver Perfil
    • futublock
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #49 en: Febrero 10, 2017, 10:47:55 am »
me doy por respondido, muchas gracias


Conectado Futu-block

  • Hero Member
  • *****
  • Mensajes: 2587
  • Karma: 32
  • Sexo: Masculino
  • Superviviente marciano
    • Ver Perfil
    • futublock
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #50 en: Octubre 10, 2017, 01:33:42 pm »
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:
Código: [Seleccionar]

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


Desconectado warrior_rockk

  • Full Member
  • ***
  • Mensajes: 227
  • Karma: 8
    • Ver Perfil
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #51 en: Octubre 11, 2017, 06:47:02 am »
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:


Código: [Seleccionar]
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...

Conectado Futu-block

  • Hero Member
  • *****
  • Mensajes: 2587
  • Karma: 32
  • Sexo: Masculino
  • Superviviente marciano
    • Ver Perfil
    • futublock
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #52 en: Octubre 11, 2017, 07:37:55 am »
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...
Código: [Seleccionar]
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

Código: [Seleccionar]
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


Conectado Futu-block

  • Hero Member
  • *****
  • Mensajes: 2587
  • Karma: 32
  • Sexo: Masculino
  • Superviviente marciano
    • Ver Perfil
    • futublock
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #53 en: Octubre 11, 2017, 10:13:45 am »
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:
Código: [Seleccionar]
      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?     
« última modificación: Octubre 11, 2017, 02:04:22 pm por Futu-block »


Conectado Futu-block

  • Hero Member
  • *****
  • Mensajes: 2587
  • Karma: 32
  • Sexo: Masculino
  • Superviviente marciano
    • Ver Perfil
    • futublock
Re:Tontadas y pamplinas + Otras dudas
« Respuesta #54 en: Octubre 15, 2017, 12: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
« última modificación: Octubre 16, 2017, 02:01:53 am por Futu-block »