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
Diff: main1.cpp
- Revision:
- 0:f385e51b61dc
- Child:
- 1:a7abb5c6f912
diff -r 000000000000 -r f385e51b61dc main1.cpp --- /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待つ + + } +} + + + + + + + + +