3

这里有整个事情的小提琴 - http://jsfiddle.net/Ey2eK/1/

但我认为问题部分是这些功能。这个在我的主游戏循环结束时加载:

 playerBullets.forEach(function() {
            if (this.x > WIDTH || this.x < 0 || this.y > HEIGHT || this.y < 0) { this.active = false;}
            playerBullets = playerBullets.filter(function(bullet) {
            return this.active;});

            bulletUpdate(this);
            bulletDraw(this);
          }); 

好的,所以我在这里要做的是循环遍历 playerBullets 数组,对于每个子弹,首先我检查它是否超出范围并删除子弹,然后我加载 bulletUpdate 以更新子弹位置,即这个公式:

bulletUpdate = function() {
    this.x += this.xVelocity;
    this.y += this.yVelocity;
  }; 

我在这里的意图是,对于数组中的每个子弹,它的 x 和 y 位置都会增加它的速度变量。

然后在我计算出子弹的新位置后,我用 bulletDraw 绘制它:

bulletDraw = function() {
    c.beginPath();
    c.save();
    c.translate(this.x,this.y);
    if (deltaX < 0) {
    c.rotate(this.angle);
    }
    else {
    c.rotate(this.angle);
    c.scale(-1,1);
    }
    c.translate(-this.x,-this.y);
    c.fillStyle = "#000000";
    c.rect(this.x, this.y, 2, 2);
    c.fill();
    c.restore();
    c.closePath();
  }; 

基本上在新的 this.x 和 this.y 上画了一个小点。

然而,实际上似乎发生的是,每次我单击时,都会从玩家现在所在的位置重新绘制子弹。很难解释,但请查看 Fiddle - http://jsfiddle.net/Ey2eK/1/ 并在游戏区域中单击几次,您会看到(不要担心子弹只会向一个方向移动,我稍后会处理)。

我想要的是让子弹像普通子弹一样继续它们的旅程,这样最终我就可以和它们一起杀死僵尸。

感谢您提供的任何帮助!我严重坚持这个。

4

1 回答 1

3

JSFiddle

主要问题是您没有Bullet在单击时实例化新对象。您只是一遍又一遍地重新定义 Bullet 函数的值。

createBullet()应该看起来更像:

function createBullet() {
  var bullet = new Bullet();
  playerBullets.push(bullet);
}

但是由于每个子弹都有很多实例,实际上可以用 bulletDraw/bulletUpdate 替换绘制/更新函数,并在 forEach 调用中调用这些函数。

function Bullet() {
    ....
    this.bulletUpdate = function() { ... }
    this.bulletDraw = function() { ... }
}

// bullet refers to the current bullet that you're iterating over.
playerBullets.forEach(function(bullet) {
    if (bullet.x > WIDTH || bullet.x < 0 || bullet.y > HEIGHT || bullet.y < 0) { 
        bullet.active = false;
    }
    playerBullets = playerBullets.filter(function(bullet) {
        return bullet.active;
    });

    bullet.bulletUpdate();
    bullet.bulletDraw();
});
于 2013-09-14T04:22:26.163 回答