![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
main1.cpp@0:f385e51b61dc, 2016-06-24 (annotated)
- 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?
User | Revision | Line number | New 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 |