JavaScript p5.js游戏中的敌人探测和炮塔动画/控制

JavaScript p5.js游戏中的敌人探测和炮塔动画/控制,javascript,animation,rotation,p5.js,path-finding,Javascript,Animation,Rotation,P5.js,Path Finding,我正在使用JavaScript和p5.js库制作一个塔防游戏。我的敌人遵循一条路径,他们的位置总是存储在一个列表中。我有一个基地和一支枪,枪围绕基地旋转(作为一个单位),应该指向最近的敌人。我有一个功能,可以使枪指向敌人指向敌人,但是,我无法获得正确的条件使其指向其射程内最近的敌人。我需要enemyx和enemyy的正确参数。我目前正在繁殖100个敌人,他们不断移动,他们的位置存储在globalenemyposition中。非常感谢您的帮助,谢谢 所需代码 一些重要变量 var number

我正在使用JavaScript和p5.js库制作一个塔防游戏。我的敌人遵循一条路径,他们的位置总是存储在一个列表中。我有一个基地和一支枪,枪围绕基地旋转(作为一个单位),应该指向最近的敌人。我有一个功能,可以使枪指向敌人
指向敌人
,但是,我无法获得正确的条件使其指向其射程内最近的敌人。我需要
enemyx
enemyy
的正确参数。我目前正在繁殖100个敌人,他们不断移动,他们的位置存储在
globalenemyposition
中。非常感谢您的帮助,谢谢


所需代码
一些重要变量

var numberOfEnemy1 = 100
let classenemy1 = new Enemy1(numberOfEnemy1);
var globalenemy1position = [];   
var isFireTowerPressed = false;
var FireTowerPos = [];    // Position of all FireTowers => [x,y]
var FireTowerRange = 300;
var FireTowerAngle = 0;
class Enemy1
{
    constructor(number_of_enemies)
    {
        this.number_of_enemies = number_of_enemies;
        this.enemy_position = [];
        this.enemy1speed = 4;

    }
    enemy1_spawn()
    {
        let randomx = random(-300, -100);
        for(var i=0; i<this.number_of_enemies; i++)
        {
            var positionx = randomx;
            var positiony = 100;

            this.enemy_position.push([positionx + (-i*50), positiony]);
            globalenemy1position.push([positionx + (-i*50), positiony]);
            image(enemy1, this.enemy_position[i][0], this.enemy_position[i][1]);
        }

    }

    enemy1_move()
    {
        for(var i = 0; i < this.enemy_position.length; i++)
        {
            image(enemy1, this.enemy_position[i][0], this.enemy_position[i][1]);

            if (this.enemy_position[i][0] >= 200 && this.enemy_position[i][1] <= 450 && this.enemy_position[i][0] < 599)
            {
                this.enemy_position[i][1] += this.enemy1speed;
                globalenemy1position[i][1] += this.enemy1speed;
            }   

            else if (this.enemy_position[i][1] >= 100 && this.enemy_position[i][0] >= 600)
            {
                this.enemy_position[i][1] -= this.enemy1speed;
                globalenemy1position[i][1] -= this.enemy1speed;
            }

            else if (this.enemy_position[i][0] >= 750)
            {
                this.enemy_position[i][0] = 750;
                lives --;
                this.enemy_position.shift();
                globalenemy1position.shift();
            }   

            else
            {
                this.enemy_position[i][0] += this.enemy1speed;
                globalenemy1position[i][0] += this.enemy1speed;
            }

        }
    }
}
我的敌人班级

var numberOfEnemy1 = 100
let classenemy1 = new Enemy1(numberOfEnemy1);
var globalenemy1position = [];   
var isFireTowerPressed = false;
var FireTowerPos = [];    // Position of all FireTowers => [x,y]
var FireTowerRange = 300;
var FireTowerAngle = 0;
class Enemy1
{
    constructor(number_of_enemies)
    {
        this.number_of_enemies = number_of_enemies;
        this.enemy_position = [];
        this.enemy1speed = 4;

    }
    enemy1_spawn()
    {
        let randomx = random(-300, -100);
        for(var i=0; i<this.number_of_enemies; i++)
        {
            var positionx = randomx;
            var positiony = 100;

            this.enemy_position.push([positionx + (-i*50), positiony]);
            globalenemy1position.push([positionx + (-i*50), positiony]);
            image(enemy1, this.enemy_position[i][0], this.enemy_position[i][1]);
        }

    }

