我目前正在学习Javascript,我对对象关联有问题。
代码可以在jsfiddle中找到:http://jsfiddle.net/hphchan/94ajjbur/2/。
在这里,我将重点介绍代码的一些基本部分。 我使用构造函数创建一个球和一些块。为了让球注意到它击中了块,我把块对象作为创建Ball对象的输入之一,如下所示:
var ball = new Ball(20, 20, "#000", 2, 5, objArray);
其中objArray包含许多块对象和一个微调器对象。我创建了一个Ball对象的方法,它是ballMove(),它会创建一个球,如果碰到任何东西就会移动并反弹回来。
我想做以下事情:
以下是要消失的块的基本代码:
在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消失?或者有没有其他方法可以做到这一点?
答案 0 :(得分:0)
我实际上建议采用稍微不同的方法:不要只是在一个地方或另一个地方进行检测,而是采用一种处理游戏内容的总体方法。
创建一个frame
方法,用于处理一帧移动的所有内容。像这样:
function updateFrame() {
ball.ballMove();
if(ball.isTouchingBlock) {
ball.getTouchedBlock().className = "block hidden";
}
}
此方法:
为此,您还需要创建另一个属性以及Ball
:isTouchingBlock
和getTouchedBlock()
的另一种方法。
isTouchingBlock
应该是一个布尔值,表示球是否正在触摸此帧中的一个块。它可以在ballMove
方法中更新。
getTouchedBlock
需要为球正在接触的棋子返回documentElement
。您可以使用其返回值来设置className
。
如果您只是在Block
对象中进行检测,则需要反转创建方式:首先创建球,不要对象数组,然后创建块第二个参考球。然后,将碰撞检测代码移动到您想要的Block代码中的任何一点。