HTML5 - JS:从面向方向射击子弹

时间:2013-02-13 15:16:06

标签: javascript html5 mouse

我正在开发一款自上而下的射击游戏HTML5游戏。我现在正试图从面对角度的角色中射出子弹。

我的角色总是面向鼠标位置(旋转)。所以,当我发射子弹时,我需要考虑轮换。

我差不多了,唯一的问题是子弹会在我的实际鼠标位置开始,但是 - 它会朝着正确的方向移动。

我相信我的数学速度在我的速度变量范围内:

var b = new Rectangle( this.x + (this.width / 2) - 4, this.y + (this.height / 2) - 4, 8, 8);

var velocityInstance = new Vector2(0, 0);
velocityInstance.x = input.mouseX - (this.localX + this.width/2);
velocityInstance.y = input.mouseY - (this.localY + this.height/2);

var bulletInstance = new Bullet(velocityInstance, b, this.bullets.length + 1);

this.bullets.push(bulletInstance);
this.shotBullet = true;

'this'指的是我的播放器。 localX / Y是我角色的中心位置(他总是在屏幕的中央,场景在他周围移动)。

如果有人可以帮我查一下,我们将不胜感激。谢谢!

------编辑------

这是我的子弹功能:

Bullet = function(vel, rectangle, index){

    this.velocity = vel;
    this.rect = rectangle;
    this.index = index;

    this.Update = function(){
        this.rect.x += this.velocity.x;
        this.rect.y += this.velocity.y;

        //Collisions
        for(var c = 0; c < GameObjects.length; c++){
            if(this.rect.Intersects(GameObjects[c])){
                console.debug("Bullet Hit: " + GameObjects[c].tag);

                //Player.bullets.splice(index, 1);
            }
        }
    };

    this.Draw = function(ctx){

        this.rect.Draw(ctxMap);
    };

};

2 个答案:

答案 0 :(得分:3)

实际上,我建议使用trig功能,只是为了提高效率。 Math.atan2,Math.cos和Math.sin可能会变得昂贵。

您已经(稍微重命名)

var deltaX = input.mouseX - (this.localX + this.width/2);
var deltaY = input.mouseY - (this.localY + this.height/2);

为什么不这么简单地跳?

var magnitude = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
var velocityScale = bulletSpeed / magnitude;
velocityInstance.x = deltaX * velocityScale;
velocityInstance.y = deltaY * velocityScale;

它的功能相同,但只使用一个泰勒系列而不是3个,所以应该效率更高。越快越好,对吧?

答案 1 :(得分:1)

想出来。我需要使用Math.cos和Math.sin:

var targetX = input.mouseX - (this.localX + this.width/2);
var targetY = input.mouseY - (this.localY + this.height/2);

this.rotation = Math.atan2(targetY, targetX);

velocityInstance.x = Math.cos(this.rotation) * bulletSpeed;
velocityInstance.y = Math.sin(this.rotation) * bulletSpeed;

非常感谢社区!帮我理解它!