繰り返しになりますが、エディタの導入をお願いします。
エディタは、プログラムを書くためのソフトです。
テキストの、ツール・素材の紹介ページにエディタがありますので、ダウンロードして使いましょう。
こちらです。
特に、Windows の方は xyzzy を必ず使って下さい。
本格的にプログラムを書く上で、ちゃんとしたエディタを使うことは欠かせません。
絶対にメモ帳を使ってはいけません。
※勘違いしている方が多いようですが、メモ帳などのエディタはあくまで 「テキストファイルを編集するためのソフト」です。
メモ帳で保存したからといって、保存するデータが変わるわけではありません。
メモ帳で保存しても、xyzzy で保存しても、保存される .java ファイルの形式は変わりません。
しかし、メモ帳を使って作業をされると、今後困りますので、極力 xyzzy を使うようにしてください。
プログラミングが苦手で、上手くいかず質問してくる人ほど xyzzy を使っていないケースが多く、非常に困ります
自力でできず、TA・SAに質問しようという人は、必ず xyzzy を使うようにして下さい。
まず、本日の講義資料をダウンロードしてください。
第4回資料(Windows用)
第4回資料(Mac用)
今までの授業で作ってきたテニスゲームに、タイトル画面を追加してみます。
ダウンロードした資料を解凍して、Sample01フォルダ直下にあるgame.javaを開いて下さい。
/********* 変数定義はこちらに *********/ (中略) // ゲームの状態 int gameState; /********* 初期化の手順はこちらに *********/ public void initGame() { (中略) // ゲームの状態を初期化 gameState = 0; }
ゲームの状態を表す変数が追加され、0で初期化されています。
/********* 物体の移動等の更新処理はこちらに *********/ public void updateGame() { // タイトル画面 if(gameState == 0) { // Enterキーが押されたらゲーム開始 if(gc.isKeyPushed(gc.KEY_ENTER)) { gameState = 1; } } // ゲーム画面 else if(gameState == 1) { (中略) } }
gameState の中身に応じて、画面が切り替わっています。
今回は、0 がタイトル画面、1 がゲーム画面です。
最初は、gameState の中身が 0 なので、if(gameState == 0) が真となり、タイトル画面の部分が実行されます。
Enterキーが押されると、gameState の中身は 1 となります。
gameState の中身が 1 の場合、else if(gameState == 1) の方が真となり、ゲーム画面の部分が実行されます。
(ゲーム画面部分の処理は、前回までにやった内容と同じです)
このように、画面に応じてゲームの状態が切り替わっていくことを、シーン遷移といいます。
/********* 画像の描画はこちらに *********/ public void drawGame() { // 画面を白で塗りつぶします gc.clearScreen(); // タイトル画面 if(gameState == 0) { // タイトル画面の文字を描画 gc.setColor(0, 0, 0); gc.drawString("テニスゲーム", 250, 150); gc.drawString("Push Enter" , 260, 250); } // ゲーム画面 else if(gameState == 1) { (中略) } }
drawGame も、gameState の中身に応じて場合分けを行っています。
gameState の中身が 0 の場合は、タイトル画面用の文字を描画。
gameState の中身が 1 の場合は、ゲーム画面の描画となります。
(ゲーム画面部分の描画は、前回までにやった内容と同じです)
画面の塗りつぶしは常に行う必要があるので、
gc.clearScreen(); だけは、gameState の中身に関係なく実行されます。
プレイ中にEnter キーを押すことで、ポーズできるようにします。
Sample02フォルダ直下にあるgame.javaを開いて下さい。
public void updateGame() { // タイトル画面 if(gameState == 0) { (中略) } // ゲーム画面 else if(gameState == 1) { // ENTERキーが押されたらポーズ if(gc.isKeyPushed(gc.KEY_ENTER)) { gameState = 2; } (中略) } // ポーズ画面 else if(gameState == 2) { // Enterキーが押されたらゲーム再開 if(gc.isKeyPushed(gc.KEY_ENTER)) { gameState = 1; } } }
変数定義、変数初期化の部分は、Sample01 と同一です。
今回は、0 がタイトル画面、1 がゲーム画面、2 がポーズ画面です。
ゲーム画面内に、Enterキーが押されたらポーズ画面へと切り替わる処理が追加されました。
if(gc.isKeyPushed(gc.KEY_ENTER)) が真となった場合に、gameState の中身を 2 に書き換えています。
else if(gameState == 2) の部分は、ポーズ画面の処理です。
Enter キーが押された場合、gameState の中身を 1 に書き換え、ゲーム画面へと切り替えています。
/********* 画像の描画はこちらに *********/ public void drawGame() { // 画面を白で塗りつぶします gc.clearScreen(); // タイトル画面 if(gameState == 0) { (中略) } // ゲーム画面 else if(gameState == 1) { (中略) } // ポーズ画面 else if(gameState == 2) { // ポーズ画面の文字を描画 gc.setColor(0, 0, 0); gc.drawString("PAUSE", 280, 200); } }
drawGame にも、ポーズ画面の描画が追加されました。
gameState の中身が 2 の場合は、ポーズ画面の描画となります。
ゲームプレイ中に音楽(BGM)を鳴らしてみましょう。
Sample03フォルダ直下にあるgame.javaを開いて下さい。
resフォルダの中に、bgm0.mid, bgm1.mid ファイルがあります。
GameCanvas では、.mid 形式のファイルを音楽(BGM) として利用することが出来ます。
ゲームで使いたい音楽ファイルは、bgm0.mid, bgm1.mid, bgm2.mid ... というファイル名でなければなりません。
playBgm 命令で、音楽を鳴らすことができます。
stopBgm 命令で、鳴っている音楽を停止することができます。
BGMを複数同時に鳴らすことはできませんので、注意して下さい。
では、game.java を見てみましょう。
Sample02からの変更点は、updateGame だけです。
/********* 物体の移動等の更新処理はこちらに *********/ public void updateGame() { // タイトル画面 if(gameState == 0) { // Enterキーが押されたらゲーム開始 if(gc.isKeyPushed(gc.KEY_ENTER)) { gameState = 1; // ゲーム開始なので、ゲーム画面の音楽を鳴らす gc.playBgm(0); } } // ゲーム画面 else if(gameState == 1) { // ENTERキーが押されたらポーズ if(gc.isKeyPushed(gc.KEY_ENTER)) { gameState = 2; // ポーズ中は曲を停止 gc.stopBgm(); } (中略) } // ポーズ画面 else if(gameState == 2) { // Enterキーが押されたらゲーム再開 if(gc.isKeyPushed(gc.KEY_ENTER)) { gameState = 1; // ゲーム開始なので、再び曲を再生 gc.playBgm(0); } } }
タイトル画面からゲーム画面に変わる部分では、gc.playBgm(0); を実行して、ゲーム用の BGM を再生しています。
ゲーム画面からポーズ画面に変わる部分では、gc.stopBgm(); を実行して、BGM を停止しています。
ポーズ画面からゲーム画面に変わる部分では、gc.playBgm(0); を実行して、再びゲーム用の BGM を再生しています。
ゲームで使う音楽ファイル(.mid ファイル)を配布しているサイトをいくつか紹介します。
以下のサイトにある素材を利用する場合には、利用規約に従うよう留意しましょう。
ゲームプレイ中に効果音(SE)を鳴らしてみましょう。
resフォルダの中に、snd0.wav, snd1.wav ファイルがあります。
GameCanvas では、.wav 形式のファイルを効果音(SE) として利用することが出来ます。
ゲームで使いたい音楽ファイルは、snd0.wav, snd1.wav, snd2.wav ... というファイル名でなければなりません。
playSe 命令を使うと、効果音(SE)を鳴らすことができます。
stopSe 命令で、鳴っている全ての効果音(SE) を停止することができます。
BGM とは違って、同時に複数の効果音を鳴らすことが可能です。
では、game.java を見てみましょう。
/********* 物体の移動等の更新処理はこちらに *********/ public void updateGame() { // タイトル画面 if(gameState == 0) { (中略) } // ゲーム画面 else if(gameState == 1) { (中略) // ボールと、ラケットが当たった場合に真 if(gc.checkHitRect(racket_x, racket_y, racket_w, racket_h, ball_x, ball_y, 24, 24)) { // ボールのY方向の速度を反転させる ball_speed_y = -ball_speed_y; // ラケットに当たったので、効果音を再生する gc.playSe(0); } } // ポーズ画面 else if(gameState == 2) { (中略) } }
ボールとラケットが当たった場合に、gc.playSe(0); を実行して、効果音を再生しています。
ゲームで使う効果音ファイル(.wav ファイル)を配布しているサイトを紹介します。
以下のサイトにある素材を利用する場合には、利用規約に従うよう留意しましょう。
今回の授業で学んだ内容を元に、テニスゲームを拡張して下さい。
満たすべき条件は次の通りです。
Kadai01フォルダの中のgame.javaを元に挑戦してみましょう。
answer01.jar ファイルを開くと、どのようにすれば良いか見ることができます。
課題1を、さらに改良してみましょう。
満たすべき条件は次の通りです。
Kadai02フォルダの中のgame.javaを元に挑戦してみましょう。
answer02.jar ファイルを開くと、どのようにすれば良いか見ることができます。
課題2を、色々な音が鳴るように改良してみましょう。
例えば、タイトル画面で音楽(BGM)を鳴らしても良いですし、
壁に当たった時やゲームオーバー時に効果音(SE)を鳴らしてもかまいません。
自分なりに色々工夫してみましょう。