1
votes

I'm new to AS3. I searched for my error many times, but have not found an answer.

First, here is my code:

this.stage.scaleMode = StageScaleMode.EXACT_FIT;
this.stage.align = StageAlign.TOP_LEFT;

stop(); 

stage.addEventListener(Event.ENTER_FRAME , movecity);
stage.addEventListener(Event.ENTER_FRAME , timerfunc);
stage.addEventListener(Event.ENTER_FRAME , burgerfall);

var g:Number = 0 ;
var now:Number = 5;

var chips_no:int = 0 ;
var burger_no:int = 0;

function movecity(event:Event):void {
    city.x = city.x - 3 ;

    if(city.x <= -498 ){
        city.x = 993;       
    }   
}

function ontouch(event:MouseEvent , my:MovieClip){
    my.y = (140 + (400 - 140) * Math.random())* (-1);   
    my.x = (60 + (400 - 60) * Math.random());   
    g=10;
    if(my.name=="chips"){
        chips_no +=1;
    }
    if(my.name=="burger"){
        burger_no +=1;
    }
    if(my.name=="burger2"){
        burger_no +=1;
    }       
}

function burgerfall(event:Event){
    if(burger_no==1 && chips_no==1){
        return stage.removeEventListener(Event.ENTER_FRAME, burgerfall), 
               stage.removeEventListener(Event.ENTER_FRAME, movecity), 
               stage.removeEventListener(Event.ENTER_FRAME, timerfunc), 
               gotoAndPlay(215);
    }
    g = g + 14;
    burger.rotation += 20 ;
    burger2.rotation += 25;
    chips.rotation +=15;

    burger.y = burger.y + g;
    burger2.y = burger2.y + g;
    chips.y = chips.y + g;
    /////////////////// chips relocate
    if(chips.y >=1730){
        chips.y = -500 ;
        g = 0.3 ;

        if(chips.x <=240){
            chips.x += Math.random()*400 ;
        }else{
            chips.x -= Math.random()*400 ;
        }
    }
    // ///////////////// burger relocate
    if(burger.y >= 1130){
        burger.y = -109 ;
        g = 0.3 ;

        if(burger.x <=240){
            burger.x += Math.random()*400 ;
        }else{
            burger.x -= Math.random()*400 ;
        }
    }
    // ///////////////////// burger 2 relocate
    if(burger2.y <= 1250){
        burger2.y = -365 ;
        g=0.3;
        if(burger2.x <=240){
            burger2.x += Math.random()*400 ;
        }else{
            burger2.x -= Math.random()*400 ;
        }
    }                   
}

function timerfunc(event:Event):void {
    timer_text.text = String(int(now));
    now-=0.05;
    if(now <= 0){
        stage.removeEventListener(Event.ENTER_FRAME , movecity);
        stage.removeEventListener(Event.ENTER_FRAME , timerfunc);
        stage.removeEventListener(Event.ENTER_FRAME , burgerfall);
        gotoAndPlay(215);
    }
}

burger2.addEventListener(MouseEvent.CLICK , function(me:MouseEvent):void {
    ontouch(me, burger2)
});

burger.addEventListener(MouseEvent.CLICK , function(me:MouseEvent):void {
    ontouch(me, burger)
});

chips.addEventListener(MouseEvent.CLICK , function(me:MouseEvent):void {
    ontouch(me, chips)
});

===========================================

My game is to click on food. If you collect 1 burger and 1 chips you move to : level completed frame. If the timer counts to 0, the game over frame will shown.

The strange problem is about the stage statements. If I re-order the statements this way:

stage.addEventListener(Event.ENTER_FRAME , movecity);
stage.addEventListener(Event.ENTER_FRAME , timerfunc);
stage.addEventListener(Event.ENTER_FRAME , burgerfall);

Then you collect burgers and level complete frame is shown. If the time reaches zero the error 1009 shown about burgerfall() method !!

If I re-order the statements to this way :

stage.addEventListener(Event.ENTER_FRAME , movecity);
stage.addEventListener(Event.ENTER_FRAME , burgerfall);
stage.addEventListener(Event.ENTER_FRAME , timerfunc);

Then you collect burgers, the error 1009 shown about timerfunc() method! If the time reaches zero, the time out frame is shown without any errors!

Hopefully, will understand the issue.

1
If you are removing all three enter frame listeners at the same time, it doesn't make sense that you are creating three listeners to begin with. Why not just create a single function that is set as the event handler for the enter frame event listener. If you were removing the listeners at different times, it would make sense to have three different listener handlers. - Anil Natha
Wow , Great idea! i don't know why i make more than one listener i just arrange all functions with one function and every thing works fine , thank you alot @SlyRaskal - Thaer Zaghal

1 Answers

1
votes

There are so many people posting questions about Null Object Reference Error that I have decided just to paste the link to tutorial here.

Here it is

It is pretty easy to find the exact reason of the error in vast majority of cases. You should try to find exact line of code and exact reference that is null, at least (even if you do not understand why it happens). Then, people, who want to help you will spend less time guessing ))

EDIT:

As to your code... I see no specific need to have 3 different methods which is called on each Enter_Frame event. This is same game loop.