1819|4

26

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【平头哥RVB2601创意应用开发】7 随机字母落下的效果 [复制链接]

 

上一期实现了字母落下,摩尔斯电码输入消除字母后分数显示。

这一期要实现随机字母下落。怎么办呢?

简单粗暴的方法,是对数组进行排序。

重温一下,结构体数组:

int size = 36;
	
struct Obj{
	char name[20];
	char code[20];
	lv_obj_t *label;
	int x;
	int y;
}objs[36]={
	{"A",".-"},
	{"B","-..."},
	{"C","-.-."},
	{"D","-.."},
	{"E","."},
	{"F","..-."},
	{"G","--."},
	{"H","...."},
	{"I",".."},
	{"J",".---"},
	{"K","-.-"},
	{"L",".-.."},
	{"M","--"},
	{"N","-."},
	{"O","---"},
	{"P",".--."},
	{"Q","--.-"},
	{"R",".-."},
	{"S","..."},
	{"T","-"},
	{"U","..-"},
	{"V","...-"},
	{"W",".--"},
	{"X","-..-"},
	{"Y","-.--"},
	{"Z","--.."},
	{"0","-----"},
	{"1",".----"},
	{"2","..---"},
	{"3","...--"},
	{"4","....-"},
	{"5","....."},
	{"6","-...."},
	{"7","--..."},
	{"8","---.."},
	{"9","----."},
};

之后,对其循环,把lvgl的label标签对象加上去,注意下面我注释的内容:

for(int i=0;i<size;i++){
	objs[i].label=lv_label_create(lv_scr_act(), NULL);
	objs[i].x=10 + rand() % (128-30);
	objs[i].y=-1*(rand() % size)-30; //这里重点是这个随机数,不是为了y轴坐标,而是用来排序的!
	lv_obj_set_pos(objs[i].label, objs[i].x, objs[i].y);
	lv_obj_set_size(objs[i].label, 20, 20);
	lv_label_set_text(objs[i].label, objs[i].name);
}

之后,再用循环,完成排序:

for (int i = 0; i < size; ++i){
    for (int j = i + 1; j < size; ++j){
	    if (objs[i].y < objs[j].y){
			struct Obj temp = objs[i];
			objs[i] = objs[j];
			objs[j] = temp;
		}
	}
}

再循环一次,重新排完序的结构体数组重新设置y轴。

for(int i=0;i<size;i++){
    objs[i].y=-1*30*i;
}

至于下落,还是老样子,在while中循环,每隔一定时间,让结构体的y轴+1:

for(int i=0;i<size;i++){
	objs[i].y+=1;
	lv_obj_set_pos(objs[i].label, objs[i].x, objs[i].y);
}

另外,本期还优化了上期一段代码,用于分数的显示:

优化前:用strcat拼接字符串实现分数的显示

sprintf(value, "%d", score);
strcat(text_score,value);
lv_label_set_text(score_label,text_score);

优化后,用lv_label_set_text_fmt方法,可以自己设置模板文本:

lv_label_set_text_fmt(score_label, "score: %d", score);

最后:

gui_game_task全部代码:

