月光宝盒游戏机MAME街机模拟器方案源码项目解析 您所在的位置:网站首页 月光宝盒游戏可以用手机玩吗 月光宝盒游戏机MAME街机模拟器方案源码项目解析

月光宝盒游戏机MAME街机模拟器方案源码项目解析

2023-12-14 11:55| 来源: 网络整理| 查看: 265

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

 

这样的游戏机,画面上面 还能看到月光宝盒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

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可以切换两种编译方式。

  横屏截图



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有