在开始游戏应用开发之前,我们先搞一个简单的应用,目的是把菜单操作与应用启动之间打磨平顺。
这里,我们做一个关于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学习笔记十六:掌机系统——启动第一个应用