static void gui_game_task(void *arg)
{	
	lv_init();
    oled_init();
	time_t t;
	srand((unsigned) time(&t));
	int looptime = 0;
	int score=0;//分数初始为0
	int status=0;//初始状态为 0    游戏中 1    胜利 2   失败 3
	
	
	lv_obj_t *text_gameover = lv_label_create(lv_scr_act(), NULL);
	lv_obj_set_pos(text_gameover, 28, 30);
	lv_obj_set_size(text_gameover, 128, 60);
	lv_label_set_text(text_gameover, "");
	
	//输入的标签
	lv_obj_t *text_input = lv_label_create(lv_scr_act(), NULL);
	lv_obj_set_pos(text_input, 100, 50);
	lv_obj_set_size(text_input, 80, 20);
	lv_label_set_text(text_input, "");
	
	lv_obj_t *score_label = lv_label_create(lv_scr_act(), NULL);
	lv_obj_set_pos(score_label, 0, 0);
	lv_obj_set_size(score_label, 128, 30);
	lv_label_set_text_fmt(score_label, "score: %d", score);
	
	int size = 36;
	
	struct Obj{
		char name[20];
		char code[20];
		lv_obj_t *label;
		int x;
		int y;
	}objs[36]={
		{"A",".-"},
		{"B","-..."},
		{"C","-.-."},
		{"D","-.."},
		{"E","."},
		{"F","..-."},
		{"G","--."},
		{"H","...."},
		{"I",".."},
		{"J",".---"},
		{"K","-.-"},
		{"L",".-.."},
		{"M","--"},
		{"N","-."},
		{"O","---"},
		{"P",".--."},
		{"Q","--.-"},
		{"R",".-."},
		{"S","..."},
		{"T","-"},
		{"U","..-"},
		{"V","...-"},
		{"W",".--"},
		{"X","-..-"},
		{"Y","-.--"},
		{"Z","--.."},
		{"0","-----"},
		{"1",".----"},
		{"2","..---"},
		{"3","...--"},
		{"4","....-"},
		{"5","....."},
		{"6","-...."},
		{"7","--..."},
		{"8","---.."},
		{"9","----."},
	};
	
	
	for(int i=0;i<size;i++){
		objs[i].label=lv_label_create(lv_scr_act(), NULL);
		objs[i].x=10 + rand() % (128-30);
		objs[i].y=-1*(rand() % size)-30;
		lv_obj_set_pos(objs[i].label, objs[i].x, objs[i].y);
		lv_obj_set_size(objs[i].label, 20, 20);
		lv_label_set_text(objs[i].label, objs[i].name);
	}

	for (int i = 0; i < size; ++i){
	   for (int j = i + 1; j < size; ++j){
		  if (objs[i].y < objs[j].y){
			struct Obj temp = objs[i];
			objs[i] = objs[j];
			objs[j] = temp;
		  }
	   }
	}
	
	for(int i=0;i<size;i++){
		objs[i].y=-1*30*i;
	}
	
	status=1;
    
	
    while (1) {

        /* Periodically call the lv_task handler.
         * It could be done in a timer interrupt or an OS task too.*/
        lv_task_handler();
		
		if(status==1){
			looptime+=1;
			if(looptime % 15 ==0){
				for(int i=0;i<size;i++){
					objs[i].y+=1;
					lv_obj_set_pos(objs[i].label, objs[i].x, objs[i].y);
				}
				if(objs[size-1].y>64){
					lv_label_set_text(text_gameover, "GameOver");
					status = 3; //game over
				}
			}
		}
		
        if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1)) {
			//当低电平(按下时)
			if(button1_pressed==0){
				// 如果button1的状态没有被按下,则设为按下
				button1_pressed = 1;
			}
			if(button1_pressed==1){
				//如果button1的状态是按下,则计时
				time_for_pressed++;
			}
		}
		
		if(GPIO_PIN_HIGH == csi_gpio_pin_read(&key1)) {
			if(button1_pressed==0){
				nopress_time++;
				if(nopress_time>30){
					//check_input();
					for(int i=0;i<size;i++){
						if(objs[i].y>0 && objs[i].y<64){
							//在可视区间
						
							if(strcmp(input,objs[i].code)==0){
								lv_label_set_text(objs[i].label, "");
								char value[10];
								char text_score[20]="score:";
								score++;
								lv_label_set_text_fmt(score_label, "score: %d", score);
							}
						
						}
					}
					strcpy(input,"");
					lv_label_set_text(text_input,"");//输入效果清空
					//check win
					//if status == playing
					if(score==size){
						//status == "win"
					}
				}
			}
			
			if(button1_pressed==1){
				nopress_time=0;
				
				printf("%d",time_for_pressed);
				//通过判断time_for_pressed的大小,得出是长按还是短按
				if(time_for_pressed>20){
					//长按
					printf("-");
					strcat(input,"-");
					
				}else{
					//短按
					printf(".");
					strcat(input,".");
				}
				lv_label_set_text(text_input,input);//输入效果
				time_for_pressed=0;//恢复计数
				button1_pressed = 0;
			}
			
		}
		
		if(GPIO_PIN_LOW == csi_gpio_pin_read(&key2)) {
			if(button2_pressed==0){
				button2_pressed=1;
			}
			
		}
		if(GPIO_PIN_HIGH == csi_gpio_pin_read(&key2)) {
			if(button2_pressed==1){
				printf("\n");
				button2_pressed=0;
				strcpy(input,"");
				lv_label_set_text(text_input,"");//输入效果清空
			}
		}
		
        aos_msleep(5);
        lv_tick_inc(1);
    }
}

