好吧,我们到了第一星期最后一天。所以我认为是时候将前面所学到的东西组合一起来用。我们现在将会做一个Tetris风格的游戏。
注意: 我们实际上并不是完成这个游戏(虽然你会觉得自己自由试还好)。但为了以后的计画我们可能需要回到这里。
我现在只希望你知道什么是功能原型。
在这个教程中我建立一个精灵图像和二个背景图像。 拷贝这些文件到gfx目录内。步骤二就是这个程序。
首先,去那个目录中运行gfx2gba:
gfx2gba -t8 -m -pmaster.pal -fsrc *.bmp
接着将会产生的这些文件:
master.pal.c
block_L.map.c
block_L.raw.c
bubbles.map.c
bubbles.raw.c
outline_plain.map.c
outline_plain.raw.c
这将会为我们所需的全部图形产生必需的背景图像文件和它的调色板。问题是,我们不想将精灵放在一个tile/map格式中,因此接着我们将会键入指令:
gfx2gba -D -fsrc -pblock_L.pal -t8 block_L.bmp
注意: 我们将不需要block_L.map.c 或 block_L.pal ,因此你现在应该划除他们。
有一件事物在我们开始之前,你需要知道一样东西- 透明效果(或称为alpha混合)。例如有一种颜色在调色板的行列中是α颜色。这意味着你的图像中任何有这一种颜色的将会是变成透明。系统调色板在窗口中的第一像素点是黑色。因此,我的是黑色任何部份将不被显示到屏幕。你看着outline_plain.bmp和被建立的"游戏"的比较,你就能看得出这个。
好吧,我们讲到这里了。就开始吧!
//主要HAM头文件
#include"mygba.h"
//图形
#include "gfx/master.pal.c"
#include "gfx/bubbles.raw.c"
#include "gfx/bubbles.map.c"
#include "gfx/outline_plain.raw.c"
#include "gfx/outline_plain.map.c"
#include "gfx/block_L.raw.c"
//全局变量
u8 block;// 精灵索引为区块
u8 block_x=61;// 区块的 X 位置 (行)
u8 block_y=0;// 区块的 Y 位置 (列)
//功能原型
void vblFunc();//VBL功能
void query_keys();//检查键盘
void redraw_block();//刷新区块
//Main 功能
int main ()
{
//变量
map_fragment_info_ptr bg_bubbles;
map_fragment_info_ptr bg_outline_plain;
//初始化HAMlib
ham_Init;()
//在你的选择BG之上初始化本文显示系统
ham_InitText;(2)
//设置背景模式
ham_SetBgMode(1);
//初始化调色板
ham_LoadBGPal(&master_Palette,256);
ham_LoadObjPal(&master_Palette,256);
// 为我们的图像安装tileset
ham_bg[0].ti=ham_InitTileSet(&bubbles_Tiles,SIZEOF_16BIT(bubbles_Tiles),1,1);
ham_bg[1].ti=ham_InitTileSet(&outline_plain_Tiles,SIZEOF_16BIT(outline_plain_Tiles),1,1);
// 为我们的图像安装映像
ham_bg[0].mi=ham_InitMapEmptySet(3,0);
ham_bg[1].mi=ham_InitMapEmptySet(3,0);
bg_bubbles=ham_InitMapFragment(&bubbles_Map,30,20,0,0,30,20,0);
bg_outline_plain=ham_InitMapFragment(&outline_plain_Map,30,20,0,0,30,20,0);
ham_InsertMapFragment(bg_bubbles,0,0,0);
ham_InsertMapFragment(bg_outline_plain,1,0,0);
//显示背景
ham_InitBg(0,1,1,0);
ham_InitBg(1,1,0,0);
//输出一些本文
ham_DrawText(21,8,"Next Up");
//安装区块
block = ham_CreateObj(&block_L_Bitmap,0,2,OBJ_MODE_NORMAL,1,0,0,0,0,0,0,block_x,block_y);
//开始VBL中断处理程式
ham_StartIntHandler(INT_TYPE_VBL,&vblFunc);
While(1)
{
//使让程序不断运行着
}
return 0;
}//Main的结束 ()
//VBL 功能
void vblFunc()
{
ham_CopyObjToOAM();//对硬件的拷贝区块精灵
query_keys();// 检查按钮动作
redraw_block();// 刷新区块
return;
}//vblFunc()的结束
//检查按键动作
void query_keys()
{
if (F_CTRLINPUT_UP_PRESSED)
{
if (block_y
ham_DrawText;(1,18," Up")
}
if (F_CTRLINPUT_DOWN_PRESSED)
{
if (block_y
ham_DrawText;(1,18," Down ")
}
if (F_CTRLINPUT_LEFT_PRESSED)
{
if (block_x61) block_x--;
ham_DrawText;(1,18," Left ")
}
if (F_CTRLINPUT_RIGHT_PRESSED)
{
if (block_x
ham_DrawText;(1,18,"Right")
}
return;
}//query_keys()的结束
//刷新区块
void redraw_block()
{
ham_SetObjX(block,block_x);
ham_SetObjY(block,block_y);
return;
}//redraw_block()结束
编码解释
//全局变量
这个不用我多讲了吧,不清楚的话请翻阅有关内容。
//功能Protoypes
我将会解释AgbMain()中的每一个动作的作用是什么。
map_fragment_info_ptr bg_bubbles;
map_fragment_info_ptr是一个包含所有的neccessary数据的类型的结构体变量的指针。例如在一个已存在的屏幕映像之上拷贝只读存储器映像的这个部份。
ham_InitText(2)
对於这个计画我们将会在BG2上输出我们本文。 BG0和1将会作为playing field。
block =ham_CreateObj(...)
如果你不记得这个呼叫是什麽,看一看第五天的教程 。
ham_StartIntHandler(INT_TYPE_VBL,&vblFunc);
这是一个非常重要的功能。基本上它做什么是在GBA中告诉处理器每个VBL中断它应该运行我们specifiy。 在这情况下,我们将会产生一个称为vblFunc()的功能。 你可能问,一个VBL中断是什么? 一个VBL中断每一次发生在GBA画完一个屏幕时,通常是一秒60次的。
让我们谈论另一个功能。
//VBL功能
void vblFunc()
{
ham_CopyObjToOAM();
再一次,你从第五天起应该记得这。
query_keys() 和 redraw_block() 的功能在下面看见。
}//vblFunc() 的结束
//检查按键的动作
void query_keys(){...}
这个函数的作用是检查那个按键被按下。
让我们继续行进最後一个功能。
//刷新区块
void redraw_block()
{
ham_SetObjX(block,block_x);
ham_SetObjY(block,block_y);
这二个呼叫设定以为query_keys()为基础更新区块的位置。
}//redraw_block() 的结束
下载源代码
HAM Version 2.40 版和更高的版本
必需的HAM 程序: makefile http://www.aaronrogers.com/ham/Day7/makefile
图形: block_L.bmp http://www.aaronrogers.com/ham/Day7/gfx/block_L.bmp
block_L.raw.c http://www.aaronrogers.com/ham/Day7/gfx/block_L.raw.c
bubbles.bmp http://www.aaronrogers.com/ham/Day7/gfx/bubbles.bmp
bubbles.map.c http://www.aaronrogers.com/ham/Day7/gfx/bubbles.map.c
bubbles.raw.c http://www.aaronrogers.com/ham/Day7/gfx/bubbles.raw.c
master.pal.c http://www.aaronrogers.com/ham/Day7/gfx/master.pal.c
outline_plain.bmp http://www.aaronrogers.com/ham/Day7/gfx/outline_plain.bmp
outline_plain.map.c http://www.aaronrogers.com/ham/Day7/gfx/outline_plain.map.c
outline_plain.raw.c http://www.aaronrogers.com/ham/Day7/gfx/outline_plain.raw.c
Main文件: main.c http://www.aaronrogers.com/ham/Day7/main.c
编译了二进文件: hello.gba http://www.aaronrogers.com/ham/Day7/hello.gba
打包下载所有的文件: Day7_Project1_Tetris.zip
http://www.aaronrogers.com/ham/Day7/Day7_Project1_Tetris.zip
HAM Version 2.30 版和比更低的版本
必需的HAM 程序: makefile http://www.aaronrogers.com/ham/Day7/2.30/makefile
Main源文件: main.c http://www.aaronrogers.com/ham/Day7/2.30/main.c
编译了二进文件: hello.gba http://www.aaronrogers.com/ham/Day7/2.30/hello.gba
打包下载所有的文件: Day7_Project1_Tetris.zip
http://www.aaronrogers.com/ham/Day7/2.30/Day7_Project1_Tetris.zip
(ES_ZETA:限于本人的翻译能力值,难免会有错,望大家指出。
以前那六天的教程的翻译,由于时间问题,错误奇多,有空的话,我会更正,望大家见谅。
最后多谢大家支持!(^0^))
HAM 教程:第8天:精灵 #2 - 动画
(我希望能和ES_ZETA的译本保持一致吧,如有意见和建议望提出-mikeshi)
好了,我们已经在第一周涵盖了很多知识,但是,当