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
- Committer:
- InoueTakashi
- Date:
- 2016-06-24
- Revision:
- 0:f385e51b61dc
- Child:
- 1:a7abb5c6f912
File content as of revision 0:f385e51b61dc:
//-------------------------------------------------------------------------------- // バルーンタッチゲーム・プログラム // // // 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待つ } }