|
71
|
Foros Generales / Foro Libre / 2 juegos en el foro.
|
en: 10 Diciembre 2024, 19:57 pm
|
El 1ero, típico, consistiría en: - Todo usuario comienza teniendo 1 punto. - Un usuario plantea un reto y un plazo. - Los que quieran plantean soluciones. - Terminado el plazo, cada usuario conocido (*) puede, durante 1 semana: - Decir que la solución de otro es correcta. O de otros. - Votar por una solución que no sea la suya. - Cada usuario cuya solución haya sido catalogada como correcta, obtiene la mitad de puntos del catalogador que tenga más (éste no los pierde). Máximo 1 decimal. - Cada usuario cuya solución haya sido votada, obtiene tantos puntos como tiene su votante (de nuevo, éste no los pierde). - Si se vota por una se entiende que se la considera correcta y sólo tiene efecto el voto de favorita, no de correcta. (*): Para evitar amiguismos o multicuentas.
Ejemplo: - Hacer programa que genere cuentos en castellano de mínimo 20 palabras, antes del próximo mes. - A postea una solución, B postea otra, C postea otra. - Termina el plazo, empieza el plazo de votación, 1 semana. - A dice que la solución de B es correcta y vota la de C. - B tiene 1.5 puntos, C tiene 2. - B vota la de A. - A tiene 2. - C vota la de A y dice que la de B es correcta. - A 3, B 2, C 2. - D dice que todas fueron correctas y vota la de C. - A 3.5, B 2.5, C 3. - D sigue con 1 porque no dió solución ni fue votado, etc.
Si se les ocurre cómo hacerlo mejor, díganme, yo intenté que sea justo y no muy complicado.
---------------------------------------------------------------------------------------------------------
El 2ndo sería: - Todo usuario comienza teniendo 1 punto. - Cada semana, los que quieran postean una conversación que se haya tenido con un chatbox sobre Informática. Que no se haya posteado antes. - Durante la semana siguiente, cada usuario conocido puede: - Decir que conversación o conversaciones le gustaron. Que no sea la suya. - Votar por una conversación que no sea la suya. - Cada usuario cuya conversación haya sido gustada, obtiene la mitad de puntos del catalogador que tenga más (éste no los pierde). Máximo 1 decimal. - Cada usuario cuya conversación haya sido votada, obtiene tantos puntos como tiene su votante.
¿Hacen algo similar los dueños de los chatbots?
|
|
|
72
|
Programación / Programación General / Ayuda con las funciones de string de AS 1.0.
|
en: 5 Diciembre 2024, 07:34 am
|
Intenté hacer una simulación de un sorteo pero ni con ayuda de GPT pude >__< Se tiene una urna con 2 bolas blancas y una negra. 3 personas van sacando por turnos hasta que saquen la negra. Esa persona pierde. Yo quería ver si sacar 1ero da ventaja, desventaja, o si está favorecido el 2ndo, etc. BaseUrna = "WWB"; AlexPerdidas = 0; BartPerdidas = 0; CamiloPerdidas = 0; function Sortear () { // Preparar urna: Urna = BaseUrna; // Elección de la 1er persona, Alex: BolaDeAlexNro = random(3); if (BolaDeAlexNro == 2) { AlexPerdidas++; } else { BolaDeAlex = Urna.charat(BolaDeAlexNro); Parte1 = substring(Urna, 0, BolaDeAlexNro); trace(Parte1); Parte2 = substring(Urna, BolaDeAlexNro+1, Urna.length); trace(Parte2); Urna = Parte1+Parte2; // trace(Urna); // Elección de la 2nda persona, Bart: BolaDeBartNro = random(2); if (BolaDeBartNro == 1) { BartPerdidas++; } else { CamiloPerdidas++; } } }
La función se repite y los resultados se muestran en pantalla. Lo de Parte1 y Parte2 se lo copié a GPT pero no funciona bien. Quiero que de Urna se remueva la bola que fue elegida. Es claro que en ese punto será una W, así que siempre quedaría WB, pero quiero aprender a hacerlo de este modo. Es que no entiendo los métodos string, la ayuda de Flash carece de ejemplos en eso. Además no vi algo que sirva para remover un caracter. myString.concat(valor1,...valorN); Argumentos
valor1,...valorN Cero o más valores que se van a concatenar.
Descripción
Método; combina los valores especificados y devuelve una nueva cadena. Si es necesario, cada argumento valor se convierte en una cadena y se anexa, en orden, al final de la cadena. No se entiende bien lo de ",...", imagino que es cualquier cantidad de valores, y los concatena, pero es más fácil hacer esto: Concatenado = ""+Valor1+Valor2; o: Concatenado = String(Valor1)+Valor2; Quizá la diferencia es que .concat modifica el valor. No: BaseUrna = "ABC"; BaseUrna.concat("D"); trace(BaseUrna);
eso me da ABC. No entiendo qué hace exactamente o qué ventaja tiene comparado con lo que dije. Siguiente: myString.slice(inicio, fin); Argumentos
inicio: Un número que especifica el índice del punto de inicio del sector. Si inicio es un número negativo, el punto inicial se especifica desde el final de la matriz, donde -1 es el último elemento.
fin: Un número que especifica el índice del punto final del sector. Si no se especifica fin, el sector incluye todos los caracteres desde el inicio al final de la cadena. Si fin es un número negativo, el punto final se determina desde el final de la cadena, donde -1 es el último carácter.
Descripción Método; extrae un sector o una subcadena del objeto String especificado, después la devuelve como una nueva cadena sin modificar el objeto String original. La cadena devuelta incluye el carácter inicio y todos los caracteres hasta (pero sin incluir) el carácter fin. Código: Resultado BaseUrna.slice(0, 0): BaseUrna.slice(0, 1): A BaseUrna.slice(0, 2): AB BaseUrna.slice(0, 3): ABC BaseUrna.slice(1, 1): BaseUrna.slice(1, 2): B BaseUrna.slice(2, 3): C BaseUrna.slice(3, 3): El final se nombra como si fuese +1 a lo que se quiere, no tiene mucho sentido. Si quiero del 0 al 2, debo decir del 0 al 3. La cosa es que esto de cortar tiene poco, sólo es obtener parte de una cadena. myString.split(delimitador); Argumentos
delimitador: El carácter utilizado para delimitar la cadena.
Descripción
Método. divide un objeto String rompiendo la cadena cuando se produce el argumento delimitador especificado y devuelve las subcadenas en una matriz. Si no se especifica delimitador, la matriz devuelta contiene solamente un elemento: la propia cadena. Si el delimitador es una cadena vacía, cada carácter del objeto String se convierte en un elemento de la matriz. No lo entiendo, lo pruebo. BaseUrna.split(0): ABC BaseUrna.split(1): ABC BaseUrna.split(2): ABC BaseUrna.split(3): ABC No sé, no veo división, ni siquiera cambio. ¿Hay que especificar el caracter, no es un número? myString.substr(inicio, longitud); Argumentos
inicio: Un número entero que indica la posición del primer carácter de la subcadena que se está creando. Si inicio es un número negativo, el punto inicial se determina desde el final de la matriz, donde -1 es el último carácter.
longitud: El número de caracteres en la subcadena que se está creando. Si no se especifica longitud, la subcadena incluye todos los caracteres desde el inicio al final de la cadena.
Descripción
Método; devuelve los caracteres de una cadena desde el índice especificado en el argumento inicio, hasta el número de caracteres especificados en el argumento longitud. Este lo he usado y lo entiendo, creo. Además es lo que me conviene usar, creo. Pero cómo. Si la bola elegida es la 0, no necesito 2 partes, hago: Urna = Urna.substr(1, Urna.length); Si fuera la última, más o menos lo mismo: Urna = Urna.substr(0, (Urna.length)-1); pero eso no funciona: Urna.substr(0, (Urna.length)-1): Urna.substr(0, Urna.length: ABC Urna.substr(1, (Urna.length)-1): Urna.substr(1, Urna.length: BC Sin los paréntesis tampoco. Ah, tenía mal escrito length a la derecha de los :, suelo escribir mal esa palabra, ahora sí: Urna.substr(0, (Urna.length)-1): AB Urna.substr(0, Urna.length: ABC Urna.substr(1, (Urna.length)-1): BC Urna.substr(1, Urna.length: BC ¿pero por qué el 3ero da BC en vez de B? trace("Urna.substr(1, (Urna.length)-1): "+Urna.substr(1, (Urna.length)-1)); Ah, porque lo 2ndo es la cantidad de caracteres a obtener, no hasta cual. En este caso serán 2. Bien. Y bueno, si se quiere remover un caracter intermedio, sí, en partes: Parte1 = Urna.substr(0, X); Parte2 = Urna.substr(BolaDeAlexNro+1, Y); ¿Está bien? Debo calcular X e Y. En este caso, el número elegido es el 1. Entonces se quiere captar, en la Parte1, sólo el caracter 0. Entonces va 1. ¿Pero cual es la fórmula? Si hubieran más elementos: ABCDE Si se elige el 1, B, queremos obtener sólo A. Si se elige 2, C, queremos AB. Entonces la cantidad de números que queremos obtener es igual al número elegido: Parte1 = Urna.substr(0, BolaDeAlexNro); Ahora Y. Bueno, siempre se va a querer hasta el caracter final, así que es: Parte2 = Urna.substr(BolaDeAlexNro+1, Urna.lenght); lo escribí mal de nuevo >___< th, th, th, th, th, th... Parte2 = Urna.substr(BolaDeAlexNro+1, Urna.length); Así parece ok: BaseUrna = "ABCD"; AlexPerdidas = 0; BartPerdidas = 0; CamiloPerdidas = 0; function Sortear () { // Preparar urna: Urna = BaseUrna; // Elección de la 1er persona, Alex: BolaDeAlexNro = random(4); if (BolaDeAlexNro == 3) { AlexPerdidas++; } else { BolaDeAlex = Urna.charat(BolaDeAlexNro); Parte1 = Urna.substr(0, BolaDeAlexNro); // trace(Parte1); Parte2 = Urna.substr(BolaDeAlexNro+1, Urna.length); // trace(Parte2); Urna = Parte1+Parte2; trace(Urna); } }
Remueve A, B o C sin problema. No es necesario un if cuando sólo se quiere remover la parte 0. Listo. myString.substring(desde, hasta); Argumentos
desde: Un número entero que indica la posición del primer carácter de la subcadena que se está creando. Los valores válidos para desde van de 0 a string.length - 1.
hasta: Un número entero que es 1 + el índice del último carácter de la subcadena que se está creando. Los valores válidos para hasta van de 1a string.length. Si no se especifica el argumento hasta, el final de la subcadena es el final de la cadena. Si desde es igual a hasta, el método devuelve una cadena vacía. Si desde es mayor que hasta, los argumentos se intercambian automáticamente antes de que se ejecute la función.
Descripción
Método; devuelve una cadena que consiste en los caracteres entre los puntos especificados por los argumentos desde y hasta. Por ahora me cansé. Esa es la que me dijo GPT. substring(cadena, índice, recuento); Argumentos
cadena La cadena de la que extraer la nueva cadena.
índice El número del primer carácter que se va a extraer.
recuento El número de caracteres que se van a incluir en la cadena extraída, sin incluir el carácter de índice.
Descripción
Función de cadena; extrae parte de una cadena. Esta es probablemente la que necesitaba. Como es distinta (no empieza con "variable."), no pensé que fuese la que buscaba. Que me sirva de lección xP En fin, lamento el entrevero.
|
|
|
73
|
Programación / Python / Python falla en usar la ñ.
|
en: 2 Diciembre 2024, 04:44 am
|
cuando le pongo ñ a charset no funciona: charset = "abcdefghijklmnñopqrstuvwxyz" with open("passwords.txt", "w", encoding="utf-8") as txt : for a in charset : for b in charset : for c in charset : for d in charset : txt.write(a + b + c + d + "\n")
¿qué hago para que funcione con ñ? El problema puede deberse a cómo Python maneja la codificación al escribir en un archivo. Aunque estás especificando `encoding="utf-8"` al abrir el archivo, puede haber conflictos si el sistema en el que estás ejecutando el script no interpreta correctamente los caracteres extendidos, como la `ñ`.
Aquí tienes una solución que debería funcionar correctamente:
### Solución:
1. **Asegúrate de que tu archivo fuente esté guardado en UTF-8**. Si tu editor de texto no guarda el archivo fuente en UTF-8, la `ñ` podría no ser interpretada correctamente. En editores como VS Code, puedes configurar la codificación en UTF-8.
2. **Verifica que la consola/terminal interprete UTF-8**. Si estás ejecutando el código en una terminal que no maneja UTF-8, podría haber problemas al visualizar o procesar caracteres como la `ñ`.
3. **Código corregido:**
```python # Definir el charset con la letra ñ charset = "abcdefghijklmnñopqrstuvwxyz"
# Abrir el archivo en modo escritura, asegurando la codificación UTF-8 with open("passwords.txt", "w", encoding="utf-8") as txt: # Generar todas las combinaciones de 4 caracteres for a in charset: for b in charset: for c in charset: for d in charset: # Escribir cada combinación en una nueva línea txt.write(a + b + c + d + "\n") ```
4. **Verifica el archivo generado**. Tras ejecutar el código, abre el archivo `passwords.txt` con un editor que soporte UTF-8 para confirmar que las combinaciones con la `ñ` se generan correctamente.
### Qué hacer si sigue sin funcionar:
Si el problema persiste, puede ser útil probar estas opciones:
- **Forzar la codificación UTF-8 en tu entorno Python**. Asegúrate de que Python esté utilizando UTF-8 por defecto. Puedes agregar esta línea al inicio de tu script:
```python import sys sys.stdout.reconfigure(encoding='utf-8') ```
- **Revisar el entorno de ejecución**. Si estás en Windows, puedes configurar la consola para que use UTF-8 ejecutando este comando en la terminal antes de correr el script:
```cmd chcp 65001 ```
### Explicación del problema:
La `ñ` es un carácter que no está en el conjunto básico ASCII. Si hay un desajuste en la codificación entre tu archivo fuente, el entorno Python o el archivo de salida, podría causar que la `ñ` no se procese correctamente. Al usar `encoding="utf-8"` y asegurarte de que todo tu entorno soporte UTF-8, deberías poder manejar la `ñ` sin problemas. ¿Se supone que en eso está la solución? Lo que me sucede es que el archivo py se cierra enseguida y no se genera el archivo que quiero.
|
|
|
74
|
Programación / Programación General / Simulación de empuje.
|
en: 1 Diciembre 2024, 10:29 am
|
En el siguiente video hay 2 pruebas. En la 1era, cuando el personaje camina tiene 2 estados, y en uno es más ancho que en el otro, estira los pies hacia adelante. Eso hace que el barril sea empujado muchas veces en un mismo contacto, lo cual le da demasiada velocidad, está mal. El error ocurre porque en este caso el contacto se produjo cuando el personaje era menos ancho, luego se ensancha y entonces el programa sigue detectando que está tocando el barril, hasta que por fin se aleja suficiente. En la 2nda prueba, el personaje no cambia al caminar, siempre tiene el mismo ancho, el movimiento del barril está bien, pero el personaje debería cambiar al caminar. https://youtu.be/eWPQZnodI1U¿Cómo logro que quede bien? Puedo poner un ancho único. Que, sin importar el ancho del personaje, el contacto se produzca siempre a la misma distancia. Pero no me gusta eso. Puedo poner que al ocurrir el hecho una variable cambie durante un tiempo, en el cual el barril no podrá ser empujado de nuevo. Tampoco me parece buena idea. Busco una solución digamos lógica o realista. Si alguien va caminando, cuando adelanta la pierna tiene más ancho, entonces empuja algo que está más lejos. Si justo lo empuja cuando tiene las 2 piernas juntas, es como si lo empujara varias veces, pero ¿con menos fuerza? No sé, e intentando encontrar fallas cambié varias cosas así que algunas puede que hayan quedado mal. El código en resumen es: 1- Cuando el personaje camina, se calcula su distancia con respecto al barril: DistanciaPlayerBarril = ValorAbsoluto(PlayerX-BarrilX); Las coordenadas que se consideran son los centros de los objetos, o sea, distancia entre el centro del personaje y el centro del barril. 2- Se calcula esto: MinDistanciaSinChoque = PlayerAncho/2+14+0.2; O sea, el ancho del personaje/2 + el ancho del barril/2 (da 14) y 0.2 que es lo que el personaje se moverá. Es la mínima distancia a la que están sin chocar. Como el personaje se moverá 0.2, se agrega eso. 3- Se compara la distancia con eso, para detectar si el personaje tocará el barril o no: if (DistanciaPlayerBarril<MinDistanciaSinChoque) { 4- Supongamos que habrá contacto, ya que es lo relevante aquí. En tal caso tengo esto: // Determinar movimientos: // MinDistanciaSinChoque -> mov 0.2, empuje 0. // 0 -> mov 0, empuje 0.2. MovimientoDelPers = DistanciaPlayerBarril*0.2/MinDistanciaSinChoque; ...la idea es que normalmente el personaje se mueva 0.2, pero si va a tocar el barril se mueva menos, y lo que reste se aplique a la velocidad del barril, en el siguiente paso del programa. Entre más cerca estén, menos se moverá el personaje. 5- Aquí puse que el barril aumente siempre la misma velocidad independientemente de cuánto sea MovimientoDelPers, porque eso me daba problemas. Deberá mejorarse: BarrilSpeed = BarrilSpeed+0.3; ...antes creo que tenía esto: BarrilSpeed = BarrilSpeed+0.2-MovimientoDelPers; Como el barril se detiene si su velocidad es muy poca, eso me daba problemas, creo que era así. Creo que eso es todo. Luego se reduce la velocidad del barril debido a rozamiento, pero eso creo que ya está bien, ya pregunté aquí. En Mario Bros, cuando Mario toca un caparazón de tortuga o similar, ésta adquiere más velocidad que la que él puede tener y además no tiene rozamiento, por eso en ese juego no ocurren estos problemas xP
|
|
|
75
|
Media / Multimedia / Ver video lentamente.
|
en: 1 Diciembre 2024, 05:17 am
|
Uso el Windows Media Classic y si bien tiene esa función, no funciona en los videos que lo preciso, quizá debido al formato (asf, y cambiarle la extensión manualmente no lo soluciona).
Lo puedo subir a YT y tal vez ahí podría verlo lento, pero debe haber algo mejor.
Para Windows 7, ligero, y gratis.
|
|
|
76
|
Foros Generales / Sugerencias y dudas sobre el Foro / Advertencia (o casualidad) sobre el tema de Hason.
|
en: 28 Noviembre 2024, 19:17 pm
|
Recién había encendido la PC, entré en el tema de Hason: (no recomiendo entrar) https://foro.elhacker.net/ingenieria_inversa/unpack_exe_enigma_protector_v5x-t522760.0.html;topicseeny me apareció que la conexión era privada y YT dejó de funcionar, decía que no tenía Internet, pero el cartelito de Windows sí. Tuve que reinicia el PC y menos mal que sólo fue eso. Tal vez entré demasiado pronto al foro, pero en fin, es sospechoso. EDIT: Es más raro de lo que pensé, porque ese link dice algo de un exe, pero luego miré el link y es: https://foro.elhacker.net/analisis_y_diseno_de_malware/virus_en_pagina_online_peliculas-t522758.0.htmlEl link ese que puse al inicio me apareció acá: https://foro.elhacker.net/unread.html;all¿Copié mal el link? ¿qué copié? Ah, es otro tema de la misma sección, no sé por qué se copió ese.
|
|
|
77
|
Programación / Python / Generar diccionarios con Phython.
|
en: 28 Noviembre 2024, 06:05 am
|
GPT me dió este código: import itertools # Definimos el alfabeto incluyendo la ñ alfabeto = "abcdefghijklmnñopqrstuvwxyz" # Generamos todas las combinaciones de 4 letras combinaciones = itertools.product(alfabeto, repeat=4) # Convertimos las combinaciones en una lista de strings resultado = [''.join(combinacion) for combinacion in combinaciones] # Mostramos las primeras 10 combinaciones como ejemplo print(resultado[:10]) # Si necesitas guardarlas en un archivo with open("combinaciones.txt", "w", encoding="utf-8") as archivo: for combinacion in resultado: archivo.write(combinacion + "\n")
Quisiera que me expliquen algunas cosas... resultado = [''.join(combinacion) for combinacion in combinaciones]
La variable resultado es... ''.juntar(¿?) para ¿? en combinaciones. ¿Qué es combinacion y qué hace todo eso exactamente? Nunca les vi sentido a los for xP with open("combinaciones.txt", "w", encoding="utf-8") as archivo:
Con abrir archivo combinaciones.txt, ¿w?, parámetro que no necesito, como archivo Me habían dado otra forma de guardar: with open("passwords_python.txt", "w") as txt:
Por eso dije que lo de encoding no lo necesito, lo que no entiendo es la w y que uno dice archivo y el otro txt ¿eso último es un nombre de resúmen que se le pone al archivo para referirse a él dentro del programa? Y eso de "con abrir (nombre)" tampoco parece tener sentido. Lo normal es cosas como "with a hammer, drive a nail", o sea, "con objeto, hacer algo". Si se dice "con verbo, hacer algo", también podría entenderlo, pero aquí la acción parece el verbo, no sé, no es algo como "Crear archivo (nombre)", eso sí tendría sentido. for combinacion in resultado: archivo.write(combinacion + "\n")
Para ¿? en resultado al archivo agregarle (¿? + salto de línea) No sé qué es combinacion, tal vez algo que itertools crea por defecto, o sea, esa variable no se definió.
|
|
|
78
|
Programación / Programación General / No se capta colisión ¿calculo mal la distancia?
|
en: 27 Noviembre 2024, 08:42 am
|
Intento hacer un juego pero hay una colisión que falla en detectarse, así que hice una versión más simple, que también falla xP Un personaje se mueve hacia la derecha y cuando toca el barril debería empujarlo, pero como el programa falla, hay game over  El archivo editable: https://docs.google.com/document/d/1oHcl-CnBQtm79ABWG9JuJDslrA77XZho/edit?usp=sharing&ouid=109273743447273895658&rtpof=true&sd=trueNota: Donde dice " // Hay que ver si tocaría un barril, arreglarlo.", creo que está mal, ya lo arreglé, además no es el problema. El código: // Indica si el juego continúa o no: Game = "Ok"; // Por motivos que no recuerdo, las imágenes se ponen... // en un objeto I. // Agregar personaje: I.attachMovie("sMedaMan", "Player", 1); // X es porque la posición real del personaje no admite... // tantos valores, los simplifica, se pierde parte; // de este modo no: I.Player.X = 0; I.Player._X = I.Player.X; I.Player._Y = 584; I.Player.Action = "Quiet"; I.attachMovie("sBarril", "Barril2", 2); I.Barril2.X = 80; I.Barril2._X = I.Barril2.X; I.Barril2._Y = 584; LV = 1; Recorrido = 0; // ///////////////////////////////////////////// // ///////////////// MedaMan ///////////////// // ///////////////////////////////////////////// function AumentarRecorrido () { Recorrido++; if (Recorrido == 50) { Recorrido = 0; LV++; } } function Walk () { I.Player.Action = "Walking"; I.Player.gotoAndStop(2); // Indica si debe empujar un barril o no: I.Player.Empujar = "No"; // Ver si empuja algún barril: // (tal vez convenga chequear desde el último) BarrilesChequeados = 1; BarrilesChequeados++; BarrilaChequear = "I.Barril"+BarrilesChequeados; BarrilX = getProperty(BarrilaChequear, _x); // Si el barril existe: if (BarrilX != undefined) { DistanciaPlayerBarril = Math.abs(I.Player.X-BarrilX); trace("DistanciaPlayerBarril: "+DistanciaPlayerBarril); // 26 es la mínima distancia conque no se tocan, // pero se agrega 0.2 por el movimiento de Medaman: if (DistanciaPlayerBarril < 26.2) { trace("Empuja"); I.Player.Empujar = "Sí"; } } if (I.Player.Empujar == "No") { // El personaje avanza: // Hay que ver si tocaría un barril, arreglarlo. I.Player.X = I.Player.X+0.2; I.Player._X = I.Player.X; AumentarRecorrido(); } else { // Determinar movimientos: // MaxDist < 14+12+0.2 // MinDist > 0 // Distancia 26.2 -> 0 movimiento // 0 -> 0.2 MovimientoDelPers = DistanciaPlayerBarril*0.2/26.2; I.Player.X = I.Player.X+MovimientoDelPers; I.Player._X = I.Player.X; // Recorrido debe aumentar acorde a eso, arreglarlo: AumentarRecorrido(); // Empuja un barril: // Esto sólo aumenta la velocidad, ojo que si no se mueve puede que quede tocando al personaje: BarrilSpeed = BarrilaChequear+"Speed"; set (BarrilSpeed, eval(BarrilSpeed)+0.2-MovimientoDelPers); trace("Speed: "+eval(BarrilSpeed)); } } function Quiet () { I.Player.Action = "Quiet"; I.Player.gotoAndStop(1); } // Whens: function RightWhenQuiet () { // Ver si toca algún barril: BarrilesChequeados = 1; BarrilesChequeados++; if (I.Player.hitTest(eval("I.Barril"+BarrilesChequeados)) == true) { trace("Apareció en barril"); // Game over: Game = "Over"; I.Player.gotoAndStop(2); } if (Game == "Ok") { Walk(); } else { gotoAndStop (3); } } function RightWhenWalking () { // AumentarRecorrido(); Walk(); } function QuietWhenWalking () { Quiet(); } // QuietWhenQuiet nada hace. function ControlPlayer () { if (Key.isDown(39)) { // Si se presiona derecha: eval("RightWhen"+I.Player.Action)(); } else { // Si nada se presiona: eval("QuietWhen"+I.Player.Action)(); } } // ///////////////////////////////////////////// // //////////////// Barriles ///////////////// // ///////////////////////////////////////////// function MoveBarriles () { Moved = 1; Moved++; BarrilaMover = "I.Barril"+Moved; BarrilSpeed = BarrilaMover+"Speed"; EvaluedBarrilSpeed = eval(BarrilSpeed); // Aplicar rozamiento: if (EvaluedBarrilSpeed>0) { EvaluedBarrilSpeed = EvaluedBarrilSpeed/1.0025; if (EvaluedBarrilSpeed<0.05) { EvaluedBarrilSpeed = 0; } set (BarrilSpeed, EvaluedBarrilSpeed); } PosicionDelBarril = getProperty(BarrilaMover, _x)+EvaluedBarrilSpeed; // Si ya no está en la pantalla: if (PosicionDelBarril>850) { // Quitarlo: removeMovieClip (BarrilaMover); } else { // Actualizar posición y girar su parte: setProperty (BarrilaMover, _x, PosicionDelBarril); Res = BarrilaMover+".Part"; setProperty (Res, _rotation, getProperty(Res, _rotation)+EvaluedBarrilSpeed*2); // Si tocan al personaje y él se está moviendo: if (I.Player.hitTest(eval(BarrilaMover)) == true && I.Player.Action == "Walking") { DistanciaPlayerBarril = Math.abs(I.Player.X-PosicionDelBarril); trace("Golpeado"); trace("DistanciaPlayerBarril: "+DistanciaPlayerBarril); // Game over: gotoAndStop (3); } else { // Ver si tocó al barril anterior, que está delante: BarrilAnterior = "I.Barril"+(Moved-1); if (eval(BarrilaMover).hitTest(eval(BarrilAnterior)) == true) { // Pasarle la velocidad: set (BarrilAnterior+"Speed", eval(BarrilAnterior+"Speed")+EvaluedBarrilSpeed); // Quedar sin velocidad: set (BarrilSpeed, 0); } } } }
O sea, que si empuja o no, en vez de chequearlo con hittest calculo la distancia entre el personaje y el barril, porque quiero que el personaje se mueva más o se mueva menos de acuerdo a qué tan cerca estaba el barril antes de tocarlo, y si lo hiciera con hittest tendría que mover al personaje, ver si toca, y en tal caso retrocederlo cierta cantidad, o sea cancelar parte del movimiento. Me pareció mejor de esta otra forma, calculando la distancia. El juego dice que hay colisión en el chequeo del golpe, cuando la distancia es 27.7999999999998. Ese chequeo tiene que estar, es para ver si el personaje es golpeado desee atrás cuando los barriles se mueven (en esta versión no sucede porque es simplificada). El chequeo que falla es el de empuje, que es lógico que falle porque la distancia debe ser <26.2 según mis cálculos, que deben estar mal o no sé qué pasa. El personaje mide .................................+306666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666 ..3+02222222222222222222222222222222222222222222222222222222222222222222222222222222222220 no, eso fue porque me pareció ver una cucaracha cerca de donde tengo el mouse, me fijé y toqué teclas sin darme cuenta, han habido varias cerca, lo dejo como chiste  28 de ancho y está en el medio de su película. El barril 24, lo mismo. La línea roja, la distancia, mide 26:  Tal vez debí poner 25.8, no lo entiendo, si a 26 no se tocan pero el personaje se moverá 0.2... ¿entonces a 26 debo sumarle 0.2 o restarle? No sé, pero teniendo en cuenta que por ese movimiento es más fácil que se toquen, entonces supuse que sería 26.2, porque <26.2 es más fácil de cumplirse que 25.8. Igual el problema no es ese ¿por qué con hittest se detecta una colisión a distancia 27.7999999999998? Aunque parte del barril se gira, lo cual podría extender (según el criterio de Flash) el ancho del objeto barril, en esta versión no se gira, pero quito eso del código a ver. Sucedió lo mismo. Acabo de ver que en el estado Wait, Medaman tiene ancho 30, pruebo quitarlo a ver. Lo mismo. Pensé que quizá aunque su estado e imagen fuese walking, hittest funcionaba con el ancho de la 1er imagen, pero no.
|
|
|
79
|
Programación / Programación General / Error por clic y soltar fuera del botón.
|
en: 26 Noviembre 2024, 05:19 am
|
https://youtu.be/xvKPm6Sox3cLo negro que cliqueo estará debajo de unos botones, ya hay uno, blanco. Tienen 3 estados, o frames. El 1ero es simple, estático. Cuando uno de esos botones se señala, su borde parpadea cambiando de colores al azar. El estado 2: Señalándolo. Cuando se cliquea, su borde adquiere el color de su centro, y su centro parpadea cambiando de colores al azar. El estado 3: Cliqueándolo. Cuando se suelta, su centro adquiere el color del separador de dibujos, eso adquiere el color del borde del botón, y eso vuelve a como era (negro transparente). Es un botón que asigna un color a los separadores de dibujos, pero en vez de asignar siempre el mismo, luego de usarse adquiere el color de los separadores, porque si son blancos no tiene mucho sentido un botón que los vuelva blancos. El resto son efectos para que quede mejor. El problema es que si se cliquea, sin soltar el clic se deja de señalar, y se suelta el clic sin señalar el botón, entonces queda en el estado 3, incluso sin estarlo señalando, ni cliqueando, y eso está mal. ¿Cómo se evita ese error? Aún no lo pensé porque tuve mucho lío intentando lograr esos efectos que dije arriba xP Tengo que acomodar algunos nombres de variables también. Pongo el código y luego el archivo. También pueden darme sugerencias sobre cómo mejorar el proceso. La película que tiene el botón inicia así: onClipEvent (load) { ColorDel = 0xFFFFFF; }
DelCentro sería, pero ese nombre ya lo tenía usado, culpa de cómo Flash guarda los colores  Eso hará que cada botón tenga un color distinto, aunque el símbolo u objeto sea el mismo. Sólo debe aplicarse una vez, sino el botón podría quedar como al inicio, cuando no debe. En el frame 1 de la película: ColorDelCentro = new Color(Centro); stop (); Posiblemente se puede poner esa definición en el load anterior. El stop hace que la película se quede mostrando el estado 1, normal, del botón. Esto es de la parte central del botón, que ocupa el frame 1 y el 2: onClipEvent (load) { _parent.ColorDelCentro.setRGB(_parent.ColorDel); }
Adquiere el color asignado por la variable. Botón en el frame 1: on (rollOver) { gotoAndStop (2); }
Cuando el botón se señala, va a su frame 2. Frame 2: El borde del botón, llamado Extremo (pues de hecho también tiene un borde exterior a eso, pero no cambia) tiene esto: onClipEvent (load) { ColorDelExtremo = new Color(this); } onClipEvent (enterFrame) { Rojo = random(256); Verde = random(256); Azul = random(256); ColorDelExtremo.setRGB(Rojo*65536+Verde*256+Azul); }
El botón, que ocupa el frame 2 y 3, tiene: on (rollOut) { gotoAndStop (1); } on (press) { // El extremo de este botón tendrá el color del centro, // y él cambiará a colores random: ExColorDelCentro = ColorDelCentro.getRGB(); gotoAndStop (3); } on (release) { // El centro tendrá los colores de los separadores (fondo): ColorDel = _level0.ColorDelObjetoFondo.getRGB(); ColorDelCentro.setRGB(ColorDel); // Los separadores el color del extremo: _level0.ColorDelFondo = ColorDelExtremo.getRGB().toString(16).toUpperCase(); _level0.ColorDelObjetoFondo.setRGB(ColorDelExtremo.getRGB()); gotoAndStop (2); }
Frame 3: ColorDelExtremo = new Color(Extremo); ColorDelExtremo.setRGB(ExColorDelCentro);
Un detalle quizá relevante es que en el frame 1, el objeto Extremo no tiene nombre, porque no se quiere que tenga efectos. Centro del botón, pero no tiene nombre: onClipEvent (load) { ColorDeEsto = new Color(this); } onClipEvent (enterFrame) { Rojo = random(256); Verde = random(256); Azul = random(256); ColorDeEsto.setRGB(Rojo*65536+Verde*256+Azul); }
Creo que eso es todo. https://drive.google.com/file/d/1cveV1htg1Hto9ylnu-hNnCMpwrdV45ma/view?usp=sharingEdit: Solucionado, los botones tienen la opción de "release out", simplemente hice tic en esa opción y puse que vaya al frame 1 en vez de al 2. Lo que está mal es cómo queda el texto del color luego de que se seleccionan ciertos colores, pero eso es otro tema.
|
|
|
80
|
Media / Multimedia / Texto apareciendo a medida que moto lo atraviesa.
|
en: 25 Noviembre 2024, 14:10 pm
|
En el siguiente video pueden ver 2 animaciones. https://youtu.be/If4OhphUivwLa 1era está bien, pero la moto anda en un fondo negro, vacío. La 2nda está mal, pero tiene pista. Quiero que esté bien y tenga pista. En la 1era, delante del texto hay un cuadro negro que se va achicando a medida que la moto avanza. En la 2nda no puedo hacer lo mismo, no puedo poner un cuadro negro o se vería una cosa negra moverse en la pista. Tampoco puedo poner algo similar a la pista, que se achique o mueva, porque la pista tiene puntitos separados y se notaría. Intenté poner una máscara (cosa de Flash), pero nunca tuve claro cómo funciona y en este caso no me sirvió. Creo que es: - Máscara. - Capa en máscara. - Capa común. El objeto que haya en la máscara determina lo que se muestra de la capa en máscara. Lo que tape se muestra. No afecta a la capas comunes. Basado en eso acabo de probar que el cuadro negro esté pequeño y se agrande, pero no parece que se agrande porque el texto sólo se ve donde está el objeto, chiquito. En la versión anterior se achica sin problema, ahora sólo cambié un - por un + y puse al objeto en una máscara ¿es por eso? onClipEvent (load) { Wait = 15; } onClipEvent (enterFrame) { setProperty ("_level0.Excitebiker", _x, getProperty("_level0.Excitebiker", _x)+5); setProperty ("_level0.Tapador", _width, getProperty("_level0.Tapador", _width)+5); setProperty ("_level0.Texto", _x, getProperty("_level0.Texto", _x)-0.1); Wait--; if (Wait == 0) { setProperty ("_level0.Texto", _alpha, getProperty("_level0.Texto", _alpha)-1); Wait = 15; if (getProperty("_level0.Texto", _alpha) < 20) { _level0.gotoAndStop (3); } } }
En fin ¿cómo lo podría hacer?
|
|
|
|
|
|
|