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:
0:f385e51b61dc
Child:
1:a7abb5c6f912
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main1.cpp	Fri Jun 24 01:25:01 2016 +0000
@@ -0,0 +1,196 @@
+//--------------------------------------------------------------------------------
+//  バルーンタッチゲーム・プログラム
+//
+//
+//  date:   2016/04/27
+//  rev 0.9   date: 2016/5/18
+//  rev 1.0   2016/6/8
+//  author: Copyright (c) 2016 Takashi Inoue
+//--------------------------------------------------------------------------------
+#include "mbed.h"
+
+#include "BlinkLabel.hpp"
+#include "ButtonGroup.hpp"
+#include "SeekbarGroup.hpp"
+
+#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)
+
+using namespace Mikami;     //Mikami 名前空間を使用
+using namespace TakaIno;    //TakaIno 名前空間を使用 (TI)
+
+DigitalOut led(LED1);
+
+Ticker timer;                 //タイマ割り込み
+extern void TimerIsr();     //タイマ割り込みハンドラ
+
+int g_game_time = 0;        //ゲーム時間用変数
+int g_game_prcs = 0;        //ゲーム中のプロセス変数、最初は待機プロセス
+
+const int G_GAME_LIMIT_TIME = 150;  //ゲーム終了時間×0.1s
+
+//タイマ割り込みハンドラ
+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;
+        }
+    }
+}
+
+//----- メイン関数 -----------------------------
+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;     //ボタン表示の幅
+    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);
+
+ /*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*/  //無限ループ
+    while(1) {
+        if ( btnary.Touched(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)を有効にする
+
+                        //すべての円の移動を開始する
+                        for( idx=0; idx < GUI_CIRCLE_MAX; idx++)       cirary[idx].MoveCircle(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];
+                        }
+
+                        g_game_time = 0;    //ゲーム時間を0クリア
+                        g_game_prcs = 1;    //ゲーム中プロセスにする
+                        break;
+                    case 1:
+                        g_game_prcs = 2;    //ゲーム終了プロセスにする
+                        btnary.Inactivate(1);   //ボタン1(end)を無効にする
+                        btnary.Activate(0); //ボタン0(start)を有効にする
+
+                        befo_btn_num = -1;  //1回前に押されたボタンは無しとする
+
+                        //すべての円の移動を停止する
+                        for( idx=0; idx < GUI_CIRCLE_MAX; idx++)       cirary[idx].MoveCircle(false);
+
+                        g_game_prcs = 0;    //待機プロセスにする
+
+                        break;
+                     default:
+                        break;
+                }
+            }
+        }
+        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 < 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;    //それ以外の円であれば、減点
+                }
+            }
+        }
+
+        //以下は、タイマにより、ゲームが終了する場合の処理
+        if( g_game_prcs == 2 ) {
+            btnary.Inactivate(1);   //ボタン1(end)を無効にする
+            btnary.Activate(0);//ボタン0(start)を有効にする
+
+            befo_btn_num = -1;  //1回前に押されたボタンは無しとする
+
+            //すべての円の移動を停止する
+            for( idx=0; idx < GUI_CIRCLE_MAX; idx++)       cirary[idx].MoveCircle(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待つ
+
+    }
+}
+
+
+
+
+
+
+
+
+