我在GBA编程一个游戏的乐趣,想使用模式4。我最近在模式3中创建了一个游戏,它的dma非常简单。如果我想在屏幕上绘制图像,dma结构是否相同?以下是我的文件:
/*
* A function that will draw an arbitrary sized image * onto the screen (with DMA).
* @param r row to draw the image
* @param c column to draw the image
* @param width width of the image
* @param height height of the image
* @param image Pointer to the first element of the image. */
void drawImageInMode4(int r, int c, int width, int height, const u16* image)
{
for(int i = 0; i < height; i++){
DMA[3].src = image + OFFSET(i,0,width);
//offset calculates the offset of pixel to screen
DMA[3].dst = VIDEOBUFFER + OFFSET(r+i,c,240);
DMA[3].cnt = DMA_ON | width;
}
我感觉这不是使用模式4,而是使用模式3。我已经查看了如何修改我的代码,使其可以在模式4中工作。提前感谢!
在GBA上,模式3和模式4之间的主要区别是模式3对每个像素使用2个字节,而模式4使用一个调色板表对每个像素使用一个字节。您仍然将数据复制到相同的位置,但视频硬件对其的解释不同。(Tonc包含了一个很好的示例。)
您需要对代码进行的主要更改如下:
- 将每行复制的字节数减半
- 调整
OFFSET
宏以返回模式4的正确值 - 选择要将像素数据写入 的两个页面中的哪一个
(您还需要将位图转换为8bpp格式,并为它们提供调色板数据)
模式4引入了另一个问题:您的图像可以是奇数字节宽。由于VRAM不支持单字节写入,您需要编写一些特殊的代码来处理这种情况,或者永远不要绘制具有奇数宽度或x位置的图像。