背景

我可能是一个很怀旧的人,喜欢听老歌,看老电影,玩一些小时候的游戏。小时候趁着爸妈去田里,赶紧叫上小伙伴搬来小霸王插上卡带进入到游戏的世界里,当时有一个小霸王是所有小孩的梦想,后来才知道当年玩的超级玛丽,魂斗罗都属于FC游戏,运行FC游戏的叫做FC游戏机是日本任天堂出品的,小霸王属于国产的“山寨机”

上高中的时候,家里给买了一台步步高的学习机,这应该是我接触的第一款电子产品,对我学习上倒是没帮助多少,但是让我第一次接触到了RPG游戏,步步高上有一款非常经典的游戏叫做伏魔记,当时玩的如痴如醉,那段时间玩的都没心思上课,玩到后面有些关卡总是走不下去,才知道有攻略这东西,有了攻略后玩的更疯狂,一遍一遍的玩,当时步步高平台上能下载的游戏还有很多,比较经典的还有侠客行魔塔等,后来升高三了要高考了,才不得不把机器给藏起来。

高考后报了软件学院,我一直觉得是步步高游戏启蒙了我对电子产品和游戏的认知,报软件一定程度上也是受了这个影响。当时一个宿舍六个人,我们因为是软件学院,可以正大光明的带电脑,那时dota很火,五人组队,他们五个人刚好组成一队,我从来不玩dota,甚至整个大学都没怎么玩过游戏,原因很简单,我觉得编程比游戏更好玩。

后面毕了业,工作,写了很多很多的代码,突然某一天想起步步高的游戏,可惜机子已经找不到,步步高官网也不提供下载,好在有一群跟我一样恋旧的人专门做了一个资源站点,分享当年步步高的一些游戏文件,并且有模拟器,游戏还是当年的游戏,但玩不出当年的味道,也就试玩了一下,后面甚至还去闲鱼上买了一台二手的步步高学习机来玩,玩是不会去玩了,更像是找到了一个老朋友,也很满足。

任天堂是一个很伟大的公司,坚持做游戏,做掌机,给全世界的儿童带来梦想和欢乐,我一直在想,为什么中国没有属于自己的掌机产品,当年的步步高游戏可玩性真的不输任天堂,国产的游戏真的不输给国外,可能国人过于急功急利,没法慢慢打磨好一款产品,如果当年小霸王能坚持自主研发,如果当年步步高发展掌机业务,经过这么多年的迭代,不敢说和任天堂平起平坐,但也不至于现在中国山寨掌机满天飞。

我自己一直也有做游戏的梦想,目前的编码能力也是足够独立完成一款游戏的编码,所以也是出于兴趣想做一款小游戏圆了自己小小的梦想,一开始计划是用java写,因为我是java程序员,后来看到家里躺着一台3ds,想着写了放到3ds上玩,那java肯定是不合适的,就想用3ds直接开发,但3ds开发一方面资料少,另外一方面3ds的模拟器还不成熟,而且3ds通过烧录卡可以流畅的玩nds游戏,nds的模拟器和资料都很丰富,就决定用nds,这个教程就是这么来的,我因为是做企业应用开发,养成了写文档的习惯,所以就准备写一个系列的教程,把研究过程记录下。

以上是背景,有点长。

devkitpro

devkitpro提供了一个开发任天堂游戏完整的开发环境,基本所有的任天堂游戏都可以通过devkitpro进行开发,devkitpro支持多种操作系统,Windows,MAC,Linux都支持,因为我的电脑是MAC,所以接下来的教程都是基于MAC,不过差别也不是很大。

  • 1. 你需要具备科学上网的能力。
  • 2. 下载devkitpro
这里有介绍每个平台的安装方法,mac需要安装一个包管理工具devkitPro pacman,这里面介绍是通过命令行安装,其实不用那么麻烦,你找到里面pkg文件的下载地址直接下载pkg文件,然后在mac中双击直接安装即可。

默认安装在/opt/devkitpro目录下。

  • 3. 设置环境变量

编辑文件~/.bash_profile,加入以下内容

export DEVKITPRO=/opt/devkitpro
export DEVKITARM=${DEVKITPRO}/devkitARM
export DEVKITPPC=${DEVKITPRO}/devkitPPC   
export PATH=${DEVKITPRO}/tools/bin:$PATH

执行source ~/.bash_profile令其生效

  • 4. 安装xcode-select工具(可选)

执行以下命令即可

xcode-select --install
  • 5. pacman只是包管理工具,并没有开发环境,我们需要通过pacman安装相应的nds包
sudo dkp-pacman -S nds-dev

如果安装顺利,输出如下:

➜  ~ sudo dkp-pacman -S nds-dev
:: There are 16 members in group nds-dev:
:: Repository dkp-libs
   1) default-arm7  2) devkitarm-crtls  3) devkitarm-rules  4) dswifi  5) libfat-nds
   6) libfilesystem  7) libnds  8) maxmod-nds  9) nds-examples
:: Repository dkp-osx
   10) devkitARM  11) dstools  12) general-tools  13) grit  14) mmutil  15) ndstool  16) pkg-config
输入某个选择 ( 默认=全部选定 ): 
正在解决依赖关系...
正在查找软件包冲突...
软件包 (16) default-arm7-0.7.4-2  devkitARM-r53-1  devkitarm-crtls-1.0.3-1  devkitarm-rules-1.0.0-1
            dstools-1.2.1-1  dswifi-0.4.2-1  general-tools-1.0.3-1  grit-0.8.16-1
            libfat-nds-1.1.3-2  libfilesystem-0.9.14-1  libnds-1.7.3-3  maxmod-nds-1.0.11-2
            mmutil-1.8.7-1  nds-examples-20181226-1  ndstool-2.1.2-1  pkg-config-0.29.2-1
