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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值