SDL2画点 随手记

SDL官网

http://www.libsdl.org/

参考链接

http://lazyfoo.net/tutorials/SDL/08_geometry_rendering/index.php


记录一下 SDL2画点的关键步骤 .做好手写光栅画渲染器的第一步

#include <iostream>

#include "SDL.h"
#include <stdio.h>

const int SCREEN_WIDTH = 150;
const int SCREEN_HEIGHT = 150;

SDL_Window* gWindow = nullptr;
SDL_Surface* gScreenSurface = nullptr;
SDL_Surface* gHelloWorld = nullptr;
SDL_Renderer* gRenderer = nullptr;

bool init();
bool loadMedia();
void close();

bool init()
{
	if (SDL_Init(SDL_INIT_VIDEO) < 0)
	{
		printf("SDL can not initialized!SDL Error:%s\n", SDL_GetError());
		return false;
	}
	gWindow = SDL_CreateWindow("msdl1", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
	if (gWindow == nullptr)
	{
		printf("SDL can't create window!SDL Error:%s\n", SDL_GetError());
		return -1;
	}
	gScreenSurface = SDL_GetWindowSurface(gWindow);
	gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);
	if (gRenderer == nullptr)
	{
		return false;
	}

	//SDL_FillRect(gScreenSurface, nullptr, SDL_MapRGBA(gScreenSurface->format, 0xff, 0xff, 0xff, 0xff));
	SDL_FillRect(gScreenSurface, nullptr, SDL_MapRGBA(gScreenSurface->format, 0, 0, 0, 0));

	return true;
}

void close()
{
	SDL_FreeSurface(gHelloWorld);
	SDL_DestroyRenderer(gRenderer);
	SDL_DestroyWindow(gWindow);
	SDL_Quit();
}

bool loadMedia()
{
	gHelloWorld = SDL_LoadBMP("test.bmp");
	if (gHelloWorld == nullptr)
	{
		return false;
	}
	return true;
}

void mainLoop()
{
	/*
	SDL_BlitSurface(gHelloWorld, nullptr, gScreenSurface, nullptr);
	SDL_UpdateWindowSurface(gWindow);
	*/
	bool quit = false;
	SDL_Event evt;
	while (!quit)
	{
		while (SDL_PollEvent(&evt) != 0)
		{
			if (evt.type == SDL_QUIT){
				quit = true;
			}
		}


		SDL_RenderClear(gRenderer);

		// bg
		{
			SDL_SetRenderDrawColor(gRenderer, 0x00, 0x00, 0x00, 0xff);
			SDL_Rect fillRect = { 0,0, SCREEN_WIDTH, SCREEN_HEIGHT};
			SDL_RenderFillRect(gRenderer, &fillRect);
		}

		/*
		// rect
		{
			SDL_SetRenderDrawColor(gRenderer, 0xff, 0xff, 0x00, 0xff);
			SDL_Rect fillRect = { SCREEN_WIDTH / 4, SCREEN_HEIGHT / 4, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 };
			SDL_RenderFillRect(gRenderer, &fillRect);
		}

		// point
		{
			SDL_SetRenderDrawColor(gRenderer, 0xff, 0x00, 0x0f, 0xff);
			for (int i = 0; i < SCREEN_HEIGHT; i += 4)
			{
				SDL_RenderDrawPoint(gRenderer, SCREEN_WIDTH / 2, i);
			}
		}
		*/
		for (int row = 0; row < SCREEN_HEIGHT;row++)
		{
			for (int col = 0; col < SCREEN_WIDTH;col++)
			{
				int r = rand()/100 % 256;
				int g = rand() / 100 % 256;
				int b = rand() / 100 % 256;

				SDL_SetRenderDrawColor(gRenderer, (Uint8)r, (Uint8)g, (Uint8)b, 0xff);
				SDL_RenderDrawPoint(gRenderer, col,row);
			}
		}
		SDL_RenderPresent(gRenderer);
	}
}

int main(int argc,char* args[])
{
	if (!init()) return -1;
	if (!loadMedia()) return -1;
	mainLoop();
	close();
	return 0;
}


关键步骤:

1. sdl2 头文件,库文件,dll

2.创建 window SDL_CreateWindow()

3. 用window 创建  renderer SDL_CreateRenderer()

4. 绘制前 SDL_RenderClear(gRenderer); 清理 renderer

4. renderer 设置颜色,并绘制

SDL_SetRenderDrawColor(gRenderer, (Uint8)r, (Uint8)g, (Uint8)b, 0xff);
SDL_RenderDrawPoint(gRenderer, col,row);

5. 绘制后  SDL_RenderPresent()  把renderer 绘制的的内容展现出来 


现在可以操作窗口里的每个象素.搞 渲染器的 准备工作做好了,接下来需要啃就是图形学的干货




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值