在开始游戏应用开发之前,我们先搞一个简单的应用,目的是把菜单操作与应用启动之间打磨平顺。

这里,我们做一个关于About页面即可。

1、菜单项JSON的定义:

[
	{
		"t": "关于",
		"i": "menu/test16.png",
		"d": 102,
		"g": {},
		"s": []
	}
]

2、实现About页面

About.h

class About : public IScean
{
   public:
		About();   
		~About();  
		SceanResult tick(u32 ticks);
		int scean_init(cJSON* param);
private:
		u16 colorIndex;
		DisplayOption option1 = {FONT_SIZE_1516, WHITE, BLACK, 0, 0};
		DisplayOption option2 = {FONT_SIZE_1516, YELLOW, BLACK, 0, 0};
		u32 _aboutInterval;
};

About.cpp

About::About(void)
{
}


About::~About(void)
{
	printf("Destory About.\n");
}

int About::scean_init(cJSON*  param){
	clear_screen();
	Display_String(240, 260, &option2, "深圳市杨梅科技有限公司");
	show_status_info("EXIT:返回");
	setKeyAdepterIntervalAll(100);
	return 0;
}


#define AboutInterval 10

SceanResult About::tick(u32 ticks){
	if(KEY_EXIT) {
		printf("goto top menu from About.\n");
		return SceanResult_EXIT;
	}
	if(_aboutInterval > ticks){
		_aboutInterval -= 	ticks;
		return SceanResult_Done;
	}
	_aboutInterval = AboutInterval;
	
	colorIndex+=3;
	option1.foreColor = cvColorIdx2RGB(colorIndex);
	
	Display_String(50, 100, &option1, R"( __  ______  __  ____  ______  ____  ______  __ )");
	Display_String(50, 116, &option1, R"( \ \/ / __ \/ / / /  \/ / __ \/    \/ __ \ \/ / )");
	Display_String(50, 132, &option1, R"(  \  / /_/ / /_/ / /\  / /_/ / / / / /_/ /\  /  )");
	Display_String(50, 148, &option1, R"(  / /\____/\____/_/ /_/\__  /_/_/_/\___,_\/ /   )");
	Display_String(50, 164, &option1, R"( /_/                  /____/             /_/    )");

	return SceanResult_Done;
}

3、在menu.cpp中根据ID启动该应用

。。。

#define SceanId_About 102

。。。


SceanResult Menu::tick(u32 ticks){
	if(KEY_EXIT){ // 返回
		cJSON*  currentMenu =  (cJSON *)menuList->prev->data;
		if(	currentMenu == menuRoot) return SceanResult_Done;
		ListPopBack(menuList);
		showMenu ();
		return SceanResult_Done;
	}
	
	if(KEY_SEL){ //进入
		cJSON* item =  (cJSON*) ctlList->selectItem()->tag;
		int sceanId = cJSON_GetObjectItem(item,"d")->valueint;
		if(sceanId!= 0){
			IScean *scean =createScean(sceanId);
			if(scean !=NULL){
				scean->scean_init(cJSON_GetObjectItem(item,"g"));
				ListPushBack(sceanList, scean);
			}
			return SceanResult_Done;
		}
		cJSON* sitem =  cJSON_GetObjectItem(item,"s");
		
		if(cJSON_GetArraySize(sitem) > 0){
			ListPushBack(menuList, sitem);			
			showMenu();
			return SceanResult_Done;
		}
		return SceanResult_Done;
	}
	ctlList->tick(ticks);
	ran_max(10);
	return SceanResult_Done;
}

IScean* Menu::createScean(u32 idx){
	switch (idx) {
		case SceanId_About:
			return new About();
	}
	return NULL;
}

没有做完全的动态加载,只是实现了按需实例化应用。后面再研究能不能像安卓那样加载应用。

看看效果:

W801学习笔记十六:掌机系统——启动第一个应用

04-26 06:38