用FreeMind整理了DS创意和DS开发出路。
文章的脚注信息由WordPress的wp-posturl插件自动生成
文章的脚注信息由WordPress的wp-posturl插件自动生成
使用重力(实现跳跃等效果)
请务必已经读过定点数教学部分。。。代码很简单,你可以用于任何类型的游戏。。。你必须懂得一些定点数的运算,否则可能看不懂下面的东东。
"重力"的代码非常不错,因为它可以用在很多的游戏中,特别是类似于超级马里奥那种。。。它有一个基本原则:你的精灵(或马里奥或玩家或任何东西)有垂直速度的时候,"重力"代码能够给予这个速度以加速度。下面有3件事情:
因为速度和加速度有很多值,我们也不希望给它们增加限制,我们将使用定点数。。。这就是你为什么要使用移位操作的原因(«8和»8这种操作 )。这个例子是演示一个小飞船上升,下降。你能够改变重力和启动力(相当于跳跃)来看看飞船的不同效果。
#define FLOOR (160<<8) // Floor y level
int main(void){
PA_Init(); //PAlib inits
PA_InitVBL();
PA_InitText(1, 0);
PA_OutputText(1, 2, 4, "Press A to take off !");
PA_OutputText(1, 2, 5, "Gravity change : Left/Right");
PA_OutputText(1, 2, 7, "Takeoff Speed change : Up/Down");
PA_LoadSpritePal(0, 0, (void*)sprite0_Pal)
PA_CreateSprite(0, 0, (void*)vaisseau_Sprite, OBJ_SIZE_32X32, 1, 0, 50, 50);
s32 gravity = 32; // change the gravity and check the result
s32 velocity_y = 0;
s32 spritey = FLOOR; // at the bottom
s32 takeoffspeed = 1000; // Takeoff speed…
while(1) // Infinite loops
{
takeoffspeed += (Pad.Held.Up – Pad.Held.Down)*8; // Change takeoff speed…
gravity += (Pad.Held.Right – Pad.Held.Left)*2; // Change gravity speed…
PA_OutputText(1, 4, 8, "Takeoff speed : %d ", takeoffspeed);
PA_OutputText(1, 4, 6, "Gravity : %d ", gravity);
if((spritey <= FLOOR) && Pad.Newpress.A) { // You can jump if not in the air…
velocity_y = -takeoffspeed; // Change the base speed to see the result…
}
// Moves all the time…
velocity_y += gravity; // Gravity…
spritey += velocity_y; // Speed…
if(spritey >= FLOOR) // Gets to the floor !
{
velocity_y = 0;
spritey = FLOOR;
}
PA_OutputText(1, 0, 0, "Y : %d \nVY : %d ", spritey, velocity_y);
if (spritey>>8 > -32) PA_SetSpriteY(0, 0, spritey>>8); // show if on screen
else PA_SetSpriteY(0, 0, 192);
PA_WaitForVBL();
}
return 0;
}
下面解释一下:
文章的脚注信息由WordPress的wp-posturl插件自动生成
概览
首先,什么是文件系统?为什么你需要它?
好吧,文件系统没什么东西,它提供了另外向你的ROM增加文件的新方法。你现在已经知道了一种基本的简单的方法:编译期增加文件。。。。(译:这一点不会翻译了。。。略过。)实际上,还有另外一种方法,编译后增加文件。是的,这是可能的,而且有不小的便利:
凡事都有坏处。。。
PAlib的文件系统被称为PAFS。。。。你也可以使用GBFS,这是PAlib早期版本中带的文件系统功能,目前的版本为了前向兼容还保留着。
需要的文件
好的,准备好了。。。开始!如你所猜,你需要一些文件让文件系统跑起来。。。我们看一下PAFS/PAFS这个例子,这是最简单的。。。打开目录,你就会看到你需要的文件。。。
PAFS PAFS.ds.gba. 这些是什么?现在,你看到了Files目录了吗?在里面有很多文件文件。他们没有什么用,只是用来检查增加文件是否正常工作。如果正常,你应该能够在你的DS上看到这些文件(就像文本阅览器)。我们看看代码吧!
你同样可以在PAlibTools目录下发现一个PAFS.exe和.bat文件。
简单文件加载
在同一个例子里面,打开模板。。。这里是主函数里面应该包含的代码(除了经典的初始化函数以外)
PA_InitText(0, 0); // Initialise the text system on the bottom screen
PA_InitText(1, 0); // Initialise the text system on the top screen
PA_OutputText(1, 0, 0, "Loading PAFS…");
u32 FileNumber = PA_FSInit(); // Inits PA File System, and returns the number of files
PA_OutputText(1, 0, 1, " Files : %d ", FileNumber);
// For each file, we’ll draw it’s name on the bottom screen…
s32 i;
for (i = 0; i < FileNumber; i++){
PA_OutputText(0, 0, i, "%s.%s Size : %d, %d", PA_FSFile[i].Name, PA_FSFile[i].Ext, PA_FSFile[i].Length, PA_FSFile[i].FilePos);
}
// Output the first file text on the top screen, just to test…
PA_OutputText(1, 0, 5, "File 0 : %s", PA_PAFSFile(0));
PA_OutputText(1, 0, 7, "File 1 : %s", PA_PAFSFile(1));
PA_OutputText(1, 0, 9, "File 2 : %s", PA_PAFSFile(2));
// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}
我们以2个文件初始化函数作为开始,每个屏幕一个,以及一个非常傻瓜的装载PAFS。。。。文本。。。。我不再细说了。
让我们看看重要的部分:
u32 FileNumber = PA_FSInit(); PA_FSInit 是初始化文件系统的函数。如果你不调用它,你就不能读任何文件。。。如果需要文件的信息,你只要遍历一遍所有的文件。。。 这个函数返回了文件的个数,我把它存在FileNumber这个变量里面。然后是PA_OutputText(1, 0, 1, " Files : %d ", FileNumber);用文本显示文件的个数。
下面是有趣的部分:
s32 i;
for (i = 0; i < FileNumber; i++){
PA_OutputText(0, 0, i, "%s.%s Size : %d, %d", PA_FSFile[i].Name, PA_FSFile[i].Ext, PA_FSFile[i].Length, PA_FSFile[i].FilePos);
}
这些代码起什么作用呢?对每个文件(按照文件顺序,0号文件,1号。。。),显示出文件的名称,文件名后缀,文件长度,文件在文件系统中的位置。你不会使用最后2个信息,但是文件名称和后缀是非常有用的。
就像你看到的那样,获取这些信息非常简单。他们被包含在PA_FSFile结构数组里面。PA_FSFile[n]是第n个文件(注意:编号是从0开始,不是从1),.Name, .Ext, .Length, .FilePos是这个结构的值。
你看到的最后一件事情是PA_OutputText(1, 0, 5, "File 0 : %s", PA_PAFSFile(0));. 非常重要的东西,张大你的眼睛!(译:我觉得这个作者是不是老师出身?)
这个例子里,我们使用在文本命令里面使用指针。。。为什么?很简单因为我们增加的这些文件是文本文件,所以我们能够把文本显示在屏幕上。。。如果你试图显示其他类型(比如音乐文件)的文件到屏幕上,你将看到一屏幕的天书。。。
好了,现在我们看过了代码,你编译下。。。在把你的ROM放到你的闪存卡之前,别忘了加入文件!要做到这个,运行一下PAFS.bat,它会把所有Files目录下的文件搞到你的ROM里面。烧录,测试,你现在可以在你的DS屏幕上看到你的文本啦!(译:看起来实现读书功能实在太简单了,比我原来设想的要简单很多)
哈哈,程序已经完成了!但是教程还没有结束。还有很多东西值得一看,比如说读取目录结构(是的,PAFS支持目录!)或者在WMB和CF卡上使用PAFS。。。。还有一些例子演示了如果从文件装载图片和音乐,你可以在对应的目录下找到这些例子。
(译:待续)
文章的脚注信息由WordPress的wp-posturl插件自动生成
唉,自从上上周五发现了DS的开发资源以后,高烧不退,水深火热。
一周间翻译PAlib的wiki达数万字。混成了NDSBBS版的开发版斑竹。开发数个DS应用。
最新的进展为"火箭升空"游戏和"是男人就下一百层"游戏。
上周日老婆批准了DS购入计划。教主夫人洪福齐天,仙福永享!
相关链接:
是男人就下一百层:http://www.ndsbbs.com/read.php?tid=56679
照美女:http://www.ndsbbs.com/read.php?tid=55988
火箭升空:http://www.ndsbbs.com/read.php?tid=56433
文章的脚注信息由WordPress的wp-posturl插件自动生成
这里我们将介绍所有PAlib中特别针对DS的函数,比如:关机,合起状态,用户信息,时钟。。。
时间和日期
获取时间和日期非常简单,简直不用学习!例子在PAlibExamples/Other/Date_Time,只有2行
PA_OutputText(1, 2, 10, "%02d/%02d/%02d", PA_RTC.Day, PA_RTC.Month, PA_RTC.Year); // Date
PA_OutputText(1, 2, 12, "%02d:%02d %02d seconds", PA_RTC.Hour, PA_RTC.Minutes, PA_RTC.Seconds); // Time
你不用关心文本显示的函数,只用关心里面的变量。。。PA_RTC是一个每帧刷新的结构,包含了当前日期和时间。PA_TRC有如下变量:
不用再废话了吧。。一清二楚。
用户信息
(译:用户信息就是第一次开机的时候输入的生日啊,喜欢的颜色啊,等等信息)
用户信息并不难获取!看看PAlibExamples/Other/UserInfo这个例子。。。
用户信息包含在PA_UserInfo结构中,包含以下变量:
就这些了。。。
合屏暂停
(译:DS正在玩的时候,把上下屏幕闭合,游戏就会暂停)
我猜你已经发现了如果你把上下屏闭合,游戏会自动暂停!至少在商业游戏中会这样。。。。你不想在你的游戏中加入这一特性吗?很容易!只要加一行函数就行了!
PA_CheckLid(); 检测是否上下屏闭合的函数。。。。如果上下屏已经闭合就会返回1,否则就返回0
我们应该把这个函数放在哪里?放在PA_WaitForVBL();函数之前。你可以试试Other/CheckLid这个例子,不过模拟器上可没有盖子让你合起来。
屏幕背景光
屏幕背景光!你能随意调节它。。。。
看看这个例子Other/ScreenLight
if (Pad.Newpress.A) PA_SetScreenLight(0, 1); // Turn on bottom light
if (Pad.Newpress.B) PA_SetScreenLight(0, 0);
if (Pad.Newpress.X) PA_SetScreenLight(1, 1);// Turn on top light
if (Pad.Newpress.Y) PA_SetScreenLight(1, 0);
超级简单的函数。。。。
文章的脚注信息由WordPress的wp-posturl插件自动生成
最新评论