JavaScript p5.js游戏中的敌人探测和炮塔动画/控制
我正在使用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
指向敌人
,但是,我无法获得正确的条件使其指向其射程内最近的敌人。我需要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您能提供帮助并提供更详细的答案吗?我已经尝试了几种方法,但到目前为止没有一种有效。