PALIB教程1--简介,安装和编译(翻译)



掌叔
2008-06-06 09:42:24

摘自:ndsbbs
作者:hulihutu
简介

PA_Lib是运行在libnds上的一个库,就象是GBA的HAM一样。为什么需要另外一个库?因为它使DS编程变得很简单。如果你是一个核心编程人员,可能会对PA_Lib不感兴趣。但是,如果你想开始进行DS开发,想把精力集中在编程而不是关心硬件的输入和输出,等等,那么PA_Lib可能是条道路。


相关资料:
[url]http://www.aaronrogers.com/nintendods/PA_Lib/[/url]
[url]http://www.palib.info/wiki/[/url]

所需知识:C语言


掌叔
2008-06-06 09:42:49

这个教程包含2部分:
1.安装devkitPro和PAlib,以及你可能需要的其它东西
2.编译一个hello world程序,并理解模板(template)是什么

安装

想要建立DS开发环境,你首先得下载并安装devkitPro : devkitPro updater ([url]http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=160396[/url])。现在,用这个比较好的安装程序来安装devkitPro。注意!你可以不选择PSP和GBA库,但不要动其它选项(MSYS,devkitarm,libnds ...)。如果省了一些东西,它会罢工的。如果你不能确定,那就选中全部,如果安装多了不会有问题的。

现在PAlib需要你安装.Net框架。PAGfx(图像转换),PAFS(文件系统),和VHaM(IDE)安装需要它。[url]http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5[/url]

下一步,下载并安装PAlib(使用安装程序):PAlib Installer [url]http://sourceforge.net/project/showfiles.php?group_id=142901&package_id=168612[/url] 把它安装到devkitPro的目录里,这样所有事情就完了。

对于devkitPro和PAlib,注意,不能安装到一个名字中含有空格的目录中(如:c:DS DevelopmentPA Lib)。同样,也不能安装桌面,因为桌面的目录是c:Documents and Settings...

现在完成了,进行下一步:)

编译测试

检查安装正确与否不需要大量的方法...它不难,来吧,希望它工作正常!

我们将要编译第一个例子。打开PAlibExamplesTextHelloworld,双击build.bat来编译...如果一切正常,会生成helloworld.ds.gba和helloworld.nds文件。

嘿,就这么简单!

现在,有2种方法来运行rom:使用模拟器(注意,有很多bug)或硬件(flashme/passme/wifime/wmb)。

模拟器

目前只有4种模拟器,不过现在我们只有其中2种。

HyperDs是第一种模拟器,从未公开发布,从未用过...lol

