SDL2 如何绘制虚线
SDL2 How to draw dotted line
可以像
一样使用 SDL2(或 gfx)绘制一条简单的虚线
int drawDottedLine(SDL_Renderer *renderer,Sint16 x1,Sint16 y1, Sint16 x2, Sint16 y2, int r, int g, int b, int a);
在网上完全找不到任何东西这么难吗?
你可以简单地自己实现...
检查 "Bresenham algorithm" 画一条线。
对于虚线,它只是很多实线,所以用三角函数的铅笔和纸应该可以解决:)
编辑:对于虚线,您甚至没有用到 "Bresenham algorithm",您只需要三角函数。
顺便说一下,对于那些投反对票的人,请解释一下?
这是一个使用 Bresenham 算法的工作函数:
void DrawDottedLine(SDL_Renderer* renderer, int x0, int y0, int x1, int y1) {
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = dx+dy, e2;
int count = 0;
while (1) {
if (count < 10) {SDL_RenderDrawPoint(renderer,x0,y0);}
if (x0==x1 && y0==y1) break;
e2 = 2*err;
if (e2 > dy) { err += dy; x0 += sx; }
if (e2 < dx) { err += dx; y0 += sy; }
count = (count + 1) % 20;
}
}
你必须考虑到这个函数的性能很糟糕,因为虚线的每个点都会调用 SDL_RenderDrawPoint()
来渲染。
这是我在乒乓球游戏中使用的代码:
SDL_SetRenderDrawColor(renderer, 155, 155, 155, 255);
for (line.y = 0; line.y < WINDOW_HEIGHT; line.y += 10)
{
SDL_RenderFillRect(renderer, &line);
}
在代码的前面,我初始化了这一行:
SDL_Rect line;
line.w = 2;
line.h = 8;
line.x = WINDOW_WIDTH / 2;
可以像
一样使用 SDL2(或 gfx)绘制一条简单的虚线int drawDottedLine(SDL_Renderer *renderer,Sint16 x1,Sint16 y1, Sint16 x2, Sint16 y2, int r, int g, int b, int a);
在网上完全找不到任何东西这么难吗?
你可以简单地自己实现... 检查 "Bresenham algorithm" 画一条线。
对于虚线,它只是很多实线,所以用三角函数的铅笔和纸应该可以解决:)
编辑:对于虚线,您甚至没有用到 "Bresenham algorithm",您只需要三角函数。
顺便说一下,对于那些投反对票的人,请解释一下?
这是一个使用 Bresenham 算法的工作函数:
void DrawDottedLine(SDL_Renderer* renderer, int x0, int y0, int x1, int y1) {
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = dx+dy, e2;
int count = 0;
while (1) {
if (count < 10) {SDL_RenderDrawPoint(renderer,x0,y0);}
if (x0==x1 && y0==y1) break;
e2 = 2*err;
if (e2 > dy) { err += dy; x0 += sx; }
if (e2 < dx) { err += dx; y0 += sy; }
count = (count + 1) % 20;
}
}
你必须考虑到这个函数的性能很糟糕,因为虚线的每个点都会调用 SDL_RenderDrawPoint()
来渲染。
这是我在乒乓球游戏中使用的代码:
SDL_SetRenderDrawColor(renderer, 155, 155, 155, 255);
for (line.y = 0; line.y < WINDOW_HEIGHT; line.y += 10)
{
SDL_RenderFillRect(renderer, &line);
}
在代码的前面,我初始化了这一行:
SDL_Rect line;
line.w = 2;
line.h = 8;
line.x = WINDOW_WIDTH / 2;