HTML5画布 - 敌人射击

时间:2017-03-11 02:48:44

标签: javascript canvas trigonometry

我在HTML5 Canvas中制作游戏。现在我试图让它成为敌人(地面到空气枪)可以朝着玩家(飞机)的方向射击。

我的游戏使用2个数组根据其中的值制作地图。因为游戏不知道有多少敌人要放在屏幕上直到它通过地图,我才会创建一个具有随机id的新敌人,并将其添加到跟踪敌人的对象中每当它遇到地图中的敌人价值时。

问题出现在敌人在飞机上射击时,它们都以相同的角度射击,而不是以特定情况所需的角度射击。

这里有一个问题:如何让每个敌人以正确的角度向玩家射击?

我意识到这个问题/解释可能有点令人困惑,但是请试一试。最好先看看第222-257行(updateEntity函数)。 (请注意,这是一个与我的真实游戏代码不同的代码示例,它并不是最好的。)

google drive上的代码:https://drive.google.com/open?id=0By026U5OT4C7OUZSNG5GM19kV1U

JS小提琴:https://jsfiddle.net/k2xwypkp/

整个代码:

document-start

感谢您花时间(并希望)帮助我的时间。感谢。

1 个答案:

答案 0 :(得分:1)

updateEntity

中的此代码
for (var enemyBullet in enemyClip) {
    for (var e in enemy) {
        var dx = enemy[e].x - enemyClip[enemyBullet].playerX;
        var dy = enemy[e].y - enemyClip[enemyBullet].playerY;
        var angle = Math.atan2(dy, dx);
    }

应该在没有for循环的情况下编写。你应该只提到射击子弹的敌人。

for (var enemyBullet in enemyClip) {
    var bullet = enemyClip[enemyBullet]; 
    var dx = bullet.enemyX - bullet.playerX;
    var dy = bullet.enemyY - bullet.playerY;
    var angle = Math.atan2(dy, dx);

但是,在射击子弹时,不应该存储所有这些信息,而应该只计算子弹射击时的角度(子弹不需要知道玩家位置和' dir& #39;价值似乎没必要)

if (enemy[e].canShoot) {
  enemy[e].canShoot = false;
  var angle = Math.atan2( enemy[e].y-player.y, enemy[e].x-player.x);   
  ...      
  createEnemyBullet(Math.random(), angle, enemy[e].x + enemy[e].w/2, enemy[e].y);

您的updateEntity代码就变成了:

for (var enemyBullet in enemyClip) {
  var angle = enemyClip[enemyBullet].angle;

在您进一步发展之前,我建议您查看代码并查看如何简化代码,有很多内容可以删除。你在2个地方制造敌人的子弹,每个地方有4个叫createEnemyBullet,也要考虑敌人的子弹和玩家的子弹是一样的。此外,Math.random()不是生成唯一ID的好方法。每次只使用一个递增的数字(虽然此代码中的id没有真正的原因)