Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682970
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: LINUX

2010-09-12 17:27:04

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元 
阅读(6737) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2011-02-08 19:16:09

楼主你好,我按照你的步骤执行到SDL库的移植,执行make时出现了链接错误 “cannot find -ldirectfb”,请问您知道什么原因么?