linux sdl图形编程之helloworld.

#include <SDL2/SDL.h>

#include <SDL2/SDL_ttf.h>

int main3(int argc, char* argv[]) {

// 初始化SDL

if(SDL_Init(SDL_INIT_VIDEO) < 0) {

printf("SDL初始化失败: %s\n", SDL_GetError());

return -1;

}

// 初始化TTF字体库

if(TTF_Init() < 0) {

printf("TTF初始化失败: %s\n", TTF_GetError());

SDL_Quit();

return -1;

}

// 创建窗口

SDL_Window* window = SDL_CreateWindow("SDL Hello World",

SDL_WINDOWPOS_CENTERED,

SDL_WINDOWPOS_CENTERED,

640, 480,

SDL_WINDOW_SHOWN);

if(!window) {

printf("窗口创建失败: %s\n", SDL_GetError());

TTF_Quit();

SDL_Quit();

return -1;

}

// 创建渲染器

SDL_Renderer* renderer = SDL_CreateRenderer(window, -1,

SDL_RENDERER_ACCELERATED |

SDL_RENDERER_PRESENTVSYNC);

if(!renderer) {

printf("渲染器创建失败: %s\n", SDL_GetError());

SDL_DestroyWindow(window);

TTF_Quit();

SDL_Quit();

return -1;

}

// 加载字体

TTF_Font* font = TTF_OpenFont("/usr/share/fonts/truetype/freefont/FreeSans.ttf", 24);

if(!font) {

printf("字体加载失败: %s\n", TTF_GetError());

font = TTF_OpenFont("FreeSans.ttf", 24); // 尝试当前目录

if(!font) {

printf("备用字体加载失败\n");

SDL_DestroyRenderer(renderer);

SDL_DestroyWindow(window);

TTF_Quit();

SDL_Quit();

return -1;

}

}

// 创建文本表面

SDL_Color white = {255, 255, 255, 255};

SDL_Surface* textSurface = TTF_RenderText_Solid(font, "Hello World!", white);

if(!textSurface) {

printf("文本表面创建失败: %s\n", SDL_GetError());

TTF_CloseFont(font);

SDL_DestroyRenderer(renderer);

SDL_DestroyWindow(window);

TTF_Quit();

SDL_Quit();

return -1;

}

// 创建纹理

SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);

if(!textTexture) {

printf("纹理创建失败: %s\n", SDL_GetError());

SDL_FreeSurface(textSurface);

TTF_CloseFont(font);

SDL_DestroyRenderer(renderer);

SDL_DestroyWindow(window);

TTF_Quit();

SDL_Quit();

return -1;

}

// 获取文本尺寸

int textWidth = textSurface->w;

int textHeight = textSurface->h;

SDL_FreeSurface(textSurface);

// 设置文本位置

SDL_Rect textRect = {

(640 - textWidth) / 2,

(480 - textHeight) / 2,

textWidth,

textHeight

};

// 主循环

SDL_Event event;

int quit = 0;

while(!quit) {

while(SDL_PollEvent(&event)) {

if(event.type == SDL_QUIT) {

quit = 1;

}

}

// 清屏

SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);

SDL_RenderClear(renderer);

// 渲染文本

SDL_RenderCopy(renderer, textTexture, NULL, &textRect);

// 更新屏幕

SDL_RenderPresent(renderer);

}

// 清理资源

SDL_DestroyTexture(textTexture);

TTF_CloseFont(font);

SDL_DestroyRenderer(renderer);

SDL_DestroyWindow(window);

TTF_Quit();

SDL_Quit();

return 0;

}

#include <SDL2/SDL.h>

#include <SDL2/SDL_ttf.h>

int main4() {

// 初始化

if(SDL_Init(SDL_INIT_VIDEO) < 0) {

SDL_Log("SDL初始化失败: %s", SDL_GetError());

return -1;

}

if(TTF_Init() < 0) {

SDL_Log("TTF初始化失败: %s", TTF_GetError());

SDL_Quit();

return -1;

}

// 创建窗口和主Surface

SDL_Window* window = SDL_CreateWindow("SDL Surface Demo",

SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,

640, 480, SDL_WINDOW_SHOWN);

if(!window) {

SDL_Log("窗口创建失败: %s", SDL_GetError());

TTF_Quit();

SDL_Quit();

return -1;

}

SDL_Surface* screenSurface = SDL_GetWindowSurface(window);

// 加载字体和渲染文本

TTF_Font* font = TTF_OpenFont("FreeSans.ttf", 24);

if(!font) font = TTF_OpenFont("/usr/share/fonts/truetype/freefont/FreeSans.ttf", 24);

if(font) {

SDL_Color white = {255, 255, 255};

SDL_Surface* textSurface = TTF_RenderText_Solid(font, "Hello World!", white);

if(textSurface) {

// 计算居中位置

SDL_Rect textRect = {

(screenSurface->w - textSurface->w) / 2,

(screenSurface->h - textSurface->h) / 2,

textSurface->w,

textSurface->h

};

// 主循环

SDL_Event e;

int running = 1;

while(running) {

while(SDL_PollEvent(&e)) {

if(e.type == SDL_QUIT) running = 0;

}

// 清屏(填充黑色)

SDL_FillRect(screenSurface, NULL,

SDL_MapRGB(screenSurface->format, 0, 0, 0));

// 绘制文本

SDL_BlitSurface(textSurface, NULL, screenSurface, &textRect);

SDL_UpdateWindowSurface(window);

SDL_Delay(16); // 约60FPS

}

SDL_FreeSurface(textSurface);

}

TTF_CloseFont(font);

}

// 清理资源

SDL_DestroyWindow(window);

TTF_Quit();

SDL_Quit();

return 0;

}

