这里使用的是MAME 模拟器,当前手头实现了全部模拟器,FBA MD FC PSP PS1 ,支持拳皇97 98等8000多个游戏。 通过修改,去掉游戏机里面触摸按键,介入上面说的游戏按键。

输入设备当前支持 ,串口,USB ,按键,遥控器,有线无线鼠标,都已经支持。可以支持3P 4P对打。

同时画面经过渲染,完成了高清画质。

这里分享一段串口代码:合作联系QQ 332324956

#include “Com.h”
#include “Random.h”
#include “SerialPort.h”
#include “Hardware.h”
#include <stdio.h>
#include <string.h>
#include “TEA.h”

const char* SerialPortName = “/dev/ttyS4”; //2
const int Budrate = 115200;
int serialPortFD = -1;

enum Pack_Def
{
Pack_Def_Len = 0,
Pack_Def_CC1,
Pack_Def_CC2,
Pack_Def_Random,
Pack_Def_Data,
};

const int DATA_PACK_MAX_LEN = 128;
const int InBufferLen = 4096;
unsigned char inBuffer[InBufferLen]={0};
int inBufferTop = 0;
int inBufferEnd = 0;
float nonePacketTime = 0;

//******************************* ͨ�Ŵ�� ***************************************************************

void SerialPushCharToInBuffer(unsigned char data)
{
inBuffer[inBufferEnd] = data;
if(++inBufferEnd >= InBufferLen) inBufferEnd = 0;
}

int GetInBufferLen(void)
{
int len = inBufferEnd - inBufferTop;
if (len < 0) len += InBufferLen;
return len;
}

void CopyDataFromInBuffer(unsigned char *data, int len)
{
int index = inBufferTop;
for (int i = 0; i < len; i++)
{
data[i] = inBuffer[index];
if(++index >= InBufferLen)
{
index = 0;
}
}
}

void InBufferStepByStep(int step)
{
inBufferTop += step;
inBufferTop %= InBufferLen;
}

unsigned char GetCheckCode(unsigned char *data, unsigned char len, unsigned char random)
{
unsigned char add = random;
unsigned char i = 0;
for(i = 0; i < len; i++)
{
add += data[i];
}
return add;
}

int epcnt = 0;
bool GetMsgPack(unsigned char* data, int* len)
{
static unsigned char dataBuffer[DATA_PACK_MAX_LEN];

if (GetInBufferLen() > 0)
{if(GetInBufferLen() >= inBuffer[inBufferTop]){if(inBuffer[inBufferTop] >= Pack_Def_Data + 8 && inBuffer[inBufferTop] <= DATA_PACK_MAX_LEN&& (inBuffer[inBufferTop] - Pack_Def_Data) % 8 == 0){CopyDataFromInBuffer(dataBuffer, inBuffer[inBufferTop]);if(GetCheckCode(&dataBuffer[Pack_Def_Data], dataBuffer[Pack_Def_Len] - Pack_Def_Data, dataBuffer[Pack_Def_Random]) == dataBuffer[Pack_Def_CC1]&& GetCheckCode(&dataBuffer[Pack_Def_Data], dataBuffer[Pack_Def_Len] - Pack_Def_Data, dataBuffer[Pack_Def_Random]^0xdb) == dataBuffer[Pack_Def_CC2]){//У��ɹ�//����int *p = (int*)(&dataBuffer[Pack_Def_Data]);int key[4];GetTeaKey(dataBuffer[Pack_Def_Random]^0x43, key);XXTea(p, key, -1 * (dataBuffer[Pack_Def_Len] - Pack_Def_Data) / 4);//�����ݱ��浽����for (int i = 0; i < dataBuffer[Pack_Def_Len] - Pack_Def_Data; i++){data[i] = dataBuffer[Pack_Def_Data + i];}*len = dataBuffer[Pack_Def_Len] - Pack_Def_Data;InBufferStepByStep(dataBuffer[Pack_Def_Len]);}else{InBufferStepByStep(1);*len = 0;}}else{InBufferStepByStep(1);*len = 0;}return true;}
}
*len = 0;
return false;

}

void CommSendData(unsigned char* data, int len)
{
static unsigned char dataBuffer[DATA_PACK_MAX_LEN];

if(len + Pack_Def_Data > DATA_PACK_MAX_LEN) return;int aLen = (8 - len%8)%8 + len;dataBuffer[Pack_Def_Len] = aLen + Pack_Def_Data;   //���ݳ���
dataBuffer[Pack_Def_CC1] = 0;                      //��
dataBuffer[Pack_Def_CC2] = 0;                      //��
dataBuffer[Pack_Def_Random] = Rand.Rand(0, 0xff);  //���ֵ
//�������
int i = 0;
for(i = 0; i < len; i++)
{dataBuffer[Pack_Def_Data+i] = data[i];
}
//Ϊ�˲���8�ı�����������ֵ
for(; i < aLen; i++)
{dataBuffer[Pack_Def_Data+i] = Rand.Rand(0, 0xff);//���ֵ;
}//����
int *p = (int*)(&dataBuffer[Pack_Def_Data]);
int key[4];
GetTeaKey(dataBuffer[Pack_Def_Random]^0x43, key);
XXTea(p, key, aLen / 4);//������
dataBuffer[Pack_Def_CC1] = GetCheckCode(&dataBuffer[Pack_Def_Data], aLen, dataBuffer[Pack_Def_Random]);
dataBuffer[Pack_Def_CC2] = GetCheckCode(&dataBuffer[Pack_Def_Data], aLen, dataBuffer[Pack_Def_Random]^0xdb);
PortSend(serialPortFD, (char*)dataBuffer, aLen + Pack_Def_Data);

}

//************************************************************************************************************************

S_KeyState PlayerKey[PK_Count];

void ClearKey(void)
{
for (int j = 0; j < PK_Count; j++)
{
PlayerKey[j].click = false;
PlayerKey[j].u_dt = 0;
PlayerKey[j].d_dt = 0;
PlayerKey[j].a_dt = 0;
PlayerKey[j].state = false;
}
}

unsigned int get_key =0;

void GetKeyData(unsigned char* data)
{
memcpy((unsigned char*)&get_key, data, 4);

for(int i = 0; i < PK_Count; i++)
{if((get_key & (0x00000001<<i)) > 0){//����if(!(PlayerKey[i].state)){PlayerKey[i].click = true;PlayerKey[i].u_dt = 0;PlayerKey[i].a_dt = 0;}PlayerKey[i].state = true;}else{//�ɿ�if(PlayerKey[i].state){PlayerKey[i].d_dt = 0;PlayerKey[i].a_dt = 0;}PlayerKey[i].state = false;PlayerKey[i].click = false;}
}

}

void DoInData(void)
{
static unsigned char data[DATA_PACK_MAX_LEN];
static int len = 0;

while(GetMsgPack(data, &len))
{nonePacketTime = 0;switch(data[0]){case 1:            // ɨ�谴��GetKeyData(&data[1]);break;default:break;}
}

}

void ComUpdate(float dt)
{
//��������
nonePacketTime += dt;

char buffer[1024];
int len = 0;
do
{len = PortRecv(serialPortFD, buffer, 1024);if(len <= 0)   break;else{nonePacketTime = 0;for (int i = 0; i < len; i++){SerialPushCharToInBuffer((unsigned char)buffer[i]);}DoInData();}
} while (true);

}

void ComInit(void)
{
inBufferTop = 0;
inBufferEnd = 0;
for(int i = 0; i < InBufferLen; i++)
{
inBuffer[i] = 0;
}
Tea_KeyInit();
}

void OpenCom(void)
{
if(serialPortFD == -1)
{
serialPortFD = PortOpen(SerialPortName);
if(serialPortFD >= 0)
{
PortSet(serialPortFD, Budrate);
}
ClearAllPortBuffer(serialPortFD);
}
}

void CloseCom(void)
{
PortClose(serialPortFD);
serialPortFD = -1;
inBufferTop = 0;
inBufferEnd = 0;
}

void KeyUpdate(float dt)
{
for (int j = 0; j < PK_Count; j++)
{
if(PlayerKey[j].state)
{
PlayerKey[j].u_dt += dt;
}
else
{
PlayerKey[j].d_dt += dt;
if(PlayerKey[j].click && PlayerKey[j].d_dt > 0.1f)
{
PlayerKey[j].click = false;
}
}
}
}

安卓月光宝盒项目源码讲解相关推荐

  1. android安卓月光宝盒项目源码技术讲解

    月光宝盒游戏机大家都了解,但是里面开发流程指导的人比较少,去年本人有幸接到过这样一个项目,研发月光宝盒游戏机. 在过去几年这边积累了非常多的模拟器开发资源.下面是淘宝上一款月光宝盒机器,实际上目前有几 ...

  2. 155款安卓开源项目源码整理,总有你要找的

    https://www.jianshu.com/p/a0dd06565747 1.BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android ...

  3. 达达php源码,【达达前端】Ajax实战项目源码讲解(快速入门的实例)Github源码...

    作者 | Jeskson 来源 | 达达前端小酒馆 源码地址: 什么是Ajax技术?实战中的运用ajax技术,了解前后端交互的方式,了解移动端的模式,了解H5的新技术,了解CSS3的使用,和JQuer ...

  4. 安卓期末项目源码_手机随时随地写Python,还可以开发安卓APP,太厉害了!

    python, 近五年最为火爆的编程语言,语法优雅,类库丰富,一行代码即可完成 Java 十行代码量. 本次,舞剑来推荐一款手机端使用 Python 的APP. QPython QPython是安卓上 ...

  5. 安卓android项目源码微信天天动听滴滴打车订票软件

  6. APICloud AVM多端开发 |《生鲜电商app开发》项目源码深度解析

    此项目为生鲜电商app开发类应用,主要功能包括商品列表.商品详情展示.购物车.登录注册.个人中心等. 项目源码在 https://github.com/apicloudcom/avm-simple 仓 ...

  7. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...

    适使用范围:  安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境:  Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...

  8. Unity小游戏-平衡大师(安卓、PC、web)2D益智类游戏 项目展示+完整项目源码

    游戏录像 游戏试玩 平衡带师_平衡带师html5游戏_4399h5游戏-h.4399.com 游戏玩法 这是一款类似堆积木的游戏,它非常考验玩家的智商和手速,难度系数很高的游戏,谁能征服它,谁就是平衡 ...

  9. android 快传 源码_安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端...

    适用范围:安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端 演示地址:(以截图为准) 运行环境:Android+PC+web 其他说明: 本项目是一个基于安卓的类似茄子 ...

最新文章

  1. js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...
  2. 公有云环境下应用程序的自动化部署与水平扩展问题
  3. JPA入门例子(采用JPA的hibernate实现版本)
  4. 用st-link通过stvp给stm8下载程序的坑
  5. java实现验证码输出_java实现验证码
  6. Linux 线程实现机制分析
  7. js 从一个函数中传递值到另一个函数
  8. JS跨页面调用变量的方法
  9. Android Glide数据更新及内存缓存、硬盘缓存清理
  10. TeaVM奇怪的编译现象:同样代码,编译有时通过有时不通过
  11. Volley(五)—— 自定义Request
  12. 和秋叶一起学PPT之绘制表格(课时七)
  13. EditPlus之Java开发环境配置
  14. win7下chm打不开
  15. MAC caps lock大小写切换电脑卡顿
  16. JavaScript基础知识-JS数据类型
  17. “天天向上”力量的Python教学实例
  18. 上帝叫我牵一只蜗牛去散步
  19. svchost.exe是什么进程
  20. CorAl – Are the point clouds Correctly Aligned?

热门文章

  1. lavaral中文手册_Laravel-mix 中文文档
  2. 你的Mac支持更新macOS Monterey吗
  3. [转载]Matlab生成Word报告
  4. 【python辅助excel】(3)
  5. 基于c语言测井原始数据编程,C语言对数据库文件的信息压缩
  6. 碰到国内外虚拟机无法识别usb加密狗或者银行U盾问题,大家请进入!!!
  7. 华为(huawei)USG6000的CLI命令行综合配置之Ensp真机连接 USG6000防火墙
  8. 一致性检查的具体含义是什么
  9. 常用正则表达式-数字、字母、金额等
  10. echarts怎么控制圆饼图的大小