![](/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
Revision 1:a7abb5c6f912, committed 2016-07-02
- Comitter:
- InoueTakashi
- Date:
- Sat Jul 02 05:39:15 2016 +0000
- Parent:
- 0:f385e51b61dc
- Commit message:
- modify main1.cpp like C source.
Changed in this revision
diff -r f385e51b61dc -r a7abb5c6f912 F746_GUI_Other.lib --- a/F746_GUI_Other.lib Fri Jun 24 01:25:01 2016 +0000 +++ b/F746_GUI_Other.lib Sat Jul 02 05:39:15 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/users/InoueTakashi/code/F746_GUI_Other/#944b36823ef2 +https://developer.mbed.org/users/InoueTakashi/code/F746_GUI_Other/#c77f45e79881
diff -r f385e51b61dc -r a7abb5c6f912 F746_OL_GUI.lib --- a/F746_OL_GUI.lib Fri Jun 24 01:25:01 2016 +0000 +++ b/F746_OL_GUI.lib Sat Jul 02 05:39:15 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/users/InoueTakashi/code/F746_OL_GUI/#36e616bde4b8 +https://developer.mbed.org/users/InoueTakashi/code/F746_OL_GUI/#d7dc710446a8
diff -r f385e51b61dc -r a7abb5c6f912 func_ol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/func_ol.cpp Sat Jul 02 05:39:15 2016 +0000 @@ -0,0 +1,187 @@ +#include "mbed.h" + +#include "BlinkLabel.hpp" +#include "ButtonGroup.hpp" +#include "SeekbarGroup.hpp" +#include "Label.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) + +Ticker timer; //タイマ割り込み + +GUIinit guiobj; //GUIクラスオブジェクト生成 +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]}; +ButtonGroupOL btnary; //ButtonGroupOLクラスオブジェクトの生成 +Rand rndobj; //乱数発生クラスオブジェクト生成 +//ゲーム時間表示 +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, 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", 0, Label::LEFT, Font16, LCD_COLOR_RED, LCD_COLOR_WHITE); + +uint16_t btn_width = GUI_BTN_WIDTH; //ボタン表示の幅 +int g_btn_num = 4; ////ボタンの個数 +int g_bln_num = GUI_CIRCLE_MAX; +int rndary[2], befo_rndary[2] = {-1,-1}; //今回と前回の乱数値用配列 + +int g_game_time = 0; //ゲーム時間用変数 +int g_game_prcs = 0; //ゲーム中のプロセス変数、最初は待機プロセス + +//タイマ割り込みハンドラ +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; + } + } +} +//グラフィック初期化 +void gui_init(void) +{ + //GUIオブジェクトで、フォント16とボタン幅をセット + guiobj.SetInit(Font16, btn_width); +} + +// メインタイトルの表示 +//void dsp_main_title(string main_title) +void dsp_main_title(char main_title[]) +{ + string str = main_title; + // メインタイトルの表示、中央位置、フォント16 + Label title_obj(0,0, main_title, Label::CENTER, Font16); // +} + +//バルーン表示 +void dsp_baloon(void) +{ + //円オブジェクトにより、円を描画する + for( int idx = 0; idx < g_bln_num; idx++ ) { + cirary[idx].DrawCircle(true); + } +} + +//idx番のバルーンに触ったかどうかチェックする +bool chk_baloon_tch(int idx) +{ + return cirary[idx].CircleTouched(); +} + +//idx番のバルーンの色を反転する +void rvs_baloon_col(int idx) +{ + //idx番目の円を触ったら、円の色を反転する + cirary[idx].ReverseCircleColor(); +} + +//idx番のバルーンの表示位置を動かす +void chg_baloon_pos(int idx) +{ + cirary[idx].ChangeCirclePos(); +} + +//idx番のバルーンの表示位置を動かすことを許可する +void ena_baloon_mov(int idx, bool mov_flg) +{ + cirary[idx].MoveCircle(mov_flg); + } + + +//ボタン初期化 +void btn_init() +{ + //ボタン1(end),2,3を無効に ボタン0(start)を有効のままにする + btnary.Inactivate(1); btnary.Inactivate(2); btnary.Inactivate(3); + + } + + //ボタンの有効無効をセットする + void set_btn_act_inact(bool act_ary[]) + { + for( int i = 0; i < g_btn_num; i++) + { + if( act_ary[i] ) { + btnary.Activate(i); + } + else { + btnary.Inactivate(i); + } + } + } + +//あるボタン番号のボタンタッチを調べる +bool chk_btn_tch(int btn_num) +{ + return btnary.Touched(btn_num); +} + +//新しい乱数値をセットする +void set_new_rand(void) +{ + //乱数用配列に、1回前と異なった乱数値を入れる + for( int idx=0; idx < 2; idx++) { + do { + rndary[idx] = (int)rndobj.GetRand(g_bln_num); + } while( rndary[idx]==befo_rndary[idx]); + befo_rndary[idx] = rndary[idx]; + } +} + + +//idx番目のバルーンが、2つの乱数と一致していれば加点、違っていれば減点する +void chk_baloon_rand(int idx, int *score) +{ + if( idx == rndary[0] ) *score += GUI_ADD_POINT1;//乱数0と一致している円であれば、加点 + else if (idx == rndary[1] ) *score += GUI_ADD_POINT2;//乱数1と一致している円であれば、加点 + else *score += GUI_DEME_POINT; //それ以外の円であれば、減点 +} + +//ゲーム時間表示の初期化 +void init_game_time(void) +{ + g_game_time = 0; +} + + //ゲーム中プロセスであれば、残り時間の表示 +void dsp_game_time(void) +{ + timeobj.Draw("%03d", G_GAME_LIMIT_TIME - g_game_time,LCD_COLOR_WHITE, LCD_COLOR_DARKBLUE); + } + +//ゲーム得点の初期化 +void init_game_score(void) +{ + ; +} + + //ゲーム得点の表示 +void dsp_game_score(int score) +{ + if( score >= 0 ) { + scoreobj.Draw("%04d", score, LCD_COLOR_BLACK, LCD_COLOR_GREEN); + } else { + scoreobj.Draw("%04d", score, LCD_COLOR_WHITE, LCD_COLOR_RED); + } +} + +//0.1秒毎のタイマ割り込みを有効にする +void ena_tim_irt(double tim_intvl) +{ + timer.attach(&TimerIsr, tim_intvl); //0.1秒ごとのタイマ割り込みを有効にする + +} + + \ No newline at end of file
diff -r f385e51b61dc -r a7abb5c6f912 main1.cpp --- 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待つ }
diff -r f385e51b61dc -r a7abb5c6f912 main1.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main1.hpp Sat Jul 02 05:39:15 2016 +0000 @@ -0,0 +1,20 @@ + +#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); + +