上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--:--  |  スポンサー広告

2011.09.04 (Sun)

初クリアほかいろいろ。

気持ち程度ですが記事のフォントサイズを大きくしてみました。
少し読みにくいかなーと気になっていましたので、改善されていればいいのですが・・・

東方の方は、神霊廟Lのあまりの難易度に挫折気味。
あのときクリアできたのは、やっぱり奇跡だったのかな・・・

そこで、気分転換に
イージークリアまでしか出来ていなかった妖精大戦争に、また手をつけ始めました。
やるたびに思うのですが、これがほんとに"のーまる"の弾幕か!?ムズすぎる・・・
妖精大戦争01

でも、他の作品で少しは鍛えられたのか?
なんとか、のーまる初クリアできました~!
妖精大戦争02

まだA1、A2ルートの2ルートだけですが、これから全ルートクリアと、Extraクリアに向けて頑張っていこうと思います。

さて、話は変わりますが、前回の記事で書いた東方原曲用MP3プレイヤーのC#プログラミングについて、TageSPさんが下さったアドバイスを元に、ランダム再生機能の搭載に挑戦してみました。

結果は続きにて(興味ない方はスルーしてください)
[More・・・]
配列のシャッフル、これを聞いたときには一気に道が開けたような気がしたのですが、なかなか簡単にはいかないものですね。少し問題が出てきたのです。

ランダムボタンに曲の配列を作ってシャッフルする機能をつけるだけなら、

//10曲再生する場合
string[] ary = new string[10]{
 "music1.mp3", "music2.mp3", ・・・, music10.mp3};

System.Random rng = new System.Random();
int n = ary.Length;
while (n > 1)
{
 n--;
 int k = rng.Next (n + 1);
 string tmp = ary[k];
 ary[k] = ary[n];
 ary[n] = tmp;
}

と、こんな感じで出来たのですが、これをどうやって再生すればよいか、大変に悩みました。
たとえば、

int i = -1;
while (i < 10)
{
 i++;
 axPlayer.URL = @"C:¥MusicFolder¥" + ary[i];
 axPlayer.Ctlcontrols.play();
}

という風に書くと、i=0→1曲目が再生→i=1→2曲目が再生→・・・→i=9→10曲目が再生
という処理が一瞬で行われて、10曲目しか再生されないんですね。

そこで、ランダムボタンには配列を作ってシャッフルする機能とTimerコントロールのイベント発生機能だけつけて、Timerイベントで1曲目再生→Timerイベントで停止→2曲目再生→Timerイベント・・・というようにする必要があるようです(他に方法があるのかも知れませんが、私の腕ではそうせざるを得ない)。

しかし、ランダムボタンで作ったシャッフル済み配列を、Timerのイベントハンドラで参照することが出来ないのですね・・・Timerイベントの方に配列シャッフル機能を持たせてしまうと、1曲終了毎に配列がシャッフルされてしまうし・・・。
どうしたものかと、今日の明け方まで悩んでいました。

そして、ようやくたどり着いたのは、

まずランダムボタンで配列をシャッフルし、テキストボックスに表示する
ランダム再生機能

次に、Timerのイベントハンドラで、テキストボックスの数字を読み取って配列を作り直し、順番に再生する
という形です。

ソースコードはこんな感じ

//ランダムボタンを押したときのイベント
private void RandOn_Click(object sender, EventArgs e)
{
 i = -1;
 //10曲再生する場合
 string[] ary1 = new string[10]{
  "0", "1", "2",・・・, "9" }; 

 //配列のシャッフル
 System.Random rng = new System.Random();
 int n = ary1.Length;
 while (n > 1)
 {
  n--;
  int k = rng.Next (n + 1);
  string tmp = ary1[k];
  ary1[k] = ary1[n];
  ary1[n] = tmp;
 }
 
 //シャッフルした配列をテキストボックスに表示
 tbx1.Text = ary1[0];
 tbx2.Text = ary1[1];
     ・
     ・
     ・
 tbx10.Text = ary1[9];

 timer2.Enabled = true; //タイマー機能を使用
}

//タイマーイベント発生時のイベント
private void timer1_Tick(object sender, EventArgs e)
{
 string[] ary2 = new string[10]{
  "music1.mp3", "music2.mp3", ・・・, "music10.mp3" };
 int[] ary3 = new int[10]{
  151000, 127000, ・・・, 184000}; //各曲の再生時間

 //テキストボックスからシャッフル済み配列を作成
 int[] ary4 = new int[10]{
  int.Parse(tbx1.Text),
  int.Parse(tbx2.Text),
       ・  
       ・
       ・
  int.Parse(tbx10.Text)
 };

 i++;

 if (i != 10)
 {
  int j = ary4[i];
  timer1.Interval = ary3[j];
  axPlayer.URL = @"C:¥MusicFolder¥" + ary2[j];
  axPlayer.Ctlcontrols.play();
 }
 else
 {
  axPlayer.Ctlcontrols.stop();
  timer1.Enabled = false;
 }

とてもスマートとは言えませんが、何とかこんな感じでランダム再生機能を持たせることができたようです。

TageSPさんのアドバイスがなければ、今も途方にくれていたことと思います。
本当にありがとうございました~!!

スポンサーサイト

テーマ : 東方Project - ジャンル : ゲーム

15:44  |  未分類  |  トラックバック:(0)  |  コメント:(10)

Comment

よろしい、ならば妖精大戦争だっ!!
「「「クリーク!!クリーク!!クリーク!!」」」


ノーマルとは思えん弾幕ですね・・・これが妖精の本気っ!

ルナティッククリアしたら、きっとEXで炎の妖精とかでるに違いないwww
山猫AK |  2011.09.04(日) 17:21 | URL |  [編集]

こんにちは

流石、飲み込みが、お早いですね。
私には、C言語は、読むので精一杯ですよ・・・。

>まずランダムボタンで配列をシャッフルし、テキストボックスに表示する

分かります。
私も、昔は、コントロールにデータを
一旦、移してやっていました。

確かに、スマートではないですが、
そのほうが、
直感的で、やり易いですよね。

スマートにするなら、
テキストボックスの代わりに
新たに、文字列の配列を用意して
そこから読んでもいいですし。

欲を言うなら、
シャッフルして生成した、
グローバル定義の、文字列の配列より、
直接、再生管理できると、よりスマートですが、

まあ、
プログラムなんて、答えもないですし、
望み通りに動いたら、それが正解
だと思います。

こちらこそ、
勉強になりました。

ありがとうございました。
TageSP |  2011.09.04(日) 21:16 | URL |  [編集]

こんばんは~!

妖精大戦争ですか(`・ω・´)
アイスバリアが無いと、ノーマルでも、
ルナティックレベルになりますよね~><
アイスバリアありがたや~です。。

エキストラ頑張って下さい!
のったん |  2011.09.04(日) 21:29 | URL |  [編集]

妖精大戦争難しいですよね
チルノってすごいな~と思わされた作品でしたw
ノーマルクリアできない(泣)

さて本格的にプログラミング勉強しようかな・・・
ジョバンニ |  2011.09.05(月) 18:05 | URL |  [編集]

Re: タイトルなし

山猫AKさん>

元ネタ探すの大変でしたが、HELLSINGですね。
最初エロゲーがHITしてこれか!?と思ってしまったw
HELLSINGは自分も読んでいたはずなのに・・・

なにっ!ルナティッククリアするとExが更に鬼畜になるというのか!!
お、恐ろしい・・・
でも、ノーマルでこれなんで、ルナはたぶん無理な気がします(あきらめたくはないけど・・・)
WreN to Kanna |  2011.09.05(月) 20:00 | URL |  [編集]

Re: タイトルなし

TageSPさん>

おお、TageSPさんでも似たようなやり方してた時期があるのですね。
少し安心・・・

なるほど、スマートな方法も色々あるようですが、
すみません、今の私ではあまり理解できなかったり・・・
でも、テキストボックスを使わずにできそうな方法も1つ思いついたので、
今度試してみようと思ってます!

プログラムに答えなんて無いというのはおっしゃるとおりですね。
かっこいいプログラムが書けるに越したことはないんでしょうが、
不恰好でもなんとか望みの機能が得られるのは初心者にもうれしい限りです。

これからも精進したいと思います。
ありがとうございました~!
WreN to Kanna |  2011.09.05(月) 20:09 | URL |  [編集]

Re: タイトルなし

のったんさん>

こんばんは~!

いくら弱いチルノの主観とはいえ、やっぱり弾が多いですよね。
でもアイスバリアのシステムにとっては弾が少ないと面白くないし・・・

やはり私の修行が足りないということですよね。
ありがたや~なアイスバリアを使いこなせるように頑張ります~!

ありがとうございました~!!
WreN to Kanna |  2011.09.05(月) 20:15 | URL |  [編集]

Re: タイトルなし

ジョバンニさん>

やっぱりジョバンニさんもそう思いますか!

確かにあの弾幕に向かっていくチルノはすごい・・・けど、
チルノの主観で見てるから弾が多いという設定が笑えますねw

私もやっとノーマルクリアしたところで、今Bルートに挑戦してます。
でもAルートに比べBルートむず過ぎる気がするのは気のせいか?

プログラミングに興味あるなら、手を付けるのは早いほうがいいと思いますよ!
一緒に頑張りましょう!!
WreN to Kanna |  2011.09.05(月) 20:21 | URL |  [編集]

すごいですねぇ~
僕も早くやりたい!
時間がないので軽いんですみません。
また、改めてコメやらしてもらいます。
ゆゆ様さいこー!
夜桜 |  2011.09.05(月) 21:43 | URL |  [編集]

Re: タイトルなし

夜桜さん>

おや?妖精大戦争はまだ未プレイでしたか。
たまにやると気分転換にいいですよ!

最近お忙しいようですね。
無理しないように頑張ってください~!
ゆゆ様さいこー!!
WreN to Kanna |  2011.09.06(火) 21:16 | URL |  [編集]

コメント:を投稿する

Url
Comment
Pass  編集・削除に必要
Secret  管理者だけにコメント:を表示  (非公開コメント:投稿可能)
 

▲PageTop

Trackback

この記事のトラックバック URL

→http://wrentokanna.blog.fc2.com/tb.php/64-d4eb888a

この記事にトラックバックする(FC2ブログユーザー)

この記事へのトラックバック:

▲PageTop

 | ホーム | 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。