如何解决JavaScript p5.js游戏中的敌人检测和炮塔动画/控制
我正在使用JavaScript和p5.js库制作塔防游戏。我的敌人走了一条路,他们的位置始终存储在列表中。我有一个基地和一把枪,枪绕基地旋转(作为1个单位),并且应该指向最近的敌人。我有一个可以让我的枪指向敌人pointEnemy
的功能,但是,我无法获得正确的条件来使其指向该范围内最近的敌人。我需要enemyx
和enemyy
的正确参数。我目前正在产卵100个敌人,它们一直在移动,它们的位置存储在globalenemy1position
中。感谢您的任何帮助,谢谢。
必需的代码
一些重要变量
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][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;
}
}
}
}
绘制功能-重绘每一帧
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);
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][1]-20);
}
}
}
使枪支指向敌人的功能-我需要敌人和敌人的正确值
function pointEnemy(enemyx,enemyy,gunangle,gunrange)
{
const isWithinRange = dist(enemyx,guny) < gunrange;
if(isWithinRange)
{
gunangle = atan2(enemyy - guny,enemyx - gunx) + radians(90);
}
push();
translate(gunx,guny);
// rect(-25,-20,40) // Draw the gun base
// ellipse(0,gun.range*2) // display the gun range
rotate(gunangle);
image(firetowerturretImg,-28,-45); // Set the offset of the gun sprite and draw the gun
pop();
}
这里有一张图片可以帮助您直观地查看问题
如您所见,当前我只是遍历所有敌人并给出他们的位置,因此它基本上指向附近的每个敌人。
更新
1
我尝试了@ user3386109给出的方法,但是无法实现,如果可能的话,我也希望炮塔/机枪指向敌人,直到它离开射程,而不是始终指向最近的敌人。它应该从最接近的位置开始,然后一直指向它,直到它离开或敌人死亡(从列表中删除位置),以先到者为准。然后,该功能应再次重新启动并继续该过程。
解决方法
此过程是塔的完整目标。将其添加到绘图中并搜索敌人。
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][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][3]);
}
else
{
enemiesInRange.shift();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。