赞
踩
wii homebrew 程序编程入门指南
请尊重原作者的劳动成果,转载请注明出自A9VG和原作者Silenceburn!
本人水平有限,难免错漏,欢迎各路高手拍砖指正,非常感谢!
Chapter 1: wii 自制程序简介 |
由于TP漏洞的存在,wii使用自制程序的大门被完全的打开了。这也吸引了大量的编程高手在这个全新的平台上一展身手。
时至今日,wii上的自制程序的种类和数量都是相当丰富的,以下简单列举几类,
完整的主流自制程序列表请查看 homebrew apps
● LOADER类:
程序名称 | 程序作者 |
Homebrew Channel | Team Twiizers |
Wiiload | Team Twiizers |
All-in-1 Emuloader | Eke-eke |
Front SD ELF Loader | svpe |
Gecko Region Free | Nuke |
geckoloader | dhewg |
TCP Loader | svpe |
Wii Homebrew Launcher | Hell Hibou |
WiiTCPLoad | Bart?omiej Burdukiewicz |
● 模拟器类:
程序名称 | 程序作者 |
AtaWii | NoNameNo |
FCE Ultra Wii | Askot+others |
FUSE | bg |
Genesis Plus | Eke-eke |
Hugo-wii | Eke-eke |
Mike Tyson's Jungle Beat | SpindleyQ + FCEU Team |
Neopop Wii | Askot |
RIN Wii | mirakichi |
ScummVM | dhewg |
SDL MAME | Nuvalo |
SMSPlus | Eke-eke |
Snes9X Wii | Askot+dsbomb |
Trojan Wii | Jon Conrad |
Visual Boy Advance | emu_kidid |
Wii64 | tehpola |
Yabause Wii | Yabause team |
● 工具类:
程序名称 | 程序作者 |
Duplicate Channel Remover | Waninkoko |
ftpii | joedj |
Gamecube Saver | dasda |
Homebrew Browser | teknecal |
Mii Extractor | Waninkoko |
Mii Installer | Waninkoko |
Rebooter | SquidMan |
Save Extractor | Waninkoko |
Savegame Installer | Waninkoko |
SD Explorer | miom |
Title Lister | bushing |
WAD Manager | Waninkoko |
WiiBServer | Jay |
Wiihttpd | teknecal |
WiiMU | SquidMan |
Wii Web Server | Cboomf + Felix123 + Others |
WiiWhiteboard | Bg |
xyzzy | bushing |
仔细看看上述列表的话,会发现很多我们耳熟能详的程序名称,我们在享受这些程序、工具带给我们的快乐和方便的同时,请不要忘记这些程序的开发者在幕后的艰辛工作,再次向他们表示敬意和感谢!
我作为一名程序员,个人一直笃信中国的程序员的聪明才智不落后于世界上任何一个国家的程序员群体。而wii独特的体感操作方式,大量简单快乐的休闲游戏,一定的健身和运动效果,都非常适合高脑力强度高压力工作的程序员(IT工作者)群体用于放松身心,所以我相信入手wii的程序员(IT工作者)也不会少^_^。那么何不在自己心爱的wii上写一点小程序自娱自乐,或者小工具方便大家呢?
例如我的两个demo恶搞作品:
● 漂浮的A9 logo
● 支持wiiRemote的mini小游戏
我个人能力和精力都很有限,没法写出更多更好的作品来给大家使用,因此想通过这篇文章,介绍一下wii 自制程序编程的一些基础和入门知识,好让更多的高手们少走一些弯路,尽快投入到真正的应用研发中去^_^
值得注意的是,本文假设本文读者具备一定的 linux / linux 环境编程 / C语言 知识,否则您的阅读可能会很辛苦
Chapter 2: 准备软硬环境 |
● 硬件方面
-- wii本体
-- PC主机
-- SD卡 (或者通过无线路由器使用wii TCPLoader )
● 软件方面
-- devkitProUpdate-1.4.7 devkitPro开发包安装程序
● Cygwin MinGW Msys 的选择
由于大多数人没有安装双系统,为了方便起见,这里只介绍在WINDOWS上如何搭建编程环境。
为了编译程序,我们需要一套windows下面的linux编译环境仿真程序,而这种仿真程序,主流的有三种,Cygwin、MinGW和Msys 。Cygwin 功能强大使用广泛,可支持的安装包也非常多,但是安装时需要做大量的手工选择,对于编译环境不熟悉的人很有可能漏选一些重要的包。MinGW的情况和Cygwin差不多,功能强大,但是其实我们使用不到那么多的功能。最后,我个人的选择是MSys,而且使用的是 devkitPro 开发包中自带的Msys,已经特别为我们所要做的工作进行了定制,强烈推荐大家直接使用这个自带的MSys来编译程序。
Chapter 3: 安装DevkitPPC开发包 |
devkitPro是一款非常非常强大的开发包集合,目前几乎所有工作在windows平台下的NDS/PSP/WII的自制程序开发者都是使用这套集成开发包来进行开发的。
官方网站:www.devkitpro.org
devkitPro的安装也非常简单,因为有一个独立的安装/更新工具存在。有了这个工具,我们确定自己的需求后,该工具会自动选择下载并安装我们需要的开发包。而且通过改工具,我们还可以随时在线更新这套开发包。该安装/更新工具的最新版本是 devkitProUpdate-1.4.7 ,我在上一章中已经提供了该最新版本工具的纳米盘下载。
启动该工具后,就可看到如下的安装向导界面
点击next后,选择是仅下载还是下载并安装,我们当然是选择下载并安装了:
继续next后,选择是否保留下载文件,建议大家选择保留:
再次NEXT后,就到重点部分了,在这里我们需要选择要安装的开发包:
点击“select the type of install ”,然后选择 devkitPPC,这是wii/ngc程序的开发包,
如果选择 devkitARM 就是安装NDS开发包,选择 devkitPSP 的话顾名思义了。如果选择full自然就是全部安装,选择custom可以手动调整要安装的开发包。
选择devkitPPC后的情况如下:
再次next,接下来是选择安装路径,这一步没什么好说的:
再次next,接下来本工具开始自动下载安装包,根据网速情况这一步可能后花很长时间,请耐心等待:
耐心等待全部下载完毕后,进入解压安装界面:
至此,devkitPPC 安装完成。
注意:由于安装时是从国外站点下载,可能会非常慢,因此我把所有安装时需要的包单独打包了一份,上传到了纳米盘供大家使用。
devkitPPC打包下载
把我打包的这份安装包里面的内容解压到devkitProUpdate的相同路径下,像这样:
然后运行Update,就可以跳过下载步骤,直接进入解压安装部分。但是我上传的这份仅是我使用的开发包,可能不是最新版本,如果有条件的话,还是尽量直接使用update工具自动下载安装。
Chapter 4: HELLO WORLD ! |
OK,万事具备了,现在我们就可以开始编写wii上的homebrew程序了。
我也不能免俗,带大家从hello world开始写起吧哈哈~
● Step 1: 确认环境变量
首先需要确认环境变量是否设置好了,从开始菜单下执行Msys进行仿真环境:
执行Msys后进入仿真环境命令行,echo 或者 env 检查环境变量 DEVKITPPC 是否存在:
如果不存在就要 我的电脑 - 属性 - 高级 - 环境变量 - 系统变量 里面做如下配置:
这里一定要注意路径的写法,我把devkitpro安装在D:/devkitpro下面,路径就要写为/d/devkitpro
● Step 2: 认识 devkitpro 文件夹结构
进入devkitpro的安装目录,会发现很多文件夹:
我们从最上边开始介绍
-- devkitPPC devkitPPC库函数和头文件,一般不用动
-- emulators NGC模拟器,主要用于调试程序
-- examples NGC和wii自制程序例子,等会我们会使用到其中的例子
-- libogc libogc LIB库,一般不用动
-- msys msys仿真环境,其子目录home文件夹是进入msys以后的缺省工作目录
-- Programmers Notepad 编译调试工具
一般来说,我们建议把工作文件都放到home下进行编译开发工作,当然你放到其它地方也可以。
● Step 3: 编译 hello world! 程序
首先打开Msys,进入随devkitPro附送的例子程序的文件夹:(请注意我安装在了d:/devkitpro 下面,请根据自己安装的路径做相应修改)
然后执行make即可:
我们可以看到 .dol .elf 两个wii用的自制程序已经编译完成了。
OK,到了这一步接下来需要干什么就不用我说了吧,心急的同学可以把我们刚刚编译出来的.dol或者.elf拿到wii上运行一下看看了。
我们刚才make的时候真正编译的是 source 目录下面的 template.c 文件:
我们在下一章会讲解这个程序,心急的同学可以先把 “printf("Hello World!");”这句里面的hello world 改成任意其它内容,然后再次执行make,然后把新生成的 .dol 和 .elf 文件拿到wii上运行一下,看看自己修改输出的成果.
Chapter 5: hello world 程序分析 |
1.初始化和设置视频输出选项
2.初始化wii手柄连接
3.进入1个死循环
4.在这个死循环中,通过对wii手柄的响应,每个循环输出1帧或完成1个逻辑功能
5.返回
其中1,2,3,5是上述代码中的绿色字体部分,而4是上述代码中的红色字体部分,
从中我们可以分析出,对于大多数情况下的wii自制程序的编程,我们是不需要修改
1,2,3,5中的内容中的,只需要对于4的循环体内的代码进行编辑。
绝大多数的wii自制程序的大部分逻辑功能都是在4的循环体内的代码中完成的,
这就是一般的wii自制程序的基本架构。
为了再说明的具体点,我再写一段伪码,比如我们要编程实现这样的功能,
显示一条从屏幕上方向屏幕下方移动的横线,该怎么写呢?
首先,从上面的分析中,我们可以得知1,2,3,5是不用动的(其实还是要稍微动动的,后面会提到),只需要改4就可以了。
然后继续分析,假设我们把wii的输出设置为640*480,画线函数的坐标原点在左上角,
采用XY坐标系,那么问题就转化为了这样:
1. 从X,Y(0,0)到X,Y(640,0) 画一条线
2. 从X,Y(0,1)到X,Y(640,1) 画一条线,同时把上次的线抹去
3. 从X,Y(0,2)到X,Y(640,2) 画一条线,同时把上次的线抹去
...........
480. 从X,Y(0,480)到X,Y(640,480) 画一条线,同时把上次的线抹去
假设把这480步很快的连续起来执行(可以想象一下动画片的原理),
那么最终的显示效果就变成了一条线从屏幕上面往屏幕下面移动!
那么代码就很好写了:
int Ypoint = 0 ; 定义变量存储Y轴位置
while(1) {
// 如果按下的是 HOME 键,则退出
if ( pressed & WPAD_BUTTON_HOME ) exit(0);
(这段代码建议在任何程序中都保留,用于退出自制程序的执行死循环)
//在指定坐标上画一条线
//DrawLine(线起点X坐标,线起点Y坐标,线终点X坐标,线终点Y坐标,线的颜色)
DrawLine(0,i,640,i,BLACK);
i++;// Y轴位置增加1
if (i == 481) break; //画完退出
// 等待输出下一帧
VIDEO_WaitVSync();
}
就是这样了,简单吧?
这里面我们注意到一点,就是我们是把每一帧的绘画都放在了每一次循环的执行中去调用,循环共执行了480次,完成了整个绘制动作。而不是一次在一个for里面把480帧都绘画完。为什么这样呢?是因为每次VIDEO_WaitVSync()后画面才会变化一帧,如果在一次循环的执行中把480个变化都绘制完,其结果就是你只能看到最后一根线,根本看不到画面的变化。
Chapter 6: GRRLIB和显示图片 |
GRRLIB 是 GX Rgb Renderer Library 的二次开发的库,
提供了一些非常友好易用的函数,供 小白程序员们使用
(不带这么鄙视人的啊 )
3.0以前的版本由于没有提供完整的GX支持,已经被废弃。目前最新版本3.0.1.
更多信息请查看:
GRRLIB wiibrew wiki | http://www.wiibrew.org/wiki/GRRLIB |
GRRLIB 官方站点 | http://grrlib.santo.fr/ |
GRRLIB 官方wiki(含例程) | http://grrlib.santo.fr/wiki/wikka.php?wakka=HomePage |
GRRLIB_FillScreen | 填充整个屏幕 |
GRRLIB_Plot | 没用过,期待大家研究使用 |
GRRLIB_NPlot | 没用过,期待大家研究使用 |
GRRLIB_Line | 画线 |
GRRLIB_Rectangle | 画矩形 |
GRRLIB_NGone | 没用过,期待大家研究使用 |
GRRLIB_NGoneFilled | 没用过,期待大家研究使用 |
u8 * GRRLIB_LoadTexture | 读取填充材质 |
GRRLIB_DrawImg | 画图片 |
GRRLIB_DrawTile | 没用过,期待大家研究使用 |
GRRLIB_DrawChar | 画文字 |
GRRLIB_Printf | 输出文字 |
GXColor GRRLIB_Splitu32 | 没用过,期待大家研究使用 |
GRRLIB_GXEngine | GX绘图引擎 |
GRRLIB_InitVideo | 初始化视频输出 |
GRRLIB_Start | GRRLIB启动 |
GRRLIB_Render | GRRLIB绘制 |
Step 0: 准备图片 |
Step 1: 转换图片 |
Step 2: 准备GRRLIB程序模板 |
我们注意到这个文件和hello world的模板文件有一些不同,原因是有一些初始化过程被封装在了下列代码中:
GRRLIB_InitVideo();
GRRLIB_Start();
我们可以先到template这一级目录make一下,看能否正常编译:
如果可以编译通过,就可以进入下一步的具体编码了
Step 3: 具体编码,编译输出 |
#include "gfx/bjos.h" //注意文件名和你生成的文件名一致
然后在main函数一进去就调用读取绘画材质的函数:
u8 *tex_bjos=GRRLIB_LoadTexture(bjos); //注意输入参数是文件名不带后缀,
//其实你打开 bjos.h 就能看到一个变量名为 bjos 的巨大矩阵,这里输入的就是那个矩阵变量
// 这个 tex_bjos 对象下一步要用到
然后在while循环中调用绘图函数:
GRRLIB_FillScreen(0xFFFFFFFF);
//把画面填充成白色
GRRLIB_DrawImg(210, 90 , 220 , 300 , tex_bjos , 0 , 1, 1, 255 );
//画图,第一个参数是图片的左上角的X轴位置,第二个参数是图片的左上角的Y轴位置
// GRRLIB显示为640*480像素,我在这里通过计算让图片居中显示了(640/2-220/2=210)
//第三个参数是图片的宽,第四个参数是图片的高,注意一定要和图片的真实宽高一致,单位是像素
//第五个参数是绘画材质,也就是刚刚我们在main里面第一行load进来的图片定义矩阵
//第六个参数是旋转角度,0是不旋转
//第七个参数是X轴显示比例,第八个参数是Y轴显示比例,X/Y =1 的话就是原大小
//第九个参数是显示透明度,从0~255变化,255就是不透明
OK,完成!还算简单吧
完成后的代码:
编码完成,make一下,把编译生成的.dol或.elf拿到wii上去看看效果吧~
大家也可以尝试改变一下旋转角度,透明度等参数,看会有什么效果,
更可以结合上一章中一根线从上往下掉分为480步的原理,让这幅图片动起来!
或者实现淡入淡出的效果!总之到了这一步,就是海阔凭鱼跃,天高任鸟飞了!
Chapter 7: wiiuse和光标移动控制 |
step 1: 准备图片文件 |
step 2: 编码 |
#include "gfx/bjologo.h"
读取材质
u8 *tex_bjologo=GRRLIB_LoadTexture(bjologo);
定义IR信息结构体(注意了,这个可是上一章中没有的呦~)
struct ir_t ir;//定义IR信息结构体
//我们用它来保存获取到的IR信息
初始化WPAD配置(写在 WPAD_Init() 之后)
WPAD_SetVRes(WPAD_CHAN_ALL,640,480);
//定义WPAD返回光标位置时使用的分辨率,定义为640*480
WPAD_SetDataFormat(0,WPAD_FMT_BTNS_ACC_IR);
//定义WPAD返回数据的格式, WPAD_FMT_BTNS_ACC_IR表示需要返回加速度信息和IR位置信息
在循环体中获取IR信息(写在while(1)一进去的WPAD_ScanPads()之后 )
WPAD_IR(0, &ir);
// 获取0号手柄的IR位置信息(最多4个手柄,0,1,2,3编号)
绘制图标(写在绘制完奥运标志之后)
GRRLIB_DrawImg(ir.x, ir.y , 20 , 80 , tex_bjologo , 0 , 1, 1, 255 );
//从上一步获取的IR结构体中获得X,Y坐标的位置,在该位置绘制图标
//由于每次绘制帧的时候IR的X,Y都会变化,连续起来看就好像是光标在移动一样
完整的代码:
step 3: 编译执行 |
END: 结语 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。