下载大小:    41.98 MiB
全部安装大小:  217.22 MiB
:: 进行安装吗? [Y/n] Y
:: 正在获取软件包......
 devkitarm-rules-1.0.0-1-any          3.6 KiB   602K/s 00:00 [################################] 100%
 libnds-1.7.3-3-any                 410.6 KiB   919K/s 00:00 [################################] 100%
 default-arm7-0.7.4-2-any            99.7 KiB  5.41M/s 00:00 [################################] 100%
 dswifi-0.4.2-1-any                 161.9 KiB  3.95M/s 00:00 [################################] 100%
 libfat-nds-1.1.3-2-any             103.7 KiB  3.90M/s 00:00 [################################] 100%
 libfilesystem-0.9.14-1-any          17.7 KiB  0.00B/s 00:00 [################################] 100%
 maxmod-nds-1.0.11-2-any             24.6 KiB  24.0M/s 00:00 [################################] 100%
 nds-examples-20181226-1-any        810.8 KiB  2.81M/s 00:00 [################################] 100%
 devkitARM-r53-1-any                 38.1 MiB  3.06M/s 00:12 [################################] 100%
 dstools-1.2.1-1-any                993.3 KiB   915K/s 00:01 [################################] 100%
 general-tools-1.0.3-1-any           21.1 KiB  20.6M/s 00:00 [################################] 100%
 grit-0.8.16-1-any                 1023.1 KiB  1068K/s 00:01 [################################] 100%
 mmutil-1.8.7-1-any                  66.6 KiB  3.42M/s 00:00 [################################] 100%
 ndstool-2.1.2-1-any                 48.1 KiB  47.0M/s 00:00 [################################] 100%
 pkg-config-0.29.2-1-any            179.0 KiB   923K/s 00:00 [################################] 100%
(16/16) 正在检查软件包完整性                                           [########################################] 100%((((16/16) 正在加载软件包文件                                               [#########################################] 100%
(16/16) 正在检查文件冲突                                                 [#########################################] 100%
(16/16) 正在检查可用硬盘空间                                             [#########################################] 100%
:: 正在处理软件包的变化...
( 1/16) 正在安装 devkitarm-rules                                         [#########################################] 100%
( 2/16) 正在安装 devkitarm-crtls                                         [#########################################] 100%
( 3/16) 正在安装 devkitARM                                               [#########################################] 100%
( 4/16) 正在安装 libnds                                                  [#########################################] 100%
( 5/16) 正在安装 default-arm7                                            [#########################################] 100%
( 6/16) 正在安装 dswifi                                                  [#########################################] 100%
( 7/16) 正在安装 libfat-nds                                              [#########################################] 100%
( 8/16) 正在安装 libfilesystem                                           [#########################################] 100%
( 9/16) 正在安装 maxmod-nds                                              [#########################################] 100%
(10/16) 正在安装 nds-examples                                            [#########################################] 100%
(11/16) 正在安装 dstools                                                 [#########################################] 100%
(12/16) 正在安装 general-tools                                           [#########################################] 100%
(13/16) 正在安装 grit                                                    [#########################################] 100%
(14/16) 正在安装 mmutil                                                  [#########################################] 100%
(15/16) 正在安装 ndstool                                                 [#########################################] 100%
(16/16) 正在安装 pkg-config                                              [#########################################] 100%
  • 6. 更改权限
/opt/devkitpro默认拥有者(owner)是root,需要更改为当前用户。
sudo chown -R $USER /opt/devkitpro

如果不更改权限,当编译程序时会报以下错误

sudo make
Makefile:6: *** "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM".  Stop.

hello world

安装完nds的开发包后,会默认安装一些examle,位于/opt/devkitpro/examples/nds路径下,执行下面命令编译hello word的程序

$ cd /opt/devkitpro/examples/nds/hello_world
$ make
Nintendo DS rom tool 2.1.2 - Jun 13 2018
by Rafael Vuijk, Dave Murphy, Alexei Karpenko
built ... hello_world.nds

编译完会在当前路径生成一个nds文件

ll
total 1048
drwxr-xr-x   9 asan  wheel     288  5  9 15:23 ./
drwxr-xr-x  18 asan  wheel     576  5  9 10:05 ../
-rw-r--r--   1 asan  wheel    4906  5  9 01:48 Makefile
drwxr-xr-x   5 asan  wheel     160  5  9 10:04 build/
-rwxr-xr-x   1 asan  wheel  362660  5  9 10:04 hello_world.elf*
-rw-r--r--   1 asan  wheel  154112  5  9 15:23 hello_world.nds
-rw-r--r--   1 asan  wheel     294 12 27  2018 hello_world.pnproj
-rw-r--r--   1 asan  wheel     441 12 27  2018 hello_world.prj
drwxr-xr-x   3 asan  wheel      96  5  9 01:39 source/

你可以将该nds文件直接拷贝到nds机器或者3ds机器上运行,也可以通过模拟器运行

模拟器

nds的模拟器很多,这里推荐desmume,有mac版的,安装完后点击File->LoadROM选择上面的nds文件即可,如果一切正常,会出现以下画面

恭喜你,完成了第一个nds游戏。

源码

这里贴下hello world的源码,下个章节会进行讲解

/*---------------------------------------------------------------------------------
	$Id: main.cpp,v 1.13 2008-12-02 20:21:20 dovoto Exp $
	Simple console print demo
	-- dovoto
---------------------------------------------------------------------------------*/
#include <nds.h>
#include <stdio.h>
volatile int frame = 0;
//---------------------------------------------------------------------------------
void Vblank() {
//---------------------------------------------------------------------------------
	frame++;
}
	
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
	touchPosition touchXY;
	irqSet(IRQ_VBLANK, Vblank);
	consoleDemoInit();
	iprintf("      Hello DS dev'rs\n");
	iprintf("     \x1b[32mwww.devkitpro.org\n");
	iprintf("   \x1b[32;1mwww.drunkencoders.com\x1b[39m");
 
	while(1) {
	
		swiWaitForVBlank();
		scanKeys();
		int keys = keysDown();
		if (keys & KEY_START) break;
		touchRead(&touchXY);
		// print at using ansi escape sequence \x1b[line;columnH 
		iprintf("\x1b[10;0HFrame = %d",frame);
		iprintf("\x1b[16;0HTouch x = %04X, %04X\n", touchXY.rawx, touchXY.px);
		iprintf("Touch y = %04X, %04X\n", touchXY.rawy, touchXY.py);		
	
	}
	return 0;
}

参考资料

Trackback

no comment untill now

Add your comment now