Сто тысяч Оззи в AS3 - PullRequest
       2

Сто тысяч Оззи в AS3

1 голос
/ 13 января 2011

Я делаю флэш-игру с птицей в качестве аватара. И когда птица поднимает пикап Iron Bird, звучит песня Iron Man. Но проблема в том, что он продолжает делать новые экземпляры этого аудио. Так что я, как сто тысяч Оззи, поет песню. Но они имеют задержку секунды между собой. Есть ли определенная функция для воспроизведения песни только один раз? Или небольшой скрипт, чтобы сделать это?

Это мой сценарий:

var IronManMusic:Sound = new IronManSong();
var IronManChannel:SoundChannel = new SoundChannel();

var backgroundMusic:Sound = new BackgroundMusic(); 
var myChannel:SoundChannel = new SoundChannel();
myChannel = backgroundMusic.play();

 if(ironbird==true){
  laatstejump = 9;
  myChannel.stop();
  IronManChannel = IronManMusic.play();
 }

Логическое значение ironbird находится в функции Updatescreen. Я думаю, что это проблема, но я не уверен. Помощь очень ценится! :)

Ответы [ 2 ]

0 голосов
/ 13 января 2011

Не знаю, что именно вы имеете в виду под аудио и анимацией, но вот мой сценарий.

//loads keyboard events
import flash.events.KeyboardEvent

var laatstelook:int = 1;
var ironbird:Boolean = false;
var laatstejump = 1;
var movebirdie:int = 2;
var birdfatigue : Boolean = false;
var birdtellery:int = 0;
var birdtelleryvertrager = 0;
var vy:Number=0;
var movement:Boolean=false;
var springen:Boolean=false;
var gv:Number=0.1;
var keyArray:Array = new Array();
var i:Number;
var leftOrrightpressed:Number=0;
var platformraak=false;
var PlatformArray:Array = new Array();

var IronManMusic:Sound = new IronManSong();
var IronManChannel:SoundChannel = new SoundChannel();

var backgroundMusic:Sound = new BackgroundMusic(); 
var myChannel:SoundChannel = new SoundChannel();
myChannel = backgroundMusic.play();

for(i=0;i<222;i++){
    keyArray.push([i,false]);
}
//creating multiple objects from 1 object
for (var a:int = numChildren - 1; a >= 0; a--){
    var child:DisplayObject = getChildAt(a);
    if (child.name == "platform"){
        PlatformArray.push(child);
    }
}

stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown);
stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp);
this.addEventListener(Event.ENTER_FRAME, UpdateScreen);
function UpdateScreen(event:Event):void{

    //No multiple jumps in air
    if(springen==true){

        birdie.gotoAndStop(laatstejump);
        birdtelleryvertrager+=0.2;
        birdie.y-=15;
        birdie.y+=birdtelleryvertrager;
        birdtellery++;

        if(isKeyDown(39)==true){
            birdie.x += 5;
            background.x += 1;
            vcam.x += 5;
            if(birdie.x <= 261.95){
                vcam.x = 275.5;
                background.x -= 1;
            }
                if(ironbird != true){
                    birdie.gotoAndStop(5);
                }else{birdie.gotoAndStop(13);}
        }

        if(isKeyDown(37)==true){
            birdie.x-=5;
            vcam.x -= 5;
            background.x -= 1;
            if(birdie.x <= 261.95){
                vcam.x = 275.5;
                background.x += 1;
            }
            birdie.gotoAndStop(6);
        }

        //bird falls down
        if(birdtellery>25){
            birdfatigue == true;
            if(isKeyDown(39)==true){
                birdie.x-=4;
                vcam.x -= 4;
            }

            if(isKeyDown(37)==true){
                birdie.x += 4;
                vcam.x += 4;
            }

            birdtelleryvertrager+=0.8;
        }

        //bird can jump again (when on platform)
        if(birdtellery>30){
            springen=false;
        }

    }else{
            if(birdfatigue == true){
                birdie.gotoAndStop(7);
            }

            //if right arrow button is pressed
            if(isKeyDown(39)==true){
                birdie.x += movebirdie;

                if(birdie.x >= 261.95){
                    vcam.x += movebirdie;
                    background.x += 0.5;
                }
                if(ironbird != true){
                    birdie.gotoAndStop(2);
                    laatstelook =1;
                }else{birdie.gotoAndStop(11);
                        laatstelook =9;
                    }

                laatstejump =5;
                leftOrrightpressed =1;

            }

            if(isKeyDown(39)==false){
                if (leftOrrightpressed ==1){
                    birdie.gotoAndStop(laatstelook);
                }

            }

            //if left arrow button is pressed
            if(isKeyDown(37)==true){

                birdie.x -= movebirdie;
                background.x -= 0.5;
                vcam.x -= movebirdie;
                if(birdie.x <= 261.95){
                    vcam.x = 275.5;
                    background.x += 0.5;
                }
                if(ironbird != true){
                    birdie.gotoAndStop(3);
                    laatstelook =4;
                }else{birdie.gotoAndStop(12);
                        laatstelook = 10;
                    }

                laatstejump=6;
                leftOrrightpressed =2;
            }

            if(isKeyDown(37)==false){
                if (leftOrrightpressed ==2){
                    birdie.gotoAndStop(laatstelook);
                }
            }

            //if space button is pressed
            if(isKeyDown(32)==true && springen==false){
                springen=true;  
            }

        }

    if(birdie.hitTestPoint(ironbirdpickup.x,ironbirdpickup.y,true)){
        ironbird = true;
        ironbirdpickup = Null;
    }

    if(ironbird==true){
        laatstejump = 9;
        myChannel.stop();
        IronManChannel = IronManMusic.play();
    }



    addEventListener(Event.ENTER_FRAME,ctrl_birdie);


    function ctrl_birdie(e:Event){

        //when bird touches one of the platforms, bird stops falling
        for(var a in PlatformArray){
            if(PlatformArray[a].hitTestPoint(birdie.x,birdie.y,true)){
                birdtelleryvertrager=0;
                birdtellery = 0;
                birdie.y-=1;
            }
        }
    }

    if(birdie.hitTestPoint(platform.platformboundingbox.x,platform.platformboundingbox.y,true)){
        trace("hit");
    }

    //gravity
    vy = 10;
    birdie.y+=vy;
}

//checks if certain key is pressed
function checkKeysDown(event:KeyboardEvent):void{
    keyArray[event.keyCode][1]=true;
}
function checkKeysUp(event:KeyboardEvent):void{
    keyArray[event.keyCode][1]=false;
}
function isKeyDown(X){
    return keyArray[X][1];
}

Я голландец, поэтому некоторые переменные странны. xD Просто спросите, не поняли ли вы!

0 голосов
/ 13 января 2011

Хм ... выглядит так, как должно быть:

if(ironbird==true) {
  [...]
  ironbird = false;
}

Или, по крайней мере, упомянутая вами функция Updatescreen должна установить ironbird обратно на false после одного тика / итерации.

РЕДАКТИРОВАТЬ: Глядя на код, который вы отправили в качестве ответа, это еще проще:

Вы делаете

if(birdie.hitTestPoint(ironbirdpickup.x,ironbirdpickup.y,true)){
    ironbird = true;
    ironbirdpickup = Null;
}

if(ironbird==true){
    laatstejump = 9;
    myChannel.stop();
    IronManChannel = IronManMusic.play();
}

и используйте переменную ironbird для анимации и других вещей. Перемещение звукового триггера должно запускать звук только один раз (или так часто, как срабатывает hitTestPoint).

if(birdie.hitTestPoint(ironbirdpickup.x,ironbirdpickup.y,true)){
    ironbird = true;
    ironbirdpickup = Null;
    myChannel.stop();
    IronManChannel = IronManMusic.play();
}

if(ironbird==true){
    laatstejump = 9;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...