elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Solucionado, lo dejo como reto: Optimizar código relacionado con presionar y soltar teclas.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Solucionado, lo dejo como reto: Optimizar código relacionado con presionar y soltar teclas.  (Leído 1,516 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.217


Superhacker (es broma xD )


Ver Perfil
Solucionado, lo dejo como reto: Optimizar código relacionado con presionar y soltar teclas.
« en: 16 Noviembre 2022, 18:15 pm »

Quiero:

Momento 1:
El usuario puede mover un personaje hacia los costados con las teclas flechas o elevar una pelota con la tecla A. El 2ndo evento activa el momento 2.

Momento 2:
La pelota sube cada vez más lento y luego comienza a bajar cada vez más rápido, hasta llegar a su posición de inicio, evento que reactiva el momento 1. Si la tecla A se soltó y mientras la pelota está en el aire se represiona, se activa el momento 3.

Momento 1 repetido:
Si el usuario no soltó la tecla A, el evento de elevar la pelota no se activa, pero es posible mover al personaje.


Tengo:
Frame 1:
Código
  1. Teclafuesoltada = 0;
  2. // ///////////////////////////////////////////////////////
  3. // ///////////////////////  Alex  ////////////////////////
  4. // ///////////////////////////////////////////////////////
  5. function Alexmovetoserve () {
  6. if (Teclafuesoltada == 0) {
  7. // Se asume que el jugador elevó la pelota y no soltó la tecla, o que quizá empezó el juego con la tecla presionada.
  8. // Hasta que se capte que la tecla no está presionada no se podrá elevar la pelota.
  9. // Es para evitar que en caso de mantener la tecla presionada se eleve la pelota a penas vuelva a la mano.
  10. if (Key.isDown(65)) {
  11. } else {
  12. Teclafuesoltada = 1;
  13. // Ahora al presionar la tecla de nuevo Alex elevará la pelota.
  14. }
  15. if (Key.isDown(37)) {
  16. // Se mueve a la izquierda, si no se sale del límite.
  17. } else if (Key.isDown(39)) {
  18. // Se mueve a la derecha, si no se sale del límite.
  19. }
  20. } else if (Key.isDown(65)) {
  21. // Tecla A, lanza pelota hacia arriba.
  22. Funcencurso = "Alexelevandoball";
  23. Teclafuesoltada = 0;
  24. // Velocidad de subida y altura (todo al revés).
  25. BallZSpeed = -0.75;
  26. BallZ = -40;
  27. Alex.gotoAndStop(2);
  28.                gotoAndStop(3);
  29. } else if (Key.isDown(37)) {
  30. // Se mueve a la izquierda, si no se sale del límite.
  31. } else if (Key.isDown(39)) {
  32. // Se mueve a la derecha, si no se sale del límite.
  33. }
  34. }
  35. //
  36. function Alexelevandoball () {
  37. if (Teclafuesoltada == 0) {
  38. // Aún no se soltó la tecla.
  39. if (Key.isDown(65)) {
  40. } else {
  41. Teclafuesoltada = 1;
  42. // Ahora al presionarla de nuevo Alex saca.
  43. }
  44. } else if (Key.isDown(65)) {
  45. // La tecla fue soltada y vuelta a presionar; Alex saca.
  46. Alex.gotoAndStop(3);
  47.         gotoAndStop(3);
  48. }
  49. // Disminuye la velocidad de subida y varía la altura.
  50. // Varía el tamaño de la pelota.
  51. if (BallZ>=-40) {
  52. // Si queda muy abajo (BallZ muy alto), vuelve a la etapa Alexmovetoserve.
  53. Teclafuesoltada = 0;
  54. Funcencurso = "Alexmovetoserve";
  55. Alex.gotoAndStop(1);
  56. gotoAndStop(2);
  57. }
  58. }
  59. Funcencurso = "Alexmovetoserve";

Frame 2:
stop ();

Objeto en frame 2:
Código:
onClipEvent (enterFrame) {
    _level0.Alexmovetoserve();
}

Objeto en frame 3:
Código:
onClipEvent (enterFrame) {
    _level0.Alexelevandoball();
}


Lo malo es que la parte:
Código:
if (Key.isDown(37)) {
// Se mueve a la izquierda, si no se sale del límite.
} else if (Key.isDown(39)) {
// Se mueve a la derecha, si no se sale del límite.
}
...está presente 2 veces ¿alguna manera de mejorarlo que no sea crear una función y repetirla también?


Tenía esto:
Código
  1. Teclafuesoltada = 0;
  2. // ///////////////////////////////////////////////////////
  3. // ///////////////////////  Alex  ////////////////////////
  4. // ///////////////////////////////////////////////////////
  5. function Alexmovetoserve () {
  6. if (Teclafuesoltada == 0) {
  7. // Se asume que el jugador elevó la pelota y no soltó la tecla, o que quizá empezó el juego con la tecla presionada.
  8. // Hasta que se capte que la tecla no está presionada no se podrá elevar la pelota.
  9. // Es para evitar que en caso de mantener la tecla presionada se eleve la pelota a penas vuelva a la mano.
  10. if (Key.isDown(65)) {
  11. } else {
  12. Teclafuesoltada = 1;
  13. // Ahora al presionar la tecla de nuevo Alex elevará la pelota.
  14. }
  15. } else if (Key.isDown(65)) {
  16. // Tecla A, lanza pelota hacia arriba.
  17. Funcencurso = "Alexelevandoball";
  18. Teclafuesoltada = 0;
  19. // Velocidad de subida y altura (todo al revés).
  20. BallZSpeed = -0.75;
  21. BallZ = -40;
  22. Alex.gotoAndStop(2);
  23.                gotoAndStop(3);
  24. } else if (Key.isDown(37)) {
  25. // Se mueve a la izquierda, si no se sale del límite.
  26. } else if (Key.isDown(39)) {
  27. // Se mueve a la derecha, si no se sale del límite.
  28. }
  29. }
  30. //
  31. function Alexelevandoball () {
  32. if (Teclafuesoltada == 0) {
  33. // Aún no se soltó la tecla.
  34. if (Key.isDown(65)) {
  35. } else {
  36. Teclafuesoltada = 1;
  37. // Ahora al presionarla de nuevo Alex saca.
  38. }
  39. } else if (Key.isDown(65)) {
  40. // La tecla fue soltada y vuelta a presionar; Alex saca.
  41. Alex.gotoAndStop(3);
  42.         gotoAndStop(3);
  43. }
  44. // Disminuye la velocidad de subida y varía la altura.
  45. // Varía el tamaño de la pelota.
  46. if (BallZ>=-40) {
  47. // Si queda muy abajo (BallZ muy alto), vuelve a la etapa Alexmovetoserve.
  48. Teclafuesoltada = 0;
  49. Funcencurso = "Alexmovetoserve";
  50. Alex.gotoAndStop(1);
  51. gotoAndStop(2);
  52. }
  53. }
  54. Funcencurso = "Alexmovetoserve";

...pero con eso ocurre que si uno deja presionada la tecla desde el evento 1, entonces al reactivarse ese momento no es posible moverse hasta que se suelte la tecla; quiero que se pueda.

Para lograrlo hice esto:
Código
  1. Teclafuesoltada = 0;
  2. // ///////////////////////////////////////////////////////
  3. // ///////////////////////  Alex  ////////////////////////
  4. // ///////////////////////////////////////////////////////
  5. function Alexmovetoserve () {
  6. // Se asume que el jugador elevó la pelota y no soltó la tecla, o que quizá empezó el juego con la tecla presionada.
  7. // Hasta que se capte que la tecla no está presionada no se podrá elevar la pelota.
  8. // Es para evitar que en caso de mantener la tecla presionada se eleve la pelota a penas vuelva a la mano.
  9. if (Key.isDown(37)) {
  10. // Se mueve a la izquierda, si no se sale del límite.
  11. } else if (Key.isDown(39)) {
  12. // Se mueve a la derecha, si no se sale del límite.
  13. } else if (Teclafuesoltada == 0) {
  14. if (Key.isDown(65)) {
  15. } else {
  16. Teclafuesoltada = 1;
  17. // Ahora al presionar la tecla de nuevo Alex elevará la pelota.
  18. }
  19. } else if (Key.isDown(65)) {
  20. // Tecla A, lanza pelota hacia arriba.
  21. Funcencurso = "Alexelevandoball";
  22. Teclafuesoltada = 0;
  23. // Velocidad de subida y altura (todo al revés).
  24. BallZSpeed = -0.75;
  25. BallZ = -40;
  26. Alex.gotoAndStop(2);
  27.                gotoAndStop(3);
  28. }
  29. }
  30. //
  31. function Alexelevandoball () {
  32. if (Teclafuesoltada == 0) {
  33. // Aún no se soltó la tecla.
  34. if (Key.isDown(65)) {
  35. } else {
  36. Teclafuesoltada = 1;
  37. // Ahora al presionarla de nuevo Alex saca.
  38. }
  39. } else if (Key.isDown(65)) {
  40. // La tecla fue soltada y vuelta a presionar; Alex saca.
  41. Alex.gotoAndStop(3);
  42.         gotoAndStop(3);
  43. }
  44. // Disminuye la velocidad de subida y varía la altura.
  45. BallZSpeed = BallZSpeed+0.01;
  46. BallZ = BallZ+BallZSpeed;
  47. setProperty (Alex.Ball, _y, BallZ);
  48. // Varía el tamaño de la pelota.
  49. BallZoom = 100+BallZ*-1;
  50. setProperty (Alex.Ball, _xscale, BallZoom);
  51. setProperty (Alex.Ball, _yscale, BallZoom);
  52. if (BallZ>=-40) {
  53. // Si queda muy abajo (BallZ muy alto), vuelve a la etapa Alexmovetoserve.
  54. Teclafuesoltada = 0;
  55. Funcencurso = "Alexmovetoserve";
  56. Alex.gotoAndStop(1);
  57. gotoAndStop(2);
  58. }
  59. }
  60. Funcencurso = "Alexmovetoserve";

...pero esto hace que mientras uno esté caminando, si se presiona A, el evento de A no se activa.


¡Ya se me ocurrió una solución y funcionó! ;-) Describir los problemas ayuda. Bueno, lo dejo como reto, si quieren les digo la solución.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado] Optimizar ram « 1 2 »
.NET (C#, VB.NET, ASP)
Segurida 11 8,993 Último mensaje 8 Mayo 2011, 17:24 pm
por Segurida
[Solucionado] [Windows 7] [Atajo te] [Mute] ¿Como hacerlo sin teclas especiales?
Windows
Di~OsK 6 9,411 Último mensaje 31 Mayo 2011, 06:53 am
por Randomize
AYUDA- presionar teclas
.NET (C#, VB.NET, ASP)
Nukita 1 3,528 Último mensaje 10 Agosto 2011, 19:22 pm
por Nukita
Presionar teclas de forma automatica
Programación General
daryl09 2 6,292 Último mensaje 12 Diciembre 2013, 17:36 pm
por Platanito Mx
VBS: Mensaje en pantalla al presionar ciertas teclas
Scripting
Dreyko91 1 1,626 Último mensaje 23 Noviembre 2018, 02:59 am
por tincopasan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines