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

Revision:
1:a7abb5c6f912
Parent:
0:f385e51b61dc
--- a/main1.cpp	Fri Jun 24 01:25:01 2016 +0000
+++ b/main1.cpp	Sat Jul 02 05:39:15 2016 +0000
@@ -5,128 +5,118 @@
 //  date:   2016/04/27
 //  rev 0.9   date: 2016/5/18
 //  rev 1.0   2016/6/8
+//  rev 1.1     2016/7/2
 //  author: Copyright (c) 2016 Takashi Inoue
 //--------------------------------------------------------------------------------
-#include "mbed.h"
+#include "main1.hpp"       //
 
-#include "BlinkLabel.hpp"
-#include "ButtonGroup.hpp"
-#include "SeekbarGroup.hpp"
+extern GUIinit  guiobj;
+extern  Circle cirary[GUI_CIRCLE_MAX];
+extern  ButtonGroupOL btnary;
+extern  NumericLabelOL<int> timeobj;
 
-#include "GUIconst.hpp"     //GUI用定数  (TI)
-#include "GUIinit.hpp"     //GUI初期化 (TI)
-#include "ButtonGroupOL.hpp"     //ButtonGroupオーバーラップクラス (TI)
-#include "NumericLabelOL.hpp"   //Numerical Labelオーバーラップクラス (TI)
-#include "Circle.hpp"     //GUI 円クラス (TI)
-#include "Rand.hpp"   //乱数発生クラス (TI)
+extern int  g_bln_num;  //バルーン表示個数
+extern  int g_game_time;        //ゲーム時間用変数
+extern  int g_game_prcs;        //ゲーム中のプロセス変数、最初は待機プロセス
 
-using namespace Mikami;     //Mikami 名前空間を使用
-using namespace TakaIno;    //TakaIno 名前空間を使用 (TI)
-
-DigitalOut led(LED1);
+extern void gui_init(void);
+//extern  void dsp_main_title(string main_title); // メインタイトルの表示
+extern  void dsp_main_title(char main_title[]); // メインタイトルの表示
+extern  void dsp_baloon(void);  //バルーン表示
 
-Ticker timer;                 //タイマ割り込み
-extern void TimerIsr();     //タイマ割り込みハンドラ
-
-int g_game_time = 0;        //ゲーム時間用変数
-int g_game_prcs = 0;        //ゲーム中のプロセス変数、最初は待機プロセス
-
-const int G_GAME_LIMIT_TIME = 150;  //ゲーム終了時間×0.1s
+extern  void btn_init(void);    //ボタン初期化
+extern  bool chk_btn_tch(int btn_num);  //あるボタン番号のボタンタッチを調べる
+extern  void set_btn_act_inact(bool act_ary[]); //ボタンの有効無効をセットする
 
-//タイマ割り込みハンドラ
-void TimerIsr()
-{
-    if( g_game_prcs == 1 )    {     //「ゲーム中プロセス」時に処理する
-        g_game_time++;      //ゲーム時間をカウントアップ
-        if( g_game_time > G_GAME_LIMIT_TIME ) {
-            //ゲーム終了時間になったら「ゲーム終了プロセス」にする
-            g_game_time = G_GAME_LIMIT_TIME;
-            g_game_prcs = 2;
-        }
-    }
-}
+extern  void set_new_rand(void);    //新しい乱数値をセットする
+extern  void chk_baloon_rand(int idx, int *score);//idx番目のバルーンが、2つの乱数と一致していれば加点、違っていれば減点する     
+extern  bool chk_baloon_tch(int idx);   //idx番のバルーンに触ったかどうかチェックする
+extern  void rvs_baloon_col(int idx);   //idx番のバルーンの色を反転する
+extern  void chg_baloon_pos(int idx);    //idx番のバルーンの表示位置を動かす   
+extern  void ena_baloon_mov(int idx, bool mov_flg); //idx番のバルーンの表示位置を動かすことを許可する
+                
+extern  void init_game_time(void);  //ゲーム時間表示の初期化
+extern  void dsp_game_time(void);   //ゲーム中プロセスであれば、残り時間の表示
+
+extern  void init_game_score(void); //ゲーム得点の初期化
+extern  void dsp_game_score(int score); //ゲーム得点の表示
+
+extern void TimerIsr();     //タイマ割り込みハンドラ
+//0.1秒毎のタイマ割り込みを有効にする
+extern  void ena_tim_irt(double tim_intvl);
 
 //----- メイン関数 -----------------------------
 int main()
 {
-    GUIinit     guiobj;      //GUIクラスオブジェクト生成
-
-//作業3: 表示する円の数を変えてみましょう 1~7
-    //円クラスオブジェクト配列生成
-    Circle cirary[ GUI_CIRCLE_MAX ]={DEF_CIR_INFO[0], DEF_CIR_INFO[1],DEF_CIR_INFO[2], DEF_CIR_INFO[3],
-                        DEF_CIR_INFO[4], DEF_CIR_INFO[5],DEF_CIR_INFO[6]};
-                        
-    Rand    rndobj;         //乱数発生クラスオブジェクト生成
- /*Q6*/   
-    int     rndary[2], befo_rndary[2] = {-1,-1};      //今回と前回の乱数値用配列
-
     int btn_num = 0;        //今回押されたボタンの番号
     int befo_btn_num = -1;  //前回押されたボタンの番号
-    int score = 0;
-    uint16_t btn_width = GUI_BTN_WIDTH;     //ボタン表示の幅
+/*課題6 */    bool btn_act_ary[4] = {true, false, false, false};     //ボタンの有効フラグを入れる配列
+    int score = 0;     //ゲーム点数     
     int idx;            //各種配列操作用添え字
 
-    //GUIオブジェクトで、フォント16とボタン幅をセット
-    guiobj.SetInit(Font16, btn_width);
-
-    // メインタイトルの表示、中央位置、フォント16
-    Label title_obj(0,0, GUI_MAIN_TITLE, Label::CENTER, Font16);   //
-    
-    //ButtonGroupOLクラスオブジェクトの生成 
-    ButtonGroupOL btnary;
-    //ボタン1(end),2,3を無効に  ボタン0(start)を有効のままにする
-    btnary.Inactivate(1);    btnary.Inactivate(2);    btnary.Inactivate(3);
+     gui_init(); //グラフィック初期化
+     
+     g_bln_num = 7;    //バルーン表示個数設定
+     
+    //ボタン初期化     
+    set_btn_act_inact(btn_act_ary); //ボタンの有効無効をセットする         
+         
+ /*課題5 */   // メインタイトルの表示
+    dsp_main_title("+++ Baloon Touch! GAME +++");   // メインタイトルの表示
+ 
+ /**/ //ゲーム時間の表示
+     init_game_time();  //ゲーム時間表示の初期化
+ 
+    //ゲーム得点の表示
+     init_game_score();   //ゲーム得点表示の初期化    
 
- /*Q5*/ //ゲーム時間の表示
-    Label lb_time_obj(425,205, "Time", Label::LEFT, Font16, LCD_COLOR_YELLOW, LCD_COLOR_BLUE);   //
-    NumericLabelOL<int> timeobj(425, 220, "%03d", G_GAME_LIMIT_TIME - g_game_time, Label::LEFT, Font16, LCD_COLOR_WHITE, LCD_COLOR_DARKBLUE);
-
-    //ゲーム得点の表示
-    Label lb_score_obj(425,235, "Score", Label::LEFT, Font16, LCD_COLOR_CYAN, LCD_COLOR_BLUE);   //
-    NumericLabelOL<int> scoreobj(425, 250, "%04d", score, Label::LEFT, Font16, LCD_COLOR_RED, LCD_COLOR_WHITE);
-
- /*Q3*/ //円オブジェクトにより、円を描画する
-    for( idx = 0; idx < GUI_CIRCLE_MAX; idx++ ) {
-        cirary[idx].DrawCircle(true);
-    }
-     
-     timer.attach(&TimerIsr, 0.1f);      //0.1秒ごとのタイマ割り込みを有効にする 
- /*Q4*/  //無限ループ
+ /**/
+    dsp_baloon();  //バルーン表示 
+ 
+     ena_tim_irt(0.1f); //0.1秒毎のタイマ割り込みを有効にする
+    
+ /*課題4*/  //無限ループ
     while(1) {
-        if ( btnary.Touched(btn_num) == true )   {
+        //ボタン番号btn_numのボタンタッチを調べる
+        if( chk_btn_tch(btn_num) == true )  {            
             //ボタンが押され、1回目に押されたボタンと異なっていたら処理を行う
             if( befo_btn_num != btn_num )   {
-                befo_btn_num = btn_num;
- /*Q2*/         switch(btn_num) {       //ボタン番号により処理を分ける
-                    case 0:
-                        btnary.Inactivate(0);   //ボタン0(start)を無効にする
-                        btnary.Activate(1);     //ボタン1(end)を有効にする
+                //今回押されたボタン番号を、1回前に押されたボタン番号として保存する
+                 befo_btn_num = btn_num;
+                
+ /*課題2*/         switch(btn_num) {       //ボタン番号により処理を分ける
+                    case 0:     //[start]ボタンが押された
+                        btn_act_ary[0] = false;   //ボタン0(start)を無効にする
+                        btn_act_ary[1] = true;     //ボタン1(end)を有効にする
+                        set_btn_act_inact(btn_act_ary); //ボタンの有効無効をセットする                       
 
-                        //すべての円の移動を開始する
-                        for( idx=0; idx < GUI_CIRCLE_MAX; idx++)       cirary[idx].MoveCircle(true);
-
+ /*課題3*/                 //すべての円の移動を開始する
+                        for( idx=0; idx < g_bln_num; idx++) {
+                             //idx番のバルーンの表示位置を動かすことを許可する
+                            ena_baloon_mov(idx, true);
+                        }
                         score = 0;      //得点を0クリア
-
-                        //乱数用配列に、1回前と異なった乱数値を入れる
-                        for( idx=0; idx < 2; idx++) {
-                            do {
-                               rndary[idx] = (int)rndobj.GetRand(GUI_CIRCLE_MAX);
-                            } while( rndary[idx]==befo_rndary[idx]);
-                            befo_rndary[idx] = rndary[idx];
-                        }
-
+ 
+                        set_new_rand();    //新しい2つの乱数値をセットする
+                        
                         g_game_time = 0;    //ゲーム時間を0クリア
                         g_game_prcs = 1;    //ゲーム中プロセスにする
+                        
                         break;
-                    case 1:
+                    case 1:     //[end]ボタンが押された
                         g_game_prcs = 2;    //ゲーム終了プロセスにする
-                        btnary.Inactivate(1);   //ボタン1(end)を無効にする
-                        btnary.Activate(0); //ボタン0(start)を有効にする
+                        
+                        btn_act_ary[1] = false;   //ボタン1(end)を無効にする
+                        btn_act_ary[0] = true;     //ボタン0(start)を有効にする
+                        set_btn_act_inact(btn_act_ary); //ボタンの有効無効をセットする       
+                                               
+                         befo_btn_num = -1;  //1回前に押されたボタンは無しとする
 
-                        befo_btn_num = -1;  //1回前に押されたボタンは無しとする
-
-                        //すべての円の移動を停止する
-                        for( idx=0; idx < GUI_CIRCLE_MAX; idx++)       cirary[idx].MoveCircle(false);
+                        //すべてのバルーンの移動を停止する
+                        for( idx=0; idx < g_bln_num; idx++) {
+                            //idx番のバルーンの表示位置を動かすことを禁止する
+                            ena_baloon_mov(idx, false);
+                        }
 
                         g_game_prcs = 0;    //待機プロセスにする
 
@@ -136,51 +126,49 @@
                 }
             }
         }
+/* 課題7*/
         btn_num++;  //ボタン番号を増加
         if( btn_num >= GUI_NUMBER_BUTTONS ) btn_num=0;  //ボタン番号範囲内に限定する
 
         if( g_game_prcs == 1 )    {         //ゲーム中プロセスであれば以下の処理を行う
 
-            //GUI_CIRCLE_MAX分の円を動かす
-            for( idx=0; idx < GUI_CIRCLE_MAX; idx++) {
-                cirary[idx].ChangeCirclePos();
-            }
+             for( idx=0; idx < g_bln_num; idx++) {
+                //idx番のバルーンの表示位置を動かす
+                chg_baloon_pos(idx);       
+                                 
+                //idx番のバルーンに触ったかどうかチェックする
+                if( chk_baloon_tch(idx) )   {
+                  
+                    rvs_baloon_col(idx);    //idx番のバルーンの色を反転する
 
-            for( idx=0; idx < GUI_CIRCLE_MAX; idx++) {
-                if( cirary[idx].CircleTouched() )   {
-                    //idx番目の円を触ったら、円の色を反転する
-                    cirary[idx].ReverseCircleColor();
-                    if( idx == rndary[0] )  score += GUI_ADD_POINT1;//乱数0と一致している円であれば、加点
-                    else if (idx == rndary[1] ) score += GUI_ADD_POINT2;//乱数1と一致している円であれば、加点
-                    else    score += GUI_DEME_POINT;    //それ以外の円であれば、減点
-                }
+                    chk_baloon_rand(idx, &score);  //idx番目のバルーンが、2つの乱数と一致していれば加点、違っていれば減点する                 
+                 }
             }
+            
+           //ゲーム中プロセスであれば、残り時間の表示
+             dsp_game_time();
+
+            //ゲーム中プロセスであれば、得点の表示
+             dsp_game_score(score);           
+          
         }
 
         //以下は、タイマにより、ゲームが終了する場合の処理
         if( g_game_prcs == 2 ) {
-            btnary.Inactivate(1);   //ボタン1(end)を無効にする
-            btnary.Activate(0);//ボタン0(start)を有効にする
-
+            btn_act_ary[1] = false;   //ボタン1(end)を無効にする
+            btn_act_ary[0] = true;     //ボタン0(start)を有効にする
+            set_btn_act_inact(btn_act_ary); //ボタンの有効無効をセットする       
+                        
             befo_btn_num = -1;  //1回前に押されたボタンは無しとする
 
             //すべての円の移動を停止する
-            for( idx=0; idx < GUI_CIRCLE_MAX; idx++)       cirary[idx].MoveCircle(false);
-
+            for( idx=0; idx < g_bln_num; idx++) {
+                 //idx番のバルーンの表示位置を動かすことを禁止する
+               ena_baloon_mov(idx, false);
+            }
             g_game_prcs = 0;    //待機プロセスにする
         }
 
-        if( g_game_prcs == 1)   {
-            //ゲーム中プロセスであれば、残り時間の表示
-            timeobj.Draw("%03d", G_GAME_LIMIT_TIME - g_game_time,LCD_COLOR_WHITE, LCD_COLOR_DARKBLUE);
-            //ゲーム中プロセスであれば、得点の表示
- /*Q1*/     if( score >= 0 )    {
-                scoreobj.Draw("%04d", score, LCD_COLOR_BLACK, LCD_COLOR_GREEN);
-            } else    {
-                scoreobj.Draw("%04d", score, LCD_COLOR_WHITE, LCD_COLOR_RED);
-            }
-        }
- 
         wait(0.01f);      //10ms待つ
 
     }