我在HTML5 Canvas中制作游戏。现在我试图让它成为敌人(地面到空气枪)可以朝着玩家(飞机)的方向射击。
我的游戏使用2个数组根据其中的值制作地图。因为游戏不知道有多少敌人要放在屏幕上直到它通过地图,我才会创建一个具有随机id的新敌人,并将其添加到跟踪敌人的对象中每当它遇到地图中的敌人价值时。
问题出现在敌人在飞机上射击时,它们都以相同的角度射击,而不是以特定情况所需的角度射击。
这里有一个问题:如何让每个敌人以正确的角度向玩家射击?
我意识到这个问题/解释可能有点令人困惑,但是请试一试。最好先看看第222-257行(updateEntity函数)。 (请注意,这是一个与我的真实游戏代码不同的代码示例,它并不是最好的。)
google drive上的代码:https://drive.google.com/open?id=0By026U5OT4C7OUZSNG5GM19kV1U
JS小提琴:https://jsfiddle.net/k2xwypkp/
整个代码:
document-start
感谢您花时间(并希望)帮助我的时间。感谢。
答案 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没有真正的原因)