Autor Tema: Solucionado: Colocar signos bien y entender máximo.

0 Usuarios y 1 Visitante están viendo este tema.

18 Diciembre, 2025, 07:45 am
Leído 643 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Ignoren el hecho de que hay picas en vez de tréboles y corazones, eso lo intento arreglar luego.

Explico qué pasa, hasta donde entiendo:

En cada carta, que mide 100x150 pixeles, se deben colocar una cantidad al azar de signos. En la imagen fue 7 y 10.

Se quiere que los signos dejen un margen de al menos 1/4 de su ancho y alto, o sea, que no estén demasiado arriba, ni demasiado a la izquierda, etc.

Un signo se coloca al azar para cumplir eso.

Luego se coloca otro, y se chequea si quedó tocando algún anterior, en cuyo caso su tamaño se reducirá y se colocará en otro lado, y este proceso se repetirá hasta que todo signo necesario haya sido colocado y no haya quedado tocando a otro.
Algo matemático me está fallando en esa parte, los signos se colocan, sin que queden tocándose, pero se colocan fuera de las cartas  :P

Lo relevante del código supongo que está desde que dice SignosAgregados = 0;
y probablemente el error esté en esto
setProperty (RutaDelSignoAgregado, _x, -50+CuartoAnchoDeSigno+Math.random()*(100-AnchoDeSigno-CuartoAnchoDeSigno*2));
setProperty (RutaDelSignoAgregado, _y, -75+CuartaAlturaDeSigno+Math.random()*(150-AlturaDeSigno-CuartaAlturaDeSigno*2));

La coordenada 0, 0 en cada carta está en su centro, así que -50, -75 es su esquina superior izquierda.
O sea, cada carta es como un espacio propio, con coordenadas propias.

Código: [Seleccionar]
function MostrarCartasDeHumano () {
NroDeCartaaMostrar = 0;
if (CartasDeHumano.length % 2 == 0) {
PosicionDe0 = 256 - CartasDeHumano.length-1 * 50 - 25;
} else {
PosicionDe0 = 256 - CartasDeHumano.length * 50;
}
do {
NombreDeCarta = "CartaDeHumano"+CartasDeHumano[NroDeCartaaMostrar];
attachMovie ("sCarta", NombreDeCarta, NroDeCartaaMostrar);
setProperty (NombreDeCarta, _x, PosicionDe0+(NroDeCartaaMostrar)*150);
setProperty (NombreDeCarta, _y, 192);
// Para el interior de la carta:
Tipo = CartasDeHumano[NroDeCartaaMostrar].charat(0);
if (Tipo == "T") {
Tipo = "tréboles";
} else if (Tipo == "D") {
Tipo = "diamantes";
} else if (Tipo == "P") {
Tipo = "picas";
} else {
Tipo = "corazones";
}
set (NombreDeCarta+".Text", NumerosDeHumano[NroDeCartaaMostrar]+"\n"+Tipo);
SignosAgregados = 0;
Escala = 100;
AnchoDeSigno = 36.5;
AlturaDeSigno = 41.5;
CuartoAnchoDeSigno = AnchoDeSigno/4;
CuartaAlturaDeSigno = AlturaDeSigno/4;
do {
SignosAgregados++;
NombreDeSigno = "Signo"+SignosAgregados;
RutaDelSignoAgregado = NombreDeCarta+"."+NombreDeSigno;
eval(NombreDeCarta).attachMovie ("sPica", NombreDeSigno, SignosAgregados);
setProperty (RutaDelSignoAgregado, _x, -50+CuartoAnchoDeSigno+Math.random()*(100-AnchoDeSigno-CuartoAnchoDeSigno*2));
setProperty (RutaDelSignoAgregado, _y, -75+CuartaAlturaDeSigno+Math.random()*(150-AlturaDeSigno-CuartaAlturaDeSigno*2));
// Se verá si toca alguno anterior:
NroDelSignoaChequear = 1;
ParteDeRutaaChequear = NombreDeCarta+".Signo";
while (NroDelSignoaChequear < SignosAgregados) {
if (eval(RutaDelSignoAgregado).hitTest(eval(ParteDeRutaaChequear+NroDelSignoaChequear)) == true) {
trace("CONTACTO");
// Toca uno, se recolocará, más chico:
SignosAgregados--;
Escala--;
AnchoDeSigno = 36.5*Escala/100;
AlturaDeSigno = 41.5*Escala/100;
CuartoAnchoDeSigno = AnchoDeSigno/4;
CuartaAlturaDeSigno = AlturaDeSigno/4;
NroDelSignoaChequear = SignosAgregados;
}
NroDelSignoaChequear++;
}
} while (SignosAgregados < NumerosDeHumano[NroDeCartaaMostrar]);
NroDeCartaaMostrar++;
} while (NroDeCartaaMostrar < CartasDeHumano.length);
}

El 1er signo se coloca en
setProperty (RutaDelSignoAgregado, _x, -50+CuartoAnchoDeSigno+Math.random()*(100-AnchoDeSigno-CuartoAnchoDeSigno*2));
setProperty (RutaDelSignoAgregado, _y, -75+CuartaAlturaDeSigno+Math.random()*(150-AlturaDeSigno-CuartaAlturaDeSigno*2));
O sea, su coordenada X es
Mínimo: -50+CuartoAnchoDeSigno+0*(100-AnchoDeSigno-CuartoAnchoDeSigno*2);
Significa: En el extremo izquierdo de la carta (-50), pero le sumamos 1/4 del ancho del signo, entonces queda con un poco de márgen.
Supongamos que el ancho del signo es 36:
-50+9 = -41
La coordenada 0, 0 del signo está en su esquina superior izquierda, así que está dejando un márgen de 9.

Máximo: -50+9+1*(100-36-9*2);
-41+1*(100-36-18);
-41+1*(100-54);
-41+1*(46);
4
Esto parece un error, el máximo debería ser 100-36-9 creo...

Intentaré corregir esa fórmula, pero no entiendo qué hace que los signos se coloquen fuera. Si dependiera sólo de esa fórmula, difícil que se colocaran muy a la derecha del centro.

Edit: Me di cuenta que me faltaba escalar, pensé que las imágenes no se estaban reduciendo porque no tenían necesidad de reducirse tanto, lo dudé y me di cuenta.

Me faltaba esto:
setProperty (RutaDelSignoAgregado, _xscale, Escala);
setProperty (RutaDelSignoAgregado, _yscale, Escala);

Ahora mi duda es:
¿Por qué al hacer esta cuenta me dió 4?
-50+9+1*(100-36-9*2);
¿hice mal la cuenta?
¿cual sería la fórmula correcta para que el mínimo sea -50+CuartoAnchoDeSigno
y el máximo 100-CuartoAnchoDeSigno-AnchoDeSigno?
¿es así como debe ser, no?

Edit2: Creo que ya entendí, me confundió ese 100, pero la coordenada en el extremo derecho de la carta es 50, así que el máximo debe ser 50-36-9, que es... 50-45, y había sumado 1 a 41 pero nada que ver, el 1 estaba multiplicando.