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


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Cómo mejoro la jugabilidad de mi Pong?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Cómo mejoro la jugabilidad de mi Pong?  (Leído 87 veces)
Tachikomaia


Conectado Conectado

Mensajes: 1.758


Hackentifiko!


Ver Perfil
¿Cómo mejoro la jugabilidad de mi Pong?
« en: Hoy a las 06:54 »

Mi idea, que me está siendo imposible de aplicar o no es buena, incluye:

- Cuando la bola va hacia ti, puedes presionar Q, W, A o S. Q hace que la bola rebote (si te toca) hacia arriba-izquierda, W arriba-derecha, A izquierda y S derecha. O sea en vez de que la bola rebote según con qué parte la toques, rebota hacia donde indiques con teclas. Incluso si es mala idea, es una práctica para un posible videojuego de tenis más adelante.

Opinen de ese y los siguientes puntos. ¿No es bueno, por qué, qué sería mejor?

- Una vez que presionaste una de esas teclas y la soltaste, presionar Q o A hace que la bola tenga rotación hacia la izquierda y presionar W o S rotación a la derecha.
No es posible lanzar al centro y con rotación. Para lanzar al centro debes no tocar tecla, y la rotación sólo se puede asignar luego de haber tocado tecla, elegido dirección. Podría poner la opción con Z, pero tirar al centro no lo veo muy útil, incluso si tiene rotación.

- La rotación hace que la bola vaya aumentando su velocidad hacia el lado correspondiente. En la realidad puede que también disminuya la velocidad hacia adelante, pero ya me fue muy difícil conseguir las fórmulas matemáticas para todo lo anterior, por ahora no quiero cambiar esto.

- La rotación va disminuyendo a medida que pasa el tiempo. Creo que en la realidad es conforme a cuánto avanza la bola, pero mismo comentario.

- Cuando la bola toca una pared, la rotación influye en cómo rebota. Es como cuando toca el piso con efecto liftado o cortado, en este caso rebotará adquiriendo velocidad o perdiendo. Si pierde demasiado puede quedarse quieta o ir hacia atrás, esto puede ser la causa de un bug muy poco probable que aún no intenté corregir. También, la rotación se pierde luego de rebotar, pero adquiere otra un poco.

- El rival tiene una variable ReactionProgress que marca cuánto tarda en reaccionar a tus tiros.

- Cuando haces un punto, muchas cosas aumentan: La velocidad de las naves, la velocidad mínima y máxima de la bola, de la intensidad de la rotación... ReactionProgress también al resetearse es mayor, digamos, tardará menos en llegar a 100%.

- Las naves tienen una estadística puntería y maxPuntería, que empiezan muy bajas. De momento es coherente con lo dicho anteriormente. Quisiera que suban por experiencia (lo demás también), pero como algo está fallando, aún no lo intento.

- Cuando presionas una tecla para apuntar, tu puntería alcanzada comienza a aumentar sin llegar a superar tu MaxPuntería. Esto es una 3er variable, para entenderlo pueden pensar en la velocidad en juegos de coches: 1) Qué tan rápido aumenta tu velocidad actual, 2) cual es la máxima, 3) tu velocidad actual. Acá hay cuan rápido aumenta tu puntería cuando apuntas, cual es la máxima puntería que puedes alcanzar así, y cuánto alcanzaste de momento. Así que entre más antes presiones una tecla para apuntar, más probable es que tus tiros salgan bien.

- Cuando presionas de nuevo para rotar, tu puntería baja a 0 y empieza a aumentar/caer (según hacia dónde elijas rotar) la variable Rotando, funciona muy parecido a lo de puntería, y puntería sigue subiendo luego. En vez de que baje a 0 la voy a dividir entre 2, pero bueno, el fundamento de esto es que al causar rotación se pierde puntería, y no es que se tenga 0 si reaccionas suficientemente rápido.

