Andrew Huang
0.支持库的编译
------------------------------------------------------------------
仙剑奇侠传是DOS下经典游戏。这个游戏最早是一个DOS下的商业游戏,流行一行。后来还拍成的电视剧。
LINUX上的的仙剑是在分析了其中游戏资源文件的格式情况下,用SDL重写一个开源软件。后来这个版本还移植到Android上。在我的乐phone手机也能完美运行。
这是一批一批的开发人员接力完成的开源项目,完整写一个教材,也是我小小支持。
这个游戏需要 SDL/SDL_mixer/SDL_ttf/SDL_image四个库
而这四个库分别需要 mad/zlib/iconv/freetype/jpeg/png库. 嵌入式版本还需要tslib.因此完整的游戏需要大量移植工作
X86库的支持库编译
编译freetype
tar xvzf freetype-2.3.11.tar.gz
cd freetype-2.3.11
./configure
make
make install
安装zlib
tar xvzf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --enable-shared --enable-static
make
make install
安装libiconv
tar xvzf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure
make
make install
安装libmad
tar xvzf libmad-0.15.1b.tar.gz
cd libmad-0.15.1b
./configure
make
make install
安装jpeg
tar xvzf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure
make
mkdir -p /usr/local/man/man1 #因为安装没有自己创建这个目录
make install
安装libpng
tar xvjf libpng-1.2.19.tar.bz2
cd libpng-1.2.19
./configure
make
make install
安装SDL
tar xvzf SDL-1.2.14.tar.gz
cd SDL-1.2.14
./configure
make
make install
安装SDL ttf库
tar xvzf SDL_ttf-2.0.9.tar.gz
cd SDL_ttf-2.0.9
./configure
make
make install
安装SDL_image库
tar xvzf SDL_image-1.2.8.tar.gz
cd SDL_image-1.2.8
./configure
make
make install
安装SDL_mixer
tar xvzf SDL_mixer-1.2.9.tar.gz
cd SDL_mixer-1.2.9
./configure --enable-music-mp3-mad-gpl --enable-music-mp3=no
make
make install
一.x86版本的编译运行
这个用SDL实现的经典游戏的代码同样经典,支持屏幕缩放,键盘,MOUSE和JOY Stick支持。因此在X86上可以玩得更多。
x86 版本比较简单,直接在源代码目录下,直接make就行
其中dist/Debug/GNU-Linux-x86/目录下的sdlpal就是可执行文件.
运行仙剑的准备工作。
它需要原版的资源文件。所以要在网上找到DOS版的资源包。注意原版文件名一般是大写的,而开源Linux版需要全部小写的文件。需要一一改过来。全部资源文件名如下:
0.rpg 1.rpg abc.mkf ball.mkf data.mkf f.mkf fbp.mkf fire.mkf gop.mkf install.exe m.msg map.mkf mgo.mkf midi.mkf mpu401.drv mus.mkf pal.exe pat.mkf play.bat rgm.mkf rng.mkf roriso.nfo run.sh sdlpal sdlpal.map setup.dat sss.mkf voc.mkf wor16.asc wor16.fon word.dat |
把编译好的sdlpal 程序拷入这个目录。
执行语句
export LD_LIBRARY_PATH=/usr/local/lib; ./sdlpal
二.ARM版本支持库移植
-----------------------------------------------------------------------------
2.1.arm版本支持库的移植.
这里采用相应的移植规范.
1.freetype移植
tar xvzf freetype-2.3.11.tar.gz
cd freetype-2.3.11
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux
make
make install
2.移植zlib库
tar xvzf zlib-1.2.3.tar.gz
cd zlib-1.2.3
CC=arm-linux-gcc NM=arm-linux-nm CPP="arm-linux-gcc -E " RANLIB="arm-linux-ranlib" AR="arm-linux-ar rcv" ./configure --shared --prefix=$PWD/../../output/arm-linux
make
make install
3. 移植jpeg库
tar xvzf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --enable-shared
#这里直接用环境变量来修改Makefile,会造成configure执行失败.因此只能手工修改Makefile
#手工修改Makefile ,把所有工具链用arm-linux-gcc工具链
#23 行改为 CC= arm-linux-gcc
#63行改为 AR = arm-linux-ar rc
#65行改为 AR2= arm-linux-ranlib
make
mkdir -p $PWD/../../output/arm-linux/man/man1
make install
4.移植 png库
tar xvjf libpng-1.2.19.tar.bz2
cd libpng-1.2.19
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux
make
make install
5.移植libmad
tar xvzf libmad-0.15.1b.tar.gz
cd libmad-0.15.1b
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux
#手工修改Makefile 把129的-fforce-mem去掉
make
make install
6.移植libiconv库
tar xvzf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux
make
make install
移植tslib参见我相关博文.
7.SDL库的移植
注意SDL的ALSA音频在ARM板上很不正常,会造成SDL启动卡死的现象,因此这里还是采用OSS音频。
tar xvzf SDL-1.2.14.tar.gz
cd SDL-1.2.14
./configure --prefix=$PWD/../../output/arm-linux --disable-video-nanox --disable-video-qtopia --disable-video-photon \
--disable-video-ggi --disable-video-svga --disable-video-aalib \
--disable-video-dummy --disable-video-dga --disable-arts --disable-esd \
--disable-alsa --disable-video-x11 --disable-nasm --enable-joystick --enable-input-tslib --enable-video-fbcon \
--host=arm-linux --build=i386 CPPFLAGS="-I$PWD/../../output/arm-linux/include" LDFLAGS="-L$PWD/../../output/arm-linux/lib "
make
make install
8.SDL_image库移植
tar xvzf SDL_image-1.2.8.tar.gz
cd SDL_image-1.2.8
./configure --enable-shared --enable-static --host=arm-linux --prefix=$PWD/../../output/arm-linux \
--enable-bmp --enable-gif --enable-jpg --enable-png --enable-tif --enable-pnm --enable-xpm --disable-sdltest SDL_CFLAGS="-I$PWD/../../output/arm-linux/include" \
SDL_LIBS="-L$PWD/../../output/arm-linux/lib -lSDL" LIBPNG_CFLAGS="-I$PWD/../../output/arm-linux/include" \
LIBPNG_LIBS="-L$PWD/../../output/arm-linux/lib -lpng" CPPFLAGS="-I$PWD/../../output/arm-linux/include/SDL "\
LDFLAGS="-L$PWD/../../output/arm-linux/lib -ljpeg -lts -lpng -liconv"
make
make install
9 SDL_ttf 库移植
tar xvzf SDL_ttf-2.0.9.tar.gz
cd SDL_ttf-2.0.9
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --enable-shared --enable-static \
--disable-sdltest --with-freetype-prefix=$PWD/../../output/arm-linux/ \
--with-sdl-prefix=$PWD/../../output/arm-linux/ CFLAG="-I$PWD/../../output/arm-linux/include" \
LDFLAGS="-L$PWD/../../output/arm-linux/lib -lSDL -lts -liconv -lfreetype"
#手工修改Makefile,去掉OpenGL相关处理
# 123行去 掉-I/usr/include -DHAVE_OPENGL
# 143行 改成GL_LIBS =
# 266行 glfont_LDADD = libSDL_ttf.la -lm
#手工修改 glfont.c.全部清空,写入如下
#void main() {}
make
make install
10.音频库SDL_mixter移植
tar xvzf SDL_mixer-1.2.9.tar.gz
cd SDL_mixer-1.2.9
./configure --enable-music-mp3-mad-gpl --enable-music-mp3=no \
--host=arm-linux --prefix=$PWD/../../output/arm-linux \
--with-sdl-prefix=$PWD/../../output/arm-linux --enable-shared --enable-static
make
make install
三.SDLPAL的ARM版的移植
-----------------------------------------------------------------------------
ARM版本的的调整需要做如下处理,
用unzip码解压zip源码
2.1 修改屏幕分辩率
开发板的分辩率可以在busybox下运行fbset命令查看到
我用的6410板是采用 480*272 (QVGA),bpp是16
#fbset
mode "480x272-769601" # D: 111111.111 MHz, H: 211640.212 kHz, V: 769600.770 Hz geometry 480 272 480 272 16 timings 9 3 2 1 1 40 1 accel false rgba 5/11,6/5,5/0,0/0 endmode
|
把main.c的524/525行改成的板的分辨率
wScreenWidth = 480;
wScreenHeight = 272;
如果想做得更加灵活可以加入对屏幕分辩率的自动侦测代码,或用命令行参数来设置.
2.2 修改Makefile.
通过对主Makefile的分析,实际编译动作,是nbproject/Makefile-Debug.mk 来实现的。
在ARM板的移植可以通过修改这个Makefile来完成.
14行改成 RANLIB=arm-linux-ranlib
15行改成 CC=arm-linux-gcc
16行改成 CCC=arm-linux-g++
17行改成 CXX=arm-linux-g++
65行 改成 CFLAGS="-I$(PRJ_ROOT)/output/arm-linux/include"
68行 CCFLAGS = $(CFLAGS)
69行 CXXFLAGS = $(CFLAGS)
82行改为
${LINK.cc} -L$(PRJ_ROOT)/output/arm-linux/lib -lfreetype -liconv -lmad -lz -ljpeg -lpng -lSDL_mixer -lSDL_image -lSDL_ttf -lSDL -Xlinker -Map=dist/Debug/GNU-Linux-x86/sdlpal.map -o sdlpal_arm ${OBJECTFILES}
把Makefile里所有 -I/usr/include/SDL 置换成 为空
所有的GNU-Linux-x86换成 GNU-Linux-arm
在第一行增加 PRJ_ROOT=/home/hxy #这个要根据你自己目录来定
这里改动比较多,因此可以参考我写的模板的.
2.2 声音的处理.
另外在实测发现SDL如果用ALSA模式在ARM板上启动时会卡死。最后只能换成OSS才能正常运行通过。
2.3 在ARM-LInux的USB JoyStick
它是直接支持的,插入后直接直接用手柄的来控制。
2.4 MOUSE及触摸屏操作
默认的的MOUSE支持没有打开。可以简单的写在common.h 最后部分加入
#define PAL_HAS_MOUSE
并且在Linux打开tslib支持。而且tslib支持需要大量的环境变量支持。具体情况参见我的博文。
并且调用sdlpal_arm之前。需要设SDL的环境变量
SDL_MOUSEDRV=tslib
SDL_MOUSEDEV=/dev/input/event1 #这个取决于你tslib的设置。这里只是我的板上tslib的事件结点。
2.5设置运行进的LD_LIBRARY_PATH指向支持库路径
export LD_LIBRARY_PATH=/mnt/output/arm-linux/lib ; ./sdlpal_arm
以上是实际运行效果,各部分都正常工作
最终运行结果是在S3C6410运行成功
|
|
850.0元 |
|