0

私は現在、多くの船と航空機の地図を持っているプロジェクトを構築しています。私が達成しようとしているのは、それらの間の視線距離をチェックすることです。1つのプラットフォームの高さをチェックし、2番目のプラットフォームの高さをチェックして応答するLOSCalculatorをセットアップしました。それはうまくいきます。

次に、この計算機の結果に基づいてCircleを追加したいと思いました。したがって、結果が10の場合、半径10cmの円を描画します。結果が100の場合、100で描画され、画像が得られます。これは機能します。

今の私の問題は、計算を行い、.addCircleをそのmovieClipに追加する前または後に、1つのプラットフォームをクリックできるようにする必要があることです。ムービークリップのインスタンス名を格納する配列を設定し、それをトレースしました。プラットフォームをクリックすると、クリックされたプラットフォームが認識されるように、ステージにフィールドを追加しました。クリックされたmovieClipにサークルを入れる方法がわかりません。

私はAS3に非常に慣れていないので、これで頭を悩ませ始めています。どんな助けでも大歓迎です。

私が持っているコードは以下に添付されています。これを正しく挿入したと思います。再度、感謝します

import flash.events.MouseEvent;
import flash.display.MovieClip;

stage.focus=ht1;


// creation of array containing movieclips and code that adds the clicked movieclip to Array-platformClicked
var platformArray:Array = [arunta_mc, f15_mc];
var platformClicked = [];
var selectedPlatform:MovieClip = new MovieClip();

for(var i:int = 0; i < platformArray.length; i++) {
    platformArray[i].buttonMode = true;
    platformArray[i].addEventListener(MouseEvent.CLICK, item_onClick);
}

function item_onClick(event:MouseEvent):void {
    var selectedPlatformArray:Array = platformArray.filter(checkName);
    selectedPlatform = selectedPlatformArray[0];
    myText.text = event.currentTarget.name + " was clicked";
    var platformClicked = String(event.currentTarget.name);
trace(platformClicked);
}



function checkName(item:MovieClip, index:int, array:Array):Boolean
{
    return(item.name == platformClicked);
}



//setup of LOS Calculator code
var counter:Number=1;
operator_txt.text = "+";
ht1.restrict="-0123456789.";
ht2.restrict="-0123456789.";
var myresult:Number;
var test = [];

//start of code when equal button is pressed
equal_btn.addEventListener(MouseEvent.CLICK, equalhandler);
var newCircle:Shape = new Shape();//defines circle to be drawn

    function equalhandler(event:MouseEvent):void{
        newCircle.graphics.lineStyle(1, 0x000000);
        newCircle.graphics.beginFill(0x435632);
        newCircle.alpha = .1;
    //start of result code
    result_txt.text = String(int((1.23*(Math.sqrt(Number(parseFloat(ht1.text)+parseFloat(ht2.text)+""))))));
    var test = String(int((1.23*(Math.sqrt(Number(parseFloat(ht1.text)+parseFloat(ht2.text)+""))))));
    trace(test);
    //end of result code
    newCircle.graphics.drawCircle(0,0,test);//add circle based on LOS calculation
    newCircle.graphics.endFill();
    //var selectedPlatform:MovieClip = selectedPlatformArray[0];
    selectedPlatform.addChild(newCircle);//this is where I need to add newCircle to the movieClip that is clicked
    trace(selectedPlatform);
//trace(platformClicked);
}


//start of code for the clear button
clear_btn.addEventListener(MouseEvent.CLICK, clearhandler);
function clearhandler(event:MouseEvent):void{
ht1.text=ht2.text=result_txt.text="";
removeChild(newCircle);
var test = [];
}
4

1 に答える 1

0

このfilter()メソッドを使用して、次のように各アイテムの名前を確認できます。

var selectedPlatformArray:Array = platformArray.filter(checkName);

コードのどこかで、checkName関数を定義します

function checkName(item:MovieClip, index:int, array:Array):Boolean
{
    return (item.name == platformClicked);
}

selectedPlatformArraytrueこれで、checkName関数に戻るすべての要素が含まれるようになりますMovieClips。同じ名前の要素が複数ない限り、配列には1つの要素のみが含まれる必要があります。これは、配列の最初の要素にアクセスするだけで取得できます。

var selectedPlatform:MovieClip = selectedPlatformArray[0];

getChildByName()または、次のように関数を使用することもできます。

var selectedPlatform:MovieClip = stage.getChildByName(platformClicked);

ただし、これはオブジェクトが追加される場所によって異なり、すべてが同じコンテナにない場合(またはまったく追加されていない場合)、これは最適なオプションではありません。ただし、これは小規模なプロジェクト向けの迅速でシンプルなソリューションです。

equalHandlerとにかく、どの方法を使用しても、通常どおり関数に円を簡単に追加できます。

selectedPlatform.addChild(newCircle);

私の例では、この特定の状況でそれらをどのように使用するかを示しているだけなので、filter()との両方のドキュメントをチェックして、それらがどのように機能するかをよりよく理解することをお勧めします。getChildByName()


あなたが持っているべき完全なコード:

import flash.events.MouseEvent;
import flash.display.MovieClip;

stage.focus=ht1;


// creation of array containing movieclips and code that adds the clicked movieclip to Array-platformClicked
var platformArray:Array = [arunta_mc, f15_mc];
var platformClicked:String = "";
var selectedPlatform:MovieClip = new MovieClip();

for(var i:int = 0; i < platformArray.length; i++) {
    platformArray[i].buttonMode = true;
    platformArray[i].addEventListener(MouseEvent.CLICK, item_onClick);
}

function item_onClick(event:MouseEvent):void {
    var selectedPlatformArray:Array = platformArray.filter(checkName);
    selectedPlatform = selectedPlatformArray[0];
    myText.text = event.currentTarget.name + " was clicked";
    platformClicked = String(event.currentTarget.name);
    trace(platformClicked);
}



function checkName(item:MovieClip, index:int, array:Array):Boolean
{
    return(item.name == platformClicked);
}



//setup of LOS Calculator code
var counter:Number=1;
operator_txt.text = "+";
ht1.restrict="-0123456789.";
ht2.restrict="-0123456789.";
var myresult:Number;
var test:String = "";

//start of code when equal button is pressed
equal_btn.addEventListener(MouseEvent.CLICK, equalhandler);
var newCircle:Shape = new Shape();//defines circle to be drawn

function equalhandler(event:MouseEvent):void{
    newCircle.graphics.lineStyle(1, 0x000000);
    newCircle.graphics.beginFill(0x435632);
    newCircle.alpha = .1;
    //start of result code
    result_txt.text = String(int((1.23*(Math.sqrt(Number(parseFloat(ht1.text)+parseFloat(ht2.text)+""))))));
    test = String(int((1.23*(Math.sqrt(Number(parseFloat(ht1.text)+parseFloat(ht2.text)+""))))));
    trace(test);
    //end of result code
    newCircle.graphics.drawCircle(0,0,test);//add circle based on LOS calculation
    newCircle.graphics.endFill();
    //var selectedPlatform:MovieClip = selectedPlatformArray[0];
    selectedPlatform.addChild(newCircle);//this is where I need to add newCircle to the movieClip that is clicked
    trace(selectedPlatform);
    //trace(platformClicked);
}


//start of code for the clear button
clear_btn.addEventListener(MouseEvent.CLICK, clearhandler);
function clearhandler(event:MouseEvent):void{
    ht1.text=ht2.text=result_txt.text="";
    selectedPlatform.removeChild(newCircle);
    test = "";
}
于 2013-01-20T14:04:20.780 に答える