Report
2006 >> [11.11] [08.26] [05.13] [02.25] 
2005 >> [11.26] [08.27] [05.14] [02.05]
2004 >> [11.13] [08.07] [05.15] [02.07]
2003 >> [11.08] [08.24] [05.31] [02.01]
2002 >> [12.08] [09.07]

2002.09.07 野中博士の「ActionScript虎の穴(の入り口)」
 demo1:ハンドラとイベント(アクション主体)@初心者向け
 demo2:イベントリスナー@少し中級者よりの方向け
 『お悩み相談コーナー』

雨が心配な曇り空のなか、参加者は約80名でした。
13:00受け付け開始。
題字の差し入れもありました。
120人収容のセミナールームに、明日のスクリプター集結
今日の講師の野中博士。
demo1:ハンドラとイベント
主にスクリプトを書く場所はフレームとインスタンスの2つ。
アクションパネルを開くにはフレームを選択して
Alt + ダブルクリック(Windows)
option + ダブルクリック(Mac)
> アクションパネル > エキスパートモード
MC,ボタンにかく、ASにはかならず、「ハンドラがある」
フレームにはハンドラは必要がない。
#MXでは、コードヒントが出る。自動フォーマット、シンタックスチェックは便利。
MCにかいたつもりが、フレームに書いていることがあるので、アクションパネルのタイトルに注意しよう。
★フレームアクション(1フレーム目)にイベントハンドラ(onClipEvent)を書いた時出るエラー

シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 : 行 1:クリップイベントはムービークリップインスタンスでのみ使用可能です。

onClipEvent (enterFrame) {}
v5では、
onclipEvent()はMCのハンドラ、 onはボタンのハンドラ。
MXでは、両方MCで使用できる。
trace()をスクリプトを書いてる作業中に使うと便利
処理がきちんと実行されてるかなどの確認等に役立つ
// MovieClipアクション
on(release){
trace("cheked")
}
onclipEvent()のmauseUpはステージのどこをクリックしてもでるが、これはMCをクリックした時だけ。
つまり、イベントを選んでハンドラをきめる。
では、アクションはどこに書くのか?

ムーピークリップの中のフレームにフレームアクションを書くこともできる
//ムーピークリップにイベントハンドラを書くときは インスタンスごとに書き分けができる
// MovieClipアクション
onClipEvent (load) {
this._x = 0;
}

ムーピークリップの中でもフレームに書くときはフレームアクション 。( このとき、 イベントハンドラは必要なし、書くとエラー。)
// MovieClip
// フレームアクション
this._x = 0;

ムーピークリップ内のフレームに書いた場合全てのインスタンスに共通に実行
MovieClipアクションに書くと、インスタンスごとに異なる処理
// MovieClipアクション
on(release){
this._x+=10;
}

//+=現在のX座標に10ポイント加算する。


// MovieClipアクション
//MovieClip this;
//上記は this.でコードヒントが出るようにする記述法。

on (press) {
this.startDrag();
}

on (release,releaseOutside) {
this.stopDrag();
}

on(release, releaseOutside)
//,でイベントをつなげられるのはonだけ。
// MovieClipアクション
on (press) {
bPress = true;
}

on (release,releaseOutside) {
bPress = false;
}
onClipEvent (enterFrame) {
if(bPress == true){
_root.target_mc._x +=10;
}
}


ハンドラとは?
※詳しくは野中さんの本の22P参照のこと。

イベントとハンドラの関係の例え:
昼時の吉野家でカウンターから矢継ぎ早に入れるオーダーがイベント。厨房でそのオーダーを処理するのがハンドラ。
// MovieClip: メインのタイムラインに配置
// MovieClipアクション
onClipEvent (enterFrame) {
this._x = _root._xmouse;
this._y = _root._ymouse
}

onClipEvent (mouseMove) {
this._x = _root._xmouse;
this._y = _root._ymouse
updateAfterEvent();
}
//MovieClip this;
on (press) {
bPress = true;
}

on (release,releaseOutside) {
bPress = false;
}

コードヒントが出てるとこ
// MovieClip: ボタン用
// MovieClipアクション
// _root.target_mcをコントロール
//MovieClip this;
on (press) {
_root.target_mc.bPress = true;
}

on (release,releaseOutside) {
_root.target_mc.bPress = false;
}

