2013-05-08 2 views
0

Я создаю игру, где, если вы нажмете на зомби, зомби умрет, и его голова будет отправлена ​​обратно в том направлении, в которое вы попали. Это похоже на игру в бейсбол с головой зомби с головой, являющейся мячом. У меня есть два мувиклипа зомби и голова зомби. Как только зомби будет поражен, он сыграет свою умирающую анимацию и удалит себя, и в то же время голова зомби будет добавлена ​​к координатам x и y умирающего зомби и будет унесена назад, как игра в бейсбол. Я сделал код для hittest, и зомби умирает и возрождается, но я не могу показаться, что он позиционируется и добавляет голову умирающему зомби, когда он попадает. Я сделал функцию для головы зомби, но как добавить ее к зомби. Я думал, что это будет так, я добавил это в функции 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); 
      } 
     } 
    } 
} 

Zombie

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

Вам нужно будет отслеживать х, у значения для головы, чтобы следовать за телом, функция enterFrame бы: , например:

 addEventListner(event.ENTER_FRAME,follow head); 

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

В основном thehead будет следовать body x, y определяет каждый кадр или внутри каждого цикла кадра.

0

Вы, кажется, добавляете голову зомби, а не к классу держателя, а затем, когда вы удаляете зомби, вы также удаляете его голову, так как эта голова является ребенком зомби. Есть ли добавить к родителю этого зомби:

parent.addChild(zh); 

Кроме того, для того, чтобы переместить эти головы, родительский класс должен быть осведомлен о голове прибывающей. Итак, когда вы добавляете голову, и у вас есть массив зомби, сделайте массив из них головами, которые будут заполнены, когда голова будет появляться, и обезлюдели, когда вы захотите, чтобы ваши головы исчезли, и проведите через нее, как вы, по-видимому, уже делают с зомби.

+0

Это почти сработало, это то, что я сделал. В классе игрока для (var i: int = MovieClip (parent) .zombies.length-1; i> = 0; i -) { \t if (inAttackCone (MovieClip (родительский) .zombies [i])) { \t \t, если (hitTestObject (MovieClip (родитель) .zombies [I])) { \t \t \t мувиклип (родитель) .zombies [I] .zombieDead = TRUE; \t \t var zh = new ZombieHead; \t \t \t zh.x = MovieClip (parent) .zombies [i].Икс; \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

+0

Но проблема заключается в ZombieHead воссоздаст себя много раз, пока зомби не мертв. Голова функционирует так, как она должна функционировать и избавляется от себя, как она должна, но я думаю, что до тех пор, пока zombiedead = true, она будет постоянно воссоздавать себя до тех пор, пока zombiedead не станет ложным. Как я могу придумать решение, в котором будет добавлена ​​только одна голова, когда zombiedead верен. – user2350724

+0

Ничего, я заработал, спасибо, я так сильно застрял, как неделю. Мне просто нужно сделать parent.addChild и изменить некоторые булевы вокруг – user2350724

Смежные вопросы