総合演習

 

ここでは総合演習として、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にはさまざまな機能があるので、ゲーム中で何に使えるのかを考えて、各自のアイデアで、よりゲームらしくなるような機能を追加すること。

(ゲームの途中で終了してしまった場合やゲーム自体をクリアした場合,その後,再スタートをする機能もオリジナル機能とみなす.)

※ 作成のコツは、いっぺんに作り込むのではなく、まず単純なものを作り、動作を確認してから次の処理を加えていく。

 

Copyright © 2012-2024 ミームス(MEMEs)のサポートページ All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.