标题很模糊,抱歉。想不出怎么用一句话来问这个问题。
我将总结一下我的代码应该做什么:
我有步骤1-3。我无法“掀起”最近的两个地雷(即从舞台上移走)。
我可以确定最后爆炸的两个最近的地雷,但我似乎找不到如何移除它们的方法。
代码:
package
{
import flash.display.MovieClip;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.events.*;
public class Minefield extends MovieClip
{
var inputNumber:int;
var iField:TextField = new TextField();
var button:iButton = new iButton();
var i:int;
var mines:Array = new Array();
public function Minefield()
{
var explosion:iExplosion = new iExplosion();
iField.type = "input";
iField.height = 18;
iField.x = 460;
iField.y = 275;
iField.border = true;
iField.restrict = "0-9";
iField.maxChars = 2;
stage.focus = iField;
addChild(iField);
addChild(button);
button.x = 450;
button.y = 175;
button.buttonMode = true;
button.addEventListener(MouseEvent.CLICK, UponClick);
}
function AddMines()
{
for (i = 0; i < inputNumber; i++)
{
CreatorOfMine();
mines[i].addEventListener(MouseEvent.CLICK, UponMineClick)
mines[i].buttonMode = true;
}
}
function CreatorOfMine()
{
mines[i] = new Mine();
MineLocation()
}
function MineLocation()
{
mines[i].x = Math.round(Math.random() * 925);
mines[i].y = Math.round(Math.random() * 525);
mines[i].rotation = Math.random() * 360;
addChild(mines[i]);
}
function UponClick(e:MouseEvent)
{
inputNumber = int(iField.text);
RemoverOfChildren();
}
function RemoverOfChildren()
{
removeChild(button);
removeChild(iField);
AddMines();
}
function UponMineClick(event:MouseEvent)
{
var mineObject:Mine = Mine(event.currentTarget)
var expl:iExplosion = new iExplosion()
expl.x = mineObject.x
expl.y = mineObject.y
expl.rotation = mineObject.rotation
addChild(expl)
removeChild(mineObject)
ChainReaction(mineObject)
}
function ChainReaction(mineObject:Mine)
{
Distances(mineObject,i)
}
function Distances(mineObject:Mine, i:int)
{
var DistanceArray:Array = new Array()
var x1:Number = mineObject.x;
var y1:Number = mineObject.y;
for (var q:int = 0; q < (mines.length); q++){
if (q != i){
var x2:Number = mines[q].x
var y2:Number = mines[q].y
var dy:Number = y2 - y1
var dx:Number = x2 - x1
var dist:Number = Math.sqrt(Math.abs(dx*dx + dy*dy))
if (dist != 0)
{
DistanceArray[q] = [dist]
//trace(dist)
trace(DistanceArray[q])
}
else if (dist == 0)
{
continue
}
}
}
FindNearestMines(DistanceArray)
}
function FindNearestMines(DistanceArray:Array){
DistanceArray.sort(Array.NUMERIC);
// Sorted my distances numerically so that I can figure out the closest two. How do I remove those two mines from the stage?
}
}
}
答案 0 :(得分:0)
好的,我仔细看了一下你的代码,这是我的建议。
在“距离”功能中,您可以执行以下操作:
制作2个临时数组。一个叫做mines_l,一个叫做distance_l 拿第一个矿井,将其粘贴在mines_l中,并将其距离放在distance_l中。 然后通过你的矿井进行处理。每个矿井,与distance_l [0]进行比较。如果它比disances_l [0]更近,则将distance_l [0]和mines_l [0]移动到... [1]。 如果矿井比...更接近[1]但不比......更接近[0],然后替换... [1]与新矿。
最后,你将在阵列mines_l中拥有2个最近的地雷。
此外,您可以考虑将mines数组更改为属性。就目前而言,您没有从阵列中移除地雷的机制。如果将其转换为属性,则可以在需要时将当前的地雷收集到数组中。
答案 1 :(得分:0)
生成一个数组,其中每个数组项都是包含“mine”和“distance”字段的Object。然后使用Array.sortOn(“distance”,Array.NUMERIC)按距离对该数组进行排序。
此示例计算_target与_movieClips数组的距离,并返回按距离排序的新的movieClip / distance对象数组。
function getClosestMovieClips(_target:MovieClip, _movieClips:Array, _num:int):Array{
// This array will store our objects.
var tempArray:Array = [];
// Loop through _movieclips
for(var i:int = 0; i < _movieClips.length; i++){
// Don't check _target's distance
if (_target != _movieClips[i]){
// Distance calculation
var dy:Number = _movieClips[i].y - _target.y;
var dx:Number = _movieClips[i].x - _target.x;
var dist:Number = Math.sqrt(Math.abs(dx*dx + dy*dy));
// New object contains mc and distance
var tempObject:Object = {
mc:_movieClips[i],
distance:dist
}
// Push object into tempArray
tempArray.push( tempObject );
}
}
// Sort tempArray based on distance field
tempArray.sortOn("distance",Array.NUMERIC);
// return new array with length of the parameter _num
return tempArray.slice(0,_num);
}
答案 2 :(得分:0)
您的代码如何使用这些函数:
function CreatorOfMine()
{
mines[i] = new Mine();
MineLocation()
}
function MineLocation()
{
mines[i].x = Math.round(Math.random() * 925);
mines[i].y = Math.round(Math.random() * 525);
mines[i].rotation = Math.random() * 360;
addChild(mines[i]);
}
至少需要一个整数参数来访问mines [] array:)
在AS3中,我们需要在从舞台中删除之前删除DisplayObject的所有侦听器。如果您只是从舞台中删除该对象但保留所有侦听器,则不会将其删除。
所以你需要一个像这样的小函数:
function removeMineFromStage(var i):void {
mines[i].removeEventListener(MouseEvent.CLICK);
//remove any other event listeners that you might have added.
removeChild(mines[i]);
mines[i] = null;
}