雨が心配な曇り空のなか、参加者は約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だったら
|
|
|
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/監修:野中
※禁写真無断転載
|