月光宝盒游戏机大家都了解,但是里面开发流程指导的人比较少,去年本人有幸接到过这样一个项目,研发月光宝盒游戏机。 在过去几年这边积累了非常多的模拟器开发资源。下面是淘宝上一款月光宝盒机器,实际上目前有几个大厂在做,淘宝上爆款一看就了解,我的客户机器比这个还要大一些,需要投币。
可以在网盘下载,app体验:https://pan.baidu.com/s/1c2BdnPY
软件分为2个部分:输入装置+游戏机APP+输出装置。这样就组成一个游戏机系统。
输入装置: 这里主要是按键摇杆, 客户的按键是通过串口实现的,需要我自己去读串口发到我的APP中。
而且客户为了怕设备被破解,串口通信还加了密,真是坑爹啊。
游戏机APP:这里使用的是我 这边街机pro专业版游戏机模拟器,支持拳皇97 98等8000多个游戏。 通过修改,去掉游戏机里面触摸按键,介入上面说的游戏按键。
输出装置:输出装置就是显示器和声音。这些都是走的安卓系统通用api。不需要特殊处理。
这里先贴出串口处理的部分代码:,一般来说摇杆按键走的串口,一般需要经过加密,不然太容易破解了:别人可能盗走你的游戏主板去硬件山寨出一个跟你一模一样的东西。所以这就要涉及加密了。
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <jni.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "SerialPort.h"
#include "miyao.h"
#include "android/log.h"
static const char *TAG="serial_port";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
#define IsLock 1
//下函数由叶先生实现
/*需要在JNI中实现如下函数功能函数
函数功能:将OStar_msg结构加密后转化成字节。
函数目的:(用于java层调用后获得返回字节结果,java层将直接写入到串口。)
char * MsgToByte(OStar_msg msg)
函数功能:将字节添加到缓冲区。 若成功返回1,若缓冲区满返回0
函数目的:(用于java层从串口获得字节后调用它将字节保存到缓冲区)
int MsgCacheOffer(char * byte)
函数功能:将从缓冲区取出24个有效数据返回,若无返回NULL。(函数需要校验 直到成功取出正确数据)
函数目的:(用于java层调用后,直接从串口取出正确数据)
OStar_msg MsgPoll()
*/
//下函数由softboy实现
/*
需要在JNI中实现 Java 层接口函数:
函数功能:将java层函数数据转化成 OStar_msg
函数目的:调用MsgToByte转成成字节返回给java。用于发送。调用 MsgToByte();
JNIEXPORT jbyteArray JNICALL Java_org_winplus_serial_utils_SerialPort_msg2byte
(JNIEnv *env, jobject thiz,jint msg1,jint msg2,jint msg3)
函数功能:将java层从串口读出的字节调用MsgCacheOffer 写入到缓冲区
函数目的:java层串口读取字节 ,调用 MsgCacheOffer();
JNIEXPORT jbyteArray JNICALL Java_org_winplus_serial_utils_SerialPort_msg2cache
(JNIEnv *env, jobject thiz,jbyteArray bytes)
函数功能:将java层从串口读出的字节调用MsgCacheOffer 写入到缓冲区
函数目的:java串口读取有效数据 ,调用 MsgPoll()
JNIEXPORT jobject JNICALL Java_org_winplus_serial_utils_SerialPort_msg2java
(JNIEnv *env, jobject thiz)
*/
static speed_t getBaudrate(jint baudrate)
{
switch (baudrate)
{
case 0: return B0;
case 50: return B50;
case 75: return B75;
case 110: return B110;
case 134: return B134;
case 150: return B150;
case 200: return B200;
case 300: return B300;
case 600: return B600;
case 1200: return B1200;
case 1800: return B1800;
case 2400: return B2400;
case 4800: return B4800;
case 9600: return B9600;
case 19200: return B19200;
case 38400: return B38400;
case 57600: return B57600;
case 115200: return B115200;
case 230400: return B230400;
case 460800: return B460800;
case 500000: return B500000;
case 576000: return B576000;
case 921600: return B921600;
case 1000000: return B1000000;
case 1152000: return B1152000;
case 1500000: return B1500000;
case 2000000: return B2000000;
case 2500000: return B2500000;
case 3000000: return B3000000;
case 3500000: return B3500000;
case 4000000: return B4000000;
default: return B9600;
}
}
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
#define JIAOME_LEN 18 //加密长度
typedef struct CMD_group1
{
u8 CMD;
u8 rand1;
}CMD_group;
typedef struct OStar_msg1
{
union
{
u8 tbyte[16];
u16