|
591
|
Programación / Programación General / Contar los frames en que se presiona una tecla, *2 si son 2, etc.
|
en: 9 Marzo 2024, 00:15 am
|
El problema es que, tal como lo programé, se deja de contar cuando se detecta que se dejó de presionar una tecla, así que si hay otra presionándose no la cuenta, o más o menos es lo que pasa: Caso A: Presiono "A" y no la suelto, presiono "S" y no la suelto, suelto "A", deja de contar, luego reempieza. Caso B: Presiono "A" y no la suelto, presiono "S" y no la suelto, suelto "S", deja de contar. Quiero que el programa detecte cuántas teclas se están presionando, que cuente todas las presiones por frame en una misma variable (si hay 2 teclas presionándose, debe aumentar 2, por ejemplo), y que al soltar una deje de contar esa, no las demás. ¿Cómo puedo hacer? Ah, importante: En el programa se distingue una presión, de los frames presionándose, es decir, si una tecla se presiona, eso cuenta como "Clac", presiones, pero la cantidad de clacs sólo aumenta si se suelta y se vuelve a presionar, en cambio "FramesClaqueando" aumenta en cada frame si se está presionando una tecla. Básicamente lo que me interesa es eso último, lo demás está bien. Miren lo relativo a Claqueando: onClipEvent (load) { Moviendose = "No"; Cliqueando = "No"; Claqueando = "No"; ActualXMouse = _level0._xmouse; ActualYMouse = _level0._ymouse; } onClipEvent (enterFrame) { // Frames: _level0.Frames = _level0.Frames+1; // Movimiento: // Si el mouse se movió: if (ActualXMouse != _level0._xmouse or ActualYMouse != _level0._ymouse) { _level0.FramesMoviendose = _level0.FramesMoviendose+1; // Si el mouse estaba quieto: if (Moviendose == "No") { Moviendose = "Sí"; _level0.Movimientos = _level0.Movimientos+1; } } else if (Moviendose == "Sí") { // No se movió pero estaba moviéndose: Moviendose = "No"; _level0.Frenadas = _level0.Frenadas+1; } ActualXMouse = _level0._xmouse; ActualYMouse = _level0._ymouse; // FramesCliqueando: if (Cliqueando == "Sí") { _level0.FramesCliqueando = _level0.FramesCliqueando+1; } // FramesClaqueando: if (Claqueando == "Sí") { _level0.FramesClaqueando = _level0.FramesClaqueando+1; } } onClipEvent (mouseDown) { Cliqueando = "Sí"; _level0.Clics = _level0.Clics+1; } onClipEvent (mouseUp) { Cliqueando = "No"; _level0.Desclics = _level0.Desclics+1; } onClipEvent (keyDown) { if (Claqueando == "No") { Claqueando = "Sí"; _level0.Clacs = _level0.Clacs+1; } } onClipEvent (keyUp) { if (Claqueando == "Sí") { Claqueando = "No"; _level0.Desclacs = _level0.Desclacs+1; } }
|
|
|
592
|
Informática / Software / Problema con archivos pcx.
|
en: 8 Marzo 2024, 19:49 pm
|
Tengo varios, son fotos de algún emulador de NES. Quiero abrirlos a ver si los borro o no. Antes los abría sin problema, ahora ni con el visualizador de imágenes, ni Paint, ni Chrome, ni Flash. Abrí uno con un visualizador online, todo bien, pero no quiero abrir tantos así. Descargué Microsoft Photo Editor, que yo solía tener, y me dice que el formato es desconocido.
¿Hay alguna manera de cambiarle las extensiones a JPEG o algo así normal y que funcionen? ¿o qué programa debo usar? Yo nunca tuve Photoshop, no quiero algo pesado.
|
|
|
594
|
Programación / Programación General / No logro que el programa cuente bien los nuevos píxeles pintados.
|
en: 7 Marzo 2024, 21:10 pm
|
Intento hacer un generador de dibujos cada vez de más píxeles (2x2, 3x3, etc), por ahora solo negros con fondo blanco. Aquí se ve algo parecido: https://www.youtube.com/watch?v=0x5fEw8LGP4Quiero evitar que se generen dibujos repetidos. Para eso exijo a los dibujos 2 cosas (no es suficiente pero 1ero debo resolver esto): 1- La cantidad de píxeles pintados debe ser >= Píxeles que entran en el largo de la hoja. Si en la hoja puede haber 2x2, debe haber mínimo 2. 2- La cantidad de nuevos pixeles pintados debe ser > 0. Cuando la hoja es de 2x2, los nuevos (N) son: ON NN Cuando es de 3x3 son: OON OON NNN Es decir, los del extremo derecho y los inferiores. Intento que los cuente para así determinar si debe mostrar el dibujo o salteárselo, pero llega un punto en que la cifra no disminuye o aumenta cuando no debe, no sé, estoy viendo cual puede ser el problema. actions for fotograma 1 PixelesdeLargo = 1; // En F3 se repite: function Variar () { PixelaModificar = "ColordePixel"+Puntero; ColordePixelaModificar = eval(PixelaModificar); // ¿El pixel puede cambiar de color? if (ColordePixelaModificar<1) { // Sí, hacer los cambios: set (PixelaModificar, ColordePixelaModificar+1); Col = new Color("Pixel"+Puntero); Col.setRGB(parseInt(0, 16)); trace ("Se pintó el pixel "+PixelaModificar); // Para juzgar: ¿El dibujo es repetido? SumadePintados = SumadePintados+1; // ¿El píxel está en el extremo derecho o abajo, donde no había en una hoja más chica? if (Puntero/PixelesdeLargo == Math.floor(Puntero/PixelesdeLargo) or Puntero>MinPixelInferior) { // Sí, actualizar SumadePintadosNuevos: SumadePintadosNuevos = SumadePintadosNuevos+1; } trace ("SumadePintadosNuevos: "+SumadePintadosNuevos); // ¿El dibujo tiene píxeles donde no había en una hoja más chica... // y son al menos (PixelesdeLargo) píxeles? if (SumadePintadosNuevos>0 && SumadePintados>=MinSumadePintados) { // Sí, hacer dibujo y dar tiempo para verlo: Puntero = MaxPosiciondePuntero; trace ("\tMostrando dibujo."); // trace ("SumadePintados: "+SumadePintados); trace ("SumadePintadosNuevos: "+SumadePintadosNuevos); play (); } else { // No, el dibujo es repetido, no mostrarlo y hacer otro: Puntero = MaxPosiciondePuntero; trace ("\tRepetido, salteándolo."); // trace ("SumadePintados: "+SumadePintados); trace ("SumadePintadosNuevos: "+SumadePintadosNuevos); Variar(); } } else { // El pixel no puede cambiar de color, resetearlo: set (PixelaModificar, 0); Col = new Color("Pixel"+Puntero); Col.setRGB(parseInt("FFFFFF", 16)); trace ("Se reseteó el pixel "+PixelaModificar); SumadePintados = SumadePintados-1; // ¿El píxel está en el extremo derecho o abajo, donde no había en una hoja más chica? if (Puntero/MaxPosiciondePuntero == Math.floor(Puntero/MaxPosiciondePuntero) or Puntero>=MinPixelInferior) { // Sí, actualizar SumadePintadosNuevos: SumadePintadosNuevos = SumadePintadosNuevos-1; } trace ("SumadePintadosNuevos: "+SumadePintadosNuevos); // ¿Hay un pixel anterior? if (Puntero>1) { // Sí, apuntar a ese: Puntero = Puntero-1; // Continuar haciendo el dibujo: trace ("\tHaciendo dibujo, apuntando al pixel anterior."); // trace ("SumadePintados: "+SumadePintados); trace ("SumadePintadosNuevos: "+SumadePintadosNuevos); Variar(); } else { // No, aumentar tamaño de hoja y reiniciar. gotoAndPlay (2); } } } actions for fotograma 2 PixelesdeLargo = PixelesdeLargo+1; // Colocados: Pixeles = 0; DistanciaEntrePixeles = 384/PixelesdeLargo; PosicionX = 64-DistanciaEntrePixeles; EnlaFilaActual = 0; PosicionY = 0; MaxPosiciondePuntero = PixelesdeLargo*PixelesdeLargo; Puntero = MaxPosiciondePuntero; // Píxeles pintados: SumadePintados = 0; // Esta variable parece eliminable pero antes era-1, // y podría ser que deba aumentar en ciertos casos: MinSumadePintados = PixelesdeLargo; MinPixelInferior = PixelesdeLargo*(PixelesdeLargo-1); // Píxeles pintados que no estaban en hojas de menos píxeles: SumadePintadosNuevos = 0; // Agregar píxeles en blanco: do { Pixeles = Pixeles+1; if (EnlaFilaActual<PixelesdeLargo) { EnlaFilaActual = EnlaFilaActual+1; PosicionX = PosicionX+DistanciaEntrePixeles; } else { PosicionX = 64; EnlaFilaActual = 1; PosicionY = PosicionY+DistanciaEntrePixeles; } trace ("El pixel "+Pixeles+" se colocó en "+PosicionX+", "+PosicionY); attachMovie("mPixel", "Pixel"+Pixeles, Pixeles); setProperty ("Pixel"+Pixeles, _x, PosicionX); setProperty ("Pixel"+Pixeles, _y, PosicionY); setProperty ("Pixel"+Pixeles, _width, DistanciaEntrePixeles); setProperty ("Pixel"+Pixeles, _height, DistanciaEntrePixeles); } while (Pixeles<MaxPosiciondePuntero); stop (); actions for fotograma 3 stop (); actions for Vacío onClipEvent (enterFrame) { _level0.Variar(); } actions for fotograma 4 stop (); actions for fotograma 5 gotoAndPlay (3);
¿Cómo lo soluciono?
|
|
|
595
|
Programación / Programación General / Obtener rápido el valor más cercano a 18.6.
|
en: 7 Marzo 2024, 13:21 pm
|
Un jugador de tenis debe hacer un servicio pero con una técnica le bajaron la fuerza. Inicialmente el cálculo de las velocidades de la bola es: Norma = Math.sqrt(DistanciahastaObjetivoX*DistanciahastaObjetivoX+DistanciahastaObjetivoY*DistanciahastaObjetivoY); BallXSpeed = DistanciahastaObjetivoX/Norma*-AlexFuerzadetiros; BallYSpeed = DistanciahastaObjetivoY/Norma*-AlexFuerzadetiros; BallZSpeed = 0;
y se aplica este diagrama que queremos mejorar:  Chispa = Inicio. Verde = True. Rojo = False. Azul = Flujo incondicional. Zona dentro de circulo = El caso que queremos resolver. Edit: Veo que debería decir cosas como "¿Pasará?", porque el tiro aún no se hizo, la máquina está calculando cómo debe hacerse, pero pronto debo irme así que no quiero editar eso. También dice tiros VP pero entiéndanlo como V, V importa más que P, abajo explico. Normalmente la bola pasaría la red, pero en este caso no. En el juego hay en principio 2 tipos de servicio: Veloz y Profundo. En casos como este, en un tiro V las velocidades serían recalculadas de modo que el tiro pase y sea in, no importa cuan profundo bote. En los P sí, se quiere profundidad, por lo que el tiro podría ser más lento y elevado. El ángulo se conserva a menos que no haya otra manera de que el tiro sea in, eso viene más adelante. Pensando cómo resolver este caso para un tiro V, hice esto:  En la 2nda fila dice que con fuerza 1 lanzando desde punta a punta y con la máxima altura que puede el jugador, la bola pasaría por la red a una altura de -307.05, lo cual significa que no llegaría, no pasaría. Ese número queremos que sea lo más cercano posible a 18.6, es la mínima altura conque la bola puede llegar a la red sin tocarla. Si es > que eso entonces parte de la fuerza se usó mal (recuerden lo del tiro tipo V), en lo posible no debe ocurrir, pero eso es mejor que obtener uno más bajo. Fuerza está asignada en el juego. BallZ when striked (ZInicial), es qué tan arriba se golpea a la bola. Norma puse arriba cómo se calcula, depende de hacia a donde apunte el humano que juegue. BallX Speed, BallY Speed y BallZ Speed también las dije arriba. Duración hastared = REDONDEAR.MAS(248/VelocidadY), donde 248 es la distanciaY hasta la red. BallZ when Reach Red = ZInicial-Duración*(Duración+1)/200+BallZSpeed*Duración La velocidad de la bola hacia abajo (Z) aumenta 0.01 por frame, las fórmulas de Física no funcionan aquí porque por lo que vi en esas la 1era vez la velocidad disminuye la mitad de lo normal. En las filas de abajo se modifica la duración y se recalculan las velocidades. Buscando el valor más óptimo de "BallZ when Reach Red". Cuando la duración "incrementa 0", el resultado no puede empeorar, lo que sucede es que como en el juego sólo importan ciertos instantes (frames), entonces si la bola llegó un poco antes, digamos en 1.45 segundos, es irrelevante porque sólo se considerará el 1.4, 1.5, etc, entonces bajar un poco las velocidades XY da el mismo resultado y eso permite aumentar un poco la velocidad Z, haciendo que la bola vaya un poco más hacia arriba. Es lo que se quiere en este caso al fin y al cabo, que pase más arriba. Resultado con fondo verde = El mejor hasta ahora (se mira desde arriba a abajo, el mejor de todos es el verde de más abajo). Con fondo rojo = Empeoró. Fondo amarillo = Mejoró pero no es lo mejor obtenido hasta ahora. El método no lo programé pero sería algo como: Si el resultado mejora: A la duración incrementarle el doble de lo que se incrementó antes. sino Usar la duración intermedia entre la que dió el mejor resultado y la... Pero este método parece muy largo, o puede serlo, además es medio en vano parece hacer tantos cálculos si no hay modo de que pase, habrá que acercar el target (apuntar más al medio y abajo), así que ¿qué otro puedo usar?
|
|
|
597
|
Informática / Hardware / Re: Imágenes y vídeos en mi USB están cifrados
|
en: 5 Marzo 2024, 00:50 am
|
No sé del tema, doy unas ideas a quien sepa y que las descarte o apruebe: - Poner los archivos en un rar, zip o similares. Alguna vez me ha parecido que algunos datos de los archivos se borran, como por ejemplo la fecha de creación, quizá se borre la configuración de cifrado. - Grabar un dvd con los archivos, usando un formato que quite el cifrado.
Es curioso lo que cuentas, no es algo que Windows debería hacer por defecto o porque uno toque mal algo, nunca había escuchado de algo así.
|
|
|
599
|
Seguridad Informática / Seguridad / Re: Si me roban el PC ¿pueden usar mis cuentas?
|
en: 2 Marzo 2024, 03:20 am
|
Asumiendo que lo que escribes es verdad, que ha habido robos en y cerca de tú domicilio. Es una cosa que nunca deberías compartir en Internet o en la calle a cualquier desconocido. Por razones evidentes de seguridad, si puede modifique el mensaje original. ¿Te refieres a que dejo mi cuenta conectada o qué? Entiendo los riesgos de eso... Que roban por mi barrio no creo que sea peligroso decirlo, no sería el único, y a mí cosas que valgan mucho dinero no hay mucho que me puedan robar así que ni les conviene venir xD Si vienen es porque no tienen idea, mejor que sepan que no les conviene. No he dado datos suficientes como para que averiguen suficiente de mí y si alguien lo hace es porque está muy al pedo. ¿las puertas del domicilio siempre están abiertas o no? No xD En mi país te diría que el 95% de las casas en la ciudad tienen rejas y muchas perro. Pero las rejas las pasan por encima o las doblan (no sé para qué, quizá para poder tener más espacio donde pisar). Lo que se podría hacer es pagar a un sereno entre todos los vecinos, pero no creo que quieran. Ya aquí existe el "oficio" de cuida coches o cuida motos, podría existir el de cuida casas. Simplemente cuando vean algo extraño llaman a la policía, más podría ser exigirles mucho. La policía me han dicho que viene con las sirenas encendidas para que los ladrones se vayan, así no tienen que agarrarlos. Tampoco quisieron buscar huellas dactilares. Es lo que hay en este país.
|
|
|
600
|
Programación / Programación General / ¿Cómo la PC usa los códigos?
|
en: 1 Marzo 2024, 09:39 am
|
En realidad no me refiero a algo tan profundo sino más bien a lo siguiente: Supongan un programa que en cierto punto tiene: Si A==1 // Mucho código aquí. sino // Poco. Ese "Mucho código" ¿la PC lo leyó desde que el programa se ejecutó o va cargando línea por línea sólo si lo necesita? El concepto de "lo leyó" es un poco vago, pero me imagino que algo de eso hay, no sería lo mismo esto: "El programador me dice que si A==1 haga ciertas cosas, leeré cuales si es necesario: ¿A==1? No". que esto: "El programador me dice que si A==1 haga *lee rapidísimo un montón de cosas, medio así https://youtu.be/AwC4sNXYXLA?t=3445 * ¿A==1? No, ah tonces leí en vano". No es lo mismo darle un link que darle una base de datos enorme... Supongan también que todo ese código, es decir incluyendo el if, se va a ejecutar muchas veces. Si las instrucciones dentro de un if se cargan o leen aunque no se usen ¿entonces es mejor que estén en un archivo externo, o en una función, o da igual? En archivo externo: Si A==1 // Cargar archivo B. sino // Poco. Ahí lo que va a leer es poco salvo que deba cargar el archivo. Supongo que si el if se chequea mucho pero ocurre poco entonces conviene, pero cargar un archivo externo es más lento que si las instrucciones están en el código ¿no? En una función: Si A==1 // Usar la función B. sino // Poco. Ahí no sé si (cuando el programa se transforma en código) donde dice función se sustituye por lo que sea esa función, para que sea más rápido, o no, para que ocupe menos espacio. Quizá depende del lenguaje, compilador, no sé ¿en general cómo es? ¿y en Macromedia Flash 5? Si sólo se carga o lee "el link" ¿entonces es parecido a cargar un archivo externo? Pareciera, pero la función está en la RAM ¿no? ¿entonces convertirlo en función es incluso peor que dejarlo así nomás, ya que al definir la función se le da un nombre (ergo ocupa más memoria que sin nombre)? El tema es que en Flash se cargan o leen frames y no quiero que se cargue o lea a cada rato más de lo necesario. Respuesta de GPT: Cuando un programa se ejecuta en una computadora, el código se carga en la memoria y se va ejecutando línea por línea en secuencia, a menos que se encuentre una estructura de control, como un condicional (if), que altere el flujo de ejecución.
En el caso que mencionas, si el programa tiene un condicional como este:
```python if A == 1: # Mucho código aquí. else: # Poco. ```
El código dentro del condicional solo se ejecutará si se cumple la condición `A == 1`. Si la condición no se cumple, la PC simplemente saltará a la siguiente línea de código después del bloque `else`. El código dentro del bloque que no se ejecuta no se lee línea por línea, simplemente se ignora.
En cuanto a la carga de archivos o funciones, hay algunas consideraciones a tener en cuenta:
1. Archivo externo: Si tienes un bloque de código que se ejecuta raramente, y ese bloque es grande o consume muchos recursos, podría ser beneficioso almacenarlo en un archivo externo y cargarlo solo cuando sea necesario. Sin embargo, cargar un archivo externo puede tener un costo adicional en términos de tiempo de acceso al disco y procesamiento para leer su contenido.
2. Funciones: Las funciones son bloques de código que se pueden llamar desde diferentes partes del programa. Cuando una función se llama, el programa salta a la definición de la función y ejecuta el código dentro de ella. Una vez que se completa la ejecución de la función, el programa vuelve al punto donde se realizó la llamada.
Definir una función no ocupa más memoria solo por tener un nombre. El nombre de la función es necesario para poder llamarla desde otras partes del programa. Las funciones se cargan en la memoria cuando el programa se inicia, pero no se ejecutan hasta que se las llama.
En resumen, si quieres optimizar el rendimiento y la eficiencia de un programa, debes considerar la frecuencia de ejecución de un bloque de código y su tamaño o consumo de recursos. Si un bloque se ejecuta raramente y es grande o consume muchos recursos, podría ser beneficioso almacenarlo en un archivo externo y cargarlo solo cuando sea necesario. Por otro lado, utilizar funciones puede ayudar a organizar y reutilizar el código, pero su impacto en el rendimiento depende del contexto específico y del lenguaje de programación que estés utilizando. ¿Está bien seguir programando "normal" entonces?
|
|
|
|
|
|
|