月光宝盒游戏机MAME街机模拟器方案源码项目解析----米饭模拟器(2)

上一章节中讲叙月光宝盒项目的由来和介绍,本章节从一个月光宝盒中单一的模拟器来说起: 那就是街机模拟器。街机模拟作为经典的游戏经久不衰,现在去游戏厅还能看见很多这样的游戏机。

 

这样的游戏机,画面上面 还能看到月光宝盒3/4的 字样,现在月光宝盒已经发展到11了,因为现在你所能看到的游戏机基本都被 月光宝盒 占领啦,但无论怎么发展 街机游戏都是在首要的位置。

街机游戏目前主要有几个模拟器(方向):MAME街机,FBA 街机,Arcade 街机, neogeo  ,kawaks,nebula等,这些都是目前存在的街机模拟器,那么自己的项目适合哪一个,或者说哪一个性价比比较高

:自己能用上而且成本最低?

米饭游戏对这些模拟器进行了研究,而且开发出了针对月光宝盒合适的模拟器,(可自行下载体验:ricegame.cn

结论: 其中mame支持的游戏rom最多,但是界面不太方便。winkawaks支持的游戏数量仅次于mame,缺点是画面一般。neogeo只能模拟snk公司的游戏,数量少,画面差,综合垫底。nebula是四个模拟器中画面最好,界面最好的,但支持的游戏数量不如winkawaks和mame。MAME其实已经够了,但是界面确实不友好。FBA也不错。Kawaks和Nebula实际上有点老了,支持的街机硬件相对少,而且它们跟MAME的ROM有些不能互相兼容。

 

米饭模拟器针对目前存在的情况(软件使用情况和源代码开发情况),进行了开发得出了适合月光宝盒的街机模拟器。米饭模拟器支持:mame 和fba 和Arcade  。基本上解决了很多的街机问题,就是说,市场上面所有能玩的,米饭模拟器都能玩。

所以如果用米饭模拟器解决方案或事半功倍。

实际上mame 是开源的,其他几个很少有开源的,或者说开源了,但是是Linux的 自己要移植开发成本也比较高 。

我们可以百度一下mame源码编译运行可以看到这样的运行截图:

适配后

这是什么鬼,这样的截图 与我们想要的 月光宝盒UI 相差太远了,我们期待是这样的截图(月光宝盒12截图):

这就是为什么说,其中mame支持的游戏rom最多,但是界面不太方便。不太方便就是因为国外的开发者只考虑到使用,没考虑到实用,自己二次开发需要修改c代码,用c代码做界面,你不知道它用的什么UI框架,框架不同做出来的UI 也不同,总之开发界面起来非常不方便,一般人只能放弃,厉害一些的需要看懂代码二次开发,用Android java去开发模拟器,这样写UI也快。

米饭模拟器,经过大量二次开发,做到这一点,java 开发UI ,启动游戏适合才去调用游戏模拟器玩游戏,这样将Ui与模拟器分离开来优势也非常明显。

1:维护方便。 月光宝盒经常要改的主要是UI。而java开发的UI 一般人都很容易而且很快就改好。

2:开发快。java UI 对触摸和按键处理也是非常方便的,也是很快的。

3:稳定。模拟器使用米饭模拟器,不用担心不稳定,因为运用多个平台多个项目。就算模拟器在某些情况崩溃,也不会导致java主界面UI 奔溃。因为模拟器和UI 在不同的进程里面。

 

 

下面还是贴一些编译过程:

 

 

此步骤比较麻烦,主要工作都集中于此步。

  1. 配置makefile

  此处历经周折,mame 的makefile配置需要依赖本地NDK环境,因此需要配置各种路径,include, ldflag。尝试了gcc、clang等编译失败,文件中的好多写法不被clang接受,而且makefile中的编译选项是gnu的 (0_0)。最终由于源码是混合了c与c++而如果编译器根据文件后缀来确定语言类型将导致编译出错。我选择使用g++,既可以编译C又可以编译C++。

  NDK 笔者使用NDK 17.2.4988734,原因是 安卓自NDK-r18起移除了gcc, 并完全删除了gnustl、gabi++ 和 stlport。而模拟器源码使用了stl。

  具体配置详见github makefile 文件

  2. 编译

编译报错  opensl_snd.c:51:30: error: 'memcpy' was not declared in this scope, 找不到memcpy。解决办法 在opensl_snd.c中添加#include <string.h>

aarch64-linux-android/bin/ld: cannot find crtbegin_so.o: No such file or directory和aarch64-linux-android/bin/ld: cannot find crtend_so.o: No such file or directory 不知道为什么ld始终找不到这2个.o 配置了-L选项也不行,最后没办法把crtbegin_so.o,crtend_so.o拷到makefile同级目录Linking通过。(后来改为ln -s 软连接的方式,已配置到makefile实现自动ln armv7a和armv8a。

libMAME4droid.so: dlopen failed: cannot locate symbol "_ZNSs4_Rep20_S_empty_rep_storageE" 找不到_ZNSs4_Rep20_S_empty_rep_storageE这个符号,经查是c++ string类型的默认值,感觉是手机上没有找到这个,试了把libgnustl_shared.so打到apk包里,运行解决。(我用旧版本的AS-3.4.1 在Application.mk中配置了APP_STL := gnustl_shared后,nkd-build 会自动将libgnustl_shared.so拷贝到libs/armeabi-xxx目录下,升级3.5之后就没有这个行为了,不知道是不是AS改了这方面功能)

 

编译的最终结果将得到一个名为mame或mame64的二进制文件,即我们的 libMAME.so 库。

当然工程里面还需要配置一下编译jni文件,你可以选择使用ndk-build或是cmake。两种我都写了一下,改下app的build.gradle可以切换两种编译方式。

  横屏截图

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Softboy_TM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值