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


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 264
1  Programación / Programación General / Re: Generar secuencias evitando redundancias, loops en que nada ocurra, etc. en: Hoy a las 11:29
Creo que tenía un tema más reciente que esto pero no lo hallé. Lo que pongo a continuación está relacionado, lo pongo por si sirve a alguien:


2  Programación / Programación General / Re: Construir pirámide inversa, o parecido. en: Ayer a las 15:10
Para empezar por algo más simple ya que esto me supera, intento construir una pirámide común y corriente. Los minis o trocitos de vigas serían los ladrillos. El problema es que estoy colocando grupos de ladrillos, no coloco sueltos. Entonces:
En el piso 0 (el más de abajo) coloco 25 ladrillos, divididos en 1 grupo.
En el piso 1 coloco 24 divididos en 2 grupos.
En el piso 2, 23 dividos e 3. Y acá es donde me falla, porque si pongo 7 por grupo, van a ser 21, me faltan 2 ladrillos, y si pongo 8 por grupo me va a sobrar 1.

Que sean grupos me pareció mejor para chequear cuando Mario toca un piso, o sea, grupo1, o grupo2, etc, en vez de chequear trocito1, trocito2, etc. Pero bueno, serán grupos con agujeros que habrá que chequear distinto, no sé.

Logré esto:


Así:
Código
  1. Pisos = 0;
  2. do {
  3. Piso = "mPiso"+Pisos;
  4. // sDKPlataformas es un objeto vacío donde se insertan...
  5. // pequeñas plataformas seguidas. Sirve para chequear...
  6. // las colisiones más fácil:
  7. attachMovie("sDKPlataformas", Piso, Pisos);
  8. setProperty (Piso, _x, Pisos*16+16);
  9. setProperty (Piso, _y, 584-Pisos*18);
  10. PartesDelPiso = 0;
  11. AgujeroCada = 25/(Pisos+1);
  12. NextParteaSaltear = AgujeroCada;
  13. // Ignoro cómo llamarle, está relacionado con lo que dice:
  14. PartesRequeridas = 25-Pisos/2;
  15. do {
  16. if (PartesDelPiso >= NextParteaSaltear) {
  17. NextParteaSaltear = NextParteaSaltear+AgujeroCada;
  18. } else {
  19. Parte = "Parte"+PartesDelPiso;
  20. eval(Piso).attachMovie("sDKPlataforma", Parte, PartesDelPiso);
  21. RutaDeParte = Piso+"."+Parte;
  22. setProperty (RutaDeParte, _x, 32*PartesDelPiso);
  23. setProperty (RutaDeParte, _y, 0);
  24. }
  25. PartesDelPiso++;
  26. } while (PartesDelPiso <= PartesRequeridas);
  27. Pisos++;
  28. } while (Pisos < 30);
  29.  

Claro que así no se puede llegar al martillo, además parece demasiado obvio que conviene subir por la izquierda.
Me interesa cómo lo arreglarían pero también cómo los niveles podrían variar sin variar mucho el código, o sea cambiando algunos números o fórmulas nada más, básicamente entre mayor sea el nivel más agujeros debe haber, pero siempre debe ser posible llegar al martillo.
3  Programación / Programación General / ¿Cómo mejoro la jugabilidad de mi Pong? en: Ayer 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. }
4  Sistemas Operativos / Windows / Re: Mucho lío para que funcione el sonido. en: 10 Junio 2026, 10:10 am
Lo que decidí es no desconectar el cable, cuando quiera salir con auriculares usaré otro...

Prefiero no desinstalar el controlador, por miedo a no poder reinstalarlo, no es como un programa cualquiera, aunque puede que para muchos sí.

No se sabe por qué se rompió, probablemente al actualizarse algo, ya que aparentemente se reactivó una opción que el mismo solucionador de problemas me había recomendado quitar cuando empecé a usar esta PC y el sonido no funcionaba. Algo de efectos especiales, no me acuerdo.
No es normal que se rompa, otras cosas difícil que se rompan.

Tampoco estoy seguro de que sea un problema de Windows.
5  Sistemas Operativos / Windows / Mucho lío para que funcione el sonido. en: 9 Junio 2026, 06:32 am
https://share.google/aimode/OQJIN7BQqCZDit0hy
6  Programación / Programación General / Mejorar código de juego de naves. en: 8 Junio 2026, 09:50 am
Imagen para dar mejor contexto:


Tiene más errores de los que veo, según una IA.

Por ejemplo:

- Al destruir a un enemigo, puede que se destruya otro debido a un error. Desde que puse esto al final
LdeProfundidadesDisponibles.push(LdeProfundidadesDisponibles.length+1);

- El mecanismo de agregar enemigos parece estar funcionando mal, es como que el máximo siempre es 10, pero debería aumentar. Creo que se requiere la línea esa que mencioné, pero no sirvió parece.

- En el loop de mover enemigos, puede que se apliquen acciones a enemigos inexistentes. Habría que asignarles nombres mejor, pero la idea de usar los números finales (de la lista de profundidades disponibles) me la había dado una IA.

- Una IA insiste en que mi método de chequear colisiones puede mejorarse, en el sentido de que se puede hacer break antes o algo así. Le dije que si un disparo toca un área de un enemigo eso no significa que deba ser eliminado aún, pues otra área podría estar tocando al jugador, hay que revisar todas las áreas. Dice que entonces revise 1ero las áreas del jugador. Le digo que hago todo en un mismo loop, sino tendría que usar 2 (revisar si área 1 toca al jugador, si área 2, 3, luego otro loop: Revisar si área 1 toca al disparo, si área 2...), pero sigue insistiendo no sé qué, es tanto entrevero que ni mirar quiero.

Código
  1. fscommand ("fullscreen", "true");
  2. // //////////////////////////////////////////////
  3. // //////////////////  mAvatar  //////////////////
  4. // //////////////////////////////////////////////
  5. // Disparos suyos en pantalla:
  6. AvatarShots = 0;
  7. attachMovie("sGalaxianShip", "mAvatar", 0);
  8. mAvatar._x = 160;
  9. mAvatar._y = 230;
  10. // Para que las áreas de contacto no se vean:
  11. Area = 0;
  12. do {
  13. Area++;
  14. mAvatar["Area"+Area]._visible = false;
  15. } while (Area<8);
  16. delete Area;
  17. AvatarSpeed = 0.75;
  18. function ControlAvatar () {
  19. if (Key.isDown(37)) {
  20. // Izquierda:
  21. mAvatar._x = Math.max(13, mAvatar._x-AvatarSpeed);
  22. } else if (Key.isDown(39)) {
  23. // Derecha:
  24. mAvatar._x = Math.min(307, mAvatar._x+AvatarSpeed);
  25. }
  26. if (Key.isDown(83) && AvatarShots == 0) {
  27. // S, shot:
  28. AvatarShots = 1;
  29. attachMovie("sGalaxianShot", "mAvatarShot", 1000);
  30. mAvatarShot._x = mAvatar._x;
  31. mAvatarShot._y = mAvatar._y-10;
  32. mAvatar.gotoAndStop(2);
  33. }
  34. }
  35. // /////////////////////////////////////////////
  36. // //////////////////  Shots  //////////////////
  37. // /////////////////////////////////////////////
  38. function MoveShots () {
  39. if (AvatarShots>0) {
  40. mAvatarShot._y = mAvatarShot._y-2;
  41. if (mAvatarShot._y<-2) {
  42. AvatarShots = 0;
  43. mAvatarShot.removeMovieClip();
  44. mAvatar.gotoAndStop(1);
  45. }
  46. }
  47. }
  48. // //////////////////////////////////////////////
  49. // /////////////////  Enemigos  /////////////////
  50. // //////////////////////////////////////////////
  51. // Cuando llega a 100 puede que se inserte un enemigo:
  52. EnemigosTurn = 0;
  53. // Determina qué tan rápido aumenta EnemigosTurn y...
  54. // la máxima cantidad de enemigos:
  55. EnemigosRate = 10;
  56. MinEnemigoSpeed = 0.1;
  57. // MaxEnemigoSpeed = 0.2;
  58. EnemigosBestEffect = 0;
  59. EnemigosMinEffect = 0;
  60. // EnemigosMaxEffect = 0;
  61. EnemigosIA = 0;
  62. // Para saber qué depth asignar cuando se debe insertar un enemigo:
  63. LdeProfundidadesDisponibles = [];
  64. do {
  65. LdeProfundidadesDisponibles.push(LdeProfundidadesDisponibles.length+1);
  66. } while (LdeProfundidadesDisponibles.length<EnemigosRate);
  67. function AddEnemigos () {
  68. EnemigosTurn = EnemigosTurn+EnemigosRate;
  69. while (LdeProfundidadesDisponibles.length>0 && EnemigosTurn>=100) {
  70. EnemigosTurn = EnemigosTurn-100;
  71. // Se le asigna la última profundidad disponible porque...
  72. // asignar la 1era implica mover hacia ella a las posteriores:
  73. LastProfundidadDisponible = LdeProfundidadesDisponibles[LdeProfundidadesDisponibles.length-1];
  74. Name = "mEnemigo"+LastProfundidadDisponible;
  75. attachMovie("sDKBarril", Name, LastProfundidadDisponible);
  76. // Referencia más directa:
  77. Name = _root[Name];
  78. Name._x = Math.random()*320;
  79. // Para zigzaguear:
  80. Name.MinX = Name._x-Math.random()*EnemigosRate;
  81. Name.MaxX = Name._x+Math.random()*EnemigosRate;
  82. Name._y = -50;
  83. // ojo esto depende del tipo de enemigo
  84. Name.Area1._visible = false;
  85. Name.Area2._visible = false;
  86. Name.Area3._visible = false;
  87. Name.SpeedX = Math.random()*MinEnemigoSpeed*(random(2)*2-1);
  88. Name.SpeedY = Math.random()*MinEnemigoSpeed+MinEnemigoSpeed;
  89. // Borra el último elemento de la lista:
  90. LdeProfundidadesDisponibles.pop();
  91. }
  92. }
  93. function MoveEnemigos () {
  94. EnemigoaMover = 0;
  95. while (EnemigoaMover<EnemigosRate) {
  96. EnemigoaMover++;
  97. Name = _root["mEnemigo"+EnemigoaMover];
  98. Name._x = Name._x+Name.SpeedX;
  99. if (Name._x<-50 or Name._x>370) {
  100. removeMovieClip ("mEnemigo"+EnemigoaMover);
  101. LdeProfundidadesDisponibles.push(EnemigoaMover);
  102. } else {
  103. if (Name._x<Name.MinX) {
  104. Name._x = Name.MinX;
  105. Name.SpeedX = Name.SpeedX*-1;
  106. } else if (Name._x>Name.MaxX) {
  107. Name._x = Name.MaxX;
  108. Name.SpeedX = Name.SpeedX*-1;
  109. }
  110. Name._y = Name._y+Name.SpeedY;
  111. if (Name._y>290) {
  112. removeMovieClip ("mEnemigo"+EnemigoaMover);
  113. LdeProfundidadesDisponibles.push(EnemigoaMover);
  114. } else {
  115. // Se verá si un área enemiga toca algo relevante:
  116. TocaDisparo = "No";
  117. NroDeAreaEnemiga = 1;
  118. do {
  119. AreaaChequear = Name["Area"+NroDeAreaEnemiga];
  120. // Al avatar (a alguna de sus áreas):
  121. NroDeAreaDeAvatar = 1;
  122. do {
  123. if (mAvatar["Area"+NroDeAreaDeAvatar].hitTest(AreaaChequear) == true) {
  124. trace ("NroDeAreaEnemiga "+NroDeAreaEnemiga+" tocó "+NroDeAreaDeAvatar);
  125. // Game over:
  126. NroDeAreaDeAvatar = 9;
  127. NroDeAreaEnemiga = 4;
  128. gotoAndStop (3);
  129. }
  130. NroDeAreaDeAvatar++;
  131. } while (NroDeAreaDeAvatar<9);
  132. // Al disparo del avatar:
  133. if (mAvatarShot.hitTest(AreaaChequear) == true) {
  134. trace ("NroDeAreaEnemiga "+NroDeAreaEnemiga+" tocó "+mAvatarShot);
  135. TocaDisparo = "Sí";
  136. }
  137. NroDeAreaEnemiga++;
  138. } while (NroDeAreaEnemiga<4);
  139. if (TocaDisparo == "Sí") {
  140. removeMovieClip ("mEnemigo"+EnemigoaMover);
  141. LdeProfundidadesDisponibles.push(EnemigoaMover);
  142. EnemigosRate++;
  143. MinEnemigoSpeed = MinEnemigoSpeed+0.01;
  144. LdeProfundidadesDisponibles.push(LdeProfundidadesDisponibles.length+1);
  145. }
  146. }
  147. }
  148. }
  149. }
7  Programación / Programación General / Re: Hacer una línea, pintar los puntos intermedios de 2 puntos. en: 8 Junio 2026, 08:00 am
Intenté hacer un código con ayuda pero también se me hace muy complicado.

Lo mejor que logré sería esto:
Código
  1. function GenerarLineas () {
  2. // Pintar cuadraditos de modo que se forme una línea:
  3. // Elegir un color distinto al color del cuadro:
  4. do {
  5. ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
  6. } while (ColorDelCuadro == ColorDeImagen);
  7. // Determinar ubicación del punto 1,
  8. // llamado Punto en vez de Cuadradito porque...
  9. // ese nombre puede que se esté usando en otra cosa:
  10. FilaDePunto1 = random(CuadraditosPorFila);
  11. ColumnaDePunto1 = random(CuadraditosPorFila);
  12. trace("FilaDePunto1: "+FilaDePunto1);
  13. trace("ColumnaDePunto1: "+ColumnaDePunto1);
  14. // Averiguar qué cuadradito es y pintarlo:
  15. // NroDelCuadraditoaPintar = FilaDePunto1*CuadraditosPorFila+ColumnaDePunto1;
  16. // ParaColorDeCuadradito = new Color(Cuadro_pCuadradito+NroDelCuadraditoaPintar);
  17. // ParaColorDeCuadradito.setRGB(ColorDeImagen);
  18. // Punto 2 asegurando que no sea igual:
  19. do {
  20. ColumnaDePunto2 = random(CuadraditosPorFila);
  21. FilaDePunto2 = random(CuadraditosPorFila);
  22. } while (ColumnaDePunto1 == ColumnaDePunto2 && FilaDePunto1 == FilaDePunto2);
  23. trace("FilaDePunto2: "+FilaDePunto2);
  24. trace("ColumnaDePunto2: "+ColumnaDePunto2);
  25. // Para cálculos con regla de 3:
  26. FilasDeDistancia = FilaDePunto2-FilaDePunto1;
  27. ColumnasDeDistancia = ColumnaDePunto2-ColumnaDePunto1;
  28. trace("FilasDeDistancia: "+FilasDeDistancia);
  29. trace("ColumnasDeDistancia: "+ColumnasDeDistancia);
  30. // Averiguar la distancia mayor y graficar en función de ella:
  31. if (Math.abs(ColumnasDeDistancia) >= Math.abs(FilasDeDistancia)) {
  32. RelacionFilasColumnas = FilasDeDistancia/ColumnasDeDistancia;
  33. trace("RelacionFilasColumnas: "+RelacionFilasColumnas);
  34. ColumnaBase = ColumnaDePunto1;
  35. // Averiguar si avanzar hacia la derecha (+1) o la izquierda (-1):
  36. if (ColumnasDeDistancia >= 0) {
  37. Paso = 1;
  38. } else {
  39. Paso = -1;
  40. }
  41. do {
  42. trace("ColumnaBase: " + ColumnaBase);
  43. DistanciaRecorrida = ColumnaBase - ColumnaDePunto1;
  44. FilaCorrespondiente = Math.round(DistanciaRecorrida * RelacionFilasColumnas + FilaDePunto1);
  45. trace("FilaCorrespondiente: " + FilaCorrespondiente);
  46. NroDelCuadraditoaPintar = FilaCorrespondiente * CuadraditosPorFila + ColumnaBase;
  47. ParaColorDeCuadradito = new Color(Cuadro_pCuadradito + NroDelCuadraditoaPintar);
  48. ParaColorDeCuadradito.setRGB(ColorDeImagen);
  49. // Avanzar o retroceder según corresponda:
  50. ColumnaBase = ColumnaBase + Paso;
  51. // El bucle se detiene cuando pasamos el Punto 2 (usamos Paso para evaluar correctamente la dirección):
  52. } while ((Paso == 1 && ColumnaBase <= ColumnaDePunto2) || (Paso == -1 && ColumnaBase >= ColumnaDePunto2));
  53. } else {
  54. RelacionFilasColumnas = ColumnasDeDistancia/FilasDeDistancia;
  55. FilaBase = FilaDePunto1;
  56. if (FilasDeDistancia >= 0) {
  57. Paso = 1;
  58. } else {
  59. Paso = -1;
  60. }
  61. do {
  62. DistanciaRecorrida = FilaBase - FilaDePunto1;
  63. ColumnaCorrespondiente = Math.round(DistanciaRecorrida * RelacionFilasColumnas + ColumnaDePunto1);
  64. NroDelCuadraditoaPintar = FilaBase * CuadraditosPorFila + ColumnaCorrespondiente;
  65. ParaColorDeCuadradito = new Color(Cuadro_pCuadradito + NroDelCuadraditoaPintar);
  66. ParaColorDeCuadradito.setRGB(ColorDeImagen);
  67. // Avanzar o retroceder según corresponda:
  68. FilaBase = FilaBase + Paso;
  69. // El bucle se detiene cuando pasamos el Punto 2 (usamos Paso para evaluar correctamente la dirección):
  70. } while ((Paso == 1 && FilaBase <= FilaDePunto2) || (Paso == -1 && FilaBase >= FilaDePunto2));
  71. }
  72. }

