标题:求重写putpixel函数
只看楼主
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
你用的是哪个LINUX的发行版,你先确认一下你的LINUX是否内置了对SDL的支持?如果支持的话就很好办。
2007-09-03 13:20
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
得分:0 
我使用的是fedora,目前还不知道这个版本的Linux是否支持SDL。过会我查一下是否支持。现在有另外一个想法,利用Linux自带的curses.h库

#include "curses.h"
void putpixeles(int x, int y, char color)
{
move(x, y);
fputchar(color);

}

找到所有的颜色对应的16进制码,将它们列出各种颜色的预定义。
这样做可否






2007-09-03 16:55
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
Fedora有,我装的也是Fedora
明天接着聊吧
2007-09-03 17:38
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
得分:0 
回复:(hitzl)求重写putpixel函数

我的那个方法不可行,混淆了象素坐标和字符坐标的含义。

呵呵,看来还是要期待斑竹的方法了


2007-09-03 18:17
hjj1123
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2006-7-29
得分:0 

无语.难得解释...............


qq:674940174
2007-09-04 08:42
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 

#include <stdlib.h>
#include <SDL/SDL.h>


/* 无字序无关的颜色掩码,用于跨平台 */
#if SDL_BYTEORDER != SDL_BIG_ENDIAN
Uint32 g_rmask = 0x00ff0000;
Uint32 g_gmask = 0x0000ff00;
Uint32 g_bmask = 0x000000ff;
Uint32 g_amask = 0x00000000;
#else
Uint32 g_rmask = 0x000000ff;
Uint32 g_gmask = 0x0000ff00;
Uint32 g_bmask = 0x00ff0000;
Uint32 g_amask = 0xff000000;
#endif

/* 程序的分辨率和色深 */
const int SCREEN_W = 640;
const int SCREEN_H = 480;
const int SCREEN_BPP = 32;

/* 用于组合颜色分量成一个颜色值 */
#define XRGB(r, g, b) SDL_MapRGB(screen->format, r, g, b)

/* 全局屏幕表面 */
SDL_Surface *screen = NULL;

void DrawPixel(SDL_Surface *, int, int, Uint32);
void PutPixel(int, int, Uint32);

/* 向表面上的(x, y)画一个颜色为color的点 */
void DrawPixel(SDL_Surface *surface, int x, int y, Uint32 color)
{
int bpp = surface->format->BytesPerPixel;
SDL_Surface *pixel = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, bpp << 3, g_rmask,
g_gmask, g_bmask, g_amask);
SDL_Rect rect;
rect.x = x;
rect.y = y;
rect.w = rect.h = 1;

SDL_FillRect(pixel, NULL, color);
SDL_BlitSurface(pixel, NULL, surface, &rect);
SDL_FreeSurface(pixel);
}

/* 将DrawPixel封装成类似于TC的 putpixel 函数,即直接向屏幕指定位置画点 */
void PutPixel(int x, int y, Uint32 color)
{
DrawPixel(screen, x, y, color);
}


/* 测试函数 */
int main (int argc, char *argv[])
{
SDL_Event event;
int done = 0; /* 主循环退出标志 */

/* 初始化 SDL */
if (SDL_Init (SDL_INIT_VIDEO) < 0)
{
exit (1);
}
atexit (SDL_Quit);

/* 设置图形模式 */
screen = SDL_SetVideoMode (SCREEN_W, SCREEN_H, SCREEN_BPP, SDL_HWSURFACE | SDL_DOUBLEBUF);
if (screen == NULL)
{
exit (2);
}
SDL_WM_SetCaption ("SDL Put Pixel", NULL); /* 设置窗口标题 */

while (!done) /* 主循环 */
{
/* 检查事件 */
while (SDL_PollEvent (&event))
{
switch (event.type)
{
case SDL_KEYDOWN: /* 按任意键退出 */
done = 1;
break;
case SDL_QUIT:
done = 1;
break;
default:break;
}
}

/* 在屏幕上的随机位置画白色的点 */
PutPixel(rand() & 511, rand() & 511, XRGB(255, 255, 255));
/* 将后台页显示到前台页 */
SDL_Flip (screen);
/* 延时 */
SDL_Delay (1);
}

return 0;
}

2007-09-04 09:54
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
以上代码在Fedora 7下通过,另外在WINDOWS下的DEV-CPP + SDL也可以使用。
基本的SDL库没有带画点或画线之类的函数,但扩展库中提供了。这里是假设你只有基本库,而且这个方法与SDL官方文档中提到的锁表面直接写显存再解锁不同,这个方法是通过表面之间的直接Blit实现的,不需要锁表面,如果有心对其优化的话,效率会很高。
在Fedora下找个文本编辑器粘贴进去保存为一个.C文件(这里假设是mian.c),再打开控制台,进入该文件所在路径,敲入gcc main.c -lSDL回车(注意大小写)就可以在同目录下看到一个a.out输出文件了,当然也可以通过“-o”参数指定输出文件名。再在控制台中敲入./a.out或者直接双击a.out文件都可以执行它,按任意键退出运行。
现在给你画点的方案了,这也仅仅是LINUX下画点的方案之一,由于在LINUX下进行游戏开发SDL比较常用,所以介绍了此法,如果你有兴趣,可以到我的主页http://www.ds0101.com/找到一些关于SDL的资料。
2007-09-04 10:06
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
得分:0 

拜谢一笔苍穹斑竹!

讲授的非常细致。连编译过程和测试代码都写来了。呵呵,斑竹真是侠肠骨道。

我这样的初哥very受益啊


2007-09-04 11:22
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
得分:0 


/* 初始化 SDL */
if (SDL_Init (SDL_INIT_VIDEO) < 0)
{
printf("SDL_Init is failed"); //加了一条打印
exit (1);

}

编译通过了。

调试时,初始化的过程出现了一个问题。
我加了这条打印。发现是SDL初始化过程失败了。
(在编译过程中,我确实加了-lSDL的参数)


2007-09-04 15:28
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
得分:0 


。。。
/* 初始化 SDL */
if (SDL_Init (SDL_INIT_VIDEO) < 0)
{
printf("could not initialize SDL: %s\n",SDL_GetError()); //修改一次提示信息
exit (1);
}
。。。。

root\> gcc main.c -o main -lSDL
root\> ./main
root\> could not initialize SDL: No available video device


初始化失败,不能找到可用的视频设备。
我又从google找了一个最简单初始化SDL的例子来调试SDL初始化过程,结果是仍然不能初始化。那么这个视频设备到底是指什么呢?是不是我的显示器。为何我在本地不能初始化呢.


测试初始化SDL的例子附下:
#include <SDL/SDL.h>
#include <stdio.h>

int main() {

printf("Initializing SDL.\n");

/* Initialize defaults, Video and Audio */
if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) {
printf("Could not initialize SDL: %s.\n", SDL_GetError());
exit(-1);
}

printf("SDL initialized.\n");

printf("Quiting SDL.\n");

/* Shutdown all subsystems */
SDL_Quit();

printf("Quiting....\n");

exit(0);
}




2007-09-04 16:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-166800-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.082691 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved