关于sdl的学习笔记,怎么绘制线条和矩形

       最近陷入了sdl的学习中,发现许多函数sdl库本身并没有提供,所以还需我们自己编写,下面便来分享一下自己编写的几个函数。

       首先是绘制线条,说白了就是画点,下面给出代码:

void drawline(SDL_Surface *screen, Uint8 R, Uint8 G, Uint8 B,int x,int y,int xx,int yy){
 int x1,y1;
 for(x1=x,y1=y;x1<=xx && y1<=yy;x1++,y1++){
  DrawPixel(screen,100,100,100,x1,y1);
 }
}

       然后是绘制矩形,那也是在绘制线条的基础上:

void drawrect(SDL_Surface *screen, Uint8 R, Uint8 G, Uint8 B,int x,int y,int width,int heigth){
 int x1,y1;
 for(x1=x,y1=y;x1<x+width;x1++){
  DrawPixel(screen,100,100,100,x1,y1);
 }
 for(x1=x+width,y1=y;y1<y+heigth;y1++){
  DrawPixel(screen,100,100,100,x1,y1);
 }
 for(x1=x,y1=y+heigth;x1<x+width;x1++){
  DrawPixel(screen,100,100,100,x1,y1);
 }
 for( x1=x,y1=y;y1<y+heigth;y1++){
  DrawPixel(screen,100,100,100,x1,y1);
 }
}

      上面代码中的DrawPixel函数就是来画点的,也就是绘制像素。下面看下代码:

void DrawPixel(SDL_Surface *screen, Uint8 R, Uint8 G, Uint8 B,int x,int y)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);
 
    if ( SDL_MUSTLOCK(screen) ) {
        if ( SDL_LockSurface(screen) < 0 ) {
            return;
        }
    }
 
  Uint32 *bufp;
  
  bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
  *bufp = color;


    if ( SDL_MUSTLOCK(screen) ) {
        SDL_UnlockSurface(screen);
    }
 SDL_Delay(5);
   // SDL_Flip(screen);
 SDL_UpdateRect(screen, x, y, 1, 1);

}

 

上面加了SDL_Delay,也就是延迟5秒,所以你能看到绘制过程,去掉的话绘制的最终结果便会直接显示了。

       下面给出个例子:

#include <iostream>
#include "SDL/SDL.h"
using namespace std;
SDL_Surface* screen;

int main(int argc, char *argv[]) {
 SDL_Init(SDL_INIT_EVERYTHING);
 atexit(SDL_Quit);
 screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
 drawline(screen,200,200,200,100,100,200,280);
// SDL_Flip(screen);
 while(1){
  SDL_Event e;
  while(SDL_PollEvent(&e)){
   switch(e.type){
   case SDL_KEYDOWN:
    if(e.key.keysym.sym==SDLK_ESCAPE){
     return 0;
    }
    break;
   case SDL_QUIT:
    return 0;
   }
  }
 }
 
return 0;
}

 

       本文有什么不足之处,还望大家多多指正。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux环境下,可以使用SDL库和TTF库来实现文字水印的绘制。下面是一个简单的示例代码,演示了如何使用SDL和TTF库在图像上绘制文字水印: ```cpp #include <SDL2/SDL.h> #include <SDL2/SDL_ttf.h> int main() { // 初始化SDL SDL_Init(SDL_INIT_VIDEO); // 创建窗口和渲染器 SDL_Window* window = SDL_CreateWindow("Watermark", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, 0); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); // 初始化TTF库 TTF_Init(); // 加载字体 TTF_Font* font = TTF_OpenFont("/path/to/font.ttf", 24); if (!font) { printf("Failed to load font: %s\n", TTF_GetError()); return -1; } // 创建颜色 SDL_Color color = {255, 255, 255, 255}; // 白色 // 渲染文字 SDL_Surface* surface = TTF_RenderText_Blended(font, "Watermark", color); SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); // 渲染循环 bool quit = false; while (!quit) { SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { quit = true; } } // 清空渲染器 SDL_RenderClear(renderer); // 绘制背景 SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 黑色 SDL_RenderFillRect(renderer, NULL); // 绘制文字水印 SDL_Rect destRect = {10, 10, surface->w, surface->h}; SDL_RenderCopy(renderer, texture, NULL, &destRect); // 渲染器呈现 SDL_RenderPresent(renderer); } // 清理资源 SDL_DestroyTexture(texture); SDL_FreeSurface(surface); TTF_CloseFont(font); TTF_Quit(); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 在上述示例代码中,需要将`/path/to/font.ttf`替换为实际的字体文件路径。代码中使用`TTF_RenderText_Blended`函数渲染文字,并将渲染结果创建为纹理`SDL_Texture`,然后在渲染循环中使用`SDL_RenderCopy`函数将纹理绘制到渲染器中。最后,在退出程序前需要清理创建的资源。 请注意,编译时需要链接SDL和TTF库,可以使用以下命令编译代码: ``` gcc watermark.c -o watermark -lSDL2 -lSDL2_ttf ``` 这是一个简单的示例,你可以根据实际需求进行更多的定制和优化。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值