    enemy1_move()
    {
        for(var i = 0; i < this.enemy_position.length; i++)
        {
            image(enemy1, this.enemy_position[i][0], this.enemy_position[i][1]);

            if (this.enemy_position[i][0] >= 200 && this.enemy_position[i][1] <= 450 && this.enemy_position[i][0] < 599)
            {
                this.enemy_position[i][1] += this.enemy1speed;
                globalenemy1position[i][1] += this.enemy1speed;
            }   

            else if (this.enemy_position[i][1] >= 100 && this.enemy_position[i][0] >= 600)
            {
                this.enemy_position[i][1] -= this.enemy1speed;
                globalenemy1position[i][1] -= this.enemy1speed;
            }

            else if (this.enemy_position[i][0] >= 750)
            {
                this.enemy_position[i][0] = 750;
                lives --;
                this.enemy_position.shift();
                globalenemy1position.shift();
            }   

            else
            {
                this.enemy_position[i][0] += this.enemy1speed;
                globalenemy1position[i][0] += this.enemy1speed;
            }

        }
    }
}
class-Enemy1
{
构造函数(敌人的数量)
{
这个。敌人的数量=敌人的数量;
这个。敌方位置=[];
这一点。Enemy1速度=4;
}
enemy1_产卵()
{
设randomx=random(-300,-100);
对于(变量i=0;i=200&&此敌方位置[i][1]=100&&此敌方位置[i][0]>=600)
{
此.敌方位置[i][1]=此.敌方1速度;
globalenem1position[i][1]=此.enemy1速度;
}
否则如果(此敌方位置[i][0]>=750)
{
此.敌方阵地[i][0]=750;
生命--;
这个。敌人的位置。移位();
globalenemy1position.shift();
}   
其他的
{
此.敌方位置[i][0]+=此.enemy1速度;
globalenem1position[i][0]+=this.enemy1速度;
}
}
}
}
绘图功能-重画每一帧

function draw() 
{

    background(60, 238, 161);
    [...]
    classenemy1.enemy1_move();
    rect(750, 70, 50, 100);
    ShowLives();
    if (isFireTowerPressed == true) 
    {
        image(firetowerbaseImg, mouseX - 28, mouseY - 28);
        noFill();
        stroke(0,0,0);
        strokeWeight(1);
        circle(mouseX, mouseY, 300);
    }
    for (var i = 0; i < FireTowerPos.length; i++) 
    {
        image(firetowerbaseImg, FireTowerPos[i][0], FireTowerPos[i][1]);

        if (globalenemy1position.length >= 1)
        {
            var gunx = FireTowerPos[i][0] +28;
            var guny = FireTowerPos[i][1]+25;
            var gunrange = FireTowerPos[i][3];

            for (j=0; j<globalenemy1position.length; j++)
            {

                // Need help with this statement here
                pointEnemy(globalenemy1position[j][0], globalenemy1position[j][1], gunx, guny, FireTowerPos[i][2], FireTowerPos[i][3]);
                
            }
        }
        else
        {
            image(firetowerturretImg, FireTowerPos[i][0], FireTowerPos[i][1]-20);
        }
    }
}
函数绘图()
{
背景(60238161);
[...]
classenemy1.enemy1_move();
rect(750,70,50,100);
showlifes();
如果(isFireTowerPressed==true)
{
图像(firetowerbaseImg、mouseX-28、mouseY-28);
noFill();
冲程(0,0,0);
冲程重量(1);
圆圈(mouseX,mouseY,300);
}
对于(变量i=0;i=1)
{
var gunx=FireTowerPos[i][0]+28;
var guny=FireTowerPos[i][1]+25;
var gunlange=FireTowerPos[i][3];

对于(j=0;j此过程是对塔的完全瞄准。将此添加到绘图中,它将搜索敌人

for (var i = 0; i < FireTowerPos.length; i++) 
{
    // image(firetowerbaseImg, FireTowerPos[i][0], FireTowerPos[i][1]);
    // pointEnemy(mouseX, mouseY, FireTowerPos[i][0] +28, FireTowerPos[i][1]+25, FireTowerPos[i][2], FireTowerPos[i][3]);
    image(firetowerbaseImg, FireTowerPos[i][0], FireTowerPos[i][1]);

    var enemiesInRange = [];
    let firetowerx = FireTowerPos[i][0];
    let firetowery = FireTowerPos[i][1];
    for (var j = 0; j < globalenemy1position.length; j++) 
    {
        var checkDist = dist(globalenemy1position[j][0], globalenemy1position[j][1], firetowerx, firetowery);
        let thisenemyx = globalenemy1position[j][0];
        let thisenemyy = globalenemy1position[j][1];

        if (checkDist < FireTowerRange) 
        {
            enemiesInRange.push([thisenemyx, thisenemyy]);
            pointEnemy(enemiesInRange[0][0], enemiesInRange[0][1], FireTowerPos[i][0] +28, FireTowerPos[i][1]+25, FireTowerPos[i][2], FireTowerPos[i][3]);

        }
        else
        {
            enemiesInRange.shift();
        }
    }
}
for(var i=0;i
您需要将目标的选择与绘图代码分开。要选择目标,请使用一个变量
bestDistance
,该变量最初设置为
射程
,以及一个变量
bestTarget
,该变量最初设置为无。然后,对于每个敌方单位,计算与塔的距离。如果距离小于
bestDistance
,然后更新
bestDistance
bestTarget
。最后,如果
bestDistance
小于
GurnRange
,那么
bestTarget
就是要瞄准的敌人。@user3386109但是我如何使用它并跟踪屏幕上的每个消防塔?我会有一个消防塔等级,这可以跟踪每个消防塔的位置以及它在做什么。@user3386109您能提供帮助并提供更详细的答案吗?我已经尝试了几种方法,但到目前为止没有一种有效。