Dualis([url]http://dualis.1emulation.com/[/url]),运行得很好。我经常用它。它对2D测试表现得很好,能支持大量选项。缺陷:R12版本有一个bug--当使用笔时会崩溃,因此只好使用R11版来测试...我个人把.nds文件与Dualis程序相关联,双击rom会执行它。

iDeaS([url]http://www.rascalboy.nzone.it/ideas.html[/url])是另一个比较好的模拟器!它是第一个也是目前唯一一个支持3D和声音的模拟器。最新版本1.0.0.5已经出来很久了,而且WIP版本的截图让我们相信下一个版本很震撼,但是还没有出来...

最后一个是DSemu,可能有新的插件功能,但我不用它。以后说不定会

将ROM上传到DS上(略)

SuperCard(略)



编译


这是一个编译方面的快速教程...

PA模板机密

首先,你需要打开PAlib模板。我将会说明一下它是如何工作的...可以看到,它包含一些文件和3个目录。

模板说明

先想一想...这个问题以前经常被问到...什么是模板(template)?知道了!你会说,模板是设计的一些形式,把内容分成不同的形式和结构。换句话说,它是一种组织结构,包含针对一个工程的所有开发文件。在模板里,有C文件,精灵(sprites)图像,背景,声音等。

对应目录:

source --> 最重要的部分,源代码,基本是执行代码(.c或.cpp文件)。
include --> 头文件,提供源文件的帮助信息(.h文件)

data --> 后面会用到,声音等...

对应文件:

Makefile --> 重要但复杂的文件,描述如何编译程序,不要担心它:P

logo.bmp和logo_wifi.bmp --> 通过wifi传输ROM时用到的图像文件,不要在意它

build.bat --> 重要文件,用来建立(编译、生成)ROM

clean.bat --> 当你想要发布源代码或完成编程时,clean.bat删除所有建立的文件和ROM。它会减小体积...基本上它会删除所有build.bat生成的文件。

project.vhw --> 它很cool--在VisualHam(我们将要用到的编辑器)中打开整个工程。

模板主要代码

现在,打开template.pnproj或进入source目录打开main.c。就像它的名字一样,main.c是你的主程序文件。它包含了ROM开始时默认载入的内容。main.c包含了运行PAlib所需的基本内容。如果你编译并运行这个ROM在模拟器或DS上,它不会做任何事情,只显示2个白屏...以下是第一次打开main.c所看到的:

// Includes
#include <PA9.h> // Include for PA_Lib

// Function: main()
int main(int argc, char ** argv)
{
PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL

// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}

return 0;
} // End of main()



解释代码!

如果你懂C语言,它的含义就很清楚了。对于其它人可能不会,因此我来一行一行地解释,尽管内容只有三样...

// Includes


简单://意思是后面的文字是注释...当写下//,就是告诉编译器不要编译后面的内容...因此你可以随意写些东西做为内容!这行是告诉你可以把文件(图像等)包含在这儿。

#include <PA9.h>

意思是请把PAlib包含在我的代码中,我需要它。如果不写的话,就不能认别PAlib函数,并会得到错误信息。后面使用include的概念会很重要,它可以加入图像文件、其它重要的代码等。

int main(int argc, char ** argv)


看上去很古怪,但每个工程都要有:它是程序的开始,所有东西开始的地方。不要抱怨(int argc, char ** argv)是什么意思,不需要注意,你永远不会用到它:)只要知道{下面是执行的代码!

PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL


这2 行在所有使用PAlib的工程中都能找到。第1行是通常的初始化。它为你的程序准备好使用精灵(sprites)、背景、文字、所有的东西。没有它 PAlib就不会工作。高级用户可以修改第2行。基本上,VBL能将程序与屏幕同步,每秒60帧。如果不初始化VBL,程序要么运行很快(每秒 100000帧,不能玩),要么完全不能工作(呆在第1帧)。一定在程序写上这2行。

// Infinite loop to keep the program running
while (1){


当括号里不是0时(这里它是1),while命令执行后面的代码。这儿它永远是1,所以这是一个无限循环。为什么?如果没有这个循环,每行代码只执行一次,程序就会结束而不显示任何东西。它会让程序永远执行下去,或直到玩家关机。在每一个循环中,程序会计算出所有下一次所需的所有东西并画到屏幕上。

PA_WaitForVBL();


最后一个命令将无限循环与屏幕速率(60fps)同步。如果没有,程序会象前面说的那样比屏幕快很多。

}

return 0;
} // End of main()


上面这些是结束代码,永远会是这样,不要烦它,让它呆一边:P

现在,你了解模板的全部,继续来看如何显示文字!


Hello World


简单的hello world,显示PAlib有多容易...不会深入DS编程的细节,只说明它确实很简单,以及可能是第2天了:P

这个文字系统使用背景,一个背景(每个屏幕有4层),你可以选择使用哪个屏幕和哪个背景。还可以用其它功能,如设置字体或改变颜色,但不是现在:P

在PAlibExamples/Text/HelloWorld中可以找到以下代码(或相似的版本)

#include <PA9.h> //Include PAlib

int main(void)
{
PA_Init(); //Initialize the main library
PA_InitVBL(); // Initialize Vertical Blanking

PA_InitText(1,2); //Tell it to use text on screen 1, background number 2
PA_OutputSimpleText(1,1,1,"Hello World !"); //Print the text on screen 1, with coordinate 1,1

while(1)
{
//Loop forever
}

return 0;
}


如你所见,大部分代码与模板代码很相似。基本上,加了2行:

PA_InitText(1,2); //Tell it to use text on screen 1, background number 2
PA_OutputSimpleText(1,1,1,"Hello World !"); //Print the text on screen 1, with coordinate 1,1


第1 行用来初始化文字,载入字体到DS视频RAM中。没有它,输出的文字就象垃圾...会显示文字,但每个字母会是一个随机的图案...不太好:) PA_InitText 有2个参数:所用的屏幕(0表示DS机器的下屏,1表示上屏)和背景(0表示最上面的一层,1是下一层,2,3表示最下面的一层...)。

PA_OutputSimpleText(1,1,1,”Hello World !”), 就象它的名字一样,如果背景用InitText初始化过,就在屏幕上输出简单的文字...(到这里,你可能知道所有PAlib函数开头都是PA_...)。这个函数有4个参数:

1.屏幕(0-1)

2.开始的水平位置,0-31。每一个位置是一个8×8像素的方块,因此第0块在第0个像素,每1块在第个8像素,等等...

3.垂直位置,和水平位置一样

4.文字...以"开始和结束,C编译器靠这个来识别...

当你理解之后,按F6来编译并在DualiS中运行,或按F7来编译并在DesmuMe中运行!按F5只编译不运行ROM(可以用来编译,再传到你的DS上...)


问与答--安装和编译


Q1.当我想编译一个例子,有以下错误:make’ is not recognized as an internal or external command, operable program or batch file.

A1. 我猜可能devkitPro没有安装好,或一些包(MSys)没有安装...试着重安一次。记住,安装需要设好环境变量。同时,如果你下载后移动了任何目录,也可能不工作出现错误。请安装在一个目录中(c:/devkitpro/ preferably)并且不要移动它。

Q2.当我想编译一个例子,有以下错误:Devkitpro has reached an internal error, it must shut down” or something to that effect.

A2. 不确定为什么会发生,不过你可以这样处理。确保安装最新的Devkitpro安装程序并选择“Download only, don’t install”。做好之后,选择重新运行程序并选择“Download and install”。它不会重新下载文件,你不用担心。如果还不能工作,你可以单独执行每个EXE文件来达到同样的效果。