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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     配列からひとつずつ呼び出してシャッフル再生
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
葵-aoi-
Åê¹ÆNo.21165
投稿日時: 2005-10-30 17:44
新米
居住地: 三重県南部へ引っ越し
投稿: 29
使用環境:
WinXP / IE6.0
FlashMX2004
『おし!MX2004AS』
『ASバイブル』
配列からひとつずつ呼び出してシャッフル再生
はじめまして、葵と申します。齢23歳の大学生です。
私は卒業研究のテーマとして『FLASHを用いた英語教材』を作ろうと思い、
FLASHを今年の夏からはじめました。
「教えて!FLASHMXActionScript」
「ActionScriptサンプル集」などを読んでいます。
独学で突っ走ろうとしたのですが3週間も同じスクリプトで悩んで、
卒研締切は1ヶ月後でかなり切羽詰って困っています。
すみませんがご教授お願いします。

次のフラッシュをランダムではなく、シャッフルにしたいです。
http://briefcase.yahoo.co.jp/aoinokotoba
ランダムにすると、同じ言葉が出てきてエンドレス状態になるからです。
手順としては、過去ログにもあったように、
「あらかじめ全体をシャッフルする(野中さまの先に運命を決める)」という方法でいきたいと思います。
(尚、シャッフルの方法は「教えて!FLASHMXActionScript」を参考にしました。)

分からないところは、
【シャッフルした配列をひとつ抜き出して再生すること】です。

//シャッフル(同じ数がでないようにランダム)をする。
tansu = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
for (i=0; i<100; i++) {
hikidashi1 = Math.floor(Math.random()*tansu.length);
hikidashi2 = Math.floor(Math.random()*tansu.length);
work = tansu[hikidashi1];
tansu[hikidashi1] = tansu[hikidashi2];
tansu[hikidashi2] = work;
}
//シャッフルの結果を表示する。
trace(tansu);
//結果は「5,10,7,11,8,4,12,9,2,6,3,1」となる。
//tansuの中身をひとつ抜き出して表示する。
trace(tansu[0]);
trace(tansu[1]);
trace(tansu[2]);
/*結果は以下のようになる。
5
10
7
*/

あと【tansuの中身をひとつ抜き出して表示する】の別の方法として、
森さまのアドバイスsubstringを使おうとしたのですが、
表示が「5,10,7,11,8,4,12,9,2,6,3,1」のため、
「,」が入ってsubstringができない模様。
splitで抜き出しも考えましたが、うまくいきません。

tansu_1=tansu.split(",");
trace(tansu_1[0]);
//結果は「undefined」


助言のほど、よろしくお願いいたします。

参考過去ログ:
ランダムにクイズを出題したい
MXで外部テキストを利用したランダムクイズの作成
森 巧尚
Åê¹ÆNo.21166
投稿日時: 2005-10-30 20:32
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: 配列からひとつずつ呼び出してシャッフル再生
引用:
【シャッフルした配列をひとつ抜き出して再生すること】です。

//tansuの中身をひとつ抜き出して表示する。
trace(tansu[0]);
trace(tansu[1]);
trace(tansu[2]);

で、すでに配列をひとつずつ抜き出すことはできているようですよ。0、1、2のところを変数で指定してやればいいのです。

配列を変数で指定して、その変数がtansu.length(tansu配列の総数)より小さい場合は取り出して、値を1つ足していけば1つずつ取り出せますよ。
↓これはfor文で繰り返しを行なっていますが、繰り返し処理を行なっているところでif文で同じように調べてもいけます。
toridashi = 0;
for (i = 0; i < tansu.length; i++) {
	nakami = tansu[toridashi];
	toridashi++;
	trace(nakami);
}


別の方法もあります。shift()を使って、本当に配列から1つずつ値を取り出して配列から消していくという方法です。配列の中身は順番に消えていくのであとから使いたい場合などは使えませんけれど。
do {
	nakami = tansu.shift();
	trace(nakami);
} while(0 < tansu.length);


また、splitについてですが、tansuはすでに配列なので「tansu.split(",");」は効かないですよ。trace文で表示すると「5,10,7,11,8,4,12,9,2,6,3,1」と表示されていますけれど、実際のtansuの中身は数字の配列だからです。splitは、1つの文字列を配列に分割するときに使います。


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

ひろゆき
Åê¹ÆNo.21167
投稿日時: 2005-10-30 20:52
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 配列からひとつずつ呼び出してシャッフル再生
ランダムにクイズを出題したい
MXで外部テキストを利用したランダムクイズの作成

出題番号をどこかに記録していく必要があるのではないかと思います。

また、flaファイルでつけてあるフレーム名をそのまま使って、
フレーム移動を行うのであれば、その配列を作っておく必要があるかもしれません。

_root 第1フレーム
// ここでは6番目以降は省略しました
frameName = ["first","second","third","fourth","fifth"];
questionNum = 0;
// ここでは6番目以降は省略しました
tansu = [1, 2, 3, 4, 5];
for (i=0; i<100; i++) {
	hikidashi1 = Math.floor(Math.random()*tansu.length);
	hikidashi2 = Math.floor(Math.random()*tansu.length);
	work = tansu[hikidashi1];
	tansu[hikidashi1] = tansu[hikidashi2];
	tansu[hikidashi2] = work;
}


startボタン/nextボタン
on (release) {
	questionNum ++;
	// 確認用
	trace("出題順: "+tansu);
	trace("何番目の問題か: "+questionNum);
	trace("出題する番号: "+tansu[questionNum-1]);
	trace("出題するフレーム名: "+frameName[tansu[questionNum-1]]);
	this.gotoAndPlay(frameName[tansu[questionNum-1]]);
}

というような感じで、いかがでしょう?

ボタンを押していった場合のtraceの結果は、
例えば、こんな感じになるでしょうか。
出題順: 3,2,4,1,5
何番目の問題か: 1
出題する番号: 3
出題するフレーム名: third

出題順: 3,2,4,1,5
何番目の問題か: 2
出題する番号: 2
出題するフレーム名: second

出題順: 3,2,4,1,5
何番目の問題か: 3
出題する番号: 4
出題するフレーム名: fourth

出題順: 3,2,4,1,5
何番目の問題か: 4
出題する番号: 1
出題するフレーム名: first

出題順: 3,2,4,1,5
何番目の問題か: 5
出題する番号: 5
出題するフレーム名: fifth


----------------
質問する際は、回答者に具体的な情報を与えてください。

Fla4man
Åê¹ÆNo.21168
投稿日時: 2005-10-30 22:30
職人
居住地: かまくら
投稿: 517
使用環境:
WinMe,Win2000,
Flash4,アズさん,大仏、delphi
Re: 配列からひとつずつ呼び出してシャッフル再生
いちいちラベルをつけるより
配列値+開始フレーム
にするか
配列値の先頭=先頭フレームにするほうが良いです。

問題を1frame目にストップをおいておいて一つのムービーとしておき
そのタイムラインに対してgotoandstopする形であれば
配列値がそのまま使えます。

無論配列値の先頭が0からである必要は無いからです。

あと根本的な問題としてFlashを使うのは
パソコンで表示ということだと思いますが
大学生には携帯の方が普及しているでしょうから
内容的にいってもFlashLiteにしたほうが多分点数は良いでしょうね、


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

葵-aoi-
Åê¹ÆNo.21189
投稿日時: 2005-11-1 2:18
新米
居住地: 三重県南部へ引っ越し
投稿: 29
使用環境:
WinXP / IE6.0
FlashMX2004
『おし!MX2004AS』
『ASバイブル』
Re: 配列からひとつずつ呼び出してシャッフル再生
レスが遅くなってすみません。
こんなにたくさんの助言を頂き、嬉しく思っています。

