Deberían agregar un ícono de confusión.
Esta es la salida:
Caminó a la derecha: 0.5
Caminó a la izquierda: 0
Caminó a la izquierda: -0.5
Caminó a la derecha: 0
Caminó a la derecha: 0.5
Caminó a la izquierda: 0
Caminó a la izquierda: -0.5
Mario empujado mientras caminaba a: -0.5
El EmpujeaDKMario es: 0
Distancia: 60.7
Empuje negativo, no debería ocurrir
Mario empujado mientras caminaba a: -0.5
y se repite. Esos mensajes indican la velocidad pixeles por frame, conque Mario se está moviendo, y la distancia respecto a Donkey Kong, que está a su derecha, moviéndose hacia él:
Mario <-DK
Los mensajes de movimientos son sobre Mario.
La velocidad de ambos es 0.5. Así que... voy a poner que la distancia se muestre más seguido, pero no es un error que pueda obtener a voluntad.
Distancia: 57.8
Mario empujado mientras caminaba a: 0.5
El EmpujeaDKMario es: 2.93
Moving por ser empujado: -2.43
Caminó a la derecha contra gran empuje: -2.4007
Distancia: 59.75
Mario empujado mientras caminaba a: -2.4007
El EmpujeaDKMario es: -5.569051
Empuje negativo, no debería ocurrir
Casi seguro que es cuando presiono izquierda justo antes de que sea empujado o en el mismo momento.
No puedo explicar lo que no entiendo, pero quedan tan cerca que hay colisión, cuando Mario caminaba a la derecha, así que es empujado a la izquierda, bastante, no debería haber colisión de nuevo en ese momento, pero hay... ¿por qué?
¿Cómo lo puedo entender más?
Viendo mensajes que no puse (son muchas líneas que parecen irrelevantes) veo que con 58.8 no ocurre colisión:
Distancia: 59.8
Distancia: 58.8
Distancia: 57.8
Mario empujado mientras caminaba a: 0.5
...pero en lo que puse antes dice que se detectó a 59.75, o sea, a mayor distancia sí se detectó colisión, no puede ser. Les dejo lo que me parece relevante del código, espero no resumir de más. Ah, un detalle: Cuando Mario es empujado, su velocidad tarda en normalizarse, dependiendo de si camina contra el empuje, si se queda quieto o camina a favor, pero dudo que eso sea la causa del problema, creo que es en la parte de DK.
// Player:
attachMovie("sDKMario", "Player", 1001);
setProperty ("Player", _x, 620);
setProperty ("Player", _y, 568);
// Velocidad conque se está moviendo y dirección:
Player.Moving = 0;
DKMarioSpeed = 0.5;
// IA:
attachMovie("sDK", "IA", 1000);
setProperty ("IA", _x, 780);
setProperty ("IA", _y, 568);
IA.Moving = 0;
DKSpeed = 0.5;
// /////////////////////////////////////////////
// ////////////////// Most ///////////////////
// /////////////////////////////////////////////
// Nota: Creo que no estoy usando esto:
function FrenoPorFriccion (ID, Character) {
if (Math.abs(eval(ID+".Moving")) > eval(Character+"Speed")) {
set(ID+".Moving", (eval(ID+".Moving")+eval(Character+"Speed")*eval(ID+".Facing"))/2);
}
}
// /////////////////////////////////////////////
// ////////////////// Mario //////////////////
// /////////////////////////////////////////////
function WalkToRight () {
// Si no está empujado a la derecha con más velocidad a la propia:
if (Player.Moving < DKMarioSpeed) {
// Si no está empujado a la izquierda con más velocidad a la propia:
if (Player.Moving >= -DKMarioSpeed) {
// Aumenta su velocidad hacia la derecha sin exceder el máximo:
Player.Moving = Math.min(DKMarioSpeed, Player.Moving+DKMarioSpeed);
trace("Caminó a la derecha: "+Player.Moving);
} else {
// Aumenta su velocidad un poco hacia la derecha sin exceder el máximo:
Player.Moving = Math.min(DKMarioSpeed, (Player.Moving*99+DKMarioSpeed)/100);
trace("Caminó a la derecha contra gran empuje: "+Player.Moving);
}
} else if (Player.Moving > DKMarioSpeed) {
// Reducción de la velocidad:
Player.Moving = (Player.Moving*99+DKMarioSpeed)/100;
trace("Derecha con empuje: "+Player.Moving);
}
Player._x = Player._x+Player.Moving;
}
function WalkToLeft () {
// Si no está empujado a la izquierda con más velocidad a la propia:
if (Player.Moving > -DKMarioSpeed) {
// Si no está empujado a la derecha con más velocidad a la propia:
if (Player.Moving <= DKMarioSpeed) {
// Aumenta su velocidad hacia la izquierda sin exceder el máximo:
Player.Moving = Math.max(-DKMarioSpeed, Player.Moving-DKMarioSpeed);
trace("Caminó a la izquierda: "+Player.Moving);
} else {
// Esto no ocurre por ahora (haber sido empujado a la derecha).
}
} else if (Player.Moving < -DKMarioSpeed) {
// Reducción de la velocidad:
Player.Moving = (Player.Moving*99-DKMarioSpeed)/100;
trace("Izquierda con empuje: "+Player.Moving);
}
Player._x = Player._x+Player.Moving;
}
function Frenar () {
if (Player.Moving > DKMarioSpeed) {
// Si está moviéndose a la derecha más rápido de lo normal
// (porque está empujado), poca reducción de la velocidad:
Player.Moving = 0.99*Player.Moving;
trace("Frenando naturalmente: "+Player.Moving);
Player._x = Player._x+Player.Moving;
} else if (Player.Moving < -DKMarioSpeed) {
// Si está moviéndose a la izq más rápido de lo normal
// (porque está empujado), poca reducción de la velocidad:
Player.Moving = 0.99*Player.Moving;
trace("Frenando naturalmente: "+Player.Moving);
Player._x = Player._x+Player.Moving;
}
}
// /////////////////////////////////////////////
// /////////////////// DK ////////////////////
// /////////////////////////////////////////////
function DKVsDKMario () {
Distancia = IA._x-Player._x;
trace("Distancia: "+Distancia);
if (Distancia > 0) {
// DK está a la derecha de Mario:
IA._x = IA._x-DKSpeed;
if (IA.hitTest(Player)) {
if (Player.Action2 == "Walking") {
EmpujeaDKMario = (DKSpeed+Player.Moving)*((DKPeso-DKMarioPeso)/100);
trace("Mario empujado mientras caminaba a: "+Player.Moving);
trace("El EmpujeaDKMario es: "+EmpujeaDKMario);
} else {
EmpujeaDKMario = DKSpeed*((DKPeso-DKMarioPeso)/100);
trace("Mario empujado mientras estaba quieto.");
trace("EmpujeaDKMario: "+EmpujeaDKMario);
}
if (EmpujeaDKMario > 0) {
Player.Moving = Player.Moving-EmpujeaDKMario;
trace("Moving por ser empujado: "+Player.Moving);
} else {
trace("Empuje negativo, no debería ocurrir");
}
}
} else if (Distancia < 0) {
// DK está a la izquierda de Mario, esto tampoco ocurre por ahora.
} else {
// DK está en el mismo lugar que DKMario, tampoco.
}
}
Resumiendo el código acá me di cuenta de que el empuje no es necesariamente negativo, lo dice el if... Puede ser 0, de hecho al inicio dice que es 0, no lo había visto. Pero en la 2nda salida es negativo. El cálculo es:
EmpujeaDKMario = (DKSpeed+Player.Moving)*((DKPeso-DKMarioPeso)/100);
Supongo que resulta negativo porque Player.Moving es negativo, lo cual como expliqué no sé cómo ocurre en ese momento, parece que a veces se capta una colisión a una distancia menor, pero que yo sepa el tamaño de los dibujos (animados) no varía tanto.
¿Necesitan algo más?
O sea, estaba a Distancia 57.8, hubo colisión, fue empujado a la izquierda, caminó a la derecha intentando oponerse, pero estaba a distancia mayor que antes, y aún así se detectó otra colisión. ¿Acaso el caminar se está aplicando luego de que se dice la distancia, antes de terminar el frame? Digo, puede que la salida esté desordenada, chequearé eso.