- 精华
- 2
- 帖子
- 4942
- 威望
- 7 点
- 积分
- 6124 点
- 种子
- 0 点
- 注册时间
- 2007-4-8
- 最后登录
- 2024-3-12
|
楼主 |
发表于 2008-8-10 22:03 · 北京
|
显示全部楼层
[BB***C]Chapter 7: wiiuse和光标移动控制 |
wii最大的亮点之一就是带来无限可能的双节棍手柄了,如果自制程序无法使用wii手柄,那无疑是一个极大的损失。感谢wiiuse开发库,让我们的自制程序可以完全的使用wii手柄的各种功能。
wiiuse是目前最强的wii手柄支持库,没有之一。
Wiiuse是一个C语言写的库,支持多种wii手柄的连接和使用。
支持动作响应,光标跟踪( IR tracking ),鸡腿,经典手柄,甚至吉他英雄3的专用控制器!
拥有单线程和非阻塞的清晰易用、轻量级的API。
Wiiuse被集成到了Libogc里面并扩展为WPAD库.
WPAD库进一步进行了一些封装,使得wiiuse库更加的简单易用。
wiibrew wiki: http://www.wiibrew.org/wiki/Wiiuse
OK,下面我们来演示一下wiiuse提供的 IR tracking 光标移动控制的使用。
我们想实现这样的功能,在上一章的程序的基础上,再实现用wiiremote控制一个火炬形状的光标移动。
和上一章中一样,首先我们要准备好图片文件。
我截取修正过的20*80的火炬光标文件如下:
http://www.namipan.com/d/logo.pn ... 27aa287294eac090000
使用GRRLIB Converter转换生成的.h头文件如下:
http://www.namipan.com/d/bjologo ... 5ca732a131f3a3d0000
首先当然还是把头文件放置到 gfx 文件夹下面
然后添加头文件引用
读取材质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都会变化,连续起来看就好像是光标在移动一样
完整的代码:- /*===========================================
- GRRLIB (GX version) 3.0 alpha
- Code : NoNameNo
- GX hints : RedShade
- Template Code (Minimum Requirement)
- ============================================*/
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include "GRRLIB/GRRLIB.h"
- #include "gfx/bjos.h"
- #include "gfx/bjologo.h"
- Mtx GXmodelView2D;
- int main(){
-
- u8 *tex_bjos=GRRLIB_LoadTexture(bjos);
- u8 *tex_bjologo=GRRLIB_LoadTexture(bjologo);
- struct ir_t ir;//定义IR信息结构体
-
- VIDEO_Init();
- WPAD_Init();
- WPAD_SetVRes(WPAD_CHAN_ALL,640,480);
- WPAD_SetDataFormat(0,WPAD_FMT_BTNS_ACC_IR);
- GRRLIB_InitVideo();
- GRRLIB_Start();
- while(1){
- WPAD_ScanPads();
- WPAD_IR(0, &ir);
- u32 wpaddown = WPAD_ButtonsDown(0);
- if (wpaddown & WPAD_BUTTON_A) exit(0);
-
- GRRLIB_FillScreen(0xFFFFFFFF);
-
- GRRLIB_DrawImg(210, 90 , 220 , 300 , tex_bjos , 0 , 1, 1, 255 );
-
- GRRLIB_DrawImg(ir.x, ir.y , 20 , 80 , tex_bjologo , 0 , 1, 1, 255 );
- GRRLIB_Render();
-
- }
- return 0;
- }
复制代码
编写完代码不要忘记了保存^_^
然后make即可,把编译完的.dol或.elf拿到wii上看看效果吧~
这里我们注意到,根本没有wiiRemote的连接过程中,原因是新版的wiiuse已经支持自动连接了。 |
|