2013-05-08 123 views
0

我正在創建一個遊戲,如果您遇到殭屍,殭屍就會死亡,並且他的頭部會向您發出的方向發回。這就像打殭屍頭與棒球一樣,頭是球。我有兩個movieclip殭屍和殭屍頭。一旦殭屍被擊中,它將發揮其垂死的動畫並將其自身移除,同時殭屍頭部將被添加到垂死殭屍的x和y座標中,並像打棒球一樣被吹倒。我已經完成了關於命中和殭屍死亡和重生的代碼,但是當它被擊中時,我似乎無法定位並將頭部添加到垂死的殭屍中。我已經完成了殭屍頭部的功能,但我怎麼能把它添加到殭屍。我認爲這會是這樣,我加入這個在殭屍類的PlayDeathAnimation功能,但沒有奏效:將動畫片段定位到另一個動畫片段2

for (var i=0; i < MovieClip(parent).zombies.length; ++i) 
{ 
var zh = new ZombieHead(); 
zh.x = MovieClip(parent).zombies[i].x; 
zh.y = MovieClip(parent).zombies[i].y; 
zh.rotation = MovieClip(parent).zombies[i].rotation;     
addChild(zh); 

} 

我甚至嘗試了這一點。頭部產卵,但只是保持靜止,不會飛回來,當殭屍移除自己時,它會自行移除,我不想這樣做。我已經告訴ZombieHead時本身刪除自己的類

var zh = new ZombieHead();    
addChild(zh); 