- Cuando tu puntería no es 100 (tienes que hacer muchos puntos para que lo sea), tus tiros pueden ser menos veloces de lo normal, ir menos hacia un costado, o ir al opuesto, y tener menos rotación o la opuesta. Entre menos puntería hayas alcanzado, con más intensidad pueden ocurrir esas cosas.

Creo que eso es todo lo relevante. A mí me parece bonito pero en la práctica la bola tiene velocidades hacia el costado demasiado altas (teniendo en cuenta que es el inicio del juego y en comparación con las velocidades hacia adelante) y es muy difícil hacer puntos. Intenté arreglarlo y seguiré pero consulto porque ya medio como que no sé qué tengo que hacer.

El exe si quieren experimentarlo:
https://drive.google.com/file/d/1Pav6Swvi58bhHP2x5S8i2EchzHZKPRkC/view?usp=sharing

El siguiente video se ve como cortado porque fue a 60fps y el juego va a 120:
https://youtu.be/lmWi6YhDgVk

Código
  1. // Algo como esto if (MeteorYSpeed>0) { se está haciendo 2 veces,
  2. // pero evitarlo implicaría unir cosas del jugador y la IA?
  3. //
  4. fscommand ("fullscreen", "true");
  5. // Varía según diferencia de puntajes:
  6. Dificultad = 0;
  7. // Player:
  8. attachMovie("sShip", "Player", 1);
  9. setProperty ("Player", _x, 400);
  10. setProperty ("Player", _y, 579.5);
  11. // Velocidad conque se mueve:
  12. PlayerSpeed = 3;
  13. // Velocidad conque aumenta la puntería cuando...
  14. // se prepara un rebote:
  15. PlayerPunteria = 5;
  16. // Siempre es PlayerPunteria^2:
  17. PlayerMaxPunteria = 25;
  18. PlayerScore = 0;
  19. // Puntería alcanzada, en este momento el jugador saca...
  20. // así que tiene la máxima. Entre más baja sea,
  21. // peor puede que sea el rebote:
  22. Punteria = PlayerMaxPunteria;
  23. // ApuntandoX se define como si...
  24. // el medio de la pantalla fuese 0:
  25. ApuntandoX = 350*(2*random(2)-1);
  26. ApuntandoY = 20.5+279.5*random(2);
  27. // Hay una cantidad máxima que el meteoro puede rotar,
  28. // hacia un lado u otro (valor negativo), depende de Dificultad.
  29. // Rotando es un porcentaje, se rotará ese porcentaje del máximo:
  30. Rotando = 100*(2*random(2)-1);
  31. // IA:
  32. attachMovie("sIA", "IA", 2);
  33. setProperty ("IA", _x, 400);
  34. setProperty ("IA", _y, 20.5);
  35. IASpeed = 3;
  36. IAPunteria = 3;
  37. IAScore = 0;
  38. // Meteor:
  39. attachMovie("sMeteor", "Meteor", 3);
  40. setProperty ("Meteor", _x, 400);
  41. setProperty ("Meteor", _y, 544.5);
  42. MeteorX = 400;
  43. MeteorY = 544.5;
  44. // Se define acá para que luego el programa considere que...
  45. // hubo contacto entre la nave del jugador y el meteoro:
  46. MeteorYSpeed = 1;
  47. // Para que la curvatura dependa de...
  48. // MeteorYSpeed (1 es hacia arriba, -1 hacia abajo):
  49. MeteorYDirection = -1;
  50. // Valores del color más brillante del meteoro (F0D9C8):
  51. MaxRojo = 255;
  52. MaxVerde = 217;
  53. MaxAzul = 200;
  54. // /////////////////////////////////////////////
  55. // ////////////// Nave de Jugador //////////////
  56. // /////////////////////////////////////////////
  57. function ControlShip () {
  58. if (Key.isDown(39)) {
  59. // Derecha.
  60. // Para evitar que se vaya demasiado al extremo derecho:
  61. if (Player._x<722) {
  62. Player._x = Player._x+PlayerSpeed;
  63. } else {
  64. Player._x = 725;
  65. }
  66. } else if (Key.isDown(37)) {
  67. // Izquierda.
  68. // Para evitar que se vaya demasiado al extremo izquierdo:
  69. if (Player._x>78) {
  70. Player._x = Player._x-PlayerSpeed;
  71. } else {
  72. Player._x = 75;
  73. }
  74. }
  75. // Si el meteoro va hacia abajo:
  76. if (MeteorYSpeed>0) {
  77. // Si aún no se eligió hacia dónde rebotarlo:
  78. if (ApuntandoX == 0) {
  79. if (Key.isDown(65)) {
  80. // Tecla A, a la izquierda:
  81. ApuntandoX = -350;
  82. ApuntandoY = 300;
  83. attachMovie("sMira", "Mira", 4);
  84. setProperty ("Mira", _x, 50);
  85. setProperty ("Mira", _y, 300);
  86. // Para luego saber que la tecla fue soltada:
  87. TeclaPresionada = "A";
  88. Punteria = 0;
  89. Rotando = 0;
  90. } else if (Key.isDown(83)) {
  91. // S, a la derecha:
  92. ApuntandoX = 350;
  93. ApuntandoY = 300;
  94. attachMovie("sMira", "Mira", 4);
  95. setProperty ("Mira", _x, 750);
  96. setProperty ("Mira", _y, 300);
  97. TeclaPresionada = "S";
  98. Punteria = 0;
  99. Rotando = 0;
  100. } else if (Key.isDown(81)) {
  101. // Q, a la izquierda arriba:
  102. ApuntandoX = -350;
  103. ApuntandoY = 20.5;
  104. attachMovie("sMira", "Mira", 4);
  105. setProperty ("Mira", _x, 50);
  106. setProperty ("Mira", _y, 20.5);
  107. TeclaPresionada = "Q";
  108. Punteria = 0;
  109. Rotando = 0;
  110. } else if (Key.isDown(87)) {
  111. // W, a la derecha arriba:
  112. ApuntandoX = 350;
  113. ApuntandoY = 20.5;
  114. attachMovie("sMira", "Mira", 4);
  115. setProperty ("Mira", _x, 750);
  116. setProperty ("Mira", _y, 20.5);
  117. TeclaPresionada = "W";
  118. Punteria = 0;
  119. Rotando = 0;
  120. }
  121. // Si ya se eligió a donde apuntar pero aún no se soltó la tecla:
  122. } else {
  123. Punteria = Math.min(Punteria+PlayerPunteria, PlayerMaxPunteria, 100);
  124. if (TeclaPresionada != "Ninguna") {
  125. if (TeclaPresionada == "A" && !Key.isDown(65)) {
  126. TeclaPresionada = "Ninguna";
  127. } else if (TeclaPresionada == "S" && !Key.isDown(83)) {
  128. TeclaPresionada = "Ninguna";
  129. } else if (TeclaPresionada == "Q" && !Key.isDown(81)) {
  130. TeclaPresionada = "Ninguna";
  131. } else if (TeclaPresionada == "W" && !Key.isDown(87)) {
  132. TeclaPresionada = "Ninguna";
  133. }
  134. // Si ya se eligió a dónde apuntar y se soltó la tecla pero no se eligió cómo rotarlo:
  135. } else if (Rotando == 0) {
  136. if (Key.isDown(65) or Key.isDown(81)) {
  137. // Rotar a la izquierda. Representa un porcentaje,
  138. // por ejemplo se aplicará el 1% de...
  139. // la rotación que se elija al azar*-1.
  140. Punteria = 0;
  141. Rotando = -PlayerSpeed;
  142. } else if (Key.isDown(83) or Key.isDown(87)) {
  143. Punteria = 0;
  144. Rotando = PlayerSpeed;
  145. }
  146. } else if (Rotando<0) {
  147. Rotando = Math.max(Rotando-PlayerSpeed, -100);
  148. } else if (Rotando>0) {
  149. Rotando = Math.min(Rotando+PlayerSpeed, 100);
  150. }
  151. // setProperty ("Mira", _xscale, 200-Punteria);
  152. // setProperty ("Mira", _yscale, 200-Punteria);
  153. // setProperty ("Mira", _alpha, 50+Punteria/2);
  154. }
  155. }
  156. }
  157. // /////////////////////////////////////////////
  158. // ////////////////////  IA  ///////////////////
  159. // /////////////////////////////////////////////
  160. function IATurn () {
  161. IAReactionProgress++;
  162. if (IAReactionProgress>500) {
  163. // Si el meteoro va hacia arriba:
  164. if (MeteorYSpeed<0) {
  165. // La IA se moverá hacia él:
  166. Distancia = IA._x-Meteor._x;
  167. } else {
  168. // La IA irá hacia el centro:
  169. Distancia = IA._x-400;
  170. }
  171. if (Distancia<0) {
  172. IA._x = IA._x+IASpeed;
  173. // Para evitar que se vaya demasiado a la derecha:
  174. if (IA._x>725) {
  175. IA._x = 725;
  176. }
  177. } else if (Distancia>0) {
  178. IA._x = IA._x-IASpeed;
  179. if (IA._x<75) {
  180. IA._x = 75;
  181. }
  182. }
  183. }
  184. }
  185. // /////////////////////////////////////////////
  186. // /////////////////  Meteor  //////////////////
  187. // /////////////////////////////////////////////
  188. function VariarMeteoro () {
  189. // esto no viene al caso
  190. }
  191. VariarMeteoro();
  192. function MeteorMoves () {
  193. MeteorXSpeed = MeteorXSpeed+MeteorRotation/1000*MeteorYDirection;
  194. MeteorRotation = MeteorRotation/1.01;
  195. MeteorX = MeteorX+MeteorXSpeed;
  196. Meteor._x = MeteorX;
  197. MeteorY = MeteorY+MeteorYSpeed;
  198. Meteor._y = MeteorY;
  199. Meteor._rotation = Meteor._rotation+MeteorRotation;
  200. // Choque con nave derecha:
  201. if (Meteor._x>752.5) {
  202. MeteorXSpeed = -MeteorXSpeed;
  203. if (MeteorYSpeed>0) {
  204. // Si va hacia abajo:
  205. MeteorYSpeed = Math.max(MeteorYSpeed, MeteorYSpeed-MeteorRotation/50);
  206. } else if (MeteorYSpeed<0) {
  207. MeteorYSpeed = Math.min(MeteorYSpeed, MeteorYSpeed+MeteorRotation/50);
  208. }
  209. MeteorRotation = Math.random()*10*(2*random(2)-1);
  210. } else if (Meteor._x<47.5) {
  211. // Choque con nave izquierda:
  212. MeteorXSpeed = -MeteorXSpeed;
  213. if (MeteorYSpeed>0) {
  214. // Si va hacia abajo:
  215. MeteorYSpeed = Math.max(MeteorYSpeed, MeteorYSpeed+MeteorRotation/50);
  216. } else if (MeteorYSpeed<0) {
  217. MeteorYSpeed = Math.min(MeteorYSpeed, MeteorYSpeed-MeteorRotation/50);
  218. }
  219. MeteorRotation = Math.random()*10*(2*random(2)-1);
  220. }
  221. if (Meteor.hitTest(Player) && MeteorYSpeed>0) {
  222. // Estas 2 serán modificadas por baja Punteria luego:
  223. MeteorYSpeed = Math.min(-Dificultad/10*Math.random()-1, -1);
  224. MeteorRotation = (90*Math.random()+Dificultad*2)*Rotando/100;
  225. // Distancia Y desde el meteoro hasta el punto hacia donde se lo apuntó:
  226. DistanciaY = MeteorY-ApuntandoY;
  227. // Cuánto tardará el meteoro en recorrerla:
  228. TardanzaY = Math.ceil(DistanciaY/-MeteorYSpeed);
  229. // Distancia X desde el meteoro hasta el punto hacia donde se lo apuntó:
  230. DistanciaX = ApuntandoX+400-MeteorX;
  231. // Determinar cuánto de moverá debido a la curva (falta considerar la reducción):
  232. MovimientoPorCurva = MeteorRotation/1000*(101*TardanzaY-10100+10100*Math.pow(1.01, -TardanzaY));
  233. // Determinar la velocidad X para que el meteoro llegue...
  234. // al punto X apuntado justo cuando llega al punto Y apuntado,
  235. // pero luego será modificada por baja Punteria:
  236. MeteorXSpeed = (DistanciaX-MovimientoPorCurva)/TardanzaY;
  237. // Modificaciones por baja Punteria:
  238. InfluenciaDeError = Math.random()*(100-Punteria)/10;
  239. MeteorYSpeed = Math.min(MeteorYSpeed+InfluenciaDeError, -1);
  240. InfluenciaDeError = Math.random()*(100-Punteria)/10;
  241. if (Rotando < 0) {
  242. MeteorRotation = MeteorRotation+InfluenciaDeError;
  243. } else if (Rotando > 0) {
  244. MeteorRotation = MeteorRotation-InfluenciaDeError;
  245. } else {
  246. MeteorRotation = MeteorRotation+InfluenciaDeError*(2*random(2)-1);
  247. }
  248. InfluenciaDeError = Math.random()*(100-Punteria)/10*(2*random(2)-1);
  249. MeteorXSpeed = MeteorXSpeed+InfluenciaDeError;
  250. MeteorYDirection = 1;
  251. // Probablemente innecesario:
  252. TeclaPresionada = "Ninguna";
  253. attachMovie("sMira", "Mira", 4);
  254. setProperty ("Mira", _x, 400+ApuntandoX);
  255. setProperty ("Mira", _y, ApuntandoY);
  256. // removeMovieClip ("Mira");
  257. IAReactionProgress = Dificultad/10;
  258. IAPunteria = PlayerMaxPunteria;
  259. IAApuntandoX = 350*(2*random(2)-1);
  260. IAApuntandoY = 579.5-279.5*random(2);
  261. IARotando = 100*(2*random(2)-1);
  262. } else if (Meteor.hitTest(IA) && MeteorYSpeed<0) {
  263. MeteorYSpeed = Math.max(Dificultad/10*Math.random()+1, 1);
  264. MeteorRotation = (90*Math.random()+Dificultad*2)*IARotando/100;
  265. DistanciaY = IAApuntandoY-MeteorY;
  266. // Cuánto tardará el meteoro en recorrerla:
  267. TardanzaY = Math.ceil(DistanciaY/MeteorYSpeed);
  268. // Distancia X desde el meteoro hasta el punto hacia donde se lo apuntó:
  269. DistanciaX = IAApuntandoX+400-MeteorX;
  270. // Determinar cuánto de moverá debido a la curva (falta considerar la reducción):
  271. MovimientoPorCurva = -MeteorRotation/1000*(101*TardanzaY-10100+10100*Math.pow(1.01, -TardanzaY));
  272. // Determinar la velocidad X para que el meteoro llegue...
  273. // al punto X apuntado justo cuando llega al punto Y apuntado:
  274. MeteorXSpeed = (DistanciaX-MovimientoPorCurva)/TardanzaY;
  275. InfluenciaDeError = Math.random()*(100-IAPunteria)/10;
  276. MeteorYSpeed = Math.max(MeteorYSpeed-InfluenciaDeError, 1);
  277. InfluenciaDeError = Math.random()*(100-IAPunteria)/10;
  278. if (Rotando < 0) {
  279. MeteorRotation = MeteorRotation+InfluenciaDeError;
  280. } else if (Rotando > 0) {
  281. MeteorRotation = MeteorRotation-InfluenciaDeError;
  282. } else {
  283. MeteorRotation = MeteorRotation+InfluenciaDeError*(2*random(2)-1);
  284. }
  285. InfluenciaDeError = Math.random()*(100-IAPunteria)/10*(2*random(2)-1);
  286. MeteorXSpeed = MeteorXSpeed+InfluenciaDeError;
  287. MeteorYDirection = -1;
  288. attachMovie("sMira", "Mira", 4);
  289. setProperty ("Mira", _x, 400+IAApuntandoX);
  290. setProperty ("Mira", _y, IAApuntandoY);
  291. Punteria = 0;
  292. ApuntandoX = 0;
  293. ApuntandoY = 20.5;
  294. Rotando = 0;
  295. // removeMovieClip ("Mira");
  296. } else if (Meteor._y<0) {
  297. // Punto de humano:
  298. PlayerScore++;
  299. Dificultad++;
  300. PlayerSpeed = PlayerSpeed+0.1;
  301. PlayerPunteria = PlayerPunteria+0.1;
  302. PlayerMaxPunteria = Math.min(PlayerPunteria*PlayerPunteria, 100);
  303. IASpeed = IASpeed+0.1;
  304. setProperty ("Meteor", _x, 400);
  305. setProperty ("Meteor", _y, 55.5);
  306. MeteorX = 400;
  307. MeteorY = 55.5;
  308. // La IA va a sacar,
  309. // ergo obtiene su máxima puntería:
  310. IAPunteria = PlayerMaxPunteria;
  311. IAApuntandoX = 350*(2*random(2)-1);
  312. IAApuntandoY = 579.5-279.5*random(2);
  313. IARotando = 100*(2*random(2)-1);
  314. ShowScore();
  315. } else if (Meteor._y>600) {
  316. IAScore++;
  317. Dificultad--;
  318. PlayerSpeed = PlayerSpeed-0.1;
  319. PlayerPunteria = PlayerPunteria-0.1;
  320. PlayerMaxPunteria = Math.min(PlayerPunteria*PlayerPunteria, 100);
  321. IASpeed = IASpeed-0.1;
  322. setProperty ("Meteor", _x, 400);
  323. setProperty ("Meteor", _y, 544.5);
  324. MeteorX = 400;
  325. MeteorY = 544.5;
  326. Punteria = PlayerMaxPunteria;
  327. ApuntandoX = 350*(2*random(2)-1);
  328. ApuntandoY = 20.5+279.5*random(2);
  329. Rotando = 100*(2*random(2)-1);
  330. ShowScore();
  331. }
  332. }
  333. //
  334. function ShowScore () {
  335. // esto no viene al caso
  336. }


« Última modificación: Hoy a las 07:03 por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como mejoro la calidad de un video?
Multimedia
vanO 4 2,626 Último mensaje 27 Marzo 2005, 06:17 am
por vanO
Como mejoro calidad de filmacion en la Pc?
Electrónica
alucard99 0 2,235 Último mensaje 3 Abril 2006, 01:35 am
por alucard99
MetalSlug7 se lanza a la invasión del mercado con la jugabilidad como mejor arma
Juegos y Consolas
Castiblanco 0 1,659 Último mensaje 23 Julio 2008, 22:22 pm
por Castiblanco
¿Cómo mejoro el pin?
Redes
jorgillo123 2 3,534 Último mensaje 18 Febrero 2013, 21:26 pm
por jorgillo123
PONG Game - Simple Juego "Pong" [VBScript + HTA] (100% Notepad)
Scripting
JohnConnor 0 6,014 Último mensaje 22 Febrero 2013, 19:07 pm
por JohnConnor
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines