Matrice difettosa per capovolgere (specchio riflesso) un MovieClip
-
05-07-2019 - |
Domanda
Attualmente sto lavorando a un simpatico motore di gioco 2D in AS3. Puoi persino caricare diversi filmati di filmati flash tramite XML per le diverse animazioni. Una delle funzionalità ti consente anche di capovolgere un'animazione quando esegui una determinata azione. In questo modo potresti avere 1 animazione per sinistra e destra (come al solito). La trasformazione della matrice funziona correttamente; tuttavia, penso che la mia logica per capovolgere le cose avanti e indietro sia errata. Il risultato è che l'animazione sbagliata verrà riprodotta al momento sbagliato. Ho deciso di riprodurre l'animazione in base alla velocità dell'oggetto in movimento piuttosto che alla pressione dei tasti poiché ho elementi di fisica coinvolti.
Ecco un link al gioco nel suo stato attuale: http://parrisstudios.com/Game_Design/ gameEngineDemo /
Il problema è principalmente che le animazioni vengono riprodotte in momenti non corretti o non quando dovrebbero.
Ecco il mio codice per il lancio (fammi sapere cosa ne pensate): ps: la variabile direction è l'ultima direzione in cui si trova il personaggio (a sinistra oa destra in questo caso, è descritta più avanti nel codice)
private function drawJumpMode():void {
var change:Boolean = false;
//decide whether to swap graphics or continue playing
if (Math.abs(particleGroup.particles[0].velocity.y) < epsilon && Math.abs(particleGroup.particles[0].velocity.x) < epsilon && direction == "right") {
if (lastClipAction != "stillRight"){
lastClipAction = "stillRight";
change = true;
}
}
else if (Math.abs(particleGroup.particles[0].velocity.y) < epsilon && Math.abs(particleGroup.particles[0].velocity.x) < epsilon && direction == "left") {
if (lastClipAction != "stillLeft"){
lastClipAction = "stillLeft";
change = true;
}
}
else if (particleGroup.particles[0].velocity.y > 0 && Math.abs(particleGroup.particles[0].velocity.x) < epsilon) {
if (lastClipAction != "down"){
lastClipAction = "down";
change = true;
}
}
else if (particleGroup.particles[0].velocity.y < 0 && Math.abs(particleGroup.particles[0].velocity.x) < epsilon) {
if (lastClipAction != "up"){
lastClipAction = "up";
change = true;
}
}
else if (particleGroup.particles[0].velocity.x > 0) {
if (lastClipAction != "right") {
lastClipAction = "right";
direction = "right";
change = true;
}
}
else if (particleGroup.particles[0].velocity.x < 0) {
if (lastClipAction != "left"){
lastClipAction = "left";
direction = "left";
change = true;
}
}
//If the movie clip has changed, swap the old one back into the all clips library and get the new one.
if (change) {
//set flip to false whenever there is a change in movie clip
flipped = false;
//if the movie clip was flipped before, this should flip it
//back to normal
flip();
//remove movie clip from the scene
game.removeChild(playingMovieClip);
//check it back into the movie clip library
allClips.addChild(playingMovieClip);
//add the movie clip into the scene
playingMovieClip = MovieClip(allClips.getChildByName(actionToClip[lastClipAction + "Name"]));
game.addChild(playingMovieClip);
}
//Flip if needed
flip();
//set it to true so that it won't be constantly flipped.
flipped = true;
//set movie clip to be center over the main particle
playingMovieClip.x = particleGroup.particles[0].center.x;
playingMovieClip.y = particleGroup.particles[0].center.y;
}
private function flip():void {
//If a transformation is required, then do so
if (actionToClip[lastClipAction + "H"]=="1" && !flipped){
flipHorizontal(playingMovieClip);
}
if (actionToClip[lastClipAction + "V"]=="1" && !flipped){
flipVertical(playingMovieClip);
}
}
Soluzione
Credo che il codice in questione sia qui.
//If the movie clip has changed, swap the old one back into the all clips library and get the new one.
if (change) {
//set flip to false whenever there is a change in movie clip
flipped = false;
//if the movie clip was flipped before, this should flip it
//back to normal
flip();
//remove movie clip from the scene
game.removeChild(playingMovieClip);
//check it back into the movie clip library
allClips.addChild(playingMovieClip);
//add the movie clip into the scene
playingMovieClip = MovieClip(allClips.getChildByName(actionToClip[lastClipAction + "Name"]));
game.addChild(playingMovieClip);
}
//Flip if needed
flip();
Il problema è che stai facendo un doppio giro qui. Questo funziona se stai effettivamente cambiando clip dalla modifica. Ad esempio, se passi da correre a destra in piedi. Va storto quando passi dalla corsa a destra alla corsa a sinistra. Dato che sono la stessa clip appena lanciata, alla fine si fanno due lanci in questa situazione. Questo provoca il comportamento del moonwalk :-).
Suggerirei di ripulire questa logica e di fornire un modo per ripristinare il lancio. Invece di tornare all'orientamento originale, ripristinalo in modo da poter garantire lo stato della clip.