DISCO-F746NG test program "Baloon touch game"

Dependencies:   BSP_DISCO_F746NG F746_GUI F746_GUI_Other F746_OL_GUI LCD_DISCO_F746NG MATH_LIB_1 TS_DISCO_F746NG mbed

Committer:
InoueTakashi
Date:
Fri Jun 24 01:25:01 2016 +0000
Revision:
0:f385e51b61dc
Child:
1:a7abb5c6f912
DISCO-F746NG test program "Baloon touch game".

Who changed what in which revision?

UserRevisionLine numberNew contents of line
InoueTakashi 0:f385e51b61dc 1 //--------------------------------------------------------------------------------
InoueTakashi 0:f385e51b61dc 2 // バルーンタッチゲーム・プログラム
InoueTakashi 0:f385e51b61dc 3 //
InoueTakashi 0:f385e51b61dc 4 //
InoueTakashi 0:f385e51b61dc 5 // date: 2016/04/27
InoueTakashi 0:f385e51b61dc 6 // rev 0.9 date: 2016/5/18
InoueTakashi 0:f385e51b61dc 7 // rev 1.0 2016/6/8
InoueTakashi 0:f385e51b61dc 8 // author: Copyright (c) 2016 Takashi Inoue
InoueTakashi 0:f385e51b61dc 9 //--------------------------------------------------------------------------------
InoueTakashi 0:f385e51b61dc 10 #include "mbed.h"
InoueTakashi 0:f385e51b61dc 11
InoueTakashi 0:f385e51b61dc 12 #include "BlinkLabel.hpp"
InoueTakashi 0:f385e51b61dc 13 #include "ButtonGroup.hpp"
InoueTakashi 0:f385e51b61dc 14 #include "SeekbarGroup.hpp"
InoueTakashi 0:f385e51b61dc 15
InoueTakashi 0:f385e51b61dc 16 #include "GUIconst.hpp" //GUI用定数 (TI)
InoueTakashi 0:f385e51b61dc 17 #include "GUIinit.hpp" //GUI初期化 (TI)
InoueTakashi 0:f385e51b61dc 18 #include "ButtonGroupOL.hpp" //ButtonGroupオーバーラップクラス (TI)
InoueTakashi 0:f385e51b61dc 19 #include "NumericLabelOL.hpp" //Numerical Labelオーバーラップクラス (TI)
InoueTakashi 0:f385e51b61dc 20 #include "Circle.hpp" //GUI 円クラス (TI)
InoueTakashi 0:f385e51b61dc 21 #include "Rand.hpp" //乱数発生クラス (TI)
InoueTakashi 0:f385e51b61dc 22
InoueTakashi 0:f385e51b61dc 23 using namespace Mikami; //Mikami 名前空間を使用
InoueTakashi 0:f385e51b61dc 24 using namespace TakaIno; //TakaIno 名前空間を使用 (TI)
InoueTakashi 0:f385e51b61dc 25
InoueTakashi 0:f385e51b61dc 26 DigitalOut led(LED1);
InoueTakashi 0:f385e51b61dc 27
InoueTakashi 0:f385e51b61dc 28 Ticker timer; //タイマ割り込み
InoueTakashi 0:f385e51b61dc 29 extern void TimerIsr(); //タイマ割り込みハンドラ
InoueTakashi 0:f385e51b61dc 30
InoueTakashi 0:f385e51b61dc 31 int g_game_time = 0; //ゲーム時間用変数
InoueTakashi 0:f385e51b61dc 32 int g_game_prcs = 0; //ゲーム中のプロセス変数、最初は待機プロセス
InoueTakashi 0:f385e51b61dc 33
InoueTakashi 0:f385e51b61dc 34 const int G_GAME_LIMIT_TIME = 150; //ゲーム終了時間×0.1s
InoueTakashi 0:f385e51b61dc 35
InoueTakashi 0:f385e51b61dc 36 //タイマ割り込みハンドラ
InoueTakashi 0:f385e51b61dc 37 void TimerIsr()
InoueTakashi 0:f385e51b61dc 38 {
InoueTakashi 0:f385e51b61dc 39 if( g_game_prcs == 1 ) { //「ゲーム中プロセス」時に処理する
InoueTakashi 0:f385e51b61dc 40 g_game_time++; //ゲーム時間をカウントアップ
InoueTakashi 0:f385e51b61dc 41 if( g_game_time > G_GAME_LIMIT_TIME ) {
InoueTakashi 0:f385e51b61dc 42 //ゲーム終了時間になったら「ゲーム終了プロセス」にする
InoueTakashi 0:f385e51b61dc 43 g_game_time = G_GAME_LIMIT_TIME;
InoueTakashi 0:f385e51b61dc 44 g_game_prcs = 2;
InoueTakashi 0:f385e51b61dc 45 }
InoueTakashi 0:f385e51b61dc 46 }
InoueTakashi 0:f385e51b61dc 47 }
InoueTakashi 0:f385e51b61dc 48
InoueTakashi 0:f385e51b61dc 49 //----- メイン関数 -----------------------------
InoueTakashi 0:f385e51b61dc 50 int main()
InoueTakashi 0:f385e51b61dc 51 {
InoueTakashi 0:f385e51b61dc 52 GUIinit guiobj; //GUIクラスオブジェクト生成
InoueTakashi 0:f385e51b61dc 53
InoueTakashi 0:f385e51b61dc 54 //作業3: 表示する円の数を変えてみましょう 1~7
InoueTakashi 0:f385e51b61dc 55 //円クラスオブジェクト配列生成
InoueTakashi 0:f385e51b61dc 56 Circle cirary[ GUI_CIRCLE_MAX ]={DEF_CIR_INFO[0], DEF_CIR_INFO[1],DEF_CIR_INFO[2], DEF_CIR_INFO[3],
InoueTakashi 0:f385e51b61dc 57 DEF_CIR_INFO[4], DEF_CIR_INFO[5],DEF_CIR_INFO[6]};
InoueTakashi 0:f385e51b61dc 58
InoueTakashi 0:f385e51b61dc 59 Rand rndobj; //乱数発生クラスオブジェクト生成
InoueTakashi 0:f385e51b61dc 60 /*Q6*/
InoueTakashi 0:f385e51b61dc 61 int rndary[2], befo_rndary[2] = {-1,-1}; //今回と前回の乱数値用配列
InoueTakashi 0:f385e51b61dc 62
InoueTakashi 0:f385e51b61dc 63 int btn_num = 0; //今回押されたボタンの番号
InoueTakashi 0:f385e51b61dc 64 int befo_btn_num = -1; //前回押されたボタンの番号
InoueTakashi 0:f385e51b61dc 65 int score = 0;
InoueTakashi 0:f385e51b61dc 66 uint16_t btn_width = GUI_BTN_WIDTH; //ボタン表示の幅
InoueTakashi 0:f385e51b61dc 67 int idx; //各種配列操作用添え字
InoueTakashi 0:f385e51b61dc 68
InoueTakashi 0:f385e51b61dc 69 //GUIオブジェクトで、フォント16とボタン幅をセット
InoueTakashi 0:f385e51b61dc 70 guiobj.SetInit(Font16, btn_width);
InoueTakashi 0:f385e51b61dc 71
InoueTakashi 0:f385e51b61dc 72 // メインタイトルの表示、中央位置、フォント16
InoueTakashi 0:f385e51b61dc 73 Label title_obj(0,0, GUI_MAIN_TITLE, Label::CENTER, Font16); //
InoueTakashi 0:f385e51b61dc 74
InoueTakashi 0:f385e51b61dc 75 //ButtonGroupOLクラスオブジェクトの生成
InoueTakashi 0:f385e51b61dc 76 ButtonGroupOL btnary;
InoueTakashi 0:f385e51b61dc 77 //ボタン1(end),2,3を無効に ボタン0(start)を有効のままにする
InoueTakashi 0:f385e51b61dc 78 btnary.Inactivate(1); btnary.Inactivate(2); btnary.Inactivate(3);
InoueTakashi 0:f385e51b61dc 79
InoueTakashi 0:f385e51b61dc 80 /*Q5*/ //ゲーム時間の表示
InoueTakashi 0:f385e51b61dc 81 Label lb_time_obj(425,205, "Time", Label::LEFT, Font16, LCD_COLOR_YELLOW, LCD_COLOR_BLUE); //
InoueTakashi 0:f385e51b61dc 82 NumericLabelOL<int> timeobj(425, 220, "%03d", G_GAME_LIMIT_TIME - g_game_time, Label::LEFT, Font16, LCD_COLOR_WHITE, LCD_COLOR_DARKBLUE);
InoueTakashi 0:f385e51b61dc 83
InoueTakashi 0:f385e51b61dc 84 //ゲーム得点の表示
InoueTakashi 0:f385e51b61dc 85 Label lb_score_obj(425,235, "Score", Label::LEFT, Font16, LCD_COLOR_CYAN, LCD_COLOR_BLUE); //
InoueTakashi 0:f385e51b61dc 86 NumericLabelOL<int> scoreobj(425, 250, "%04d", score, Label::LEFT, Font16, LCD_COLOR_RED, LCD_COLOR_WHITE);
InoueTakashi 0:f385e51b61dc 87
InoueTakashi 0:f385e51b61dc 88 /*Q3*/ //円オブジェクトにより、円を描画する
InoueTakashi 0:f385e51b61dc 89 for( idx = 0; idx < GUI_CIRCLE_MAX; idx++ ) {
InoueTakashi 0:f385e51b61dc 90 cirary[idx].DrawCircle(true);
InoueTakashi 0:f385e51b61dc 91 }
InoueTakashi 0:f385e51b61dc 92
InoueTakashi 0:f385e51b61dc 93 timer.attach(&TimerIsr, 0.1f); //0.1秒ごとのタイマ割り込みを有効にする
InoueTakashi 0:f385e51b61dc 94 /*Q4*/ //無限ループ
InoueTakashi 0:f385e51b61dc 95 while(1) {
InoueTakashi 0:f385e51b61dc 96 if ( btnary.Touched(btn_num) == true ) {
InoueTakashi 0:f385e51b61dc 97 //ボタンが押され、1回目に押されたボタンと異なっていたら処理を行う
InoueTakashi 0:f385e51b61dc 98 if( befo_btn_num != btn_num ) {
InoueTakashi 0:f385e51b61dc 99 befo_btn_num = btn_num;
InoueTakashi 0:f385e51b61dc 100 /*Q2*/ switch(btn_num) { //ボタン番号により処理を分ける
InoueTakashi 0:f385e51b61dc 101 case 0:
InoueTakashi 0:f385e51b61dc 102 btnary.Inactivate(0); //ボタン0(start)を無効にする
InoueTakashi 0:f385e51b61dc 103 btnary.Activate(1); //ボタン1(end)を有効にする
InoueTakashi 0:f385e51b61dc 104
InoueTakashi 0:f385e51b61dc 105 //すべての円の移動を開始する
InoueTakashi 0:f385e51b61dc 106 for( idx=0; idx < GUI_CIRCLE_MAX; idx++) cirary[idx].MoveCircle(true);
InoueTakashi 0:f385e51b61dc 107
InoueTakashi 0:f385e51b61dc 108 score = 0; //得点を0クリア
InoueTakashi 0:f385e51b61dc 109
InoueTakashi 0:f385e51b61dc 110 //乱数用配列に、1回前と異なった乱数値を入れる
InoueTakashi 0:f385e51b61dc 111 for( idx=0; idx < 2; idx++) {
InoueTakashi 0:f385e51b61dc 112 do {
InoueTakashi 0:f385e51b61dc 113 rndary[idx] = (int)rndobj.GetRand(GUI_CIRCLE_MAX);
InoueTakashi 0:f385e51b61dc 114 } while( rndary[idx]==befo_rndary[idx]);
InoueTakashi 0:f385e51b61dc 115 befo_rndary[idx] = rndary[idx];
InoueTakashi 0:f385e51b61dc 116 }
InoueTakashi 0:f385e51b61dc 117
InoueTakashi 0:f385e51b61dc 118 g_game_time = 0; //ゲーム時間を0クリア
InoueTakashi 0:f385e51b61dc 119 g_game_prcs = 1; //ゲーム中プロセスにする
InoueTakashi 0:f385e51b61dc 120 break;
InoueTakashi 0:f385e51b61dc 121 case 1:
InoueTakashi 0:f385e51b61dc 122 g_game_prcs = 2; //ゲーム終了プロセスにする
InoueTakashi 0:f385e51b61dc 123 btnary.Inactivate(1); //ボタン1(end)を無効にする
InoueTakashi 0:f385e51b61dc 124 btnary.Activate(0); //ボタン0(start)を有効にする
InoueTakashi 0:f385e51b61dc 125
InoueTakashi 0:f385e51b61dc 126 befo_btn_num = -1; //1回前に押されたボタンは無しとする
InoueTakashi 0:f385e51b61dc 127
InoueTakashi 0:f385e51b61dc 128 //すべての円の移動を停止する
InoueTakashi 0:f385e51b61dc 129 for( idx=0; idx < GUI_CIRCLE_MAX; idx++) cirary[idx].MoveCircle(false);
InoueTakashi 0:f385e51b61dc 130
InoueTakashi 0:f385e51b61dc 131 g_game_prcs = 0; //待機プロセスにする
InoueTakashi 0:f385e51b61dc 132
InoueTakashi 0:f385e51b61dc 133 break;
InoueTakashi 0:f385e51b61dc 134 default:
InoueTakashi 0:f385e51b61dc 135 break;
InoueTakashi 0:f385e51b61dc 136 }
InoueTakashi 0:f385e51b61dc 137 }
InoueTakashi 0:f385e51b61dc 138 }
InoueTakashi 0:f385e51b61dc 139 btn_num++; //ボタン番号を増加
InoueTakashi 0:f385e51b61dc 140 if( btn_num >= GUI_NUMBER_BUTTONS ) btn_num=0; //ボタン番号範囲内に限定する
InoueTakashi 0:f385e51b61dc 141
InoueTakashi 0:f385e51b61dc 142 if( g_game_prcs == 1 ) { //ゲーム中プロセスであれば以下の処理を行う
InoueTakashi 0:f385e51b61dc 143
InoueTakashi 0:f385e51b61dc 144 //GUI_CIRCLE_MAX分の円を動かす
InoueTakashi 0:f385e51b61dc 145 for( idx=0; idx < GUI_CIRCLE_MAX; idx++) {
InoueTakashi 0:f385e51b61dc 146 cirary[idx].ChangeCirclePos();
InoueTakashi 0:f385e51b61dc 147 }
InoueTakashi 0:f385e51b61dc 148
InoueTakashi 0:f385e51b61dc 149 for( idx=0; idx < GUI_CIRCLE_MAX; idx++) {
InoueTakashi 0:f385e51b61dc 150 if( cirary[idx].CircleTouched() ) {
InoueTakashi 0:f385e51b61dc 151 //idx番目の円を触ったら、円の色を反転する
InoueTakashi 0:f385e51b61dc 152 cirary[idx].ReverseCircleColor();
InoueTakashi 0:f385e51b61dc 153 if( idx == rndary[0] ) score += GUI_ADD_POINT1;//乱数0と一致している円であれば、加点
InoueTakashi 0:f385e51b61dc 154 else if (idx == rndary[1] ) score += GUI_ADD_POINT2;//乱数1と一致している円であれば、加点
InoueTakashi 0:f385e51b61dc 155 else score += GUI_DEME_POINT; //それ以外の円であれば、減点
InoueTakashi 0:f385e51b61dc 156 }
InoueTakashi 0:f385e51b61dc 157 }
InoueTakashi 0:f385e51b61dc 158 }
InoueTakashi 0:f385e51b61dc 159
InoueTakashi 0:f385e51b61dc 160 //以下は、タイマにより、ゲームが終了する場合の処理
InoueTakashi 0:f385e51b61dc 161 if( g_game_prcs == 2 ) {
InoueTakashi 0:f385e51b61dc 162 btnary.Inactivate(1); //ボタン1(end)を無効にする
InoueTakashi 0:f385e51b61dc 163 btnary.Activate(0);//ボタン0(start)を有効にする
InoueTakashi 0:f385e51b61dc 164
InoueTakashi 0:f385e51b61dc 165 befo_btn_num = -1; //1回前に押されたボタンは無しとする
InoueTakashi 0:f385e51b61dc 166
InoueTakashi 0:f385e51b61dc 167 //すべての円の移動を停止する
InoueTakashi 0:f385e51b61dc 168 for( idx=0; idx < GUI_CIRCLE_MAX; idx++) cirary[idx].MoveCircle(false);
InoueTakashi 0:f385e51b61dc 169
InoueTakashi 0:f385e51b61dc 170 g_game_prcs = 0; //待機プロセスにする
InoueTakashi 0:f385e51b61dc 171 }
InoueTakashi 0:f385e51b61dc 172
InoueTakashi 0:f385e51b61dc 173 if( g_game_prcs == 1) {
InoueTakashi 0:f385e51b61dc 174 //ゲーム中プロセスであれば、残り時間の表示
InoueTakashi 0:f385e51b61dc 175 timeobj.Draw("%03d", G_GAME_LIMIT_TIME - g_game_time,LCD_COLOR_WHITE, LCD_COLOR_DARKBLUE);
InoueTakashi 0:f385e51b61dc 176 //ゲーム中プロセスであれば、得点の表示
InoueTakashi 0:f385e51b61dc 177 /*Q1*/ if( score >= 0 ) {
InoueTakashi 0:f385e51b61dc 178 scoreobj.Draw("%04d", score, LCD_COLOR_BLACK, LCD_COLOR_GREEN);
InoueTakashi 0:f385e51b61dc 179 } else {
InoueTakashi 0:f385e51b61dc 180 scoreobj.Draw("%04d", score, LCD_COLOR_WHITE, LCD_COLOR_RED);
InoueTakashi 0:f385e51b61dc 181 }
InoueTakashi 0:f385e51b61dc 182 }
InoueTakashi 0:f385e51b61dc 183
InoueTakashi 0:f385e51b61dc 184 wait(0.01f); //10ms待つ
InoueTakashi 0:f385e51b61dc 185
InoueTakashi 0:f385e51b61dc 186 }
InoueTakashi 0:f385e51b61dc 187 }
InoueTakashi 0:f385e51b61dc 188
InoueTakashi 0:f385e51b61dc 189
InoueTakashi 0:f385e51b61dc 190
InoueTakashi 0:f385e51b61dc 191
InoueTakashi 0:f385e51b61dc 192
InoueTakashi 0:f385e51b61dc 193
InoueTakashi 0:f385e51b61dc 194
InoueTakashi 0:f385e51b61dc 195
InoueTakashi 0:f385e51b61dc 196