Ejemplo de salida:

Las marcadas con circulo parecen mal, me cuesta ver, parece que tienen 2 puntos en una columna, 4 en otra y 2 en otra. Debería ser 3 en cada una.

Y pueden ocurrir casos como este:

Que es de 2, 4, 3 parece.

Acá se ve el motivo:


En la coiumna 0 dice que la fila debe ser 0.
En la columna 1, fila 0.25, se redondea, es 0.
Columna 2, fila 0.5, al redondear queda 1.
Y así sucesivamente.

Intentando corregir eso hice esto:
Código
  1. function GenerarLineas () {
  2. (...)
  3. if (Math.abs(ColumnasDeDistancia) >= Math.abs(FilasDeDistancia)) {
  4. PuntosPorFila = Math.floor(ColumnasDeDistancia/FilasDeDistancia);
  5. trace("PuntosPorFila: "+PuntosPorFila);
  6. // Puntos que no se pudieron repartir equitativamente...
  7. // entre las filas:
  8. Resto = ColumnasDeDistancia%FilasDeDistancia;
  9. trace("Resto: "+Resto);
  10. // Para repartirlos estéticamente:
  11. DistanciaDeExtras = ColumnasDeDistancia/(Resto+1);
  12. trace("DistanciaDeExtras: "+DistanciaDeExtras);
  13. ExtraaColocar = 1
  14. FilaDeExtra = DistanciaDeExtras

Pueden probar explicarme el algoritmo que mencionaron o corregir y continuar el que puse. Algo que veo es que no debo dividir entre las distancias sino que tengo filas y columnas a repartir, o sea, la distancia entre la fila de los puntos puede ser 2 por ejemplo, pero eso significa que son 3 filas, que la línea tendrá 3 filas.
Probé aplicar esto a mi código anterior pero me salen líneas cortadas, tendré que pensarlo mejor.
8  Foros Generales / Sugerencias y dudas sobre el Foro / Re: ¿Opción de bloquear usuario? en: 7 Junio 2026, 23:20 pm
En cuanto al otro tema expliqué a qué me refería y luego hice las preguntas, yo también protesto cuando me ponen un video larguísimo que empecé a ver porque la miniatura decía algo más simple, pero mi tema no fue un caso así.

Algunos usuarios o incluso foros se van de repente, es así. Otros sí se despiden, otros dan indicios de por qué se van.
No se puede volver al pasado, pero pueden pedir a ciertos usuarios que vuelvan si los conocen, y también podemos volver al tema, que esto no va de si antes el foro era mejor, aunque si fuese así entonces es otro argumento a favor de poner la opción.
9  Foros Generales / Sugerencias y dudas sobre el Foro / ¿Opción de bloquear usuario? en: 6 Junio 2026, 23:00 pm
Mejor dicho que él no vea mis temas/mensajes y yo no vea lo suyo. Si se desconecta supongo que sí vería lo mío, pero ya sería demasiado culpa suya.

Si cada cierto tiempo la persona que sea y yo vamos a tener disgustos por interactuar, mejor que él y yo dejemos de interactuar. Ya es bastante problema ciertas personas en "la vida real" como para tener más problemas en un foro, donde debería ser fácil poner la opción. Encima ahora que una IA puede ayudar.
10  Programación / Programación General / Re: ¿Qué pasa con While (acciones) sino (otras)? en: 6 Junio 2026, 21:19 pm
También has respondido a El_Andaluz sin mirar el video que puso, es comprensible pero a su vez da que pensar que si no te gusta un tema o la forma que se describe no respondas, hacerlo sí que parece lo que llamas ruido.

Yo estaba confundido sobre el tema y fue la pregunta que se me ocurrió hacer, abarca varias cosas como ¿por qué no se usa? ¿es demasiado inútil, por qué? Se comprenden al leer el tema.
Pero yo tampoco voy a seguir leyendo tu/s respuesta/s.
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 264
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines