我已经设置了一个塔防游戏,并且已经得到它,所以你可以放下塔,敌人来到你身边。但是,塔楼正在对其半径范围内的所有怪物造成伤害。我想要它,以便塔只对周围的一个敌人造成伤害。
我设置了两个变量:monsterList和towerList。它们都是对象,我已将其设置为在某个特定事件中,它会向指定变量添加敌人或塔。因此,当您选择一个空区域来设置塔时,它会将一个对象变量添加到列表中。单击下一级时也会发生这种情况,但它会创建可以在路径中移动的动态怪物。它看起来像这样:
allKeys
所以,这就是我如何以相同的方式创建怪物,但使用不同的参数,对于塔。当怪物沿着小路走下并进入塔的范围内时,塔将攻击它内部的任何和所有怪物。我希望它只能锁定在其范围内的1个怪物。以下是我的碰撞设置:
//the variables
var monsterList = {};
var towerList = {};
//how towers or enemies are added
var Monster = {
x:10,
y:10,
type:"Red",
id:Math.random()
}
monsterList[Monster.id] = Monster;
感谢您的帮助!
答案 0 :(得分:1)
你的塔上需要这样的东西:
var tower = {
... //your tower properties
target: null
}
然后在你的循环中:
for(var key in monsterList){
for(var i in towerList) {
if( !towerList[i].target && Collision(towerList[i], monsterList[key]) ) {
towerList[i].target = key;
monsterList[key].health -= ( towerList[i].damage/30 );
}
if( towerList[i].target ) {
monsterList[towerList[i].target].health -= ( towerList[i].damage/30 );
}
if( monsterList[key].health <= 0 )
delete monsterList[key];
}
}
你也可以用更易读的方式编写循环:
monsterList.forEach(function(monster) {
towerList.forEach(function(tower) {
if (!tower.target && Collision(tower, monster)
tower.target = monster
if (tower.target)
tower.target.health -= tower.damage / 30;
if (tower.target.health <= 0) {
var monsterIndex = monsterList.indexOf(tower.target);
delete monsterList[monsterIndex];
}
});
});
答案 1 :(得分:0)
我可能有一个建议是重新设计你的塔级,以包括一个跟踪塔所在的怪物的成员。
public void Main() {
List<Tower> towers = new List<Tower>();
List<Monster> monsters = new List<Monster>();
foreach(var tower in towers) {
if(tower.monsterTargeted==null) {//Find monster in range
tower.monsterTargeted=monsters.FindAll(x => GetDistance(tower.location,x.location)<tower.range).OrderBy(x => GetDistance(tower.location,x.location)).FirstOrDefault();//can be null
}
if(tower.monsterTargeted!=null) {//attack targeted monster
DamageMonster(tower.monsterTargeted.MonsterID,tower.damage);
}
}
}
private double GetDistance(Point p1,Point p2) {
double x = p1.X-p2.X;
double y = p1.Y-p2.Y;
return Math.Sqrt(x*x+y*y);
}
private class Monster {
public long MonsterID;
public Point location;
}
private class Tower {
public Monster monsterTargeted;
public Point location;
public double range;
public double damage;
}
当然,这是C#代码,但理论是合理的。迫使你的塔跟踪它所针对的怪物,强制塔和怪物之间建立多对一的关系。