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

在进行游戏应用开发前,为使菜单操作与应用启动更顺畅,做了一个About页面。包括菜单项JSON定义、实现About页面,在menu.cpp中根据ID启动应用,实现按需实例化应用,后续还将研究类似安卓的应用加载方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

1、菜单项JSON的定义:

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

其中,"d": 102  是这个应用的ID号。

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;
}

注意这个地方启动应用:

if(sceanId!= 0){
            IScean *scean =createScean(sceanId);
            if(scean !=NULL){
                scean->scean_init(cJSON_GetObjectItem(item,"g"));
                ListPushBack(sceanList, scean);
            }
            return SceanResult_Done;
        }

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

看看效果:

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vvind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值