2013-05-08 4 views
0

좀비를 친다면 좀비가 죽고 머리가 맞은 방향으로 다시 보내지는 게임을 만들고 있습니다. 그것은 좀비 머리와 공을 머리로하여 야구를하는 것과 같습니다. 나는 좀비와 좀비 두 영화 클립을 가지고있다. 좀비가 타격을 받으면 죽어가는 애니메이션을 재생하고 스스로 제거하며 동시에 좀비 머리가 죽어가는 좀비의 x 및 y 좌표에 추가되고 야구와 같이 날아가 버립니다. 나는 hittest와 좀비가 죽어서 respawning에 대한 코드를 완료했는데, 그것이 맞았을 때 나는 죽어가는 좀비에게 머리를 위치시키고 추가하는 것처럼 보이지 않는다. 좀비 머리 기능을 수행했지만 어떻게 좀비에 추가 할 수 있습니까? 나는 그것이 이렇게 될 것입니다 생각 나는 좀비 클래스의 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); 

} 

나는 심지어 그냥이를 시도했다. 머리는 산란을하지만 정체 상태를 유지하고 날아 가지 않으며 좀비가 스스로를 제거하면 스스로 제거합니다. 이미

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); 
       } 
     } 

    } 

} 
을 무슨 짓을 때 자신의 클래스 자체를 제거하기 위해 ZombieHead을 말한

문서 클래스

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 body x, y 값은 매 프레임마다 또는 모든 프레임주기 내에 있습니다.

0

당신은 분명히 홀더 클래스가 아닌 좀비에게 머리를 추가하고, 좀비를 제거하면 좀비의 자식이므로 머리를 제거합니다. 그 좀비의 부모에 추가 마십시오

parent.addChild(zh); 

또한, 그 머리를 이동하기 위해, 부모 클래스가 도착 머리를 인식해야한다. 따라서 머리를 추가 할 때 좀비 배열을 사용하면 머리가 스폰되는 동안 채워질 머리의 배열을 만들고 머리를 사라지게 할 때 인구를 줄이고 분명히 그것을 반복 할 수 있습니다 이미 좀비들과 함께.

+0

거의 효과가있었습니다. 제가 한 일입니다. 플레이어 클래스에서 (var i : int = MovieClip (부모) .zombies.length-1; i> = 0; i -) { \t if (inAttackCone (MovieClip (parent) .zombies [i])) { \t \t 경우 (hitTestObject (영화 클립 (부모) .zombies [I])) { \t \t \t 영화 클립 (부모) .zombies [I] .zombieDead = TRUE; \t \t var zh = 새로운 ZombieHead; \t \t \t zh.x = MovieClip (상위) .zombies [i].엑스; \t \t \t zh.y = MovieClip (상위) .zombies [i] .y; \t \t \t zh.rotation = MovieClip (부모) .zombies [i] .rotation; \t \t \t parent.addChild (zh); \t \t \t} \t \t} \t} } – user2350724

+0

그러나 문제는 좀비가 죽은 때까지 자신에게 여러 번 다시 할 ZombieHead입니다. 그 머리는 어떻게 기능 할 것인가로 기능하고 그것이 어떻게해야하는지 스스로 없애 버린다.하지만 나는 zombiedead = true 일 때까지는 zombiedead가 거짓 일 때까지 끊임없이 스스로를 재현 할 것이라고 생각한다. zombiedead가 true 일 때 단 하나의 헤드가 추가되는 솔루션을 어떻게 찾을 수 있습니까? – user2350724

+0

신경 쓰지 마라, 일하고있어, 일주일 동안 붙어있어 너무 고맙다. 난 그냥 parent.addChild 할 주위에 일부 부울 변경해야합니다. – user2350724

관련 문제