dポイントプレゼントキャンペーン実施中!

絵を描き、その都度のxy座標を一つの配列に記録するものを作っています。
http://okwave.jp/qa/q6110995.html の続きです
長くて申し訳ありません

(1)マウスのボタンが押されたとき、またその状態でカーソルが動いたときに配列xyにその時の座標drawX,drawYを追加する。次にそれを新しい配列hitohudeの末尾に追加する 現在hitohude = { (drawX1,drawY1),(drawX2,drawY2),(drawX3,drawY3)...}
(2)マウスのボタンが上がったら配列allに(1)で作った配列hitohudeを追加する
これを文字や絵の画数の数だけ繰り返し
all = [ { (x1-1,y1-1),(x1-2,y1-2),(x1-3,y1-3)...} , { (x2-1,y2-1),(x2-2,y2-2),(x2-3,y2-3) }... ]
( ):その都度の座標 { }:一筆の中での座標の集合 [ ]:各筆の集合
を作り、all[5][9][0]のように6筆目の9番目のプロットのx座標を呼び出したりできるようにしたいです。

しかし、BIGIN以外の関数内でhitohudeが読めず、エラーが出てしまいます
http://help.adobe.com/ja_JP/ActionScript/3.0_Pro …
で説明されていることが原因だと思うのですが、どうすればよいでしょうか?

import fl.motion.MotionEvent;
import flash.sensors.Accelerometer;

masu.addEventListener(MouseEvent.MOUSE_DOWN,BIGIN);
masu.addEventListener(MouseEvent.MOUSE_UP,END);

var all:Array = new Array();

function BIGIN(eventObject:MouseEvent):void {
  var drawX = Math.round(mouseX - masu.x);
  var drawY = Math.round(mouseY - masu.y);
  
  comma.text = ","
  Xzahyo.text = drawX;
  Yzahyo.text = drawY;
  
  var hitohude:Array = new Array(); //ここ
  var xy:Array = new Array();
  
  xy.push(drawX,drawY);
  hitohude.push(xy);
  
  masu.graphics.lineStyle(Number(hutosa.text),0x000000);
  masu.graphics.moveTo(drawX,drawY);
  
  masu.addEventListener(MouseEvent.MOUSE_MOVE,DRAW);
}

function DRAW(eventObject:MouseEvent):void {
  var drawX = Math.round(mouseX - masu.x);
  var drawY = Math.round(mouseY - masu.y);
  
  Xzahyo.text = drawX;
  Yzahyo.text = drawY;
  var xy:Array = new Array;
  xy.push(drawX,drawY);
  hitohude.push(xy);
  
  masu.graphics.lineTo(drawX,drawY);
}

function END(eventObject:MouseEvent):void {
  masu.removeEventListener(MouseEvent.MOUSE_MOVE,DRAW);
  all.push(hitohude);
  trace(hitohude);
}

よろしくお願いします

A 回答 (3件)

hitohudeを外で定義するだけでいいと思いますよ



その上でBEGINでhitohude=new Array()するだけ
spliceとかすることはありません


新しい配列に参照を変えないでspliceしたら
さっき書いた線の座標配列を消してしまいますから
    • good
    • 0
この回答へのお礼

どうもありがとうございました

お礼日時:2010/08/22 12:56

#1です。


さっきFlash入ったマシンで確認しました。
spliceしちゃ駄目ですね。ASのArrayは参照型なので、そいつを追加した後、いったん空にして使いまわすんで、延々と同じhitohudeが配列に追加されたものができて。。

#2さんの
hitohude = new Array();
で新しい配列参照を確保するのが正解です。
    • good
    • 0
この回答へのお礼

どうもありがとうございました

お礼日時:2010/08/22 12:56

いま使ってるマシンにFlash入ってなくて動作試せないんですが、メソッド内部で


定義生成したローカル変数に、外部メソからアクセスするのはそりゃー無理です。
なので、"hitohude"Arrayの定義を外に出してあげて、BEGINメソではその全配列
要素を削除するように。
BEGINイベントハンドラで、Array要素が空なのでspliceしたらエラーが出る?場合
は、"hitohude"になんか要素を入れれば。
hitohude.splice(0)の代わりに、hitohude=null;でもいけるかな?

変更箇所だけ書きますね。

var hitohude:Array = new Array(); // hitohudeをprivateなvarに
// hitohude.push("始めやす");

function BEGIN(eventObject:MouseEvent):void {
  hitohude.splice(0); // hitohudeから全要素削除(クリア)
}

function DRAW(eventObject:MouseEvent):void {
  // 変更なし
}

function END(eventObject:MouseEvent):void {
  // 変更なし
}

外していたらごめんなさい。

この回答への補足

hitohude.splice(0); // hitohudeから全要素削除(クリア)
は上手くできているのですが、二筆目以降、前の筆でallに入れたhitohudeがhitohude.splice(0);とDRAWでの変更に影響されてしまっていて、結果としてallが最後に作った同じhitohudeが筆の回数分連なったものになってしまいます・・・

補足日時:2010/08/21 20:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!