#include <SDL2/SDL.h>

#include <SDL2/SDL_ttf.h>

#define SCREEN_WIDTH 640

#define SCREEN_HEIGHT 480

typedef struct {

SDL_Rect rect;

SDL_Color normalColor;

SDL_Color hoverColor;

SDL_Color pressedColor;

int isPressed;

int isHovered;

} Button;

void renderButton(SDL_Renderer* renderer, Button* button) {

SDL_Color currentColor = button->normalColor;

if (button->isPressed) {

currentColor = button->pressedColor;

} else if (button->isHovered) {

currentColor = button->hoverColor;

}

SDL_SetRenderDrawColor(renderer, currentColor.r, currentColor.g, currentColor.b, 255);

SDL_RenderFillRect(renderer, &button->rect);

// 绘制边框

SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);

SDL_RenderDrawRect(renderer, &button->rect);

}

int main(int argc, char* argv[]) {

SDL_Init(SDL_INIT_VIDEO);

TTF_Init();

SDL_Window* window = SDL_CreateWindow("SDL Button Demo",

SDL_WINDOWPOS_CENTERED,

SDL_WINDOWPOS_CENTERED,

SCREEN_WIDTH, SCREEN_HEIGHT,

SDL_WINDOW_SHOWN);

SDL_Renderer* renderer = SDL_CreateRenderer(window, -1,

SDL_RENDERER_ACCELERATED);

// 创建按钮

Button myButton = {

.rect = {SCREEN_WIDTH/2 - 100, SCREEN_HEIGHT/2 - 50, 200, 100},

.normalColor = {100, 100, 200, 255},

.hoverColor = {150, 150, 250, 255},

.pressedColor = {50, 50, 150, 255},

.isPressed = 0,

.isHovered = 0

};

// 主循环

SDL_Event event;

int running = 1;

while (running) {

// 处理事件

while (SDL_PollEvent(&event)) {

switch (event.type) {

case SDL_QUIT:

running = 0;

break;

case SDL_MOUSEMOTION:

// 检测鼠标悬停

myButton.isHovered = SDL_PointInRect(

&(SDL_Point){event.motion.x, event.motion.y},

&myButton.rect

);

break;

case SDL_MOUSEBUTTONDOWN:

if (event.button.button == SDL_BUTTON_LEFT &&

SDL_PointInRect(&(SDL_Point){event.button.x, event.button.y},

&myButton.rect)) {

myButton.isPressed = 1;

}

break;

case SDL_MOUSEBUTTONUP:

if (event.button.button == SDL_BUTTON_LEFT) {

if (myButton.isPressed &&

SDL_PointInRect(&(SDL_Point){event.button.x, event.button.y},

&myButton.rect)) {

SDL_Log("Button clicked!");

}

myButton.isPressed = 0;

}

break;

}

}

// 渲染

SDL_SetRenderDrawColor(renderer, 240, 240, 240, 255);

SDL_RenderClear(renderer);

renderButton(renderer, &myButton);

SDL_RenderPresent(renderer);

SDL_Delay(16);

}

// 清理资源

SDL_DestroyRenderer(renderer);

SDL_DestroyWindow(window);

TTF_Quit();

SDL_Quit();

return 0;

}

gcc main.c -o helloworld `sdl2-config --cflags --libs` -lSDL2_ttf -lcapstone

相关推荐
做运维的阿瑞3 小时前
Kubernetes 存储核心理论:深入理解 PVC 静态迁移与动态扩容
运维·容器·kubernetes
小任今晚几点睡4 小时前
Docker 完整指南:从入门到企业实战
运维·docker·容器
郝学胜-神的一滴4 小时前
Linux系统函数link、unlink与dentry的关系及使用注意事项
linux·运维·服务器·开发语言·前端·c++
霍格沃兹软件测试开发4 小时前
借助 Dify 实现自动化工作流,每天节省3小时
运维·ai·自动化
星空的资源小屋4 小时前
RoboIntern,一款自动化办公小助手
运维·人工智能·pdf·自动化·电脑·excel
Pota-to成长日记4 小时前
2025/10/14 redis断联 没有IPv4地址 (自用)
linux·运维·服务器
樱木...4 小时前
Linux 查询目录下文件大小引发的内存溢出问题
linux·运维
.小墨迹4 小时前
linux删除通过源码安装的库
linux·运维·chrome
~黄夫人~4 小时前
Ubuntu系统快速上手命令(详细)
linux·运维·笔记·ubuntu·postgresql