Неисправная матрица для переворачивания (зеркального отражения) мувиклипа

StackOverflow https://stackoverflow.com/questions/1609095

Вопрос

В настоящее время я работаю над небольшим 2D игровым движком в AS3. Вы даже можете загружать различные фрагменты видеороликов через XML для различных анимаций. Одна из функций также позволяет переключать анимацию при выполнении определенного действия. Таким образом, вы можете иметь 1 анимацию для левой и правой (как обычно). У меня матричное преобразование работает правильно; тем не менее, я думаю, что моя логика переворачивать вещи назад и вперед неверна. В результате неправильная анимация будет воспроизводиться в неподходящее время. Я решил воспроизвести анимацию, основываясь на скорости движущегося объекта, а не на нажатии клавиш, так как у меня есть физические элементы.

Вот ссылка на игру в ее текущем состоянии: http://parrisstudios.com/Game_Design/ gameEngineDemo /

Проблема главным образом в том, что анимации воспроизводятся в неправильное время или не воспроизводятся, когда должны.

Вот мой код для переворачивания (дайте мне знать, что вы, ребята, думаете): ps: переменная направления является последним направлением, с которым сталкивается символ (в данном случае влево или вправо, это описано далее в коде)

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);
        }
    }
Это было полезно?

Решение

Я считаю, что рассматриваемый код находится здесь.

            //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();

Проблема в том, что вы делаете двойной щелчок здесь. Это работает найти, если вы на самом деле меняете клипы с изменения. Например, если вы идете от бега вправо к стоянию справа Это идет не так, когда вы идете от бега вправо к бегу влево. Так как они - один и тот же клип, только что перевернутый, в итоге вы делаете два сальто в этой ситуации. Это вызывает поведение лунной походки: -).

Я бы предложил очистить эту логику и предоставить способ сброса переворота. Вместо возврата к исходной ориентации вернитесь к ней, чтобы вы могли гарантировать состояние клипа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top