這是我到目前爲止 球員

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.events.MouseEvent; 
    import flash.ui.Keyboard; 
    import flash.display.Graphics; 
    import flash.utils.setTimeout; 

    public class Player extends MovieClip 
    { 
     //Player Setting 
     var walkSpeed:Number = 4; 
     var walkRight:Boolean = false; 
     var walkLeft:Boolean = false; 
     var walkUp:Boolean = false; 
     var walkDown:Boolean = false; 
     var attacking:Boolean = false; 
     var attackRange:int = 100; 
     var attackAngle:int = 30; 

     public function Player() 
     { 
      stage.addEventListener(KeyboardEvent.KEY_DOWN,walk); 
      addEventListener(Event.ENTER_FRAME,Update); 
      stage.addEventListener(KeyboardEvent.KEY_UP,stopWalk); 
      stage.addEventListener(MouseEvent.CLICK,attack); 
      // The lines below draw a preview of your attack area 
      graphics.beginFill(0x00ff00, 0.2); 
      graphics.lineTo(attackRange*Math.cos((rotation-attackAngle)/180*Math.PI),attackRange*Math.sin((rotation-attackAngle)/180*Math.PI)); 
      graphics.lineTo(attackRange*Math.cos((rotation+attackAngle)/180*Math.PI),attackRange*Math.sin((rotation+attackAngle)/180*Math.PI)); 
      graphics.endFill(); 


     } 

     function walk(event:KeyboardEvent) 
     { 
      //When Key is Down 
      if (event.keyCode == 68) 
      { 
       walkRight = true; 
      } 
      if (event.keyCode == 87) 
      { 
       walkUp = true; 
      } 
      if (event.keyCode == 65) 
      { 
       walkLeft = true; 
      } 
      if (event.keyCode == 83) 
      { 
       walkDown = true; 
      } 
     } 

     function Update(event:Event) 
     { 

      //if attacking is true then key moves are false; 
      if ((attacking == true)) 
      { 
       walkRight = false; 
       walkLeft = false; 
       walkUp = false; 
       walkDown = false; 
       // see if the zombie is in the cone 

       for (var i:int=MovieClip(parent).zombies.length-1; i>=0; i--) 
       { 
        if (inAttackCone(MovieClip(parent).zombies[i])) 
        { 
         if (hitTestObject(MovieClip(parent).zombies[i])) 
         { 
          //attacking = true; 
          MovieClip(parent).zombies[i].zombieDead = true; 
         } 

        } 
       } 

      } 
      else if ((attacking == false)) 
      { 
       //Else if attacking is false then move and rotate to mouse; 
       var dx = parent.mouseX - x; 
       var dy = parent.mouseY - y; 
       var angle = Math.atan2(dy,dx)/Math.PI * 180; 
       rotation = angle; 

       if ((walkRight == true)) 
       { 
        x += walkSpeed; 
        gotoAndStop(2); 
       } 
       if ((walkUp == true)) 
       { 
        y -= walkSpeed; 
        gotoAndStop(2); 
       } 
       if ((walkLeft == true)) 
       { 
        x -= walkSpeed; 
        gotoAndStop(2); 
       } 
       if ((walkDown == true)) 
       { 
        y += walkSpeed; 
        gotoAndStop(2); 
       } 
      } 
     } 

     //Calculate the distance between the two 
     public function distanceBetween(player:MovieClip,zombies:MovieClip):Number 
     { 
      for (var i:int=MovieClip(parent).zombies.length-1; i>=0; i--) 
      { 
       var dx:Number = x - MovieClip(parent).zombies[i].x; 
       var dy:Number = y - MovieClip(parent).zombies[i].y; 
      } 
      return Math.sqrt(((dx * dx) + dy * dy)); 
     } 

     public function angleDifference(a:Object, b:Object):Number 
     { 
      var dx:Number = b.x - a.x; 
      var dy:Number = b.y - a.y; 
      var ang:Number = (a.rotation/180*Math.PI)-Math.atan2(dy, dx); 
      while (ang>Math.PI) 
      { 
       ang -= 2 * Math.PI; 
      } 
      while (ang<-Math.PI) 
      { 
       ang += 2 * Math.PI; 
      } 
      return Math.abs(ang*180/Math.PI); 
     } 

     function inAttackCone(enemy:MovieClip):Boolean 
     { 
      var distance:Number = distanceBetween(this,enemy); 
      distance -= enemy.width/2;// account for the enemy's size 
      if (distance < attackRange) 
      { 
       // In range, check angle 
       if (angleDifference(this,enemy)<attackAngle) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 

     function stopWalk(event:KeyboardEvent) 
     { 
      if ((attacking == false)) 
      { 
       if (event.keyCode == 68) 
       { 
        event.keyCode = 0; 
        walkRight = false; 
        gotoAndStop(1); 
       } 
       if (event.keyCode == 87) 
       { 
        event.keyCode = 0; 
        walkUp = false; 
        gotoAndStop(1); 
       } 
       if (event.keyCode == 65) 
       { 
        event.keyCode = 0; 
        walkLeft = false; 
        gotoAndStop(1); 
       } 
       if (event.keyCode == 83) 
       { 
        event.keyCode = 0; 
        walkDown = false; 
        gotoAndStop(1); 
       } 
      } 
     } 

     function attack(event:MouseEvent) 
     { 
      if ((attacking == false)) 
      { 
       attacking = true; 
       gotoAndStop(3); 
      } 
     } 
    } 
} 

做殭屍

package 
{ 

    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.geom.Point; 

    public class Zombie extends MovieClip 
    { 

     var walkSpeed:Number = 2; 
     var target:Point; 
     public var zombieDead:Boolean = false; 

     public function Zombie() 
     { 
      //set target location of Zombie 
      target = new Point(Math.random() * 500,Math.random() * 500); 
     } 

     function loop() 
     { 
      if (zombieDead == true) 
      { 
       playDeathAnimation(); 
      } 
      else if (zombieDead == false) 
      { 
       gotoAndStop(1); 
       //Point Zombie at its target 
       var dx = MovieClip(root).Player01.x - x; 
       var dy = MovieClip(root).Player01.y - y; 
       var angle = Math.atan2(dy,dx)/Math.PI * 180; 
       rotation = angle; 
       //Move in the direction the zombie is facing 
       x = x+Math.cos(rotation/180*Math.PI)*walkSpeed; 
       y = y+Math.sin(rotation/180*Math.PI)*walkSpeed; 
       //Calculate the distance to target 
       var hyp = Math.sqrt((dx*dx)+(dy*dy)); 
       if (hyp<5) 
       { 
        target.x = Math.random() * 500; 
        target.y = Math.random() * 500; 
       } 
      } 
     } 

     public function playDeathAnimation() 
     { 
      gotoAndStop(2); 
     } 

     public function deathAnimationFinishedCallback() 
     { 
      for (var i=0; i < MovieClip(parent).zombies.length; ++i) 
      { 
       if (MovieClip(parent).zombies[i] == this) 
       { 
        MovieClip(parent).zombies.splice(i, 1); 
        break; 
       } 
      } 
      MovieClip(parent).removeChild(this); 
     } 
    } 

} 

ZombieHead

package 
{ 

    import flash.display.MovieClip; 
    import flash.events.Event; 


    public class ZombieHead extends MovieClip 
    { 

     var headSpeed:Number = -30; 
     var friction:Number = 0.9; 


     public function ZombieHead() 
     { 
      // constructor code 
      addEventListener(Event.ENTER_FRAME,Update); 

     } 

     function Update(event:Event) 
     { 
       x = x+Math.cos(rotation/180*Math.PI)*headSpeed; 
       y = y+Math.sin(rotation/180*Math.PI)*headSpeed; 
       headSpeed *= friction; 
       if (headSpeed > -0.00001) 
       { 
        removeEventListener(Event.ENTER_FRAME,Update); 
        parent.removeChild(this); 
       } 
       else if (x<0 || x > 550 || y < 0 || y > 400) 
       { 
        removeEventListener(Event.ENTER_FRAME,Update); 
        parent.removeChild(this); 
       } 
     } 

    } 

} 

文檔類

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class Game extends MovieClip 
    { 
     public var zombies:Array; 

     public function Game() 
     { 
      addEventListener(Event.ENTER_FRAME, update); 
      zombies = new Array(); 
     } 

     public function update(e:Event) 
     { 
      //Only spawn a Zombie if there are less than number 
      if (numChildren < 4) 
      { 
       //Make a new instance of the Zombie. 
       var Z = new Zombie(); 
       addChild(Z); 

       //Position and rotate the zombie 
       Z.x = Math.random() * stage.stageWidth; 
       Z.y = Math.random() * stage.stageHeight; 
       Z.rotation = Math.random() * 360; 

       zombies.push(Z); 
      } 
      for (var count = 0; count<zombies.length; count ++) 
      { 
       zombies[count].loop(); 

      } 
     } 
    } 
} 

