简体   繁体   English

Flash As3变量问题

[英]Flash As3 Variable Issue

I have a variable on frame 1 that starts at 3000 and keeps decreasing. 我在第1帧上有一个变量,从3000开始,并且一直在减少。 This variable determines the gap of time between the spawn of an object. 此变量确定对象生成之间的时间间隔。 so basically the objects spawn quicker and quicker as the this number decreases. 因此,基本上,随着此数量的减少,物体的生成速度越来越快。 Everything works fine except the fact when i make the character die and the main timeline goes to frame 2 to show the death screen. 一切正常,除了当我使角色死亡并且主时间轴转到第2帧以显示死亡屏幕的事实。 When clicked "play again" on that frame that makes you come back to frame 1. the objects keep spawning at whatever speed they were spawning before death. 在该帧上单击“再次播放”后,您将返回到第1帧。对象以死亡前产生的任何速度继续产生。 Even though the variable resets to 3000 when "play again" clicked.. 即使单击“再次播放”时变量重置为3000。

I traced the variable and it does truely reset. 我跟踪了变量,并确实将其重置。 but for some reason those spawning objects follow the previous variable. 但由于某些原因,这些生成对象遵循先前的变量。

Heres the code on the first Frame: 这是第一个框架上的代码:

import flash.events.Event;

stop(); 

var num1:Number = 0;
var scrollSpeed:Number = 3000;
var playerState:Number = 1;
var alive:Boolean = true;
var Redbars:Array = new Array();
var Bluebars:Array = new Array();

var scoreCount:Number = 10;

addEventListener(Event.ENTER_FRAME, update);



function update(e:Event){

trace(scrollSpeed);

scoreCount += 1;
scoreText.text = (scoreCount).toString();

//SCROLL SPEED-------------------

if(scrollSpeed > 300)
{
scrollSpeed -= 1;
}
//--------------------------------

CheckForCollisionBlue();
CheckForCollisionRed();

//trace(alive);

if(player.currentFrame == 1){
    playerState = 1;
}


//Check if lost
if(player.hitTestObject(leftHitBox)){
    gotoAndStop(2);
    scoreEnd.text = (scoreCount).toString();
}


//If dead Delete Object
if(currentFrame == 2){
        deleteBlue();
        deleteRed();

}




}



////
//Timer////////////////////////////////


var myTimer:Timer = new Timer(scrollSpeed,10000000);
myTimer.addEventListener(TimerEvent.TIMER, timerListener);
function timerListener (e:TimerEvent):void{


//Generate Random number
num1 = randomRange();   
trace(num1);


//IF NUM1 = 1------------------------------------------
if(num1 == 1){

//Create a Red Bar
var redBar = new Jump_Cube();
Redbars.push(redBar); //add enemy to the array
redBar.x = -33;
redBar.y = 99;
redBar.width = 12.5;
redBar.height = 20.45;

//Update the Bar
for(var i:int=0; i < Redbars.length; i++){
    if(currentFrame == 1)
{
    addChild(Redbars[i]);
}
}       
}


//IF NUM1 = 2------------------------------------------
if(num1 == 2){

//Create a Blue Bar
var blueBar = new Jump_Cube2();
Bluebars.push(blueBar); //add enemy to the array
blueBar.x = -26.8;
blueBar.y = 10;
blueBar.width = 12.25;
blueBar.height = 31.90;

//Update the Bar
for(var j:int=0; j < Bluebars.length; j++){
        if(currentFrame == 1)
        {
    addChild(Bluebars[j]);
        }
       }

myTimer.delay = scrollSpeed;

}



}
myTimer.start();



//--------------------------------------------------------------------

//Check for Collision------------------------------
function CheckForCollisionBlue(){
for(var i:int=0; i < Bluebars.length; i++){
        if( player.hitTestObject(Bluebars[i]) ){
            //Collision
            trace("Didnt Hit Blue");
            player.x -= 5;
            player.y += 1;
        }
}
}

//Check for Collision------------------------------
function CheckForCollisionRed(){
for(var i:int=0; i < Redbars.length; i++){
        if( player.hitTestObject(Redbars[i]) ){
            //Collision
            trace("Didnt Hit Red");
            player.x -= 5;
            player.y += 1;
        }
 }
}












function randomRange():Number 
{
return (Math.floor(Math.random() * (2 - 1 + 1)) + 1);
}

///////////BUTTONS------------------
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;



redButton.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchEndRed);
function onTouchEndRed(e:TouchEvent):void{
player.gotoAndPlay(2);
playerState = 2;
}

blueButton.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchEndBlue);
function onTouchEndBlue(e:TouchEvent):void{
player.gotoAndPlay(19);
playerState = 3;
}




///////--CLEARING STAGE
//--------------------------------------------------------------------

//delete Blue------------------------------
function deleteBlue(){
for(var i:int=0; i < Bluebars.length; i++){
        removeChild(Bluebars[i]);
        }

}

//delete Red------------------------------
function deleteRed(){
for(var i:int=0; i < Redbars.length; i++){
       removeChild(Redbars[i]);
        }

 }

Heres the code on the second frame: 这是第二帧的代码:

stop();

alive = false;

againButton.addEventListener(TouchEvent.TOUCH_END, again);
function again(e:TouchEvent):void{
gotoAndStop(1);
playerState = 1;

scrollSpeed = 3000;

deleteBlue();
deleteRed();


}

You have to put in a removeEventListener(Event.ENTER_FRAME, update); 您必须放入removeEventListener(Event.ENTER_FRAME, update); inside your onTouchEndRed function. onTouchEndRed函数中。 And probably also inside of this 'if' conditional: if(player.hitTestObject(leftHitBox)){... 而且也可能在此'if'条件内: if(player.hitTestObject(leftHitBox)){...

Simply stop programming using frames. 只需停止使用框架进行编程即可。 Use classes instead. 改用类。 AS3 is based on classes. AS3基于类。 It'll take you a lot of benefits. 它会带给您很多好处。 This link may help you to start: http://www.adobe.com/devnet/actionscript/getting_started.html 该链接可以帮助您开始: http : //www.adobe.com/devnet/actionscript/getting_started.html

Additionally, FlashPlayer executes frame's code each time you jump to another frame. 此外,每次您跳到另一个框架时,FlashPlayer都会执行框架的代码。 Thats why your variables are reinitializing. 这就是为什么您的变量被重新初始化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM