当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/486702.html

相关文章:

  • 开发一个网站系统报价电子商务网站建设试卷及答案
  • 瑞芯微算法环境搭建(2)------编译opencv
  • 计算机视觉(opencv)——人脸网格关键点检测
  • 自己做网站投入编程培训机构需要哪些证件
  • AXI总线的基础知识
  • 【泛微OA】泛微OA平台实现计算具体的天数
  • 「深度学习笔记1」深度学习全面解析:从基本概念到未来趋势
  • puppeteer 生成pdf,含动态目录,目录带页码
  • 深度学习的卷积神经网络中医舌诊断病系统-ResNet50与VGG16方法的比较研究
  • 如何查看网站空间wordpress图片多选
  • Android的Activity与intent知识点
  • 一、前置基础(MVC学习前提)_核心特性_【C# MVC 前置】委托与事件:从 “小区通知” 看懂 MVC 过滤器的底层逻辑
  • 网站建设年度汇报详情页设计理念怎么写
  • Spring Boot项目中Maven引入依赖常见报错问题解决
  • Android 13 启动的时候会显示一下logo,很不友好
  • seo网站快速排名外包关键词seo排名优化如何
  • Linux防火墙:核心机制与安全实践全解析
  • SX1261IMLTRT射频收发器Semtech赋能远距离物联网连接的低功耗射频芯片IC
  • Flutter---坐标网格图标
  • 邢台做网站多少钱洪泽网站建设
  • 整体设计 逻辑系统程序 之30 定稿V1 之1 含 4 套程序架构、三式模型与时空约束体系
  • 基于单片机的智能洗衣机的设计与实现(论文+源码)
  • 【ComfyUI】SDXL Revision 文本提示实现参考图像概念迁移生成
  • Zabbix 模板、监控项、图形指南
  • 个人如何做网站软件湛江免费制作网站
  • 嘉兴公司网站模板建站建设厅官方网站
  • 【javaFX基础】javaFX文档学习及基础编程实践
  • [c++语法学习]Day10:c++引用
  • iOS App 上架全流程详解:证书配置、打包上传、审核技巧与跨平台上架工具 开心上架 实践
  • C++设计模式_行为型模式_迭代器模式Iterator