我陷入了一个非常基本的问题,我无法弄明白。我有4个外星人和一个用鼠标移动的十字准线。我想把我的十字准线的颜色变成红色,当它靠近其中一个人的时候。我的alienships和crosshair都是扩展movieclip的类。我在主游戏循环中的主文档类中使用它们,这是由Enter_Frame事件侦听器触发的。
这是我检查相同
的逻辑private var objColor:ColorTransform = new ColorTransform();
private function overlayCursorMove() : void {
var initialColor:ColorTransform = new ColorTransform();
initialColor.color = 0xD3D3D3;
for(var i = 0; i < alienShipArray.length; i++){
var currentShip:AlienShip = alienShipArray[i];
if(currentShip.getDistance(overlayCursor.x - currentShip.x, overlayCursor.y - currentShip.y) <= 30 ){
overlayCursor.transform.colorTransform = objColor;
}
else if(currentShip.getDistance(overlayCursor.x - currentShip.x, overlayCursor.y - currentShip.y) > 30 ){
overlayCursor.transform.colorTransform = initialColor;
}
}
}
以下是AlienShip类
中的自定义getDistance函数public function getDistance(delta_x:Number, delta_y:Number):Number
{
return Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
}
overlayCursor是我的十字准线,它以我的mouseX和mouseY位置移动。我的舞台上有4个人,所有人都存放在alienShipArray中。
我只计算我的十字准线与目前的位置之间的距离,以检查它是否小于一定量来改变十字准线颜色,否则如果距离更大则将其改回以前的颜色。
令人惊讶的是,逻辑仅适用于数组中的最后一个船,当循环达到i = 3(alienShipArray [3])时。对于船的其余部分,十字准线的颜色保持不变!
答案 0 :(得分:1)
当遇到交叉点时,你需要break
离开你的循环,否则你的循环将继续运行而其他非交叉的外星人将导致你的条件的else if
部分测试为真,你的十字准线将改回原来的颜色。
这可以解释为什么你的代码只适用于循环中的最后一个外星人,因为在那个实例中没有进一步的迭代来重置颜色。
以下内容应该这样做(未经测试):
private var objColor:ColorTransform = new ColorTransform();
private function overlayCursorMove() : void {
var initialColor:ColorTransform = new ColorTransform();
initialColor.color = 0xD3D3D3;
for(var i:uint = 0; i < alienShipArray.length; i++) {
var currentShip:AlienShip = alienShipArray[i];
// Reset cursor back to initial color
overlayCursor.transform.colorTransform = initialColor;
if(currentShip.getDistance(overlayCursor.x - currentShip.x, overlayCursor.y - currentShip.y) <= 30 ) {
// Intersection found, change the cursor color
overlayCursor.transform.colorTransform = objColor;
// And break out of the loop so further iterations don't reset it
break;
}
}
// No intersections found, cursor remains in its initial state
}