SDL时间和天气显示

描述

  SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、MacOS X等)的应用软件。现SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

1.天气获取

   天气获取采用命令行浏览器curl,天气获取接口使用心知天气网;

  心知天气是中国气象局官方授权的商业气象服务公司,基于气象数值预报和人工智能技术,提供高精度气象数据、天气监控机器人、气象数据可视化产品,本次天气数据获取从心知天气网平台获取。

2.天气获取与解析示例

 

/******************解析 天气数据****************
形参:u8* buff原始数据
			u8 *Weather_stat天气数据标志
			u8 *data解析获取到的数据
返回值:0---成功,其他值---失败
************************************************/
u8 Weather_analysis(u8* buff,u8 *Weather_stat,u8 *data)
{
	char *p=NULL;
	u16 i=0;
	p=strstr((char *)buff,(char *)Weather_stat);//获取温度
	if(p)
	{
		p+=strlen((char *)Weather_stat)+2;
		i=0;
		while(*p!='"' && *p!='�')
		{
			data[i++]=*p++;
		}
		data[i]='�';
		return 0;
	}
	else return 1;
}
/*获取天气数据*/
int Http_GetWeather(void)
{
	FILE *fp=popen("curl  api.seniverse.com/v3/weather/now.json?key=SwD4-ybQxhedD1z7U'&'location=nanchang'&'language=zh-Hans'&'unit=c","r");
	if(fp==NULL)
	{
		printf("重定向失败n");
		return -1;
	}
	char wthread_buff[1025];
	int cnt=fread(wthread_buff,1,1024,fp);
	wthread_buff[cnt]='�';
	char buff[100];
	wchar_t wc_buff[200];
	int stat;
	/*
		{"results":[{"location":{"id":"WT47HJP3HEMP","name":"南昌","country":"CN","path":"南昌,南昌,江西,中国",
		"timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"16"},"last_update":"2021-11-20T16:57:46+08:00"}]}
	*/
	/*解析天气数据*/
	Weather_analysis(wthread_buff,(u8 *)""name"",(u8 *)weather_info.city_name);//城市名称
		
	if(!Weather_analysis(wthread_buff,(u8 *)""temperature"",(u8 *)buff))//获取温度
	{
		snprintf((char *)weather_info.city_temp,sizeof(weather_info.city_temp),"%s℃",buff);
	}
	Weather_analysis(wthread_buff,""text"",(u8 *)weather_info.city_weather);
	if(!Weather_analysis(wthread_buff,(u8 *)""code"",(u8 *)buff))//天气代码
	{
		weather_info.city_code=atoi(buff);//字符串转整数
	}
	//printf("name:%sttemp:%st天气:%st天气代号:%dn",weather_info.city_name,weather_info.city_temp,weather_info.city_weather,weather_info.city_code);
	pclose(fp);
	return 0;
}

 

3.显示时间和天气示例

 

        sec=time(NULL);
		if(sec!=sec2)
		{
			sec2=sec;
			count++;
			localtime_r(&sec2,&result);//将秒单位时间转换为时间结构体
			strftime(buff,sizeof(buff),"%H:%M",&result);//时间格式化打印
			//printf("buff=%sn",buff);
			TTF_SetFontSize(ttffont,100);
			surface1=TTF_RenderUTF8_Blended(ttffont,buff,color2);
			rect.h=surface1->h;
			rect.w=surface1->w;
			rect.x=800/2-surface1->w/2;/*要显示的x起始位置*/
			rect.y=120;/*要显示的y起始位置*/
 			srcrect.h=surface1->h;
			srcrect.w=surface1->w;
			sdltext1=SDL_CreateTextureFromSurface(render,surface1);
			SDL_RenderCopy(render,sdltext2,&rect,&rect);
			SDL_RenderCopy(render,sdltext1,&srcrect,&rect);
			SDL_FreeSurface(surface1);/*释放surface*/
			SDL_DestroyTexture(sdltext1);/*释放表面*/
		
			TTF_SetFontSize(ttffont,50);
			strftime(week_buff,sizeof(week_buff),"%w",&result);
			week_cnt=atoi(week_buff);
			strftime(buff,sizeof(buff),"%Y/%m/%d 星期",&result);//时间格式化打印
			strncat(buff,week[week_cnt],sizeof(buff));
			strncat(buff," | ",sizeof(buff));
			surface2=TTF_RenderUTF8_Blended(ttffont,buff,color2);
			rect.h=surface2->h;
			rect.w=surface2->w;
			rect.x=800/2-surface2->w/2-40;/*要显示的x起始位置*/
			rect.y=240;/*要显示的y起始位置*/
			wather_x=rect.x+surface2->w;
			wather_y=rect.y;
 			srcrect.h=surface2->h;
			srcrect.w=surface2->w;
			sdltext3=SDL_CreateTextureFromSurface(render,surface2);
			SDL_RenderCopy(render,sdltext2,&rect,&rect);
			SDL_RenderCopy(render,sdltext3,&srcrect,&rect);
			SDL_FreeSurface(surface2);/*释放surface*/
			SDL_DestroyTexture(sdltext3);/*释放表面*/
			if(count>=60)/*60s获取一次天气数据*/
			{
				count=0;
				if(!Http_GetWeather())/*获取天气*/
				{
					char image[50];
					snprintf(image,sizeof(image),"./weather_photo/%d.png",weather_info.city_code);
					SDL_Surface *weather_surface=IMG_Load(image);
					if(weather_surface)
					{	
						SDL_Rect rect;
						rect.x=wather_x;
						rect.y=wather_y;
						rect.w=50;
						rect.h=50;
						srcrect.h=weather_surface->h;
						srcrect.w=weather_surface->w;
						SDL_Texture *sdltext=SDL_CreateTextureFromSurface(render,weather_surface);/*创建*/
						SDL_RenderCopy(render,sdltext2,&rect,&rect);
						SDL_RenderCopy(render,sdltext,&srcrect,&rect);
						SDL_FreeSurface(weather_surface);/*释放surface*/
						SDL_DestroyTexture(sdltext);/*释放表面*/
						/*显示温度*/
						SDL_Surface *temp_surface=TTF_RenderUTF8_Blended(ttffont,weather_info.city_temp,color2);
						SDL_Texture *temp_sdltext=SDL_CreateTextureFromSurface(render,temp_surface);
						rect.x=wather_x+50;
						rect.y=wather_y;
						srcrect.h=temp_surface->h;
						srcrect.w=temp_surface->w;
						SDL_RenderCopy(render,sdltext2,&rect,&rect);
						SDL_RenderCopy(render,temp_sdltext,&srcrect,&rect);
						SDL_FreeSurface(temp_surface);/*释放surface*/
						SDL_DestroyTexture(temp_sdltext);/*释放表面*/
					}
				}
			}
			SDL_RenderPresent(render);//更新显示
		}

  
审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分