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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Drumpi

  • Hero Member
  • *****
  • Mensajes: 6002
  • 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: 2518
  • 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: 2518
  • 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: 6002
  • 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: 2518
  • 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