Javascript对象关联

时间:2015-08-19 09:27:43

标签: javascript oop object prototypal-inheritance

我目前正在学习Javascript,我对对象关联有问题。

代码可以在jsfiddle中找到:http://jsfiddle.net/hphchan/94ajjbur/2/

在这里,我将重点介绍代码的一些基本部分。 我使用构造函数创建一个球和一些块。为了让球注意到它击中了块,我把块对象作为创建Ball对象的输入之一,如下所示:

var ball = new Ball(20, 20, "#000", 2, 5, objArray);

其中objArray包含许多块对象和一个微调器对象。我创建了一个Ball对象的方法,它是ballMove(),它会创建一个球,如果碰到任何东西就会移动并反弹回来。

我想做以下事情:

  1. 当球击中旋转器时,没有任何反应只是球反弹回来。
  2. 当球击中挡块时,挡块消失。
  3. 以下是要消失的块的基本代码:

    在JS中:

    function Ball(width, height, color, speedX, speedY, relatedObjArray) {
         Item.call(this, width, height, color); 
         this.relatedObjArray = relatedObjArray;
         ...
    }
    
    Ball.prototype = new Item(); 
    
    Ball.prototype.ballMove = function() {
        var relatedObjArray = this.relatedObjArray;
        ...
        setInterval(function() {
            ...
            if (relatedObj.className == "block visible") {
                relatedObj.className = "block hidden"; 
                relatedObjArray.splice(i, 1); 
            }
        }
    }
    

    在CSS中:

    .hidden {
        visibility: hidden;
    }
    

    我写的代码运行得很好。但是,为了使块消失,我把使块移动的代码在moveBall()中消失,这是Ball内部的一个方法,而不是Block。

    的确,我想把代码放在Block构造函数里面使块消失,因为这是一个与Block相关的活动。 我想为Block创建一个方法。它应该看起来像这样:

    Block.prototype.hiddenBall = function() {
        if (touches ball) {
            block.className = "block hidden"; 
            removeBlock in the Object Array; 
    }
    

    同时让moveBall()方法只能弹回。

    但是,我不知道如何才能做到这一点。因为我先创造了Block,然后是Ball。这样我就可以将Block对象作为Ball的输入。所以我怎么能做相反的事情,将Ball作为Block的输入,这样当我发现Block被球击中时我可以让Block消失?或者有没有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

我实际上建议采用稍微不同的方法:不要只是在一个地方或另一个地方进行检测,而是采用一种处理游戏内容的总体方法。

创建一个frame方法,用于处理一帧移动的所有内容。像这样:

function updateFrame() {
    ball.ballMove();
    if(ball.isTouchingBlock) {
        ball.getTouchedBlock().className = "block hidden";
    }
}

此方法:

  • 移动球
  • 检查是否发生碰撞
  • 如果有,则删除碰撞块

为此,您还需要创建另一个属性以及BallisTouchingBlockgetTouchedBlock()的另一种方法。

isTouchingBlock应该是一个布尔值,表示球是否正在触摸此帧中的一个块。它可以在ballMove方法中更新。

getTouchedBlock需要为球正在接触的棋子返回documentElement。您可以使用其返回值来设置className

如果您只是在Block对象中进行检测,则需要反转创建方式:首先创建球,不要对象数组,然后创建块第二个参考球。然后,将碰撞检测代码移动到您想要的Block代码中的任何一点。