Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 创造视线_Actionscript 3 - Fatal编程技术网

Actionscript 3 创造视线

Actionscript 3 创造视线,actionscript-3,Actionscript 3,我正在创建一个生存僵尸游戏,当僵尸靠近玩家时,玩家可以攻击僵尸。如何创建玩家的视线,如果僵尸在玩家的特定半径和角度内(基本上接近玩家),那么玩家可以攻击。我设法计算出玩家面朝前方,但如何从玩家面朝的角度以及僵尸是否在玩家的半径和角度范围内创建+-15这样的角度。到目前为止,这就是我所做的 package { import flash.display.MovieClip; import flash.events.Event; import flash.events.KeyboardEvent;

我正在创建一个生存僵尸游戏,当僵尸靠近玩家时,玩家可以攻击僵尸。如何创建玩家的视线,如果僵尸在玩家的特定半径和角度内(基本上接近玩家),那么玩家可以攻击。我设法计算出玩家面朝前方,但如何从玩家面朝的角度以及僵尸是否在玩家的半径和角度范围内创建+-15这样的角度。到目前为止,这就是我所做的

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;

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 radius:Number = 60;

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

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

                               var radiusx:Number = x+radius*Math.cos(rotation/180*Math.PI);
       var radiusy:Number = y+radius*Math.sin(rotation/180*Math.PI);

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:Object,zombies:Object):Number
{
var dx:Number = player.x - zombies.x;
var dy:Number = player.y - zombies.y;
return Math.sqrt(((dx * dx) + dy * dy));
}

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);
if (hitTestObject(MovieClip(root).Zo))
{
trace('ouch');

}
}
}
}
}

在psuedo代码中,有一种方法可以做到这一点:

// check distance between player and zombie
  // if zombie is close enough 
       //get angle between player and zombie
       //check difference between player facing and angle
       //if difference between angle <= 15 degrees 
          //attack zombie
这是代码中的距离函数,我修改它以接受movieclips:

public function distanceBetween(player:MovieClip,zombie:MovieClip):Number
{
    var dx:Number = player.x - zombie.x;
    var dy:Number = player.y - zombie.y;
    return Math.sqrt(((dx * dx) + dy * dy));
}
因此,您可以使用上面的psuedo代码创建代码来解决您的问题:

// check distance between player and zombie
if (distanceBetween(player,zombie) <= maxRadius)
{
    // get angle between player and zombie
    var angleToZombie:Number = getAngle(zombie.x, zombie.y);

    // I am assuming that the facing is going to be towards the mouse
    // calculate facing of player
    var currentFacing:Number = getAngle(mouseX, mouseY);

    //check difference between player facing and angle
    if (Math.abs(currentFacing - angleToZombie) <= 15)
    {
         // attack the zombie
    }
}
//检查玩家和僵尸之间的距离

如果(distanceBetween)(player,zombie)谢谢,但我知道在伪代码中该怎么做,但我陷入的是实际的编码,我知道有很多三角函数涉及到你的代码中有一个distanceBetween()函数,你计算一个角度。这就是你需要知道的全部。你是说这不是你的代码吗?
// check distance between player and zombie
if (distanceBetween(player,zombie) <= maxRadius)
{
    // get angle between player and zombie
    var angleToZombie:Number = getAngle(zombie.x, zombie.y);

    // I am assuming that the facing is going to be towards the mouse
    // calculate facing of player
    var currentFacing:Number = getAngle(mouseX, mouseY);

    //check difference between player facing and angle
    if (Math.abs(currentFacing - angleToZombie) <= 15)
    {
         // attack the zombie
    }
}