基本实现思路是这样:有一个表盘图片和三个指针图片,表盘图片作为背景,指针图片起始点在表盘的中央。获取系统时间,计算指针角度,重绘。监听退出事件,程序退出。
实现效果如下:
具体代码:
#include "SDL2/SDL.h"
#include
#include
const int SCREEN_;
const int SCREEN_;
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
/* print out error information */
void ShowError() {
printf("%sn", SDL_GetError());
}
/* load image by filename */
SDL_Texture* LoadImage(char file[]) {
SDL_Surface *loadedImage = NULL;
SDL_Texture *texture = NULL;
loadedImage = SDL_LoadBMP(file);
if (loadedImage != NULL) {
texture = SDL_CreateTextureFromSurface(renderer, loadedImage);
SDL_FreeSurface(loadedImage);
}
else
ShowError();
return texture;
}
/* show the backgroud */
void ApplyBackground(SDL_Texture *tex, SDL_Renderer *rend) {
SDL_Rect pos;
SDL_QueryTexture(tex, NULL, NULL, &pos.w, &pos.h);
pos.x = pos.y = 0;
SDL_RenderCopy(renderer, tex, NULL, NULL);
}
/* show the pointers by angle */
void ApplySurface(SDL_Texture *tex, SDL_Renderer *rend, double angle) {
int x = SCREEN_WIDTH/2+7;
int y = SCREEN_HEIGHT/2;
SDL_RendererFlip flip = SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL;
SDL_Rect pos;
SDL_QueryTexture(tex, NULL, NULL, &pos.w, &pos.h);
pos.x = x;
pos.y = y;
SDL_Point p = {0, 0};
SDL_RenderCopyEx(renderer, tex, NULL, &pos, angle, &p, flip);
}
int main() {
if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
ShowError();
return 1;
}
/* Initial Window */
window = SDL_CreateWindow("Clock", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (window == NULL) {
ShowError();
return 2;
}
/* Initial Renderer */
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == NULL) {
ShowError();
return 3;
}
/* load pictures */
SDL_Texture *background = NULL, *hour = NULL,
*min = NULL, *second = NULL;
background = LoadImage("background.bmp");
hour = LoadImage("hour.bmp");
min = LoadImage("min.bmp");
second = LoadImage("second.bmp");
if (background == NULL | hour == NULL | min == NULL | second == NULL) {
return 4;
}
time_t rawtime;
struct tm *timeinfo;
int quit = 0;
SDL_Event e;
/* begin to run */
while (!quit) {
time(&rawtime);
timeinfo = localtime(&rawtime);
/* get system time */
int h = timeinfo->tm_hour % 12, m = timeinfo->tm_min,
s = timeinfo->tm_sec;
/* calculate their angles */
double angle_s = s*1.0*6 - 90;
double angle_m = m*1.0*6 + angle_s/360*6 - 90;
double angle_h = h*1.0*30 + angle_m/360/2 - 90;
/* repaint */
SDL_RenderClear(renderer);
ApplyBackground(background, renderer);
ApplySurface(hour, renderer, angle_h);
ApplySurface(min, renderer, angle_m);
ApplySurface(second, renderer, angle_s);
SDL_RenderPresent(renderer);
SDL_Delay(1000);
/* way to quit */
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) // close the window
quit = 1;
if (e.type == SDL_MOUSEBUTTONDOWN) // click the mouse
quit = 1;
}
}
/* Free Memory */
SDL_DestroyTexture(background);
SDL_DestroyTexture(hour);
SDL_DestroyTexture(min);
SDL_DestroyTexture(second);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