頭上のプロジェクターを見てるんです。決してだれてる訳じゃぁありません。
// MovieClip: _root.target_mc
// MovieClipアクション
// ボタンからコントロール
onClipEvent (enterFrame) {
if(bPress == true){
this._x +=10;
}
}
「MouseMoveはfpsと一緒に画面が更新される。」
MouseMoveはfpsと一緒に画面が更新される。
このときに、updateAfterEventを使うとめちゃめちゃ滑らかに動作するけど、CPUをつかうかもー。
MCが複数ある場合
// MovieClip: ボタン用
// MovieClipアクション
// _root.target_mcと_root.target2_mcの2つをコントロール
//MovieClip this;
on (press) {
_root.target_mc.bPress = true;
_root.target2_mc.bPress = true;
}
on (release,releaseOutside) {
_root.target_mc.bPress = false;
_root.target2_mc.bPress = false;
}
// MovieClip: _root.target2_mc
// MovieClipアクション
// ボタンからコントロール
onClipEvent (enterFrame) {
if(bPress == true){
this._x += 20;
if(this._x > Stage.width){//ステージの幅を超えたら
this._x -= Stage.width;//ステージの幅文へらす(左に移動)
}
}
}
if文のはなしー。
if(bPress == true){}
もしbPressがtrueだったら
間違いやすい例
if(bPress = true){}

bPressの中にtrueが入ってしまう。文法的には「あり」なのでエラーとはいわれない。逆にハマるところでもあり。
参考:[ActionScriptクラブ>マニア>if (condition=1)]
undefiind :未定義
#true以外はundefind/0はfalse,それ以外はtrue
trace(something = true);
結果:[true]
#代入したから。

休憩挟んで、demo2:「イベントリスナー」

MXから導入。
イベントハンドラメソッド。
フレームアクションに書ける。
シンボルに登録できるので便利。コンポーネントはこの書き方で書いてある。
##onClipEventはインスタンスにしかかけないので、MCにはコピーするとかになっちゃうので、シンボルとして登録できない。
MovieClipアクションを書かずに全部フレームに書けるのさー。

// MovieClip: _root.Target_mc
// 第1フレームアクション
function xMove() {
this._x += 10;
}
Fanctionは定義と実行の2段階が必須。
実行用の再生ボタン
// MovieClip: ボタン用
// MovieClipアクション
// _root.Target_mcのfunctionを実行
on (release) {
_root.Target_mc.xMove();
}
xMove()が定義されてれば実行される
自分自身に書く場合
// MovieClip: _root.Target_mc
// MovieClipアクション
on (release) {
this.xMove();
}
フレームアクションに一度だけxMove()が実行するように書く時
// MovieClip: _root.Target_mc
// 第1フレームアクション
// スクリプトの記述の順番は関係なし

this.xMove();
function xMove() {
this._x += 10;
}
この場合クリックしたとき実行
// MovieClip: _root.Target_mc
// 第1フレームアクション
// ふつうfunctionの実行には()がいるけど、
// これは定義なので()は必要無い。
this.onRelease = this.xMove;
function xMove() {
this._x += 10;
}
直接代入もできる
直接なんで名前はいらない
this.onRelease = function () {
this._x += 10;
}
名前のない関数については、以下のサイトを参照。
野中さんちの「非公式テクニカルノート」
クリップイベントもOK
this.onEnterFrame = function () {
this._x += 10;
}
// MovieClip
// MovieClipアクション
//フォーカスを当てる方法
this.focusEnabled = true;
Selection.setFocus(this);
this.onKeyDown = function () {
this._x += 10;
}
配列の話
Key.addListenerを使えば、フォーカスは不要。
配列を使いこなすと、「女王」と呼ばれるかも。
KEYの中にイベントを設定
// フレームアクション
l_array = [10,11,12];
l_array.onKeyDown = function(){
trace(this);//ここでのthisは受け取った人(l_array)
}
Key.addListener(l_array);

プレビューで確認。
l1_array = ["array1"];
l1_array.onKeyDown = function () {
trace(this);
Key.removeListener(this);
}
Key.addListener(l1_array);
l2_array = ["array2"];
l2_array.onKeyDown = function () {
trace(this);
Key.removeListener(this);
}
Key.addListener(l2_array);
addListenerの逆でremoveListenerてのもある。でもこれは注意が必要。仕様上やっかいな動きをするからね。

バグ?
_listeners = [l1_array,l2_array]
(キー押す)配列0番目消す


_listeners = [l2_array]
l2_arrayが配列0番目になる


_listeners = [l2_array]
配列1番目に命令
一番目がない

対応策
0番残す・・・<野中さんちのサイトに近日UP>
質問コーナー


Stringをターゲットパスにする方法

on (release) {
sName = "XY";
//sPath = "_root." + sName;
//sPath = eval("_root." + sName);
sPath = _root[sName];
trace(sPath);
trace(typeof sPath);
eval("_root." + sName)._x += 10;
}
二つのMCの衝突判定
ドラッグアンドドロップで重ならないようにしたい。
考え方:重なったとき重なる直前状態に戻せばよい。
hittestを使って重なりをチェック。

他にも「ムービークリップのボタンイベントを使う意義はあるのか?」とか、「fpsの設定について」についてやり取りが交わされました。
以上で、本編は終了です。

場所を新宿に移して、二次会をしました↓。こちらの参加者は23名。
写真:沖/文:桜井&SIHO/監修:野中
※禁写真無断転載

© 2001-2002 F-site all right reserved.