如何让PyDirectInput同时按下多个按键?——《光·遇》开发问题
光·遇(Sky: Children of the Light)自动演奏工具多键同时按下问题
我正在为《Sky: Children of the Light》(光·遇)开发自动演奏工具,通过代码模拟按下对应乐器的按键。目前代码只能实现单键依次按下,无法处理需要多键同时按下的场景。以下是我编写的代码和测试用的JSON乐谱:
import json import sys import time import pydirectinput import pygetwindow as gw # 查找指定标题的窗口 window = gw.getWindowsWithTitle("Sky")[0] print(window) # 获取命令行参数 arguments = sys.argv # 激活窗口 window.activate() # 光·遇按键映射 key_mapping = { '1Key0': 'y', '1Key1': 'u', '1Key2': 'i', '1Key3': 'o', '1Key4': 'p', '1Key5': 'h', '1Key6': 'j', '1Key7': 'k', '1Key8': 'l', '1Key9': ';', '1Key10': 'n', '1Key11': 'm', '1Key12': ',', '1Key13': '.', '1Key14': '/' } # 演奏音乐 def play_music(json_data): song_notes = json_data[0]['songNotes'] bpm = json_data[0]['bpm'] # 计算每个节拍的持续时间(秒) beat_duration = 60.0 / bpm # 开始演奏 start_time = time.perf_counter() for i, note in enumerate(song_notes): note_time = note['time'] note_key = note['key'] if note_key in key_mapping: pydirectinput.press(key_mapping[note_key]) else: print("跳过:按键未在映射中找到") # 计算从开始演奏到现在的时间 elapsed_time = time.perf_counter() - start_time if i < len(song_notes) - 1: next_note_time = song_notes[i + 1]['time'] # 计算演奏下一个音符前需要等待的时间(毫秒转秒) wait_time = (next_note_time - note_time) / 1000 # 调整等待时间以保持节奏 remaining_time = max(0, note_time / 1000 + wait_time - elapsed_time) print("note_time:", note_time) print("wait_time:", wait_time) print("elapsed_time:", elapsed_time) print("remaining_time:", remaining_time) time.sleep(remaining_time) # 演奏结束后的延迟 time.sleep(2) # 小延迟确保最后一个音符完全演奏完毕 pydirectinput.press('/') # 检查是否传入了参数 if len(arguments) > 1: custom_value = arguments[1] try: # 读取本地JSON文件 with open(f'songs/{custom_value}.json', 'r') as file: json_data = json.load(file) # 开始演奏 play_music(json_data) except FileNotFoundError: print("未找到指定乐谱。") else: print("未指定乐谱。")
测试用JSON乐谱
[{"name":"Take on me","type":"recorded","folderId":null,"instruments":[{"name":"Piano","volume":100,"pitch":"","visible":true,"icon":"circle","alias":"","muted":false}],"version":2,"pitch":"C","bpm":200,"data":{"isComposed":false,"isComposedVersion":false,"appName":"Sky"},"notes":[[1,500,"1"],[12,500,"1"],[12,800,"1"],[10,1100,"1"],[8,1400,"1"],[8,2000,"1"],[4,2600,"1"],[11,2600,"1"],[11,2900,"1"],[6,3200,"1"],[13,3200,"1"],[13,3500,"1"],[14,3800,"1"],[14,4100,"1"],[7,4400,"1"],[14,4400,"1"],[14,4700,"1"],[11,5000,"1"],[9,5300,"1"],[3,5600,"1"],[12,5600,"1"],[12,5900,"1"],[12,6200,"1"],[2,6500,"1"],[11,6500,"1"],[11,6800,"1"],[12,7100,"1"],[11,7400,"1"],[1,7700,"1"],[12,7700,"1"],[12,8000,"1"],[10,8300,"1"],[8,8600,"1"],[8,9200,"1"],[4,9800,"1"],[11,9800,"1"],[6,10100,"1"],[11,10100,"1"],[11,10400,"1"],[6,10700,"1"],[13,10700,"1"],[13,11000,"1"],[14,11300,"1"],[14,11600,"1"],[7,11900,"1"],[14,11900,"1"],[11,12200,"1"],[4,12500,"1"],[9,12500,"1"],[9,12800,"1"],[3,13100,"1"],[12,13100,"1"],[12,13400,"1"],[12,13700,"1"],[2,14000,"1"],[11,14000,"1"],[11,14300,"1"],[12,14600,"1"],[1,14900,"1"],[10,14900,"1"],[3,15500,"1"],[10,15500,"1"],[8,15800,"1"],[9,15800,"1"],[4,16400,"1"],[6,17000,"1"],[6,17600,"1"],[7,17600,"1"],[8,17600,"1"],[2,17900,"1"],[9,17900,"1"],[10,18500,"1"],[4,18800,"1"],[9,18800,"1"],[8,19400,"1"],[7,19700,"1"],[5,20300,"1"],[7,20600,"1"],[8,20600,"1"],[9,20600,"1"],[1,20900,"1"],[10,20900,"1"],[3,21500,"1"],[10,21500,"1"],[8,22100,"1"],[9,22100,"1"],[4,22700,"1"],[6,23000,"1"],[6,23600,"1"],[7,23600,"1"],[8,23600,"1"],[2,24200,"1"],[9,24200,"1"],[10,24500,"1"],[4,24800,"1"],[9,24800,"1"],[8,25400,"1"],[7,25700,"1"],[5,26300,"1"],[4,26900,"1"]],"id":"1764816a-a847-5736-36ac","isComposed":false,"pitchLevel":0,"bitsPerPage":16,"isEncrypted":false,"songNotes":[{"time":500,"key":"1Key1"},{"time":500,"key":"1Key12"},{"time":800,"key":"1Key12"},{"time":1100,"key":"1Key10"},{"time":1400,"key":"1Key8"},{"time":2000,"key":"1Key8"},{"time":2600,"key":"1Key4"},{"time":2600,"key":"1Key11"},{"time":2900,"key":"1Key11"},{"time":3200,"key":"1Key6"},{"time":3200,"key":"1Key13"},{"time":3500,"key":"1Key13"},{"time":3800,"key":"1Key14"},{"time":4100,"key":"1Key14"},{"time":4400,"key":"1Key7"},{"time":4400,"key":"1Key14"},{"time":4700,"key":"1Key14"},{"time":5000,"key":"1Key11"},{"time":5300,"key":"1Key9"},{"time":5600,"key":"1Key3"},{"time":5600,"key":"1Key12"},{"time":5900,"key":"1Key12"},{"time":6200,"key":"1Key12"},{"time":6500,"key":"1Key2"},{"time":6500,"key":"1Key11"},{"time":6800,"key":"1Key11"},{"time":7100,"key":"1Key12"},{"time":7400,"key":"1Key11"},{"time":7700,"key":"1Key1"},{"time":7700,"key":"1Key12"},{"time":8000,"key":"1Key12"},{"time":8300,"key":"1Key10"},{"time":8600,"key":"1Key8"},{"time":9200,"key":"1Key8"},{"time":9800,"key":"1Key4"},{"time":9800,"key":"1Key11"},{"time":10100,"key":"1Key6"},{"time":10100,"key":"1Key11"},{"time":10400,"key":"1Key11"},{"time":10700,"key":"1Key6"},{"time":10700,"key":"1Key13"},{"time":11000,"key":"1Key13"},{"time":11300,"key":"1Key14"},{"time":11600,"key":"1Key14"},{"time":11900,"key":"1Key7"},{"time":11900,"key":"1Key14"},{"time":12200,"key":"1Key11"},{"time":12500,"key":"1Key4"},{"time":12500,"key":"1Key9"},{"time":12800,"key":"1Key9"},{"time":13100,"key":"1Key3"},{"time":13100,"key":"1Key12"},{"time":13400,"key":"1Key12"},{"time":13700,"key":"1Key12"},{"time":14000,"key":"1Key2"},{"time":14000,"key":"1Key11"},{"time":14300,"key":"1Key11"},{"time":14600,"key":"1Key12"},{"time":14900,"key":"1Key1"},{"time":14900,"key":"1Key10"},{"time":15500,"key":"1Key3"},{"time":15500,"key":"1Key10"},{"time":15800,"key":"1Key8"},{"time":15800,"key":"1Key9"},{"time":16400,"key":"1Key4"},{"time":17000,"key":"1Key6"},{"time":17600,"key":"1Key6"},{"time":17600,"key":"1Key7"},{"time":17600,"key":"1Key8"},{"time":17900,"key":"1Key2"},{"time":17900,"key":"1Key9"},{"time":18500,"key":"1Key10"},{"time":18800,"key":"1Key4"},{"time":18800,"key":"1Key9"},{"time":19400,"key":"1Key8"},{"time":19700,"key":"1Key7"},{"time":20300,"key":"1Key5"},{"time":20600,"key":"1Key7"},{"time":20600,"key":"1Key8"},{"time":20600,"key":"1Key9"},{"time":20900,"key":"1Key1"},{"time":20900,"key":"1Key10"},{"time":21500,"key":"1Key3"},{"time":21500,"key":"1Key10"},{"time":22100,"key":"1Key8"},{"time":22100,"key":"1Key9"},{"time":22700,"key":"1Key4"},{"time":23000,"key":"1Key6"},{"time":23600,"key":"1Key6"},{"time":23600,"key":"1Key7"},{"time":23600,"key":"1Key8"},{"time":24200,"key":"1Key2"},{"time":24200,"key":"1Key9"},{"time":24500,"key":"1Key10"},{"time":24800,"key":"1Key4"},{"time":24800,"key":"1Key9"},{"time":25400,"key":"1Key8"},{"time":25700,"key":"1Key7"},{"time":26300,"key":"1Key5"},{"time":26900,"key":"1Key4"}]}]
内容的提问来源于stack exchange,提问作者BumbleFuzzz
相关产品推荐
相关产品推荐

