0

私は現在、ActionScript 3 プログラミング言語を使用して、Adobe CS5 Flash Professional プラットフォームで教育用 Flash アプリケーションに取り組んでいます。

私のプログラムでは、ユーザーは、16 回実行される For ループを使用して生成した 4x4 の正方形のグリッドに形状をプロットする必要があります。

For ループがグリッドを構築すると、同じ 23x23 ピクセルの正方形の MovieClip の 16 個の子インスタンスが追加され、4 行 4 列に均等に配置されます。これらの各 MovieClip には、1 ~ 16 の範囲の一意の ID 番号とマウス ダウンが割り当てられます。ユーザーとの対話の準備が整ったリスナーイベント。

ユーザーがグリッド内の四角形をクリックすると、その形状をプロットして選択する過程で、最初にムービークリップの色が変わり、含めるために選択されたことをユーザーに知らせます。

次に、グリッドの対応する ID 番号にリンクするブールベースの配列 [0-15] もセットアップしました。たとえば、4x4 グリッドの左上の正方形を選択した場合、[0] プロパティはブール配列は false から true に変わり、同様に、グリッドの 2 行目に沿って 3 番目の正方形を選択すると、配列の [6] プロパティも同じようになります。

この手法を使用して配列を参照すると、ユーザーがどのブロックを選択したかを常に知ることができ、プログラムの後続のスライドで別の For ループを実行することで、「選択」ブール配列に基づいて出力することができました。 、ユーザーが設計したのと同じ形状で、別の 4x4 グリッドの範囲内で、配列値が True に設定されている場合、選択されたブロックの色が灰色から黒に変更されます。

ここでの問題は、ユーザーが最初のグリッドで作成された設計された形状を、より大きな 2 番目のグリッドに大量に (場合によっては最大 8 ~ 9 回) プロットする必要があることです。このグリッドは 4x4 よりかなり大きく、正確には 24 x 12 (288 ブロック) です。

ここで必要なのは、ユーザーがこの 2 番目に大きいグリッドをクリックしたときに、設計された形状の出力を新しいムービークリップとしてステージに追加することです。

しかし重要なのは、形状を切り詰める必要があることです。たとえば、ユーザーがブロック 2、3、6、7 を選択して最初のグリッドに正方形を作成した場合。16 ブロックの MovieClip (私の 23x23 ピクセル ブロックに基づいて 92x92 ピクセル) が、4 つのブロックが異なる色でシェーディングされた大きなグリッドに追加されるのは望ましくありません。私の 23x23 ブロック) を、2 番目のグリッドで選択した左上のグリッド スクエアから追加します。

理想的には、Shape Drawing ツールを使用してユーザーのプロットされた形状をプログラムで作成し、これを関数内で実行したいので、ユーザーが 2 番目のグリッド領域に入るたびに関数を実行し、ユーザーの形状を更新することができます。戻って、最初のグリッドで修正しました。これにより、ステージに子を追加する前に形状の色を変更することもできます。これは、必要な機能の別の領域であり、この形状をプログラムで実行したいもう 1 つの理由です。

最初のグリッドからブロックの x/y 座標を別の配列にキャプチャし、その後、その配列を検索して最初のブロック インスタンスを見つけ、この点から形状を描画することを想像してみてください。私の考えが私を連れて行った限り。

これを行う方法についてのアイデアや提案された読書は大歓迎です。どうもありがとう。

4

1 に答える 1

1

私の提案は、そのような形状の基本クラスとしてビットマップを使用し、完全な透明度で初期化してから、X&Y値を調整してそのbitmap.bitmapDataにMCを描画し、そのビットマップを「より大きなグリッド」の上に配置することです。 X&Yを提供しました。

var bd:BitmapData=new BitmapData(23*4,23*4,true,0x0);
var mat:Matrix=new Matrix();
mat.tx=-1*LeftCornerX;
mat.ty=-1*LeftCornerY;
for (i=0;i<16;i++) if (BlockMCsSelected[i])  bd.draw(BlockMCs[i],mat);
var bm:Bitmap=new Bitmap(bd);
bm.x=SuppliedX;
bm.y=SuppliedY;
LargerGrid.addChild(bm);

基本的に、これは入力データを正しく指定した場合に実行されます。ただし、イベントを受信するために必要な場合は、このビットマップをスプライトオブジェクトにカプセル化して、イベントを処理し、ビットマップではなくスプライトに座標を与えることができます。

于 2012-08-27T17:24:24.487 に答える