求重写putpixel函数
<P>郁闷了,画图都要靠这个函数,NEO SDK画点也是调用了这个函数,<BR>可是在linux上没有这个函数,<BR>现在想重写这个函数,却不知道如何写.<BR><BR>斑竹,大虾们来开动一下你们脑筋<BR><BR></P>回复:(hitzl)求重写putpixel函数
<P>我的那个方法不可行,混淆了象素坐标和字符坐标的含义。<BR><BR>呵呵,看来还是要期待斑竹的方法了</P> <P>无语.难得解释...............<BR></P> <P>#include <stdlib.h><BR>#include <SDL/SDL.h></P><P><BR>/* 无字序无关的颜色掩码,用于跨平台 */<BR>#if SDL_BYTEORDER != SDL_BIG_ENDIAN<BR>Uint32 g_rmask = 0x00ff0000;<BR>Uint32 g_gmask = 0x0000ff00;<BR>Uint32 g_bmask = 0x000000ff;<BR>Uint32 g_amask = 0x00000000;<BR>#else<BR>Uint32 g_rmask = 0x000000ff;<BR>Uint32 g_gmask = 0x0000ff00;<BR>Uint32 g_bmask = 0x00ff0000;<BR>Uint32 g_amask = 0xff000000;<BR>#endif</P>
<P>/* 程序的分辨率和色深 */<BR>const int SCREEN_W = 640;<BR>const int SCREEN_H = 480;<BR>const int SCREEN_BPP = 32;</P>
<P>/* 用于组合颜色分量成一个颜色值 */ <BR>#define XRGB(r, g, b) SDL_MapRGB(screen->format, r, g, b)</P>
<P>/* 全局屏幕表面 */<BR>SDL_Surface *screen = NULL;</P>
<P>void DrawPixel(SDL_Surface *, int, int, Uint32);<BR>void PutPixel(int, int, Uint32);</P>
<P>/* 向表面上的(x, y)画一个颜色为color的点 */<BR>void DrawPixel(SDL_Surface *surface, int x, int y, Uint32 color)<BR>{<BR> int bpp = surface->format->BytesPerPixel;<BR> SDL_Surface *pixel = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, bpp << 3, g_rmask,<BR> g_gmask, g_bmask, g_amask);<BR> SDL_Rect rect;<BR> rect.x = x;<BR> rect.y = y;<BR> rect.w = rect.h = 1;</P>
<P> SDL_FillRect(pixel, NULL, color);<BR> SDL_BlitSurface(pixel, NULL, surface, &rect);<BR> SDL_FreeSurface(pixel); <BR>}</P>
<P>/* 将DrawPixel封装成类似于TC的 putpixel 函数,即直接向屏幕指定位置画点 */<BR>void PutPixel(int x, int y, Uint32 color)<BR>{<BR> DrawPixel(screen, x, y, color);<BR>}</P>
<P><BR>/* 测试函数 */<BR>int main (int argc, char *argv[])<BR>{<BR> SDL_Event event;<BR> int done = 0; /* 主循环退出标志 */<BR> <BR> /* 初始化 SDL */<BR> if (SDL_Init (SDL_INIT_VIDEO) < 0)<BR> {<BR> exit (1);<BR> }<BR> atexit (SDL_Quit);</P>
<P> /* 设置图形模式 */<BR> screen = SDL_SetVideoMode (SCREEN_W, SCREEN_H, SCREEN_BPP, SDL_HWSURFACE | SDL_DOUBLEBUF);<BR> if (screen == NULL)<BR> {<BR> exit (2);<BR> }<BR> SDL_WM_SetCaption ("SDL Put Pixel", NULL); /* 设置窗口标题 */</P>
<P> while (!done) /* 主循环 */<BR> { <BR> /* 检查事件 */<BR> while (SDL_PollEvent (&event))<BR> {<BR> switch (event.type)<BR> {<BR> case SDL_KEYDOWN: /* 按任意键退出 */<BR> done = 1;<BR> break;<BR> case SDL_QUIT:<BR> done = 1;<BR> break;<BR> default:break;<BR> }<BR> }<BR> <BR> /* 在屏幕上的随机位置画白色的点 */<BR> PutPixel(rand() & 511, rand() & 511, XRGB(255, 255, 255));<BR> /* 将后台页显示到前台页 */<BR> SDL_Flip (screen);<BR> /* 延时 */<BR> SDL_Delay (1);<BR> }</P>
<P> return 0;<BR>}<BR></P> 以上代码在Fedora 7下通过,另外在WINDOWS下的DEV-CPP + SDL也可以使用。<BR>基本的SDL库没有带画点或画线之类的函数,但扩展库中提供了。这里是假设你只有基本库,而且这个方法与SDL官方文档中提到的锁表面直接写显存再解锁不同,这个方法是通过表面之间的直接Blit实现的,不需要锁表面,如果有心对其优化的话,效率会很高。<BR>在Fedora下找个文本编辑器粘贴进去保存为一个.C文件(这里假设是mian.c),再打开控制台,进入该文件所在路径,敲入gcc main.c -lSDL回车(注意大小写)就可以在同目录下看到一个a.out输出文件了,当然也可以通过“-o”参数指定输出文件名。再在控制台中敲入./a.out或者直接双击a.out文件都可以执行它,按任意键退出运行。<BR>现在给你画点的方案了,这也仅仅是LINUX下画点的方案之一,由于在LINUX下进行游戏开发SDL比较常用,所以介绍了此法,如果你有兴趣,可以到我的主页<a href="http://www.ds0101.com/" target="_blank" >http://www.ds0101.com/</A>找到一些关于SDL的资料。 <P>拜谢一笔苍穹斑竹!<BR><BR>讲授的非常细致。连编译过程和测试代码都写来了。呵呵,斑竹真是侠肠骨道。<BR></P>
<P>我这样的初哥very受益啊</P> <P><BR>/* 初始化 SDL */<BR> if (SDL_Init (SDL_INIT_VIDEO) < 0)<BR> {<BR> printf("SDL_Init is failed"); //加了一条打印<BR> exit (1);<BR> <BR> }<BR><BR>编译通过了。</P>
<P>调试时,初始化的过程出现了一个问题。<BR>我加了这条打印。发现是SDL初始化过程失败了。<BR>(在编译过程中,我确实加了-lSDL的参数)<BR><BR></P> <P><BR>。。。<BR>/* 初始化 SDL */<BR> if (SDL_Init (SDL_INIT_VIDEO) < 0)<BR> {<BR> <U>printf("could not initialize SDL: %s\n",SDL_GetError()); //修改一次提示信息<BR></U> exit (1); <BR> }<BR>。。。。<BR><BR>root\> gcc main.c -o main -lSDL<BR>root\> ./main<BR>root\> could not initialize SDL: No available video device<BR><BR><BR><U>初始化失败,不能找到可用的视频设备。<BR>我又从google找了一个最简单初始化SDL的例子来调试SDL初始化过程,结果是仍然不能初始化。那么这个视频设备到底是指什么呢?是不是我的显示器。为何我在本地不能初始化呢.<BR></U><BR><BR>测试初始化SDL的例子附下:<BR>#include <SDL/SDL.h> <BR>#include <stdio.h></P>
<P>int main() {<BR> <BR> printf("Initializing SDL.\n");<BR> <BR> /* Initialize defaults, Video and Audio */<BR> if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { <BR> printf("Could not initialize SDL: %s.\n", SDL_GetError());<BR> exit(-1);<BR> }</P>
<P> printf("SDL initialized.\n");</P>
<P> printf("Quiting SDL.\n");<BR> <BR> /* Shutdown all subsystems */<BR> SDL_Quit();<BR> <BR> printf("Quiting....\n");</P>
<P> exit(0);<BR>}<BR><BR><BR><BR></P>
页:
[1]
2
