=======================================
             第7回:メロディーと効果音の発生
=======================================

*基本課題

1、ボールが壁やラケットにあたったら、
   「こつっ」という効果音が出るようにしてみよう。

2、MIDIを拾ってきて、ゲームのBGMを流してみよう
    (midiファイルを入手できなかった人は、課題3に進みましょう)

*応用課題

3、20回ボールを受けたらゲームが終了するようにしてみよう。
    (GAME CLEAR)

4、クリアーした時に画面中央に「CLEAR!!」と表示して音を鳴らそう。

*難関応用課題

5、バーが動いている時と停まっている時とで、
    ボールの跳ね返り方を変えてみよう。

=======================================

基本課題ができると、、、ゲーム中に効果音が!

応用課題ができると、、、ゲームクリアー画面が!

ということで、頑張りましょう。

=======================================

<課題ができたら>

提出:
	To: report
	Subject: game7

  ・プログラムと供に、何をするプログラムかを明記し、感想も忘れずに。
	名前も漢字で書いてください。

=======================================

<ダウンロード>

まずはダウンロードの手引きを参考に、
Vodafone用のエミュレーターをダウンロードしてください。

=======================================


<基本課題1>

1、ボールが壁やラケットにあたったら、
   「こつっ」という効果音が出るようにしてみよう。

・準備1:Vodafone用アプリのbuild

音はVodafone用のエミュレータでしか鳴らせません。
まずはコンパイルツールを改造してVodafone用アプリを
buildできるようにします。

[project]->[edit env]を選んで設定ウインドウが出てくるので、
上の方にあるタブの[build]を押して、
一番下のclasses pathをc:\V-appli_SDK_122\lib\stubclasses.zip
に変更してください。
(エミュレーターをインストールしたフォルダを指定します
マシンによってはDドライブ等にインストールされるので、
指定した場所にファイルがあるか確認してください)

[tool]->[default env]の方も変えると、新しいプロジェクトを作った時も
Vodafoneで動く物をbuildすることができます。

設定が終わったら試しにbuildしてみましょう。
プログラム、リソースはそのままで構いません。
buildできたら、スタートメニューをからVodafoneのエミュレータを起動して
うまく動くか試してみましょう。

・準備2:音素材の準備

音を鳴らす為にはまず、音のファイルを準備することが必要です。
http://smaf-yamaha.com/jp/tools/downloads.html
から、PLF-L1を落としてください。
中に様々な音が入っています。



適当に選んでresフォルダに入れましょう。
この際、名前を変更する必要があります。
snd0.spf,snd1.spf,snd2.spfというように、
0から順番に名付けましょう。

・プログラム

gameCanvas.javaをvodafone用のものに切り替えましょう。
ダウンロードしてsrcフォルダのgameCanvas.javaを上書きしてください。
音素材が見つからなかった人は
snd0.spfをresフォルダに入れてください。

コンストラクタで音数を宣言します。
gc.setSoundNum(音の数);
こうすると、sndX.spfというファイルを
順番に自動的に読み込んでくれます。

音の数が1だとsnd0.spfのみ、
音の数が2だとsnd0.spfとsnd1.spfを読み込みます。

あとは鳴らしたい所で
gc.setSound(音の番号,gc.SOUND_PLAY,gc.PLAY_ONESHOT);
を呼ぶと音がなります。

跳ね返り処理のところに音を鳴らす命令を挟みましょう。

また、音を停めたい場所で
gc.setSound(音の番号,gc.SOUND_STOP,0);
を呼ぶと音がとまります。
再生中はplay命令が無視されるので、
再生中にもう一度鳴らしたい時は一度stopを呼びましょう。

再生していない時にstopを呼んでも特に不具合はないので
gc.setSound(音の番号,gc.SOUND_STOP,0);
gc.setSound(音の番号,gc.SOUND_PLAY,gc.PLAY_ONESHOT);

と常にセットで呼べば再生が無視されることはなくなります。


=======================================

☆エミュレータがうまく起動しない

Registry key 'SoftWare/JavaSoft/java Runtime Environment/Current/Version'
has value '1.5',but '1.3'/'1.4' is required.

Error; could not fine java.dll
Error: colud not fine Java 2 Runtime Environment.
Emulator boot-up timeout.

上記のエラーが出てしまうひとは、
java2 Runtime Environmentが新しすぎます。
コントロールパネル→プログラムの追加と削除→プログラムの変更と削除から
J2SE RUNTIME Environmtn 5.0 update2 を削除してください。

=======================================

<基本課題2>

2、MIDIを拾ってきてspf(phrase)に変換して、ゲームのBGMを流してみよう
    (拾えなかった人は、飛ばしましょう)

音を鳴らす為にはまず、midiファイルを準備することが必要です。
スタート→検索→ファイルとフォルダを探すで*.midを検索すると、
マシン上のmidファイルを探すことができます。

見つかったら作業用ディレクトリーにコピーしましょう。
見つからなかったらネット上から拾って来ましょう。
ネットにつながってい人は、あきらめて次の課題に進みましょう。

まず、midをspf(phrase)に変換する必要があります。
変換ツールはここから落としましょう。
http://smaf-yamaha.com/jp/tools/downloads.html
ATS-SMAFPhraseL1をダウンロードしてください。
(※似たようなファイルがあるので間違えないよう注意しましょう)

4和音以上のmidiは変換時に4和音づつ選んで変換することになります。
spfは4種類まで同時に再生できるので
スペック的には同時に16和音まで鳴らすことが可能ですが、
全部BGMに使ってしまうと効果音が鳴らせなくなります。

音は同時に4種類まで使えるので、
それぞれ別の音を準備して、
snd0.spf,snd1.spf,snd2.spf,snd3.spf
と名付けましょう。

bgmとして流しっ放しにしたい場合は
gc.setSound(音の番号,gc.SOUND_PLAY,gc.PLAY_LOOP);
を呼びます。

鳴らすのを停めたい場合は、
gc.setSound(音の番号,gc.SOUND_STOP,0);
を呼びます。

ゲーム開始時に(initGame内で)音を鳴す命令、
終了時に音を停める命令を呼べば、
ゲーム中だけbgmを鳴らすことができます。

※以下参考

ボリューム変更
gc.setSound(0or1or2or3,gc.SOUND_VOL,音量);

音量は4段階撰べます。
gc.VOL_NONE 無音
gc.VOL_MIN 小
gc.VOL_MID 中
gc.VOL_MAX 大

音ファイル読み替え(どうしても4種類以上の音を使いたい人用)

1、読み込み
gc.setSoundNum(使いたい音の数);

gc.setSoundNum(10);
コンストラクタにこう書くことで、snd0〜snd9まで
読み込んでくれます。

2、再生等
setSoundの最初の引数は0〜3までしか受け付けません。

初期状態では引数0〜3はsnd0.spf〜snd3.spfが鳴るよう
設定されていますが、
それぞれ別の音に設定しなおすことができます。

下記が引数1にsnd9.spfを割り当てる例です。

gc.setSound(1,gc.SOUND_STOP,0);//音を停止する
gc.setSound(1,gc.SOUND_LOAD,9);//snd9.spdを1番にセット
gc.setSound(1,gc.SOUND_PLAY,gc.PLAY_ONESHOT);//snd9.spdが再生される。

=======================================

<応用課題3>

3、20回ボールを受けたらゲームが終了するようにしてみよう。
    (GAME CLEAR)

ボールを受けておく回数を保存しておく為の変数が必要です。
int num=0;を用意します。
あとは、跳ね返り処理のところで、numの値を増やしてあげます。

終了はgameStateを2にすることで行います。
もしnumが20以上なら、gameStateを2に

=======================================

<応用課題4>

4、クリアーした時に画面中央に「CLEAR!!」と表示して音を鳴らそう。

spfは4種類まで同時に鳴すことができます。
gameStateを2にする時に音を鳴してやります。

あとは文字を表示します。
paint()内でgameStateの値を見て

ゲームオーバーの時もクリアーの時もゲームが終了するので、
スコアによって表示するメッセージを変えます。

もしgameStateが2なら→"CLEAR!"と表示

=======================================

<難関応用課題5>

5、バーが動いている時と停まっている時とで、
    ボールの跳ね返り方を変えてみよう。

動いているか停まっているかはbardxの値で判断します。

if(跳ね返り判定)
{
  跳ね返り処理
  if(bardx>0) dxを1足す。
  if(bardx<0) dxから1引く。
}

などなど。

物理法則とは多少違いがありますが、
ただボールを受けるだけでなく、
ボールの動きを自分で変えられるようになります。

=======================================