Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Tachikomaia en 16 Noviembre 2022, 18:15 pm



Título: Solucionado, lo dejo como reto: Optimizar código relacionado con presionar y soltar teclas.
Publicado por: Tachikomaia 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.