?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);//更新顯示 }
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
87文章
11292瀏覽量
209325 -
SDL
+關注
關注
0文章
18瀏覽量
7395 -
開發庫
+關注
關注
0文章
7瀏覽量
4860
發布評論請先 登錄
相關推薦
SDL編譯安裝圖片顯示
?SDL(Simple DirectMediaLayer)是一套開放源代碼的跨平臺多媒體開發庫,使用C語言寫成。SDL提供了數種控制圖像、聲音、輸出入的函數,讓開發者只要用相同或是相似的代碼就可以
Linux下基于SDL庫貪吃蛇游戲
?SDL(Simple DirectMediaLayer)是一套開放源代碼的跨平臺多媒體開發庫,使用C語言寫成。SDL提供了數種控制圖像、聲音、輸出入的函數,讓開發者只要用相同或是相似的代碼就可以
天氣預警收音機方案
/通道/時間顯示二、 LCD 全顯圖三、 天氣廣播---------------------------------------------------------------
發表于 05-20 17:56
SDL的交叉編譯問題
求助!!移植SDL到mini2440開發板上時,在交叉編譯SDL_image進行configure之后,再make時出現如下錯誤:/opt/mini2440/output/lib/libSDL.so
發表于 12-06 20:50
移植SDL到JZ2440顯示BMP圖片
LOGO的制作, 韋老師第3期講了如何顯示jpeg圖片, 那么怎么顯示bmp圖片?這次我們借助libSDL來實現,我們先移植SDL到Ubuntu, 體驗它的威力后再移植到開發板。一、移植SDL
發表于 06-29 11:19
OLED屏幕顯示時間天氣設計實現
通過HTTP GET天氣網站的API接口,將返回的Json中天氣數據解析出來顯示。需要顯示的圖標可以通過取模軟件轉成對應的數組工程直接編譯之后只有需要配一下網,配網接口嫌麻煩,沒有寫,
發表于 01-18 10:13
STM32+ESP8266獲取網絡時間和天氣的方法
先給出兩個可以獲取天氣和時間的網站https://www.seniverse.com/docs 可以獲取天氣http://api.k780.com:88/?app=life.time&
發表于 02-18 07:56
GUI向導編譯錯誤,找不到“SDL2/SDL.h”文件是怎么回事?
如何找出編譯錯誤:找不到“SDL2/SDL.h”文件
使用 MAC OS 12.6 和最新的guy guider 版本。
發表于 05-04 08:44
基于SDL的自動售票系統的研發
基于SDL 的自動售票系統的研發顧麗麗 梅杓春(南京郵電大學自動化學院,江蘇南京 210003)摘要:本文簡要介紹了SDL語言及其支持工具。通過設計自動售票系統實例對如何利用SDL
發表于 12-18 11:34
?21次下載
SDL1000X系列可編程直流電子負載的產品介紹
SDL1000X/SDL1000X-E 可編程直流電子負載配備了3.5 英寸 TFT-LCD 顯示屏,擁有友好的人機交互界面和優異的性能指標,SDL1020X/
發表于 02-18 08:00
?4次下載
SDL下載與配置
點擊[SDL2 核心庫下載](https://libsdl.org/download-2.0.php)下載SDL2庫,如下圖根據編譯器選擇不同版本(Visual Studo系列選擇第一個)。
評論