回答

0

您需要跟蹤的x,y值的頭跟蹤身體,一個enterFrame事件函數會做: 例如:

 addEventListner(event.ENTER_FRAME,follow head); 

     function (event.ENTER_FRAME){ 
       myhead.x == mybody.x 
       myhead.y == mybody.y 
       } 

基本上thehead將跟隨身體x,y值每幀或每幀週期內。

0

你顯然是將頭部添加到殭屍,而不是持有者類,然後,當你移除殭屍時,你也刪除它的頭部,因爲頭部是殭屍的孩子。不要將其添加到殭屍母體:

parent.addChild(zh); 

此外,爲了搬完頭,父類應該知道到達的頭。所以,當你添加一個頭部,並且你有一個殭屍陣列時,製作一個頭部陣列,這些頭部會在頭部生成時填充,當你希望頭部消失時將會消失,然後像你一樣遍歷它已經與殭屍做。

+0

它幾乎奏效,這就是我所做的。如果(inAttackCone(MovieClip(parent).zombies [i])在播放器類 中(var i:int = MovieClip(parent).zombies.length-1; i> = 0; i - ){ \t ){ \t \t如果(hitTestObject(影片剪輯(父).zombies [I])){ \t \t \t的MovieClip(父).zombies [I] .zombieDead = TRUE; \t \t var zh = new ZombieHead; \t \t \t zh.x = MovieClip(parent).zombies [i]。X; \t \t \t zh.y = MovieClip(parent).zombies [i] .y; \t \t \t zh.rotation = MovieClip(parent).zombies [i] .rotation; \t \t \t parent.addChild(zh); \t \t \t} \t \t} \t}} 但 – user2350724 2013-05-08 23:14:26

+0

的問題是ZombieHead將重新本身多次,直到殭屍已經死了。頭部的功能就像它假設的那樣起作用並擺脫它自身的方式,但我認爲只要殭屍精靈= true,它就會不斷地重建自己,直到殭屍精靈失效。我怎麼能想出一個解決方案,只有一個頭將被添加時,殭屍程序是真實的。 – user2350724 2013-05-08 23:17:44

+0

沒關係,我得到它的工作,謝謝sooooo很多我被卡住了一個星期。我只需要做parent.addChild並改變一些布爾值 – user2350724 2013-05-08 23:24:02