2012-01-09 2 views
1

У меня проблема с пулей и врагов. Я не думаю, что мне нужно так много объяснять, просто взгляните на код. Я не очень хорошо разбираюсь в AS3, им новичок и учился, поэтому мне нужна помощь: PAS3 RemoveChild. Пуля и враг?

Хорошо, это на временной шкале вспышки/сцены. Здесь я говорю, что если я нажимаю кнопку мыши, должна создаваться пуля.

stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 

function mouseDown(pEvent) 
{ 
    // Create a new bullet 
    var b = new Bullet(); 
    // Set his position to the tank position 
    b.x = Player.x; 
    b.y = Player.y; 
    // Save the randian angle between the mouse and the tank 
    // This angle will set the direction of the bullet 
    b.angleRadian = Math.atan2(AIM.y - Player.y,AIM.x - Player.x); 
    // Add an enter frame event on each bullet 
    b.addEventListener(Event.ENTER_FRAME, bulletEnterFrame); 
    // Add this display object on the display list 
    addChild(b); 
} 

// Velocity of each bullet 
var speed = 8; 

function bulletEnterFrame(pEvent) 
{ 
    // Get the current object (Bullet) 
    var b = pEvent.currentTarget; 
    // Move this bullet on each frames 
    // On X axis use the cosinus angle 
    b.x += Math.cos(b.angleRadian) * speed; 
    // On Y axis use the sinus angle 
    b.y += Math.sin(b.angleRadian) * speed; 
    // Orient the bullet to the direction 
    b.rotation = b.angleRadian * 180/Math.PI; 
    // You have to remove each created bullet 
    // So after every moves you must check bullet position 
    // If the bullet is out of the screen 
    if (b.x < 0 || b.x > 1024 || b.y < 0 || b.y > 768) 
    { 
     // Remove it from the display list 
     removeChild(b); 
     // /!\ AND REOMOVE HIS EVENT LISTER 
     b.removeEventListener(Event.ENTER_FRAME, bulletEnterFrame); 
    } 

    if (b.hitTestObject(Enemy)) 
    { 
     **I WANT TO REMOVE ENEMY!!!!** 
    } 
} 

OK. И на временной шкале я также создаю врагов. Как это:

var Enemy:MovieClip = new AI(stage); 
addChild(Enemy); 

И enemyclass выглядит следующим образом:

package 
{ 

import flash.display.MovieClip; 
import flash.events.*; 
import flash.display.Stage; 

public class AI extends MovieClip 
{ 

    var speed:Number = 1; 
    var distance:Number; 

    public function AI(stage):void 
    { 


     addEventListener(Event.ENTER_FRAME, onadd); 

    } 

    public function onadd(e:Event):void 
    { 
     addEventListener(Event.ENTER_FRAME, loop); 
    } 

    private function loop(e:Event):void 
    { 

     var Player = MovieClip(root).Player; 

     var yDistance:Number = Player.y - y; 
     var xDistance:Number = Player.x - x; 

     if (Math.sqrt(yDistance*yDistance + xDistance*xDistance) < speed) 
     { 
      x = Player.x; 
      y = Player.y; 
     } 
     else 
     { 
      var radian:Number = Math.atan2(yDistance,xDistance); 
      x += Math.cos(radian) * speed; 
      y += Math.sin(radian) * speed; 
      rotation = radian * 180/Math.PI; 
     } 

     if (this.hitTestObject(Player)) 
     { 
      trace("DEAD"); 
     } 

     //distance = Math.sqrt((MovieClip(root).Player.x - this.x) * (MovieClip(root).Player.x - this.x) + (MovieClip(root).Player.y - this.y) * (MovieClip(root).Player.y - this.y)); 

    } 

} 

} 

Аналитического том, что я не могу понять, как я должен удалить противник, когда хиты пули попали. Пожалуйста, помогите!

+0

Просто сделайте 'parent.removeChild (это)', чтобы удалить его. – Fabricio

+0

Я получаю эту ошибку: TypeError: Error # 1034: Type Coercion failed: невозможно преобразовать global @ 2ac9f29 в flash.display.DisplayObject. \t at Function/SpaceDefend_fla: MainTimeline/Spawn_Enemy/SpaceDefend_fla: bulletEnterFrame() [SpaceDefend_fla.MainTimeline :: frame1: 119] – user1133188

ответ

0

Просто используйте removeChild.

if (b.hitTestObject(Enemy)) 
{ 
    //**I WANT TO REMOVE ENEMY!!!!** 
    removeChild(Enemy); 
} 
+0

Я получаю эту ошибку: TypeError: Ошибка # 1009: Не удается получить доступ к свойству или методу ссылки на нулевой объект , \t в AI/loop() [C: \ Users \ MYNAME \ Desktop \ Project SpaceDefend \ AI.as: 30] – user1133188

+0

вы можете проверить 'if (getChildByName (« Enemy »)! = Null) {removeChild (Enemy);} 'В качестве альтернативы вы можете обернуть код removeChild в блок catch try. – ToddBFisher

+0

Первый код, который вы написали, не сработал ... Still get's TypeError: Error # 1009: Не удается получить доступ к свойству или методу ссылки на нулевой объект. Что вы имеете в виду при обертке removeChild в блоке try catch? – user1133188

0
if (b.x < 0 || b.x > 1024 || b.y < 0 || b.y > 768) 
{ 
    // Remove it from the display list 
    removeChild(b); 
    // /!\ AND REOMOVE HIS EVENT LISTER 
    b.removeEventListener(Event.ENTER_FRAME, bulletEnterFrame); 
} 

Вы удаляете ребенок, а затем пытается получить доступ события с ребенком.

Попробуйте

if (b.x < 0 || b.x > 1024 || b.y < 0 || b.y > 768) 
{ 
    b.removeEventListener(Event.ENTER_FRAME, bulletEnterFrame); 
    removeChild(b); 
} 
Смежные вопросы