>>森さま
変数を分かりやすいように工夫してくださり、ありがとうございます。おかげで、どんな状態かを理解できました。
そして、for文とshift()を使ってみました。いずれもシンプルな文ですっきりと収めることができることに驚きです。
splitについては、おっしゃるとおりです(汗。配列と文字列を混ぜて考えていました。著者の本にはきちんと「文字の切り貼り」とあったのに見落としていました。ごめんなさい。

>>ひろゆきさま
参考過去ログをリンクする心遣い、感謝です。
なるほど、フレーム名に配列…!
当初、私は「Q」+「番号」のフレーム名にしようと思いました。ですが、単語ひとつひとつに固有のフレーム名を付けるとなると、それもうまくいかないということで悩み、さらにシャッフルできずに悩み…が連鎖して硬直状態が続きました。
早速ひろゆきさまの案で作ってみます。

>>Fla4manさま
引用:

Fla4manさんは書きました:
あと根本的な問題としてFlashを使うのは
パソコンで表示ということだと思いますが
大学生には携帯の方が普及しているでしょうから
内容的にいってもFlashLiteにしたほうが多分点数は良いでしょうね。

今回は英語教材開発なので、このフラッシュのほかにも「単語」「文法」「本文」の3つのテーマに分かれて、音声を付けて、マスク付けて字幕を流れるようにして…と内容盛りだくさんです(汗。CD一枚分には抑えたい…。
最近の大学生は教授や事務との連絡の為にも携帯は必須。また、私はFLASHを勉強し始めたころに3年間愛用した思い出たっぷりの携帯を、FLASH対応A5507SAに機種変しました。卒業研究が終わったら携帯用のFLASHも作って楽しみたいです。

問題の並び替えですが、配列値がそのまま使えるだなんて…。全く考えてなかったです(汗。
そして下記の部分が私にとって難しくて理解することができませんでした。勉強不足を痛感しております。
今後のActionScript学習のため、ご教授お願いします。

引用:

Fla4manさんは書きました:
いちいちラベルをつけるより
配列値+開始フレーム
にするか
配列値の先頭=先頭フレームにするほうが良いです。

問題を1frame目にストップをおいておいて一つのムービーとしておき
そのタイムラインに対してgotoandstopする形であれば
配列値がそのまま使えます。


私の解釈(おそらく間違い):
【配列値+開始フレーム】
例えば1から5まで値をシャッフルした配列が
(ひろゆきさまのシャッフルと同じ順番ですが)
「3,2,4,1,5」となっていた場合、
配列「0」番目の配列値が「3」となる。
開始フレーム番号が「18」ならば、
3+18
(↑この時点で頭がこんがらがっています(汗)

【配列値の先頭=先頭フレーム】
先頭フレーム=1
配列値の先頭(0番目)は3だとしたら、
3=1
たしか「=」は「←」の意味があったので、
「配列値の先頭に先頭フレームをあてる」のかな…。
ひろゆき
Åê¹ÆNo.21190
投稿日時: 2005-11-1 2:35
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 配列からひとつずつ呼び出してシャッフル再生
具体的な説明を欠けば、具体的な回答は得られにくいでしょう。
flaファイルを見てください。だけではなく、
flaファイルを覗かなくても、第三者にもわかるような説明をされた方がよろしいかと。

第15フレーム "program"
第44フレーム "hi"
第73フレーム "i"
第102フレーム "am"
第131フレーム "Aoi"
第160フレーム "im"
第189フレーム "iam"

となっているわけですから、

n番目の開始フレームは、15+29*(n-1) = 29*n-14 ですね。

_root 第1フレーム
questionNum = 0;
tansu = [1, 2, 3, 4, 5, 6, 7];
for (i=0; i<100; i++) {
		(中略)
}

startボタン/nextボタン
on (release) {
	questionNum ++;
	// 確認用
	trace("出題する番号: "+tansu[questionNum-1]);
	trace("出題するフレーム番号: "+(29*tansu[questionNum-1]-14));
	this.gotoAndPlay(29*tansu[questionNum-1]-14);
}

this.gotoAndPlay(15+29*(tansu[questionNum-1]-1));
も試してみてください。


あるいは...。

_root 第1フレーム
questionNum = 0;
tansu = [15, 44, 73, 102, 131, 160, 189];
for (i=0; i<100; i++) {
		(中略)
}

startボタン/nextボタン
on (release) {
	questionNum ++;
	// 確認用
	trace("出題するフレーム番号: "+tansu[questionNum-1]);
	this.gotoAndPlay(tansu[questionNum-1]);
}
とするとか。


----------------
質問する際は、回答者に具体的な情報を与えてください。

葵-aoi-
Åê¹ÆNo.21196
投稿日時: 2005-11-1 10:04
新米
居住地: 三重県南部へ引っ越し
投稿: 29
使用環境:
WinXP / IE6.0
FlashMX2004
『おし!MX2004AS』
『ASバイブル』
Re: 配列からひとつずつ呼び出してシャッフル再生
おはようございます。たった今、大学へ着いたところです。
ひろゆきさま、レスありがとうございます。
開始フレームを個々に調べてさらに数式に直すところ、お手数おかけしました。(あと自分で作っておいて言うのもなんですが、29というフレーム数が中途半端ですので、30フレーム数ずつに直したいと思います(汗)。たしかにこれならばフレーム名なしに考えることができそうです。早速両方とも試してみます。

時間がかかると思いますが、出来上がり次第報告致します。ありがとうございました。
葵-aoi-
Åê¹ÆNo.21231
投稿日時: 2005-11-2 15:44
新米
居住地: 三重県南部へ引っ越し
投稿: 29
使用環境:
WinXP / IE6.0
FlashMX2004
『おし!MX2004AS』
『ASバイブル』
Re: 配列からひとつずつ呼び出してシャッフル再生
皆様のおかげでできました!
感謝の気持ちでいっぱいです。ありがとうございます。

早速報告したいと思い、
完成したものを下記のアドレスにUPしました。

http://briefcase.yahoo.co.jp/aoinokotoba

シャッフルの仕方は
vol3(フレーム数) vol4(フレーム名) となっております。

初期のものと変わった点は以下です。
・40フレームにしました。
・配列をtansu=[1,2,3,4,5,6,7]ではなく、tansu=[0,1,2,3,4,5,6]としました。
(tansu=[1,2,3,4,5,6,7]にすると、なぜかtansu[7]でundefinedが出力されるため。)
・最後の配列番号(7番目)になると、ENDへ飛ぶようにしました。
(配列lengthを使用。)
・nextボタンの他にTry again!とI can see it!を追加しました。
(フレーム移動はフレーム数指定…。)

[vol3のon/nextボタン]***********************************************
on (release) {
questionNum++;
//シャッフルの中身を開始フレーム数で考える。
trace("出題順: "+tansu);
trace("出題する番号: "+tansu[questionNum-1]);
trace("出題するフレーム番号: "+(40*tansu[questionNum-1]+2));
this.gotoAndPlay(40*tansu[questionNum-1]+2);
if (questionNum == 7) {
this.gotoAndPlay("end");
}
}

[vol4のon/nextボタン]***********************************************
on (release) {
questionNum++;
//シャッフルの中身をフレーム名と一緒に表示する。
trace("出題順: "+tansu);
trace("何番目の問題か: "+questionNum);
trace("出題する番号: "+tansu[questionNum-1]);
trace("出題するフレーム名: "+frameName[tansu[questionNum-1]]);
this.gotoAndPlay(frameName[tansu[questionNum-1]]);
if (questionNum == 7) {
this.gotoAndPlay("end");
}
}

?vol3とvol4を作ってみて?
vol3は、フレーム名をつけずに簡単に飛べて素敵。
vol4は、ミスった時、どの単語がおかしいのかをチェックできるところが素敵。
どちらに統一するか迷いましたが、
おっちょこちょいな私なのでvol4でいきたいと思います。

ご教授、ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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