月归档:十月 2012

谈谈 C 和 Win32 编程

作者:杨超 本文地址:http://sokoban.ws/blog/?p=214 我是一个业余的编程爱好者,绝大部分编程的经历来自于编写推箱子游戏。说来断断续续也有十年的 Win32 编程经验了,在Windows平台上先后写过两个推箱子程序(2002, 2004-2005),一个 Color Lines 的克隆(2003),一个结合了滑块和跳棋因素的 Toads and Frogs 游戏 (2007),还有几个推箱子的变种(2010)。这些基本上都是2D的逻辑类游戏。不过我最满意的还要算是和 anian 合作的 SokoFind (2009, 2011)了,一个推箱子关卡的搜索工具,虽然我只编写了其中的图形界面部分。 最近两年,我主要使用 Ubuntu 平台的时间比较多,也接触了非 Win32 平台的编程,包括编写了三个不同平台的推箱子程序: JavaApplet 《SokoPlayer》,基于JavaScript 和 HTML5 的画布(canvas)特性的网页程序《SokoPlayer HTML5》,和在 Linux 下基于 GTK+ 的自由软件《USokoban》。 再加上早前的一个GBA上的推箱子程序,我一共写过5个平台(Windows, GBA, Java, Linux 和 Web)上的6个推箱子程序。 … 继续阅读

发表在 推箱子, 编程 | 留下评论

GBA上的推箱子程序

作者:杨超 本文地址:http://sokoban.ws/blog/?p=678 GBA是日本的任天堂公司于2001年3月发行的一款掌上游戏机。国庆在老家翻出了我十年前手抄的GBA硬件技术文档和GBA使用的ARM7tdmi微处理器的指令和汇编语言技术文档。那是我在2002年大三暑假的时候对着电脑上的PDF文件抄的,抄这玩意大概花了我一个月的时间。当时抄的目的只有一个,就是为了写一个在GBA上运行的推箱子程序。 之所以有写一个GBA上的推箱子程序的想法,主要有那么几个原因。一是当时我有一部GBA,二是从同学JimmyZ那里弄到一个基于gcc的GBA开发包DevKitAdv,三是我对推箱子莫名的喜爱,在那之前已经写过一个Windows下的推箱子程序了。 虽然我费了很大力气抄写了技术文档,但最终用到的却不多。因为GBA是没有操作系统的,程序直接运行在硬件上,所以对我来说还是有比较多新奇的东西。如检查按键可以直接读取某固定地址的内存。下面代码判断A和L键是否同时按下。 #define REG_P1         *(u16*)0×4000130 #define KEY_A 1 #define KEY_L 512 short int key=REG_P1; if( (key & KEY_L)==0 && (key & KEY_A)==0 ) {…} 对显存的操作要复杂一些,十年之后我扫了几眼源代码还是不能明白个大概。显存主要支持背景和小精灵(sprite)等面向2D游戏的功能。 经过一番努力,先是在当年的8月底成功编写出一个可以在模拟器上运行的推箱子程序,用的时间似乎比抄技术文档的时间还少。我主要用VisualBoyAdvance来测试。 再过了几个月,有了烧录卡之后,在GBA真机上也成功运行了。GBA在运行一个卡带之前,要先CRC验证,若验证不对则终止运行,而模拟器往往忽略这个验证。所以要在真机上运行,还要用一个工具把正确的CRC写到二进制文件的恰当位置。我当时编译使用的批处理文件如下,其中GBARM就是用来计算并写入CRC的。 path=C:\devkitadv\bin gcc  -o skb.elf skb.cpp  -lm objcopy -O binary skb.elf … 继续阅读

发表在 推箱子, 编程 | 留下评论