[Emuelec]独立模拟器自动映射手柄按键脚本研究

2023-11-05 09:28

本文主要是介绍[Emuelec]独立模拟器自动映射手柄按键脚本研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Emuelec中,对独立模拟器配置手柄按键是个非常头疼的事,难点在于emuelec的按钮配置映射到模拟器所需的按钮配置,更头疼的是,每个模拟器所需的配置都不相同,此时就需要花大把时间了解每个模拟器的配置上。好在,Emuelec自4.3以后陆续增加了对独立模拟器的适配增强,其中最重要的就是对其自动映射按钮功能,它通过自动映射脚本,让玩家无需了解各个模拟器配置细节,既可自动完成手柄配置。这里以dc独立模拟器flycast为例,说说其自动映射脚本的工作原理。

独立flycast模拟器游戏启动主要流程如下:

1.开始游戏->启动游戏脚本:/usr/bin/emuelecRunEmu.sh->启动模拟器脚本::/usr/bin/flycast.sh

2.在flycast.sh中调用自动设置手柄按键脚本:/usr/bin/set_flycast_joy.sh

3.完成键位映射配置,生成对应配置文件:/storage/.config/flycast/emu.cfg  和 /storage/.config/flycast/mappings/手柄按钮映射文件.cfg

4.启动独立模拟器flycastSA ,开始真正游戏       

这里重点分析以下/usr/bin/joy_common.sh和/usr/bin/set_flycast_joy.sh

1. 在set_flycast_joy.sh中引用/usr/bin/joy_common.sh中的公用函数

source joy_common.sh "flycast"

2. joy_commn.sh中主要提供收集本机所有手柄信息的功能,其函数名为:jc_get_players,jc_get_players的基本工作原理是通过扫描本机的手柄的硬件信息,并通过查表(/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt)来获取手柄的键值配置信息

# echo  "${SDL_GAMECONTROLLERCONFIG_FILE}"
/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt

3.joy_common.sh收集并整理好手柄信息后,将其回传给set_flycast_joy.sh中的set_pad函数,完成最后转换映射到模拟器所需的配置

#在joy_common.sh中的代码
jc_get_players() {......local PLAYER_CFG=for p in {1..4}; dolocal CFG="${p} ${PLAYER_CFGS[$(( p-1 ))]}"if [[ $p -le $cfgCount ]]; thenecho "PLAYER_CFG=${CFG}"fieval clean_pad ${CFG}[[ "${CFG}" != "${p} " ]] && eval set_pad ${CFG} #这里回传给set_flycast.sh脚本的去做真正的配置转换(映射)done...
}
#在set_flycast_joy.sh中的代码
set_pad() {echo "set_pad params: $1 $2 $3 $4"local JSI="$2"local DEVICE_GUID=$3local JOY_NAME="$4"......
}

4.自此完成了对模拟器配置文件的生成与映射

题外话:

早期的emuelec4.6对独立flycast模拟器手柄映射有bug,会导致第一个手柄会被映射到第二个玩家,导致有些游戏无法操控,在set_flycast.sh中有一行代码如下:

local DEVICE="maple_sdl_joystick_${index} = ${JSI:2}\ndevice${1} = 0\ndevice${1}.1 = 1\ndevice${1}.2 = 1\n"

最新的4.6仓库代码已经修正了,代码如下:

local DEVICE="maple_sdl_joystick_${index} = ${index}\ndevice${1} = 0\ndevice${1}.1 = 1\ndevice${1}.2 = 1\n"

你看出差异了吗?呵呵

这篇关于[Emuelec]独立模拟器自动映射手柄按键脚本研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/348911

相关文章

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

python写个唤醒睡眠电脑的脚本

《python写个唤醒睡眠电脑的脚本》这篇文章主要为大家详细介绍了如何使用python写个唤醒睡眠电脑的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 环境:win10python3.12问题描述:怎么用python写个唤醒睡眠电脑的脚本?解决方案:1.唤醒处于睡眠状

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1