좀비를 친다면 좀비가 죽고 머리가 맞은 방향으로 다시 보내지는 게임을 만들고 있습니다. 그것은 좀비 머리와 공을 머리로하여 야구를하는 것과 같습니다. 나는 좀비와 좀비 두 영화 클립을 가지고있다. 좀비가 타격을 받으면 죽어가는 애니메이션을 재생하고 스스로 제거하며 동시에 좀비 머리가 죽어가는 좀비의 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();
}
}
}
}
거의 효과가있었습니다. 제가 한 일입니다. 플레이어 클래스에서 (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
그러나 문제는 좀비가 죽은 때까지 자신에게 여러 번 다시 할 ZombieHead입니다. 그 머리는 어떻게 기능 할 것인가로 기능하고 그것이 어떻게해야하는지 스스로 없애 버린다.하지만 나는 zombiedead = true 일 때까지는 zombiedead가 거짓 일 때까지 끊임없이 스스로를 재현 할 것이라고 생각한다. zombiedead가 true 일 때 단 하나의 헤드가 추가되는 솔루션을 어떻게 찾을 수 있습니까? – user2350724
신경 쓰지 마라, 일하고있어, 일주일 동안 붙어있어 너무 고맙다. 난 그냥 parent.addChild 할 주위에 일부 부울 변경해야합니다. – user2350724