本文主要是介绍[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]独立模拟器自动映射手柄按键脚本研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!