共1条
1/1 1 跳转至页
[转帖]Beauty16 for GBA Beta 0.2使用手册
源代码下载
[upload=zip]viewfile.asp?ID=372[/upload]
GBA是什么我就不用说了吧?呵呵。好了,转贴文章开始:
这个文档不是教你如何编写一个gba游戏,它仅仅是介绍Beauty16 for GBA的功能和使用方法而已。如果你打算使用这个函数库来编写GBA游戏的话,你就需要仔细的阅读本章,如果不是,那么请按Alt+F4。
现在有很多的GBA开发库,但都是老外们编写的根本没有一个详细的中文使用说明,虽然它们提供了一些demo和库的原代码。但我们没有太多的时间去研究和实验。所以,在这篇文档中,我将尽可能的详细介绍由我编写的Beauty16 for GBA函数库的使用方法。这里所提到的一些工具软件是我用watcom编译开发的,你可以到我主页的 软件下载 栏目中得到它。
http://yourqxy.yeah.net 我的主页
http://qxybbs.yeah.net 我的论坛
http://www.cocgame.com/leshui/gba/tools.zip 工具包
http://www.cocgame.com/leshui/gba/beauty16_for_gba.zip Beauty16 for GBA Beta 0.1开发库
更新了什么?
由于在上一个版本中的测试不完全,忽略了使用ArmSdt编译时的一些问题,主要是不能正确的显示中英文字符。关于出现这个问题的原因我已经找到了,问题出在SdtArm的C++编译器上。:
“ArmSdt的C++编译系统中,似乎并不支持struct结构中的构造和析构函数,虽然在编译的过程中它没有任何的错误提示。”
如果你使用了ArmSdt进行编译,那么你在使用OutText()函数时要注意显示的总字符长度不要超过29个字符。(你可以在函数库中自行修改,但我认为29个字符足够多了。)
如果你以前使用过我编写的PC版beauty16函数库,你会发现这个惊人的相似。是的,我的原意也是如此,为不同的平台开发一个接口及功能相似的底层,方便以后的移植工作。如果你也在某个领域或平台开发底层,希望你也可以这样做。
1.安装:
按装这个库是非常容易的,你只要将压缩包解压缩到你指定的目录就可以了,你会在这个目录下看到一个名为“H” 的子目录。是的,你想的很对,这个目录下就是所有的函数库,将它们单独放在一个目录中进行管理将是很明智的方法,希望你也可以这么做。
2.使用:
你只要将头文件“GRP.H”加入到你的主文件中就可以了,这个库支持GCC和ARMSDT两个编译器,但是这两个编译器有些不相同的地方,所以你也必须在我的函数库中做出相应的设置:
使用ARMSDT编译器:
#define ARM //必须在grp.h前定义这个
#include "h\grp.h"
如果你使用gcc编译器的话,你就不需要做什么改动。
因为是以原代码的方式提供给你使用的,所以其中会有你使用不到的代码部分,这些无用的代码可能会增加你编译的时间。所以对于一些特殊的函数我用了条件编译的方式来处理。这些函数是:
字符显示(英、中)、声音播放
默认情况下这两个函数库是不被编译的,所以你也无法使用。如果你确实需要使用它们,请按照下面的方法:
#define HZK_INSTALL //使用中英文显示
#define SOUND_INSTALL //使用播放声音
.
.
#include "h\grp.h"
如果你使用这个库,你需要将你程序中的主函数main()更改为 void MyMain(void) ,只有这样你才能正常的编译。
这里我将提供给你我使用GCC和ARMSDT编译器时的一些参数信息:
使用GCC编译:(假设你要编译的文件名为“main.cpp",下同)
gcc -mlong-calls -x c++ -lm -O3 -o main.elf main.cpp
objcopy -v -O binary main.elf main.bin
注:前提是你要正确设置了gcc编译器的目录
zarmasm -Littleend -cpu ARM7TDMI -32 h\boot.asm
zarmcpp -c main.cpp -o main.o
zarmlink -bin -libpath d:\arm\lib -first boot.o -ro-base 0x08000000 -rw-base 0x03000000 boot.o main.o -o main.bin
注:前提是你要正确设置了ArmSDT编译器的目录。boot.asm是我为armsdt编译器的需要而专门放置在库中的你不要更改其中的任何内容。“d:\arm\lib”是armsdt系统的库文件路径,你可以根据实际安装的位置进行更改。
3.函数说明
(1)系统头文件
grp.h
这个文件中定义了一些类型和本函数库需要的各种设置。为了统一与方便你最好使用新的类型声明方式:
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef signed char s8;
typedef signed short s16;
typedef signed long s32;
typedef volatile unsigned char vu8;
typedef volatile unsigned short vu16;
typedef volatile unsigned long vu32;
typedef unsigned char byte;
typedef unsigned short hword;
typedef unsigned long word;
这样做不仅仅是方便,更是为了与其它一些gba开发库兼容。你还可以使用这些宏定义:
#define FALSE 0 //假
#define TRUE 1 //真
#define NULL 0 //空
#define MIN(x,y) (((x) < (y)) ? (x) : (y)) //取两者最小数
#define MAX(x,y) (((x) > (y)) ? (x) : (y)) //取两者最大数
#define MID(x,y,z) MAX((x), MIN((y), (z))) //取三者中间数
#define ABS(x) (((x) >= 0) ? (x) : (-(x))) //取绝对值
#define SGN(x) (((x) >= 0) ? 1 : -1) //判断是否为正数
(2).图形图象
Draw.h
这个是负责图形图象部分的函数,也是最重要的一个部分。它定义了:
#define REG_DISPCNT *(u16*)0x04000000 // 显示寄存器地址
#define DISP_Y *(volatile u16*)0x4000006 //当前扫描线位置
#define VRAM 0x06000000 // 图像缓冲区地址
#define M5_VRAM 0x0600A000 // M5缓冲区地址
#define BACKBUFFER 0x010 // 双缓冲/背缓冲地址
#define BG2_ENABLE 0x0400 // BG_2
#define MODE_3 0x03 // 240*160 15位/单缓冲区
#define MODE_5 0x05 // 160*128 15位/双缓冲区
#define RGB(r,g,b) ((r)+(g<<5)+(b<<10)) //将rgb转换为15位色
#define RGB_ex(r,g,b) ((((b)>>3)<<10)+(((g)>>3)<<5)+((r)>>3)) //将rgb转换为15位色
#define SCREEN_W screen.w; //当前显示模式的宽
#define SCREEN_H screen.h; //当前显示模式的高
结构BITMAP是这个函数中的核心结构,在所有的和图象有关操作的函数中,这个是必须的。
typedef struct BITMAP
{
float bitx,bity;
u16 x,y,w,h;
u16 MskCol;
u16 *dat;
u8 flag;
}BITMAP;
向screen中写如数据就是向gba屏幕的显示。
函数简介:
void grp_init();
初始化函数,在使用这个库的图象函数前必须调用。
void blit(BITMAP dst,BITMAP src,u16 x1,u16 y1,u16 x,u16 y,int w,int h);
将src中从x,y长宽为w,h的图像数据拷贝到dst的x1,y1位置处。
void masked_blit(BITMAP source,BITMAP dest,u16 x,u16 y,u16 x1,u16 y1,int w,int h);
同上面那个函数功能相同,但这个将过滤掉dest中设置的透明色MskCol;
BITMAP load_bitmap(int width,int height,const u16 *dat);
将经过转换后的图象数据“装入”结构,为以后使用blit和masked_blit准备,width 和height分别是图象的宽和高。默认图象左上角第一个颜色值为透明色。
BITMAP load_bitmap(const u16 *dat);
将经过p2gba工具转换后的图象数据“装入”结构,为以后使用blit和masked_blit准备,因为我将图象的宽和高放置在数组中,这个函数会自动处理所以你不需要做更多的事。默认图象左上角第一个颜色值为透明色。
void putpixel(BITMAP bitmap,u16 x,u16 y,u16 col);
画点函数
void setcolor(u16 col);
设置当前作图颜色,这个函数会被其它一些没有颜色参数的函数调用,如:OutText(..);显示字符
void vline(BITMAP bitmap,u16 x,u16 y,u16 y1,u16 col);
画水平线
void hline(BITMAP bitmap ,u16 x,u16 y,u16 x1,u16 col);
画垂直线
void line(BITMAP bitmap,u16 left,u16 top,u16 right,u16 bottom,u16 color);
画线
void clear(BITMAP bitmap);
用0号色填充bitmap;
void clear_to_color(BITMAP bitmap,u16 col);
用指定颜色填充bitmap
void clear_xy(BITMAP bmp,u16 x,u16 y,int w,int h,u16 col);
用指定色填充指定区域
void rectfill(BITMAP bitmap,u16 x,u16 y,u16 x1,u16 y1,u16 col);
画矩形并填充
void rect(BITMAP bitmap,u16 x,u16 y,int top,int bom,u16 col);
画矩形
void Flip()
页反转函数(在MODE_3模式下无效)
(3).中英文显示
hzk.h
这个文件中提供了两个函数:
void textout(BITMAP bitmap1,char *Str,int x,int y,u16 col);
这个函数用来显示一些字符。
void OutText(BITMAP bitmap,int x,int y,const char *str,...);
这个的功能和上面的函数一样,但这个可以使用c/c++中的转意符,如: %d,%x等。这个函数使用由setcolor()所设定的颜色来显示。
(4).时钟函数
timer.h
因为我目前用到关于时钟的地方还不是很多,所以只提供一个函数:
void Wait(int ms);
延迟函数,单位:毫秒
注:根据我在使用中发现,这个似乎并不能真正停止程序的运行,仅仅是延迟了屏幕的更新,也有可能是模拟器的问题。
(5).按键函数
input.h
这个只有一个宏定义 KEY(keys) keys的键值是以下中的一个:
#define KEY_A 1
#define KEY_B 2
#define KEY_SELECT 4
#define KEY_START 8
#define KEY_RIGHT 16
#define KEY_LEFT 32
#define KEY_UP 64
#define KEY_DOWN 128
#define KEY_R 256
#define KEY_L 512
#define K_NONE 0x0
#define K_ALL 0x3FF
当检测到你定义的键按下后,他会返回一个TRUE值。如果你查看过这个文件,你还会发现有3个函数我没有提到。这3个函数我从别的开发库中找到,但我没有使用过它们你可以试一试。另外,在模拟器上会出现左右键相反的情况,虽然你在程序中的使用并没有错。我没有GBA所以,无法在它上面测试。
(6).声音播放
sound.h
这个虽然可以正常的播放,但还没有达到我预期的目的,只所以拿出来是为了给那些想要的朋友先看看。
void PlaySound(u8 *sound, u16 sampleRate, u32 length);
播放声音(A、B两声道),*sound是声音数据,我建议使用8位单声道格式。sampleRate是声音的播放频率,length播放文件长度。
void UpdateDirectSound(void);
检测声音是否已经播放完毕。你需要在自己的程序中不断调用它。例:while(1){UpdateDirectSound();}
void PlayDirectSoundA(u8 *sound, u16 sampleRate, u32 length);
播放声音(A声道),参数同PlaySound。
void PlayDirectSoundB(u8 *sound, u16 sampleRate, u32 length);
播放声音(B声道),参数同PlaySound。
void UpdateDirectSoundA(void);
检测声音(A声道)是否已经播放完毕。使用方法同UpdateDirectSound;
void UpdateDirectSoundB(void);
检测声音(B声道)是否已经播放完毕。使用方法同UpdateDirectSound;
(7).DMA函数
void DMA_Copy(u8 channel,void* dest, void* source, u32 WordCount, u32 mode);
GBA上有4个dma通道,但我只用这个来传输图象数据。
channel: 通道号 (0,内部数据传输。1,A声道数据传输 2,B声道数据传输 3,任何数据传输)
dest: 目标指针
source: 源指针
WordCound: 数据长度
mode: 传输模式 (32为模式:DMA_32NOW 16位模式: DMA_16NOW)建议使用32位的传输模式。
(8).其它
boot.asm
这是为ArmSdt编译器准备的文件,你不要改动它。
这个库的大部分函数和一些你可使用的定义我都在这里做了介绍,也许你还会发现有我未说明的函数,但你最好不要使用它,除非你彻底读懂或修改过可以正确的运行。这个库我还将不断的补充与修改,如果你为这个库添加或修改了函数使这个更加的方便与完美,希望你将修改后的代码发给我或公开。再次声明,这个库现在是完全免费的,你有权对原代码修改,也有义务公开你修改后的代码。但你无权将这个作为商业软件或是将利用这个库做出的任何程序商业化。
关键词: 转帖 Beauty16 使用手册 这个 如果 使用
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |