|
151
|
Programación / Programación General / Re: Explicación de estas líneas (Flash) y simplificar el código.
|
en: 9 Junio 2024, 18:51 pm
|
Quiero llamar a una función variable de la raíz (level0) desde una película.
Si fuese una función fija sería: _level0.NombreDeLaFuncion();
Llamar a una función variable de la raíz, desde la raíz, creo que sería: FuncionALlamar = "Funcion1"; eval(FuncionALlamar)();
Si fuese FuncionALlamar = "_level0.Funcion1"; quizá funcionaría desde una película, se me acaba de ocurrir, pero he estado probando cosas y nada funciona. ¿Cómo sería? "_level0."+eval(_level0.FuncionALlamar)(); o eval("_level0."+_level0.FuncionALlamar)();
No recuerdo qué cosas probé, la solución que puse funcionó (no me gustaba porque me parecía inconveniente extender innecesariamente el valor de la variable), pero estoy liado en cuanto a qué hacen esas líneas. eval usa texto y variables para indicar el nombre de una variable y si existe devuelve su valor, pero si luego hay un () entonces ese nombre es de una función a la cual llama. Hasta ahí entiendo ¿está bien, no? Pero con lo del _level0. me lié Es tal cual como dices al final, no veo porque tienes problemas si tienes bien entendida la teoría, eval evalúa lo que le des y devuelve una referencia a ese objeto (variable, objeto o función), las rutas absolutas de los objetos los ves al probar la Película, vi que ya sabes ir a Depurar > Mostrar variables, ahí aparece la ruta absoluta de las variables, funciones, objetos. Deberías encotrar: Variable _level0.FuncionALlamar = [function]. pues eso le entregas a eval de cualquier manera que lo pueda evaluar: eval("_level0." + "FuncionALlamar")(); eval("_level0." + "Funcion" + "ALlamar")(); var f = "FuncionAL"; eval("_level0." + f + "lamar")();
- En todos los casos a eval le estás entregando: "_level0.FuncionALlamar"Otra pregunta. Tengo por ahí: PosiblesSignos = ["==", "!=", "<=", ">=", "<", ">"]; Y uso esta función luego: function ModificarP2() { if (P2Valor<6) { P2Valor++; P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)]; } else { Continuar = "No"; } }
La idea es que P2 cambie a "!=", luego a "<=", y así sucesivamente pero no funciona. Es que esto: P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)]; lo hice basado en algo que me dijeron pero no entiendo qué hace. Obtiene la parte [a definir] del array llamado PosiblesSignos ¿no? Ahora creo que alcanza con decir: P2 = PosiblesSignos[P2Valor]; Sí, ahora me funcionó. ¿Pero qué es esto: P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)]; ? Debo haber copiado mal  Pues sí, quizá eso es la parte para evitar poner el valor fijo 6, con P2 = PosiblesSignos[P2Valor]; debería bastar, para no tener 6 fijo: PosiblesSignos = ["==", "!=", "<=", ">=", "<", ">"]; P2Valor = 1; P2 = PosiblesSignos[P2Valor]; trace(P2); ModificarP2(); trace(P2); function ModificarP2() { if (P2Valor < PosiblesSignos.length) { P2Valor++; P2 = PosiblesSignos[P2Valor]; } else { Continuar = "No"; } }
|
|
|
152
|
Informática / Software / Re: Quitar marca de agua pdf escaneado
|
en: 26 Mayo 2024, 14:12 pm
|
Puedes subir una muestra para verla?, al menos unas cuantas páginas para hacer las pruebas ahí.
Depende mucho de como esté, por ejemplo si es un escaneado al que después se le ha puesto una marca de agua lo tienes más sencillo porque solo es seleccionar y eliminar las marcas de agua, Acrobat tiene herramientas para seleccionar e eliminar objetos en todas las hojas cuando cumplen ciertas propiedades que puedes especificar como tamaño, fuente, color, etc
Si todo está escaneado va a depender de cuan aislado esté la marca de agua para que no afecto lo que tenga debajo, al usar OCR puede separar el escaneado en capas u objetos para poder quitar las marcas de agua pero podría ser más laborioso dependiendo de cuan aislado estén.
En todo caso siempre puedes eliminar manualmente hoja por hoja ya sea seleccionando el objeto y eliminando o editando la imagen que tiene la marca de agua, por ejemplo a mi me a tocado editarlas con Photoshop algunas veces
En Word también puedes seleccionar objetos mediante su panel de selección, o remover marcas de agua en el archivo en sí abriéndolo con WinRAR o 7zip y eliminando/cambiando las marcas de agua
|
|
|
153
|
Programación / Programación General / Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
|
en: 24 Mayo 2024, 01:32 am
|
Bien, pero entonces, teniendo especialmente en cuenta que es más ágil si todo está en una variable ¿no sería más mejor hacelo así: HabilidadesDePersonaje = 0101; // El 1er caracter indica si puede planear. // El 2ndo indica si puede atacar. // El 3ero si puede correr. // 4to si puede saltar.
Si es exactamente como dices y tal cual pasó con mi ejemplo con Array. PERO cuidado con como le das los números a Flash, 0101 para Flash es 65 porque cualquier número que le des que empiece con 0 implica que está en Base 8 (Octal), si lo vas a usar como String lo tendría que poner entre comillas: "0101", pero como vas a trabajar con números puedes darle directamente 5 que es el binario 0101 pasado a base 10 (Decimal, lo normal) - Para no perder legibilidad puede ser conveniente comentar o poner el binario pero con su debida forma, dado que no he visto que haya forma de darle binarios literales a Flash como si se puede con Hexadecimal: 0x5, octal: 05, o decimal: 5, se puede utilizar parseInt: HabilidadesDePersonaje = parseInt("0101", 2); // El 1er caracter indica si puede planear. // El 2ndo indica si puede atacar. // El 3ero si puede correr. // 4to si puede saltar.
[/quote] ? O sea 1 sola variable. Los ifs no sé cómo se harían, yo usaría CharAt pero, quizá por eso no es más ágil, otra manera sería con << o >> (no recuerdo). Puedes usar cualquier técnica para obtener una posición en particular, si trabajas con String es más conveniente usar charAt o subString, si trabajas con números puedes usar matemática (división entera + residuo entero), pero como andamos con binarios puede llegar a ser mejor usar operadores binarios, como dice se puede usar los desplazamientos para aislar un bit PERO debes estar consiente en el tamaño en bits de la variable, es decir, que la variable sea el binario 0101 implica que para Flash en realidad tienes (por legibilidad lo voy a separar cada cuatro bits pero obviamente es todo junto): 0000 0000 0000 0000 0000 0000 0000 0101 Esto es porque Flash el tamaño de una variable numérica es de 32 bits por eso mismo solo puedes desplazar 0 a 31 posiciones, pues bien, si quiero aislar el tercer bit que corresponde a que si el jugador puede o no atacar (esto si leemos de izquierda a derecha 0101, pero como vez puede llegar a confundirse por lo que siempre es mejor leer de derecha a izquierda en binario, ten esto en consideración), basta con hacer tres desplazamientos, uno para quitar los bits de la derecha, otro para los de la izquierda y otro para regresarlo a su sitio, la parte de regresarlo a su sitio es opcional si solo quieres comprobar si vale diferente a 0, pero si quisieras recuperar el número que representa el binario de atacar: 0100 si lo tendrías que hacer 0000 0000 0000 0000 0000 0000 0000 0101 >> 2 = 0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0001 << 31 = 1000 0000 0000 0000 0000 0000 0000 0000
1000 0000 0000 0000 0000 0000 0000 0000 >> (31 - 2) = 0000 0000 0000 0000 0000 0000 0000 0100Es algo tedioso hacerlo así, mejor es usar And tal cual se muestra en los ejemplos anteriores porque es hasta más legible ya que usas binarios que se representan por sí mismos: atacar = 0100 0000 0000 0000 0000 0000 0000 0000 0101 & 0100 = 0000 0000 0000 0000 0000 0000 0000 0100En ActionScript sería: HabilidadesDePersonaje = parseInt("0101", 2); // El 1er caracter indica si puede planear. // El 2ndo indica si puede atacar. // El 3ero si puede correr. // 4to si puede saltar. // HabilidadesDePersonaje & parseInt("0100", 2) resulta el binario 0100 // y como es diferente de 0 evalúa a True o Verdadero, es una forma de abreviar en lugar de poner: == true if ( HabilidadesDePersonaje & parseInt("0100", 2) ) { trace("El personaje puede Atacar"); } else { trace("El personaje no puede Atacar"); }
Lo que veo ahora que no había visto es que cuando crea la 5ta no está usando las 4, por eso le da false la habilidad de planear.
Más o menos entendí, pero sigo sin verle mucho sentido, usa 5 variables cuando podría usar 4 o sólo 1. Nunca usa 4 o 5 variables, como ya expliqué en realidad para Flash una variable numérica tiene 32 bit, tu puedes manejarte con hasta esa cantidad de bits, los ceros de la izquierda los puedes omitir pero Flash ya los rellenará con ceros hasta completar 32 bits, solo ten muy presente que es mejor usar los bits de derecha a izquierda para que todo esto no te afecte o confunda, o especificar el binario completo donde si sería más real el poner: HabilidadesDePersonaje = parseInt("01010000000000000000000000000000", 2); // El 1er caracter indica si puede planear. // El 2ndo indica si puede atacar. // El 3ero si puede correr. // 4to si puede saltar.
Lo mejor es: HabilidadesDePersonaje = parseInt("0101", 2); // El último bit indica si puede planear. // El penúltimo si puede atacar. // El antepenúltimo si puede correr. // El tras antepenúltimo si puede saltar.
O poner mejor aún poner: El 1er bit desde la derecha, El 2do bit desde la derecha, etc Todo lo estoy poniendo con parseInt para que sea más legible los bits pero en también puedes usar sus correspondientes números en cualquier otra base porque son exactamente lo mismo tal cual está en los ejemplos anteriores de ChatGPT: // Definición de habilidades del personaje //HABILIDAD_SALTO = 1 Salto: 0001 en binario //HABILIDAD_CORRER = 2 Correr: 0010 en binario //HABILIDAD_ATACAR = 4 Atacar: 0100 en binario //HABILIDAD_PLANEAR = 8 Planear: 1000 en binario //Podrá Saltar y Atacar (1 + 4) HabilidadesDePersonaje = 5; if ( HabilidadesDePersonaje & 4 ) { trace("El personaje puede Atacar"); } else { trace("El personaje no puede Atacar"); }
|
|
|
154
|
Programación / Programación General / Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
|
en: 20 Mayo 2024, 15:30 pm
|
No entiendo ¿no es más fácil algo como: HABILIDAD_SALTO = true HABILIDAD_CORRER = true HABILIDAD_ATACAR = true HABILIDAD_PLANEAR = false Si HABILIDAD_SALTO == true puede saltar etc? O en vez de true/false, "Sí"/"No", 1/0, etc. Fácil de entender por su legibilidad si es. Yo quiero aprender eso del or y and si es algo que no se puede hacer de otro modo o resulta mucho más fácil hacerlo así. Si es por agilizar procesos, entiendo que es importante pero por ahora paso.
A un número le puedo sumar otro, eso es útil y difícilmente insustituible.
El or viene a decir que a 2 binarios los puedo transformar en 1, uno tiene más probabilidad de tener 1s ¿pero eso para qué sirve?
Capaz que los ejemplos que me dió son incorrectos, imagino que si se tienen 2 cosas a comparar, con muchas variables, en vez de hacer: SumaDe1 = Objeto1TieneCuello+Objeto1TieneManos+Objeto1TienePiernas SumaDe2 = Objeto2TieneCuello+Objeto2TieneManos+Objeto2TienePiernas Si SumaDe1 == SumaDe2 los objetos son iguales ... usando or se podría hacer la comparación sin sumar ni usar 3 ifs ¿puede ser? ChatGPT te ha respondido bien y dado buenos ejemplos, quizá solo falte algo de conceptos teóricos para aplicarlos en la práctica. No creo que haya problemas de agilidad porque son procesos muy simples, al final será ínfimamente más ágil aquel que se acerque más al juego de instrucciones del procesador de forma más simplificada, y claro, tener todo en una sola variable simple siempre tomará menos recursos. - Y justo ahí está su beneficio, puedes mandar o trabajar con una sola variable que a nivel bit tenga varios estados o variables simples como muestra ChatGPT en su último ejemplo. Aunque ChatGPT ya mostró el funcionamiento en la práctica de OR, AND y los desplazamientos puede que en otros lados te muestren las famosas tablas de verdad de OR y AND para que las memorices, o si quieres el "truco" el OR es como sumar y el AND es como multiplicar: A: 11001010 + B: 10110111 ----------------- A|B: 11111111 1 + 1 = 2, pero como en binario no puedes escribir literalmente 2 pondrías 1 y llevarías 1 PERO como esto es una operación OR donde se opera bit a bit lo que llevas se pierde (como si solo existiera una cifra posible), como es un "truco" tiene esas restricciones. Si por el contrario quieres usar la Tabla de verdad OR implica que el resultado será 1 (verdadero) si al menos uno de los bits a comparar es 1, también es correcto decir que el resultado será 0 (falso) si ambos bit a operar son también 0. Todo esto es tal cual sucede en la programación real con OR: if (true || true) // true if (true || false) // true if (false || true) // true if (false || false) // false En caso de AND A: 11001010 * B: 10110111 ------------------ A&B: 10000010 - Acá es más fácil, 1 * 1 = 1, 1 * 0 = 0, 0 * 1 = 0, solo da 1 (verdadero) si ambos bit son 1, resulta 0 en cualquier otro caso. En programación: if (true && true) // true if (true && false) // false if (false && true) // false if (false && false) // false --- python # Definición de habilidades del personaje HABILIDAD_SALTO = 1 # Salto: 0001 en binario HABILIDAD_CORRER = 2 # Correr: 0010 en binario HABILIDAD_ATACAR = 4 # Atacar: 0100 en binario HABILIDAD_PLANEAR = 8 # Planear: 1000 en binario # Habilidades del personaje habilidades_personaje = HABILIDAD_SALTO | HABILIDAD_CORRER | HABILIDAD_ATACAR # Verificación de habilidades if habilidades_personaje & HABILIDAD_SALTO: print("El personaje puede saltar.") if habilidades_personaje & HABILIDAD_CORRER: print("El personaje puede correr.") if habilidades_personaje & HABILIDAD_ATACAR: print("El personaje puede atacar.") if habilidades_personaje & HABILIDAD_PLANEAR: print("El personaje puede planear.") else: print("El personaje no puede planear.")
Bien, esta es una aplicación práctica porque se usa una sola variable "habilidades_personaje" para englobar otras ya que a nivel bit tiene reservadas posiciones para guardar/obtener dichas variables. # Habilidades del personaje habilidades_personaje = HABILIDAD_SALTO | HABILIDAD_CORRER | HABILIDAD_ATACAR
- Esto está sumando las habilidades, recordar que se está trabajando a nivel bit y que estos bits no están interfiriendo con otros # Definición de habilidades del personaje HABILIDAD_SALTO = 1 # Salto: 0001 en binario HABILIDAD_CORRER = 2 # Correr: 0010 en binario HABILIDAD_ATACAR = 4 # Atacar: 0100 en binario HABILIDAD_PLANEAR = 8 # Planear: 1000 en binario
- Si los sumas o aplicas OR cada uno está en su columna sin molestar al vecino, si por ejemplo solo quiero que Salte y Ataque: HABILIDAD_SALTO: 0001 // 1 HABILIDAD_ATACAR: 0100 // 4 habilidades_personaje: 0101 // 5 Ahora solo toca obtener el valor, para eso basta con revisar bit a bit, ya sabemos que el último bit de la derecha indica si puede o no puede saltar, el segundo si puede o no correr, el tercero si puede o no atacar, y el cuarto si puede o no planear. Lo puedes convertir en String y usar CharAt o SubString pero como estamos trabajando en binario usaremos operadores binarios: # Verificación de habilidades (0 es False, cualquier otro valor es True) if habilidades_personaje & HABILIDAD_SALTO: # 0101 * // 5 (habilidades_personaje) # 0001 // 1 (HABILIDAD_SALTO) # 0001 // 1 (verdadero) print("El personaje puede saltar.") if habilidades_personaje & HABILIDAD_CORRER: # 0101 * // 5 (habilidades_personaje) # 0010 // 2 (HABILIDAD_CORRER) # 0000 // 0 (falso) print("El personaje puede correr.") if habilidades_personaje & HABILIDAD_ATACAR: # 0101 * // 5 (habilidades_personaje) # 0100 // 1 (HABILIDAD_ATACAR) # 0100 // 5 (verdadero) print("El personaje puede atacar.") if habilidades_personaje & HABILIDAD_PLANEAR: # 0101 * // 5 (habilidades_personaje) # 1000 // 2 (HABILIDAD_PLANEAR) # 0000 // 0 (falso) print("El personaje puede planear.") else: print("El personaje no puede planear.")
- Y mira que es interesante que la operación AND te devuelve la Habilidad que estás consultando, así que estás recuperando el valor de la variable, en otros casos devuelve siempre ceros: 0 (False) --- Bueno, todo esto es trabajar a nivel bit, pero también puedes trabajarlo a nivel variables como pusiste tú: HABILIDAD_SALTO = true HABILIDAD_CORRER = true HABILIDAD_ATACAR = true HABILIDAD_PLANEAR = false Si HABILIDAD_SALTO == true O utilizar un Array que más o menos se acerca en concepto al nivel bit, más legible pero aparentemente más complejo XD: HABILIDAD_SALTO = 0; HABILIDAD_CORRER = 1; HABILIDAD_ATACAR = 2; HABILIDAD_PLANEAR = 3; habilidades_personaje = new Array(); habilidades_personaje[HABILIDAD_SALTO] = true; habilidades_personaje[HABILIDAD_CORRER] = true; habilidades_personaje[HABILIDAD_ATACAR] = true; habilidades_personaje[HABILIDAD_PLANEAR] = false; if (habilidades_personaje[HABILIDAD_SALTO] == true) { // ... }
- O si quieres simplificar: // habilidades_personaje = [0] HABILIDAD_SALTO, [1] HABILIDAD_CORRER, [2] HABILIDAD_ATACAR, [3] HABILIDAD_PLANEAR] habilidades_personaje = [true, true, true, false]; if (habilidades_personaje[0] == true) { // ... }
También puedes crear un "Objeto" en ActionSript 1.0, aunque ya sería demasiado para algo tan simple: function habilidades_personaje(saltar, correr, atacar, planear) { this.HABILIDAD_SALTO = saltar; this.HABILIDAD_CORRER = correr; this.HABILIDAD_ATACAR = atacar; this.HABILIDAD_PLANEAR = planear; } var habilidades_Pepito = new habilidades_personaje(true, true, true, false); var habilidades_Jaimito = new habilidades_personaje(false, true, true, false); if (habilidades_Pepito.HABILIDAD_SALTO == true) { trace("Pepito puede saltar"); } else { trace("Pepito no puede saltar"); } if (habilidades_Jaimito.HABILIDAD_SALTO == true) { trace("Jaimito puede saltar"); } else { trace("Jaimito no puede saltar"); } habilidades_Pepito.HABILIDAD_SALTO = false; habilidades_Jaimito.HABILIDAD_SALTO = true; if (habilidades_Pepito.HABILIDAD_SALTO == true) { trace("Pepito puede saltar"); } else { trace("Pepito no puede saltar"); } if (habilidades_Jaimito.HABILIDAD_SALTO == true) { trace("Jaimito puede saltar"); } else { trace("Jaimito no puede saltar"); }
- Devuelve: Pepito puede saltar Jaimito no puede saltar Pepito no puede saltar Jaimito puede saltar
|
|
|
155
|
Sistemas Operativos / Windows / Re: No consigo hacer funcionar una tarea programada
|
en: 14 Mayo 2024, 14:23 pm
|
1. Revisa que exista la ruta: HKEY_CLASSES_ROOT\PackagedCom\ClassIndex\{ZZ95F097-EB96-453B-B4E6-1613637F3B14} y que tienes permisos para modificarla, has la prueba poniéndole un _ delante del nombre ( _{ZZ95F097-EB96-453B-B4E6-1613637F3B14}) y luego lo vuelves a dejar como estaba, en mi Windows no tengo esa ruta 2. Supongo que habrás probado tu archivo.reg o que esté bien formateado, vi que pusiste que contenía: [-HKEY_CLASSES_ROOT\PackagedCom\ClassIndex\{ZZ95F097-EB96-453B-B4E6-1613637F3B14}]Pero también debe incluir como primera línea: Windows Registry Editor Version 5.003. ¿Qué has puesto en?:  Si has puesto directamente el archivo .reg tal cual no va a funcionar porque ejecutar un .reg implica llamar a RegEdit.exe y este siempre pregunta si estás seguro de cargar el .reg o no, y como tu tarea está siendo ejecutada por SYSTEM y está marcada como oculta no verás el mensaje, tienes varias opciones pero para no cambiar mucho puedes hacer lo siguiente: En Programa o Script pon: RegEdit.exeEn Agregar argumentos pon: /S "D:\Mi Biblioteca\Trucos\Sistemas operativos\Windows\archivo.reg"No sé la ruta completa de tu archivo.reg, debes asegurarte que la parte entre comillas esté bien --- Otra opción para no depender de un .reg ya que es muy sencillo lo que hace es: En Programa o Script pon: Reg.exeEn Agregar argumentos pon: Delete HKCR\PackagedCom\ClassIndex\{ZZ95F097-EB96-453B-B4E6-1613637F3B14} /FCon eso no necesitas un archivo.reg, sino que directamente llamas a Reg.exe y le dices que elimine la clave especificada sin preguntar nada más --- Si no funciona lo anterior y lo has hecho todo bien, ya pueden ser problemas de permisos, algunas claves están protegidas y requieren permisos de Trusted Installer, pero de momento prueba hasta acá
|
|
|
157
|
Programación / Programación General / Re: ¿Cómo promediar 2 colores?
|
en: 14 Mayo 2024, 00:27 am
|
Si le quieres dar una aproximación más matemática puedes partir de este ejemplo en base 10 (lo normal): iColor1 = 123456; Si quisieras despejar 12 bastaría con dividirlo entre 10000, quedando 12.3456 y a esto le quitamos la parte decimal convirtiéndolo a entero = 12 Para despejar 34 hay que dividirlo entre 100, quedando 1234.56, luego lo convertimos a entero para obtener 1234, y por último obtenemos el módulo (residuo entero) entre 100 para conseguir 34 Para despejar 56 basta con obtener el módulo entre 100, quedando 56 Bien, pero esto que hemos hecho es con base 10, pero tú quieres trabajar con un valor hexadecimal, podrías convertirlos a decimal y trabajarlos así pero también lo puedes trabajar directo en hexadecimal sin complicaciones y sin perder legibilidad: iColor1 = 0xAABBCC; Si quisieras despejar 0xAA bastaría con dividirlo entre 0x10000 Para despejar 0xBB hay que dividirlo entre 0x100, quedando 0xAABB, luego obtenemos el módulo (residuo entero) entre 0x100 y obtenemos 0xBB Para despejar 0xCC basta con obtener el módulo entre 0x100 iColor1 = 0xAABBCC; iR1 = parseInt(iColor1 / 0x10000); iG1 = parseInt(iColor1 / 0x100) % 0x100; iB1 = iColor1 % 0x100; sColorHex = iR1.toString(16) + iG1.toString(16) + iB1.toString(16); trace(sColorHex);
Esto devuelve: aabbcc
El código completo para esta solución sería: iColor1 = 0xCC0000; iColor2 = 0xCCCCCC; iR1 = parseInt(iColor1 / 0x10000); iG1 = parseInt(iColor1 / 0x100) % 0x100; iB1 = iColor1 % 0x100; iR2 = parseInt(iColor2 / 0x10000); iG2 = parseInt(iColor2 / 0x100) % 0x100; iB2 = iColor2 % 0x100; iPromR = (iR1 + iR2) / 2; iPromG = (iG1 + iG2) / 2; iPromB = (iB1 + iB2) / 2; trace(iPromR + ", " + iPromG + ", " + iPromB); sColorPromHex = iPromR.toString(16) + iPromG.toString(16) + iPromB.toString(16); trace(sColorPromHex);
Obteniendo: 204, 102, 102 cc6666
--- La solución por el método binario te lo propuso ChatGPT pero para que te sea legible debes saber como funcionan internamente los operadores de desplazamiento binario y And binario, o al menos su equivalencia matemática, eso lo estaba explicando Serapis, te darás cuenta que es similar al método matemático que pasé antes, salvo que yo uso parseInt para deshacerme de los decimales y módulo para quitar números de la izquierda
|
|
|
158
|
Programación / Programación General / Re: ¿Cómo promediar 2 colores?
|
en: 12 Mayo 2024, 21:31 pm
|
Si digo CC0000, es decir 204, 0, 0 y CCCCCC, es decir 204, 204, 204 el resultado debe ser 204, 102, 102
Entiendo que debo convertir el hexadecimal a decimal y luego hacer promedios. ¿Por qué "0x"+ convierte a hexadecimal tan fácil? ¿es como una función (Number, toString, etc)? Depende de como tomes el dato, por ejemplo CC0000 dará error porque para flash eso no es un número por lo que entenderá que es un nombre de variable que seguramente tampoco lo sea, para que Flash entienda que es un número debería ser: 0xCC0000, entonces Flash entenderá que le diste un número hexadecimal, si le das "CC0000" entenderá que es un String o Texto, en ambos no es que estás convirtiendo, solo le estás entregando los valores correctamente para que Flash lo entienda. Siempre me costó entender esas pistas, y este código claro que tampoco lo entiendo. Ese es código Action Script 2 o 3 por lo que se está usando declaración de variables tipadas especificando el tipo de variable (variable:String, variable:Number), se escribe la variable o función seguido de dos puntos y el tipo de dato que debe contener o devolver, quítalos para no tener problemas en Action Script 1 que es el que usas, no sé si ya hayas visto que hay programadores que usan prefijos en sus variables para indicar que tipo de variables son para ser más legibles, por ejemplo: sNombre = "pepe"; iEdad = 17; fEstatura = 1.67; (s de String, i de Integer, f de Float) --- Todo lo demás son operaciones a nivel bit, básicamente se usan los desplazamientos binarios y la operación AND binaria para descomponer tu número hexadecimal 0xCC0000 en 0xCC, 0x00 y 0x00, puedes tomar ese camino o puedes trabajar con String que es más legible siempre y cuando ya hayas trabajado o conozcas el método SubStr y/o SubString para extraer partes de una String, supongo que parseInt y toString ya lo conoces bien, sino revisa la documentación o pregunta: sColor1 = "CC0000"; sColor2 = "CCCCCC"; iR1 = parseInt(sColor1.SubStr(0, 2), 16); iG1 = parseInt(sColor1.SubStr(2, 2), 16); iB1 = parseInt(sColor1.SubStr(4, 2), 16); iR2 = parseInt(sColor2.SubStr(0, 2), 16); iG2 = parseInt(sColor2.SubStr(2, 2), 16); iB2 = parseInt(sColor2.SubStr(4, 2), 16); iPromR = (iR1 + iR2) / 2; iPromG = (iG1 + iG2) / 2; iPromB = (iB1 + iB2) / 2; trace(iPromR + ", " + iPromG + ", " + iPromB); sColorPromHex = iPromR.toString(16) + iPromG.toString(16) + iPromB.toString(16); trace(sColorPromHex);
Esto devuelve: 204, 102, 102 cc6666
|
|
|
160
|
Media / Multimedia / Re: el vlc me pide no puede identificar codec de audio y video para ver tiktok
|
en: 9 Mayo 2024, 01:37 am
|
Wow, ya veo, tiktok está usando el códec HEVC en un contenedor FLV  , eso no es estándar, por eso rompe muchos reproductores, ni mi K-Lite, ni VLC, ni SM Player, ni ffmpeg por defecto lo pueden trabajar. Quizá algún otro reproductor pueda con esta muestra que encontré en línea: https://gitlab.com/mbunkus/mkvtoolnix/uploads/0a4372863e7164a736fe15e717e30bf9/hevc.flvOtro reproductor muy famoso es PotPlayer https://potplayer.daum.net/ que lo reproduce y soporta URLs en línea, en caso de ffmpeg hay una versión parchada que se distribuye para yt-dlp: https://github.com/yt-dlp/FFmpeg-Builds/releases/download/autobuild-2024-05-08-14-11/ffmpeg-n7.0-28-ge7d2238ad7-win64-gpl-7.0.zip también es capaz de reproducirlo/trabajarlo Conclusión: Usa PotPlayer en lugar de VLC --- Al inicio probé con .m3u8, con ellos no hay problemas como mostré en mis capturas, el detalle es cuando trabajas con .flv Haber si alguien más quiere poner a prueba su reproductor favorito con la muestra que mandé 
|
|
|
|
|
|
|