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);
        }
    }
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top