效果:

最新回复

摩尔斯电码?   详情 回复 发表于 2022-5-5 14:56
点赞 关注
 
 

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 
游戏机快成功了吧,历害了!

点评

嗯,快了。  详情 回复 发表于 2022-4-30 17:29
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
lugl4313820 发表于 2022-4-30 06:59 游戏机快成功了吧,历害了!

嗯,快了。

 
 
 

回复

183

帖子

12

TA的资源

一粒金砂(高级)

4
 

摩尔斯电码?

点评

对  详情 回复 发表于 2022-5-6 16:04
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

5
 
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
中国IPTV产业标准研讨会现场全景及实录

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 新浪科技讯 2005年11月24日,由中国计算机用户协会多媒体应用专业委员会主 ...

LPC1343学习笔记(连载中)--6月21日新增第十二篇

有幸拿到了EEWORLD论坛的LPC1343评估板,实在是一件意外而激励人心的事情。为感谢EEWORLD和NXP,特将学习过程与大家共同分享。也 ...

[DIY]再造二十四小时的感动【古典版II】 自制QS18-12辉光电子钟 附百图

前几天刚刚完成QS30-1管的辉光钟,有不少朋友在向我讨教如何制作。说实话,就个人而言,我更喜欢QS18-12辉光管。 QS30-1的辉光 ...

搭建开发环境和使用UBOOT【下】

本帖最后由 sjtitr 于 2014-7-24 09:26 编辑 搭建开发环境和使用UBOOT【下】 HELPER2416开发板助学计划 接下来是关于UBoo ...

4418之Android Eclipse导入应用程序在开发板上调试

由于在开发板上LEDtest 应用已经默认安装了,所以在开发板上调试已安装应用的时候,需要做一下处理才能够正常连接。 基于迅为iT ...

基于运算放大器和模拟集成电路的电路设计中3.2的德玻积分器传递函数怎样推导

505015麻烦各位高手,帮我推导一下这个积分电路的传递函数的,我推导了半天也不到极点p=-(1-k)/RC的传递函数?

CC2640R2F工程之间相互转换

在使用CC2640R2F的时候发现一个现象,就是在低版本的SDK中有一些工程,到了高版本中SDK就没有了,比如: simplelink_cc2640r2 ...

【拓普微智能显示模块】四:串口交互以及曲线、绘图板、动画控件的应用

本帖最后由 数码小叶 于 2021-11-21 12:00 编辑 上一篇已经使用SGTools产生了一个简单的界面,所以对于SGTools来说,简单使用 ...

先楫官方工程师干货:HPM6000系列PWM波尽在掌握(下)

概述 在进行电机类、电源类应用开发时,如何使用PWM定时器模块灵活、高效的实现所需 PWM波形的输出,是众多开发者关注的问题 ...

【先楫HPM6750EVK2测评】体验网络功能

【开发工具】RT-Thread Studio 【体验步骤】 1、根据【先楫HPM6750EVK2测评】体验RTT开发 - 国产芯片交流 - 电子工程世界- ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表