编辑: 被控制998 2013-10-19
NDS自制软件教程2 NDS自制软件教程2 这一部分包括如何利用NDS的 帧缓冲 (framebuffer)模式在NDS的一个显示屏上绘图.

NDS的每一个显示屏都可以被设置成很多种模式.每一种模式有其优缺点,但我们这里只使用 帧缓冲 模式来实现一个最简单的绘图功能. 帧缓冲 (framebuffer): 帧缓冲 是一种显示屏映射到一部分内存的模式.向内存中写数据会导致数据显示在显示屏上.在这个模式中,显示屏上的一个象素由2字节数据表示.这相当于C语言中的16位无符号整型数据类型(16 bit unsigned integer).我们写入这部分内存的数据是以555格式显现的象素颜色. 所以我们不需要人为转换555格式,这有一个方便的宏'

RGB15'

让我们确定每一个象素的红、绿、蓝色的数量.每一个红、绿、蓝元素是一个从0-31的值.0表示无颜色,31表示最大色.(通过不同组合来显现不同颜色).这是一个例子: RGB15 ? ? ? Color RGB15(31,0,0) ? Red RGB15(0,31,0) ? Green RGB15(0,0,31) ? Blue RGB15(0,0,0) ? Black RGB15(31,31,31) White 下面的代码片是示范如何通过给定一个指向 帧缓冲 区内存开始部分的指针来用蓝色填充屏幕的: ? uint16* framebuffer = ...;

for(int i = 0;

i <

SCREEN_WIDTH * SCREEN_HEIGHT;

++i) ? *framebuffer++ = RGB15(0,0,31);

向 帧缓冲 写的数据会立刻被画在相应象素上. 帧缓冲 模式的好处是你可以在屏幕任意地方画任何你想画的东西,它直接使用NDS的2D硬件加速. 帧缓冲 的缺点是你必须自己做所有事.没有 精灵 ('

sprites'

)、贴图、卷动等等,除非你自己写代码实现.NDS的其他模式也许会适合做这些事,它们会在以后的教程中介绍.同时, 帧缓冲 模式有很多灵活性,并让我们更加接近硬件. 屏幕: 从硬件角度来看NDS上有两个屏幕.一个在上一个在下.下屏是唯一的触摸屏. 从编程角度来看这也有两个屏.一个主屏和一个副屏.每一个程序设计中的屏是和硬件对应的.在这个例子中我们只使用一个屏,主屏,它所对应的是硬件的上屏幕. 我们用一个叫'

videoSetMode'

的函数来设置屏的模式.有很多 帧缓冲 内存可以被映射到一个屏幕.这就允许我们实现双缓冲、特殊页之类的功能.我们现在只使用一个 帧缓冲 ,所以我们使用 MODE_FB0 ;

videoSetMode(MODE_FB0);

帧缓冲 的内存区域是一部分带有一个字母 A 的名叫'

VRAM'

的内存.对每一部分,我们需要告诉显示系统那一部分'

VRAM'

内存我们用来做 帧缓冲 .我们可以像这样使用第一个,VRAM_A: vramSetBankA(VRAM_A_LCD);

画一个图形: 我们要在显示屏上画的是一个单色矩形.我们写了一个函数来实现它,函数参数包括矩形在屏幕上的位置的X、Y坐标、颜色、以及一个指向 帧缓冲 区的指针: void draw_shape(int x, int y, uint16* buffer, uint16 color) { buffer += y * SCREEN_WIDTH + x;

for(int i = 0;

i <

shape_height;

++i) { ? uint16* line = buffer + (SCREEN_WIDTH * i);

? for(int j = 0;

j <

shape_width;

++j) { ? ? *line++ = color;

? } } } 帧缓冲 在内存中以行排列,所以如果屏幕有200象素宽,那麽 帧缓冲 开始的200个uint16(一个象素由一个uint16数据表示)数据单元就代表显示屏的第一行.第二个200个uint16数据单元就表示第二行,等等. draw_shape 函数首先通过对X、Y坐标的计算来确定第一个象素在 帧缓冲 中的位置.注意SCREEN_WIDTH 和SCREEN_HEIGHT 是 LIBNDS 提供的返回屏幕宽、高的宏. 函数接下来通过向 帧缓冲 中的正确位置写入颜色数据来绘制图形的每一行. shape_height 和shape_width 是静态变量,做测试时可改变其值: static int shape_width = 10;

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题