トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     前のフレームラベル、次のクレームラベルに移動するには?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
eShin
Åê¹ÆNo.3740
投稿日時: 2004-2-12 16:12
半人前
居住地:
投稿: 32
使用環境:
XP Pro(SP1)+IE6
MX2004 Pro
Re: 前のフレームラベル、次のクレームラベルに移動するには?
#すみません、長いです。

nextScene、prevSceneでシーン間を移動するためのスクリプトを組んでみたのですが、うまくいきませんでした。。。(実際のコードと現象は後ろに。)

Keyリスナー内でprevScene、nextSceneしているのですが、基準となるシーンがリスナー作成時のシーンに固定されてしまっているようです。
野中さんに挙げていただいたページにある下記記述と同様の原因なのでしょうか。。?
引用:

また、独立のアクション'gotoAndPlay'または'gotoAndStop'でシーンとフレームを指定した場合、SWFファイルには1本につなげたタイムラインの中のフレーム番号に変換されて書出されます。つまり、シーン名自体はSWFファイルには保持されないのです。そのため、アクションの中で「シーン」を「変数」にして、移動するシーンをダイナミックに変更することはできません。


■求める挙動
・4つのシーン間をキー入力で移動したい。
 キーボードの矢印左で前のシーンへ、矢印右で次のシーンへ移動。
・上記の挙動用のスクリプトは最初のシーンに書くのみで、以降のシーンには
 書かなくてすむようにしたい。(実際は多数のシーンが必要となるため。)

■組んでみたテストムービーとスクリプト
・新規のドキュメントにシーンを4つ作成。
・それぞれのシーンに対して、
  フレーム数は5
  シーンの識別用に適当に絵を描く
  フレーム5のフレームスクリプトに「trace("1 stop");stop();」
   ※"1 stop"は、実際はシーン毎に"2 stop"、"3 stop"、"4 stop"
  
・最初のシーンのフレーム1のフレームスクリプトに下記のように記述。


if (myKeyListener == null) {
	trace("myKeyListenerを作成");
	_global.myKeyListener = new Object();
	myKeyListener.onKeyUp = function() {
		switch(Key.getCode()) {
			case Key.LEFT:	
				trace("prevScene");
				prevScene();
				play();
				break;

			case Key.SPACE:
				// Key.RIGHTに同じ
			case Key.RIGHT:
				trace("nextScene");
				nextScene();
				play();
				break;
		}
	}
	Key.addListener(myKeyListener);
}


■現象。。。
シーン1からシーン2には移動できますが、シーン2からシーン3に移動しません。。
ムービープレビューすると、出力ウィンドウに次のように表示されます。
(『』はユーザの操作です。)

myKeyListenerを作成
1 stop
『右矢印を押下』
nextScene
2 stop
『右矢印を押下』
nextScene
2 stop
『右矢印を押下』
nextScene
2 stop
『左矢印を押下』
prevScene
1 stop
『右矢印を押下』
nextScene
2 stop

-----
試しにリスナーを作成するコードをシーン1は削除して、シーン2に移動しました。
さらにシーン1フレーム5の「stop();」も削除します。すると次のようになりました。シーン3でprevSceneするとシーン1に移動してしまいます。

1 stop
myKeyListenerを作成
2 stop
『右矢印を押下』
nextScene
3 stop
『右矢印を押下』
nextScene
3 stop
『右矢印を押下』
nextScene
3 stop
『左矢印を押下』
prevScene
1 stop     ←←←なぜかシーン1へ移動
2 stop


----------------

eShin
Åê¹ÆNo.3742
投稿日時: 2004-2-12 16:29
半人前
居住地:
投稿: 32
使用環境:
XP Pro(SP1)+IE6
MX2004 Pro
Re: 前のフレームラベル、次のクレームラベルに移動するには?
自己レスです。

prevScene、nextSceneも「SWFファイルには1本につなげたタイムラインの中のフレーム番号に変換されて書出されます。」のが原因であろうと推測しました。リスナーを作成するスクリプトを外部スクリプトにして各シーンの先頭でインクルードしたところ、求める挙動になりました。

この推測は正解なのでしょうか。。? ご存知の方、よろしくお願い致します。

------
なお、外部スクリプトは次のようにしました。
if (myKeyListener != null){
 trace("myKeyListenerを削除");
 Key.removeListener(myKeyListener);
 delete myKeyListener;
}
  
trace("myKeyListenerを作成");
_global.myKeyListener = new Object();
myKeyListener.onKeyUp = function() {
 switch(Key.getCode()) {
  case Key.LEFT: 
   trace("prevScene");
   prevScene();
   play();
   break;
   
  case Key.SPACE:
   // Key.RIGHTに同じ
  case Key.RIGHT:
   trace("nextScene");
   nextScene();
   play();
   break;       
 }
}
Key.addListener(myKeyListener);


----------------

野中文雄
Åê¹ÆNo.3766
投稿日時: 2004-2-12 23:39
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 前のフレームラベル、次のクレームラベルに移動するには?
ご推察のとおりだと思います。
引用:
eShinさんは書きました:
prevScene、nextSceneも「SWFファイルには1本につなげたタイムラインの中のフレーム番号に変換されて書出されます。」のが原因であろうと推測しました。リスナーを作成するスクリプトを外部スクリプトにして各シーンの先頭でインクルードしたところ、求める挙動になりました。

シーン撲滅委員会としては、シーン先頭のフレームに"scene_1"、"scene_2"、...などのフレームラベルを設定することをお勧めしています。
// [例]つぎのシーンへ
// 変数nSceneに現行のシーンの番号を保持
_root.gotoAndStop("scene_"+(++_root.nScene));


----------------
 

笠居トシヒロ
Åê¹ÆNo.3767
投稿日時: 2004-2-13 0:20
マスター
居住地: 兵庫
投稿: 870
使用環境:
SnowLeopard, Safari4, CS4
Windows7, IE8, CS4
Re: 前のフレームラベル、次のクレームラベルに移動するには?
また撲滅とか言ってるし・・・(^^;)

そもそも、シーン間を矢印キー押下で移動したいってだけですよね?
なんでリスナーだのincludeだの、しまいにはシーン撲滅(笑)だの、そんな大げさなことになるかなぁ (^^;)

ボタン一つ作って
on (keyPress "<Right>") {
	nextScene();
}
on (keyPress "<Left>") {
	prevScene();
}

って書いて、各シーンのステージの外にでも置いておけばいいだけですよ。
長ったらしいスクリプトは不要です。FLASH1の頃からふつーに使ってたやり方です。


----------------
笠居 マッドシー
http://www.mad-c.com/

森 巧尚
Åê¹ÆNo.3770
投稿日時: 2004-2-13 1:19
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: 前のフレームラベル、次のクレームラベルに移動するには?
引用:

kasaiさんは書きました:
ボタン一つ作って
on (keyPress "<Right>") {
	nextScene();
}
on (keyPress "<Left>") {
	prevScene();
}

って書いて、各シーンのステージの外にでも置いておけばいいだけですよ。

わはは(笑)僕もそう言おうと思ってました。(笑)

ちなみにeShinさんは、
引用:

■求める挙動
・上記の挙動用のスクリプトは最初のシーンに書くのみで、以降のシーンには
 書かなくてすむようにしたい。(実際は多数のシーンが必要となるため。)

とのことですが、スクリプトを書いたボタンをコピーして各シーンにペーストすれば『スクリプトは最初のシーンだけに書けばいいだけ』ですよ。シーンパネルで「シーンの複製」ボタンを押してボタンごとシーンの複製をすれば、ボタンのコピーすら必要ありませんし。


----------------
森 巧尚
http://www.ymori.com

eShin
Åê¹ÆNo.3771
投稿日時: 2004-2-13 1:20
半人前
居住地:
投稿: 32
使用環境:
XP Pro(SP1)+IE6
MX2004 Pro
Re: 前のフレームラベル、次のクレームラベルに移動するには?
野中さん、笠居さん、森さん、ありがとうございます。

野中さんの方法を見て、なるほどと感心して
笠居さんの方法を見て、拍子抜けして力なく笑ってしまいました

ボタンの存在は知っていましたが、ボタン機能はMCでまかなっていましたし。
ましてやキー入力を受けるために使おうなどとは、頭にかすりもしませんでしたよ。

まさに「すでにあるものを使いこなしてからでも遅くない」ってことですね。

----------
ただ、それはそれとして、私がはまってしまった上記の挙動ですが、これを"仕様"とするのは許せないですよね。
ActionScriptってプログラマー的思考の常識で考えると、はまってしまう"仕様"が多いように感じてきました。。


----------------

笠居トシヒロ
Åê¹ÆNo.3783
投稿日時: 2004-2-13 11:02
マスター
居住地: 兵庫
投稿: 870
使用環境:
SnowLeopard, Safari4, CS4
Windows7, IE8, CS4
Re: 前のフレームラベル、次のクレームラベルに移動するには?
引用:
ただ、それはそれとして、私がはまってしまった上記の挙動ですが、これを"仕様"とするのは許せないですよね。
ActionScriptってプログラマー的思考の常識で考えると、はまってしまう"仕様"が多いように感じてきました。。

それはそうでしょう。
もともとFLASHはアニメーションソフトであり、スクリプトだのプログラムだのが苦手な
グラフィッカーが『簡単にインタラクティブなことができる』ように作られた
『ブラックボックスの多いオートマ車』のようなものだったわけで、
『自分でシフトしたーい』と言い出したユーザーのためのスクリプト部分は後付けですから、
整合性に難が出てくるのはアタリマエです。

で、後発で始めた方が、この『ノンクラッチのマニュアル車』みたな仕様に戸惑うのは
よーくわかるんですが、じゃあ、ってんで『完全マニュアル車』にしてもらうと、
オートマ機能を便利に使ってたユーザーは困ってしまうんです。

もちろん今のままがいいとは思いませんが、どちらかに偏った視点から問題解決を図ろうとしては
マズイでしょう。『すでにあるものを云々』とか『むやみにインターフェイス仕様を増やすのは・・』
などと言ったのもこのためです。

とはいえ、ええ加減なんとかして欲しいですよね、ホンマ頼むわ>マクロメディア(^^;)


----------------
笠居 マッドシー
http://www.mad-c.com/

eShin
Åê¹ÆNo.3803
投稿日時: 2004-2-13 16:03
半人前
居住地:
投稿: 32
使用環境:
XP Pro(SP1)+IE6
MX2004 Pro
Re: 前のフレームラベル、次のクレームラベルに移動するには?
引用:

それはそうでしょう。
もともとFLASHはアニメーションソフトであり、スクリプトだのプログラムだのが苦手な
グラフィッカーが『簡単にインタラクティブなことができる』ように作られた
『ブラックボックスの多いオートマ車』のようなものだったわけで、
『自分でシフトしたーい』と言い出したユーザーのためのスクリプト部分は後付けですから、
整合性に難が出てくるのはアタリマエです。

ですよね。。

私も最初に触ったのはFlash2なので流れは分かります。(で、アニメが主目的ではなかったので、あまり触らず。MX2004から再開でした。)

---
懸念してしまうのは、FlashをRIAの、しかも業務システムに使用するという流れです。。
マクロメディアが目指す方向のひとつのように感じられますし、SIの方もFlashの表現力とAS2のプログラム記述力によって「できるんじゃない」と安易に採用してしまうと後々「わけわからん」ことになると。
(自分としては経験積みと情報収集で乗り切るしかないですね。。 後は状況によっては「今回はFlashはやめましょう」と言えるようにする、と。)

せめて言語仕様通りに動作するようにしてくれ? >マクロメディア(^^;)
あと、エラーが出るだろう状況で"無視"しないでくれ?
あと、あと...


----------------

eShin
Åê¹ÆNo.3828
投稿日時: 2004-2-14 1:45
半人前
居住地:
投稿: 32
使用環境:
XP Pro(SP1)+IE6
MX2004 Pro
Re: 前のフレームラベル、次のクレームラベルに移動するには?
「シーン間を矢印キー押下で移動したい」の件、再びです。
#しつこくてすみません。。

ステージの外にボタンを作成して、笠居さんに教えていただいたスクリプトを書きました。さらに各シーンにボタンをコピーして、目的を達することはできました!

ただ...後から「SPACEキーでも次のシーンへ行くようにしたい」とか考えてしまい、はたと手が止まってしまいました。
やはり各シーンにボタンをコピーしなおすしかないのでしょうか。。?

#計画性が無いといえばないなぁ(^^;)と思いますが、後からこの方がよい!と思い直すこともあるわけで。。


----------------

野中文雄
Åê¹ÆNo.3829
投稿日時: 2004-2-14 2:30
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 前のフレームラベル、次のクレームラベルに移動するには?
ボタンはコピーしなくてもよいですが、Buttonアクションはコピーする必要があります。

インスタンス共通に設定したいスクリプトは、フレームアクションとして記述する必要があります。しかし、ボタンシンボルには、フレームアクションが設定できません。そして、ムービークリップシンボルにフレームアクションとしてキーイベントのハンドラを設定するためには、リスナーを使わざるを得ません。
引用:
eShinさんは書きました:
ただ...後から「SPACEキーでも次のシーンへ行くようにしたい」とか考えてしまい、はたと手が止まってしまいました。
やはり各シーンにボタンをコピーしなおすしかないのでしょうか。。?

Flashを「マニュアル車」にしろとはいいません。でも、マニュアル車として運転できるテクニックをもった人は、へたに「オートマ」の機能を使ってハマるより、マニュアル車として運転した方が結果としてコントロールしやすいと思います。


----------------
 

« 1 (2) 3 4 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops