如何让玩家锁定其半径范围内的一个敌人?

时间:2016-05-12 23:49:12

标签: javascript html5-canvas

我已经设置了一个塔防游戏,并且已经得到它,所以你可以放下塔,敌人来到你身边。但是,塔楼正在对其半径范围内的所有怪物造成伤害。我想要它,以便塔只对周围的一个敌人造成伤害。

我设置了两个变量: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;

感谢您的帮助!

2 个答案:

答案 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#代码,但理论是合理的。迫使你的塔跟踪它所针对的怪物,强制塔和怪物之间建立多对一的关系。