下面我将一一讲解上篇的程序

前三行:

typedef unsigned char u8;

typedef unsigned short u16;

typedef unsigned long u32;

定义GBA程序自己的数据类型,因为这样我们就很容易知道每个数据在GBA中占的字节数.

#define REG_DISPCNT *(u16*)0x04000000         // 显示寄存器地址

REG_DISPCNT是设置显示模式的寄存器.GBA中有mode0-mode5六个显示模式.我们这个程序的显示模式是mode4,也就是240x160的8位色(256色)的双缓冲显示模式.比如mode3,就是240x160的16位真彩色的单缓冲显示模式.

#define VRAM 0x06000000                         // 图像缓冲区地址

#define PALETTE 0x5000000                      // 调色板地址

VRAM就是GBA的显示内存,简单地说VRAM中的数据就是屏幕上的图象.跟我们的平常用的计算机一样的.PALETTE就是调色板地址,简单地说就是装图像调色板的地方.

#define MODE_4 0x04                                // mode4标志

#define BG2_ENABLE 0x0400                      // BG_2标志

MODE_4和BG2_ENABLE都是设置REG_DISPCNT的值.

我们再看看main函数主要做了些什么.

首先是SetMode (MODE_4 | BG2_ENABLE); 把显示模式设置成mode_4.然后是执行Draw函数,把我们刚刚转换的helloworld.h里面的图像数据和调色板数据复制指定的内存去.在Draw这个函数里面,都是使用了for循环一个一个地把调色板数据和图象数据复制到内存中去的.

前面提到过,GBA中MODE4支持的是240*160并且256色的显示方式,那么显示内存VRAM中一个字节就对应屏幕上的一点的颜色.这么算来,整张240*160大小的屏幕就应该有240*160=38400个字节.所以我们在helloworld.h中的helloworld_gfx有38400/2=19200个元素(一个u16是占两个字节).而且我们还可以通过公式来计算得到屏幕中一点对应在VRAM的地址.这样就可以得到下面的写点函数.特别指出的是,对于VRAM的访问只能是u16大小的数据类型,而不能是u8(包括char).而一个u16类型的数据表示着两个点的信息,低8位对应的是前面的点,高8位对应的是后面的点. 所以我们需要一些算法来实现对屏幕中单独一个点的读写,请看下面的写点函数

void SetPixel(int x,int y,u8 color)

{

register u16 *tc;

tc= video_buffer+y*120+x/2;

if(x&1)  // 如果x是奇数

*tc=((*tc&0x00FF)+(color<<8));

else

*tc=(*tc&0xFF00)+color;

}

其中video_buffer就是显示内存VRAM的地址.屏幕上的点与VRAM中的值是按线性一一对应的.VRAM中第1个字节的信息就是屏幕中(0,0)这个点的颜色在调色板上的引索,第2个字节就是屏幕(1,0)的颜色信息,第3个字节就是(2,0)的颜色信息,一次类推.到第241个字节就是屏幕(0,1)的颜色信息.然后第242就是(1,1)的信息...由此关系,我们可以找出公式,在屏幕上(x,y)点的信息应该是储存于VRAM中第 y*240+x 个字节里,那么我们如果要画(x,y)这一点,就只需要修改VRAM中第y*240+x个字节的信息就OK了.可是这里又有个问题困扰着我们,那就是上面黑体字写的,GBA中对于VRAM的访问不能是单单的一个字节的访问,而必须是16位两个字节的访问.这也就是说你每次写点的同时会影响到旁边的点的信息.还好,我们可以通过简单的位运算可以在避开影响旁边点的同时,完成对(x,y)的写点工作.代码已经在上面了.由于*tc是16位的指针,所以tc加1就等于移动了16位两个字节的距离.所以在代码中,tc=video_buffer+ y*120+ x/2 而不是前面所说的tc=video_buffer+ y*240 +x.至于后面的代码我也就不多讲了,如果你觉得有问题,那么应该去查看一下C语言书籍.

通过这个函数,你就可以在屏幕上画线,画圆,画矩型等,甚至还可以写汉字.

4.更多的资料和信息

GBA上的mode4下第一个程序虽然做出来了,但是想要真正地做GBA开发那还远远不够的.GBA里面支持Bg(Background)背景,OBJ(Object)精灵等东西,那些才是GBA游戏中常用的技术.通过Bg和OBj才能进一步使用GBA硬件上的Alpha混合,Face in/out,马塞克等特效支持.可惜我不可能在这里把这些东西都详细讲解出来.你可以到www.gpgame.net网站上找到我写的十分详细的GBA资料,名字叫做GBA探索日记.同时也可以到www.gbadev.org去查看许多国外的教程.www.gbadev.org是个十分齐全的GBA开发网站,你可以在上面找很多国外的朋友写的demo,开发工具,源代码,文章等等.虽然目前国内还没有正式的GBA开发网站,但是可以到http://www.wodenstar.com/cgdn/bbs/index.php 论坛上找到很多已经在做GBA开发的朋友.在这里我要提醒大家的是,开发GBA程序其实是很简单的事情,困难的是资料的缺乏,尤其是中文资料.最后我把我的联系方式告诉大家,如果大家在做GBA过程有什么问题,希望我能帮上你.QQ:8664220,email:tangl_99@sohu.com,msn:tangl_99@hotmail.com

GBA程序开发入门3相关推荐

  1. GBA程序开发入门1

    GBA程序开发入门 1.GBA简介 Game Boy Advanced(GBA)是日本任天堂公司于2001年推出的一款32位掌上游戏机.它着重于游戏机的便携式,并且以2D游戏为主(3D游戏依然不错). ...

  2. 掌上游戏机开发指南——GBA程序开发入门

    1.GBA简介 Game Boy Advanced(GBA)是日本任天堂公司于2001年推出的一款32位掌上游戏机.它着重于游戏机的便携式,并且以2D游戏为主(3D游戏依然不错).GBA有十分高效硬件 ...

  3. 教孩子学编程python语言pdf_iOS(iPhone)应用程序开发入门视频教程(35讲)

    资源名称:iOS(iPhone)应用程序开发入门视频教程(35讲) 资源目录: [IT教程网]ios(iPhone)应用程序开发入门视频教程:第10讲多视图应用程序 [IT教程网]ios(iPhone ...

  4. 《微信小程序开发入门精要》——导读

    本节书摘来自异步社区<微信小程序开发入门精要>一书中的导读,作者 李宁,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 第1章 微信小程序入门 第1章第1节 ...

  5. android入门程序源代码,安卓程序开发入门

    您可能感兴趣的话题: 安卓程序开发入门 核心提示:本教程为大家介绍采用Eclipse软件来编写安卓Hello,World程序. 创建一个新项目是很简单的,只要你安装了Eclipse插件,并且你的Ecl ...

  6. Linux 应用程序开发入门

    Linux 应用程序开发入门 Neo Chen (netkiller) <openunix@163.com> 版权 © 2011, 2012 http://netkiller.github ...

  7. 小程序onload_微信小程序开发入门之共享账本(十四)

    微信小程序开发入门之共享账本(十四) (备注:微信小程序的wxml文件相当于HTML文件,wxss文件相当于CSS文件,js文件就是JavaScript文件,数据库为NoSQL数据库,数据库脚本语言也 ...

  8. 小程序开发入门基础篇-张代浩-专题视频课程

    小程序开发入门基础篇-1995人已学习 课程介绍         采用小程序wepy框架,初级讲解如何搭建小程序的开发环境,创建工程,语法介绍.开发调试等,课程采用实战代码案例作为教材,通俗易懂,简单 ...

  9. 《微信小程序开发入门精要》——第2章,第2.8节带边距的水平等间隔排列

    本节书摘来自异步社区<微信小程序开发入门精要>一书中的第2章,第2.8节带边距的水平等间隔排列,作者 李宁,更多章节内容可以访问云栖社区"异步社区"公众号查看 2.8 ...

最新文章

  1. 海南大学计算机调剂要求,海南大学2020年硕士研究生招生调剂的公告
  2. php的正则表达式函数,php中常用的正则表达式函数
  3. linux 启动/关闭多个py脚本
  4. 什么?船开上高架了!
  5. 基于区块链技术的数据资产管理机制研究
  6. jvisualvm性能监控
  7. 1、pandas入门示例
  8. 为什么我keepalive配置的vip不能通_企业十大应用-Keepalived-配置详解
  9. psftp的简单使用
  10. 贝塞尔曲线运动n阶追踪方程的数学原理及其匀速化方法和应用
  11. Windows下功能强大注册表整理、修复软件RegClean Pro v6.21多国语言版
  12. java 操作主机,告诉你java怎么实现键盘操作
  13. Stream.of()用法示例
  14. 色彩空间(一):色彩空间基础
  15. 蓝牙传输速率详细分析【针对蓝牙4.2]
  16. Numpy计算分位点及标记对应区间的下标
  17. 【PC】如何导出windows锁屏壁纸
  18. ThinkPhp6+Vue智慧医疗后台管理系统
  19. MODBUS RTU转PROFIBUS DP 转换器怎么接线远创智控
  20. Linux通过wine运行QQ,Ubuntu安装wine运行QQ和微信

热门文章

  1. Charles的基本使用方法
  2. python学习之-- 协程
  3. 函数——哥德巴赫猜想
  4. ps—简易理解ps图层的各种混合模式
  5. 谁你的财神 谁是你的穷神
  6. 关于图文识别功能相关技术的大致实现
  7. 微信小程序 - 获取当前日期时间(函数封装)
  8. 大盗阿福(打家劫舍)
  9. Atom汉化之Atom-Simplified-Chinese-Menu
  10. matlab不连续分段函数,分段函数画出的曲面不连续如何办?