総合演習
ここでは総合演習として、MEMEs上で動作する簡単なゲームを作る。
内容は、LCD画面を右から左に流れてくる岩(?)を、ジョイスティックを使ってよける、というゲームである。
ゲームの雛形となるものを提示するので、まず動作を理解し、各自が機能を追加してよりゲームらしいものに仕上げていく。
memes_final
ソースコードの説明
1. main()関数
main()関数はつぎのように構成されている。
1) モジュールの設定
ここでは、使用するモジュールのスリープ解除を行い、各モジュールを次のように設定している。
- MTU2-CH0 : 100msごとにA/D変換器に対して変換開始要求を発行
- AD0 : MTU2からの変換開始要求を受け取り、AD0を変換(シングルモード)
- MTU2-CH1 : 100msごとにコンペアマッチが発生する
- CMT0 : LCD関数で使用するために、クロック選択(1/32)
2) 変数の初期化
[自分]の位置と、岩の位置は次のような構造体に格納している。
struct position { int x; int y; int active; }
x, yがLCD上の座標を示している。activeは岩が有効であるか(画面に表示されているのか)を示している。[自分]ではactiveは使用していない。
初期状態で、[自分]の位置の位置(me.x, me.y)を0に設定している。また、岩(最大6個)を非アクティブ状態に設定している。
3) メインループ
MTU2-CH1のコンペアマッチ(100ms)が発生するたびに、次の処理が実行されるようになっている。
(1) [自分]の移動:move_me()関数を呼び出して、AN0(ジョイスティック)を読み込み、上に移動/下に移動を判断している。
移動したときには、元の座標の’>’表示を消去している。また、移動しないときであっても、関数が呼ばれるたびに自分の位置に’>’を書いている。
(2) 岩の移動:move_rock()関数を呼び出して、岩を移動している。
岩の移動は少し頻度を落として、3回に1回(300msごと)としている。このタイミングを管理しているのがmove_timing変数である。
コンペアマッチが発生するたび(100msごと)に+1されて、2以上になるとmove_rock()関数などが実行される。move_timigは0, 1, 2, 0…と変化するのであるから、move_rock()は3回に1回実行されることになる。
岩を移動するタイミングでは、新しい岩を作り出す処理も行っている。岩を移動するたびにnew_timing変数を-1して、0以下であれば新しい岩を生成している。new_timingは乱数により作られているので、岩の間隔は不規則になる。
rand()関数は0からRAND_MAXの間の乱数を発生する。
rand() * 5 / (RAND_MAX + 1)は0~4の間の乱数になる。
演習問題
雛形として提示したものは、[自分]と岩が移動するだけで、ゲームとしては未完成である。SH7085の内蔵モジュールや、MEMEs上のデバイスを使用して、よりゲームらしいものに仕上げる。
1.スイッチ操作に関する機能
MEMEs上のプッシュスイッチを使って、SW6でゲーム開始、SW5でゲームの一時停止、SW4でゲームのリセット機能を実現すること。どのタイミングでSW入力を有効にするのかは各自で考えること.(main関数で現在の状態を遷移させている.)
・ ゲーム開始とは,スイッチを押すと自分と岩が表示されて動き出す機能である.(ゲームを開始する前には,LCD に「PUSH SW6」とタイトルを表示させる)
・ ゲームの一時停止とは,スイッチを押すとその状態を保持する機能であり,再度押すことにより再開される機能のことである.
・ゲームのリセットとは,スイッチを押すと画面がクリアされ初期状態(タイトルが表示された状態)に戻る機能である.(ゲーム開始スイッチを押すと初めからゲームが開始される)
2.自分自身の左右への移動機能
雛形として提示したプログラムの関数を改良し、[自分]が左右にも移動できる機能を実現すること。ただし、移動する量は各自で決め、描画エリアを意識して処理すること。
3.得点の表示機能
岩が画面左端に達して、消去されるときに+1点、岩と衝突したら-5点とし、表示は7セグメントLED 3桁で出力する。
実現のためのヒント
- score 変数を作る
- move_rock() 関数内で、岩が左端で消去されるときにscore 変数を +1 する
- 衝突検出関数をつくり、[自分]と岩の座標を比較する。一致していれば衝突と判断して、score 変数を -5 する。
- 7セグメントLED の表示は main() 内で行い、表示のダイナミック点灯の間隔はMTU2 のCH2 などで管理するとよい。
得点表示では、まず7セグメントLEDに何か適当な数値を表示する。表示動作ができれば、次にscore 変数を作り値を変更し表示を確認する。最後に衝突検出関数を作り、score 変数の更新を行うようにするとよい。
4.その他のオリジナル機能
MEMEsにはさまざまな機能があるので、ゲーム中で何に使えるのかを考えて、各自のアイデアで、よりゲームらしくなるような機能を追加すること。
(ゲームの途中で終了してしまった場合やゲーム自体をクリアした場合,その後,再スタートをする機能もオリジナル機能とみなす.)
※ 作成のコツは、いっぺんに作り込むのではなく、まず単純なものを作り、動作を確認してから次の処理を加えていく。