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=true
Nota: 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:
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.