- ベストアンサー
Flash Lite1.1ではonClipEvent(enterFrame)が使えません。ではどうすれば?
題名の通りなのですが、どうすれば同じことが 実現できるのでしょうか。お時間がありましたら、 教えていただけると幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1&#2 です。 すみません,返事が遅くなりました。 ものすごく難しいです。 かなり,あがきましたが, #2の補足に書かれている "ような" 内容のことは不可能だと思います。 なぜかというと, 「携帯によって,キーを押したときの仕様が違う。」 と言うのが第一点で,もう1つは 「キーアップを感知できない。」 という点です。 また,Flash Lite 1.1 までは,Keyクラスのメソッドもありません。 別コミュニティからの引用でもし訳ございませんが, とりあえず下のURLを参照してください。 ~~~~~~~~~~~~~~~~~~ 「FLASH-JP.COM - フォーラム」 【Flash Lite】keyPressについて http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=3187&forum=8 ---質問者の ebi さん投稿より引用 --- keyPressイベントハンドラは ボタンを押してる限り何度も実行しちゃいますが、 1度ボタンを押したら指を離すまで キーイベントを受け取らないって事は可能でしょうか? ---回答(補足) ebi さん発言より引用--- うちはテスト用の実機としてDoCoMoはF700i、P506iC、 AUはW22SAがあるんですが(テストしたい方、使って下さい) DoCoMoはリピートしませんが、AUはするんです。 ~~~~~~~~~~~~~~~~~~ まず,質問は, 「ボタンを押してる限り何度も実行するので困る」 という内容です。 これだけから考えると,そもそも enterFrame は必要ないということです。 キーを押し続けると,何度もそのキーが押されたのと同じ状態になるそうです。 つまり,PCと同じです。 まず,動かしたいムービークリップにインスタンス名を付けます。 ここの説明では,「myMC」 というインスタンス名を付けたとしておきます。 そして,ステージ上にボタン(ボタンシンボル)を4つ作って, 各ボタンに次のように書けば,「myMC」 はキー操作で動きます。 ---1つめボタン------------------------------ on (press, keyPress "8") { setProperty("/myMC", _y, getProperty("/myMC", _y)-5); } ------------------------------------------ ---2つめボタン------------------------------ on (press, keyPress "2") { setProperty("/myMC", _y, getProperty("/myMC", _y)+5); } ------------------------------------------ ---3つめボタン------------------------------ on (press, keyPress "6") { setProperty("/myMC", _x, getProperty("/myMC", _x)+5); } ------------------------------------------ ---4つめボタン------------------------------ on (press, keyPress "4") { setProperty("/myMC", _x, getProperty("/myMC", _x)-5); } ------------------------------------------ Flash Lite 的にはこれでOKです。 またPCでも,enterFrameは使わず上のようにするので良いと思います。 ところが, 回答の方を見ると, 「DoCoMoはリピートしませんが、AUはするんです。」 ということらしいです。 リピートしない機種もあるんですね。 たしかに, http://www.nttdocomo.co.jp/service/imode/make/content/flash/about/ からダウンロードできる『iモードHTMLシミュレータII』をダウンロードしてみましたが,リピートはしません。 そうすると, on (press, keyPress "8") などで,変数のフラグを立てて, その変数の値によって,enterFrame で(つまりフレームのループで)上下左右に動かす方法を取るしかなくなります(おそらく)。 それは良いのですが, 困ったことにキーをアップしたときに,フラグの値を変えるということができないのですよ。 というわけで, #2の補足に書かれている "ような" 内容のことは不可能だと思いますが, 以下で代用はできませんでしょうか? キー5 を押して,ムービークリップの動きを止める方法です。 まずステージ上にボタン(ボタンシンボル)を5つ作って, 各ボタンに次のように書けきます。押すキーによって,_root の変数 flag の値を変えます。 (ボタンが見えては困る場合は透明なボタンなどにしてください。) ---1つめボタン------------------------------ on (press, keyPress "8") { flag = 8; } ------------------------------------------ ---2つめボタン------------------------------ on (press, keyPress "2") { flag = 2; } ------------------------------------------ ---3つめボタン------------------------------ on (press, keyPress "6") { flag = 6; } ------------------------------------------ ---4つめボタン------------------------------ on (press, keyPress "4") { flag = 4; } ------------------------------------------ ---5つめボタン------------------------------ on (press, keyPress "5") { flag = 5; } ------------------------------------------ そして,動かしたいムービークリップの中のフレーム1に次のように書きます。 ------------------------------------------ if (/:flag == 8) { setProperty("", _y, getProperty("", _y)-5); } else if (/:flag == 2) { setProperty("", _y, getProperty("", _y)+5); }else if (/:flag == 6) { setProperty("", _x, getProperty("", _x)+5); }else if (/:flag == 4) { setProperty("", _x, getProperty("", _x)-5); } ------------------------------------------ そして,動かしたいムービークリップの中のフレーム2をキーフレームにして次のように書きます。 ------------------------------------------ gotoAndPlay(1); ------------------------------------------ 本当は,キーから指を離したときに, ムービークリップがストップしてくれれば良いのですが, どうあがいても無理でした。 ムービークリップ 内に ボタンを配置して, ボタンを消したり出したり繰り返すのもしてみましたが,うまく行きませんでした。 というわけで,キー5 を増やす代案です。 === 補足 ========================= 「#2の補足に書かれている "ような" 内容のことは…」 と "ような" を強調しているのは, #2の補足に書かれているスクリプトでは,Flash Lite どころか, 普通のFlashも動かないからです (゜-゜;)ヾ(-_-;) オイオイ... 。 書かれているスクリプトで普通の Flash を動かす場合の話です。 on(release, keyPress "8"){ } などは, Flash 5 以前だとボタンのみ,Flash MX 以降だと ボタン と ムービークリップ の スクリプトの冒頭だけに使える onイベントハンドラ と呼ばれる特殊なものです。 http://f-site.org/articles/2002/01/26154029.html ですから,if文の中などには使えません。 普通の Flash の場合は, ムービークリップを作って, そのムービークリップに次のようなスクリプトを書くと動作すると思います。 ----------------------------------------- onClipEvent (enterFrame) { // ※キーコード:キー0=96,キー1=97,… if (Key.isDown(104)) { _y -= 5; } else if (Key.isDown(98)) { _y += 5; } else if (Key.isDown(102)) { _x += 5; } else if (Key.isDown(100)) { _x -= 5; } } ----------------------------------------- また, ムービークリップ内のフレームを2フレームにして,1フレーム目に, ----------------------------------------- if (Key.isDown(104)) { _y -= 5; } else if (Key.isDown(98)) { _y += 5; } else if (Key.isDown(102)) { _x += 5; } else if (Key.isDown(100)) { _x -= 5; } ----------------------------------------- と書いても良いですよ。 以上です。 その他参考URL i モード用 Flash 開発講座 http://www.adobe.com/jp/devnet/devices/articles/togoru_03.html
その他の回答 (2)
#1です。 具体的なスクリプトを書かれていないので, #1では一般的なことしか書いていません。 ですから,その勝手な補足で恐縮ですが, 簡単な例(サンプル)を書かせていただきます。 ステージ上に,小さな四角を描いたとします。 その四角をムービークリップに変換して,そのムービークリップに, --------------------- onClipEvent (enterFrame) { this._x += 3; } --------------------- と書いてパブリッシュしたとします。 するとそのムービークリップの x座標は, onClipEvent (enterFrame) で, 1フレーム進む時間ごとに毎回 (デフォルトのフレームレート12fpsでは1秒間に12回), 3 ずつ加算されるので, this つまり,自分自身のムービークリップの座標を 3ピクセル ずつ右に移動するムービークリップができます(よね)。 それを, Flash Lite 1.1 で実現しようと思えば, ステージ上に描いた,小さな四角をムービークリップシンボルに変換して, その ムービークリップ を ダブルクリック して, その ムービークリップ のタイムラインの編集に入り, ムービークリップ 内のフレームを 2フレームにして, 1フレーム目に ----------------------------------------- setProperty("", _x, getProperty("", _x)+3); ----------------------------------------- そして,2フレーム目もキーフレームにして,そのフレームに, ---------------------------------------- gotoAndPlay(1); ---------------------------------------- と書くと, onClipEvent (enterFrame) とほとんど同じ事が実現可能です。 と言うことです。 前回のご質問でも書いたとおり, Flash Lite 1.1 以前では, 動詞が先に来ます。 また, スクリプトはクラスを持たずに単独のスクリプトとして存在します。 ムービークリップ内の1フレーム目に書いたスクリプトですが, まず, getProperty("", _x) で自分自身の x座標を取得しています。 階層は存在していて, 自分自身の階層(ムービークリップ)を指すターゲットパスは,「無」になります。 ですから, getProperty("", _x) は, getProperty("this", _x) と同じ意味になります。 まず,その getProperty("", _x) で,自分自身の x座標プロパティを取得しておいて, getProperty("", _x)+3 で,取得した x座標に 3 を加算するということになります。 その, getProperty("", _x)+3 の値を持って, setProperty(); で,ターゲットとなるムービークリップの x座標プロパティを セット するのです。 ですから, setProperty("", _x, getProperty("", _x)+3); は, this._x += 3; つまり, this._x = this._x + 3; と同じ意味になります。 そして,フレーム2 で gotoAndPlay(1); があるので,1フレーム目と2フレーム目はループするので, 繰り返し,1フレーム目のスクリプトが 1フレーム進む時間ごとに毎回 実行されることになります。 何というか… 私は,フレームのループという発想が先にあって, それでは面倒くさいので onClipEvent (enterFrame) を使うという思考パターンになってしまっています。 ですから,onClipEvent (enterFrame) イコール ムービークリップのループなのです。 実際にその経緯で onClipEvent (enterFrame) は Flash 5 からできたのだと思います。 それはともかく, Flash Lite 1.1 までは, 一貫して動詞が先にあって,オブジェクトはその引数またはターゲットの位置に来ます。 ですから,スクリプトが入れ子入れ子になって複雑になります。 やはり, 「オブジェクトが先に来る文法の方がスッキリしていいですね。」 という例としても回答させていただきました。 今,困られている実際のonClipEvent (enterFrame) を使った場合のスクリプトを書いてくださると, 具体的な回答ができるかもしれませんし, また逆に,もし無理であることであれば,「それは Flash Lite 1.1 まででは無理だ」ということも書けるかもしれません。 何でしたら,補足してください。答えられるかもしれません(答えられないかもしれませんが)。
補足
sassakunさん、いつも有難う御座います^^ 具体的には、あるMCを携帯電話の2キーを押したら上に、4キーを押したら下に行く、ということをやりたいんです。以下、初心者の発想ですので、お見苦しい所もあるかと思いますが^^;MCを2フレーム作って、1フレーム目に以下のスクリプトを書き、2フレーム目にgotoAndStop(1);を記述しました。 ------------------------------------------- if (on(release, keyPress "8")){ _y -= 5; } else if(on(release, keyPress "2")) { _y += 5; } else if(on(release, keyPress "6")) { _x += 5; } else if (on(release, keyPress "4")) { _x -= 5; } ------------------------------------------- しかしFlashさんに大量のエラー文を吐かれてしまいました。何か根本的に勉強不足のようですね。^^;
ムービークリップを1つ作って, そのムービークリップ内のフレームを2フレームにして, 1フレーム目のフレームにスクリプトを書きます。 2フレーム目は特に何も書かなくても良いですが, gotoAndPlay(1); と書いておく方がonClipEvent(enterFrame)に近い動きをします。 結局,onClipEvent(enterFrame) はそれの代用としてできたものです。 だから,enterFrame は基本的にムービークリップのスクリプトなのです。 いまでもよく,「NowLoading」のサンプルなどで, ムービークリップ内のタイムラインや,_root のタイムラインをループさせるのを見かけますが, 根本的発想は全て,ムービークリップ内のタイムラインをループさせるところにあります。
お礼
いやぁ…他のフォーラムにまで、お調べになられたようで…、なんとお礼申し上げてよいか分かりません。本当に有難う御座います。^^; 同じ携帯でも、違う反応を返すんですね。初めて知りました。 >#2の補足に書かれているスクリプトでは,Flash Lite どころか, >普通のFlashも動かないからです (゜-゜;)ヾ(-_-;) オイオイ... 。 本当にオイオイですね(苦笑)ActionScriptの参考書でも買って、勉強しなきゃいけませんね。 本当にいつも,sassakunさまにはお世話になってますね(^^; また機会がありましたら、教えていただけると幸いです。 (厚かましいお願いではございますが)