using System; using System.Collections.Generic; using System.Reflection; namespace AxibugEmuOnline.Client.InputDevices { public abstract class InputDevice_D { /// <summary> 指示该设备是否只能由一个Binder独占 </summary> public virtual bool Exclusive => true; public string UniqueName => m_resolver.GetDeviceName(this); /// <summary> 指示该设备是否在线 </summary> public bool Online => m_resolver.CheckOnline(this); /// <summary> 指示该设备当前帧是否有任意控件被激发 </summary> public bool AnyKeyDown { get; private set; } /// <summary> 获得输入解决器 </summary> internal InputResolver Resolver => m_resolver; protected Dictionary<string, InputControl_C> m_controlMapper = new Dictionary<string, InputControl_C>(); protected InputResolver m_resolver; public InputDevice_D(InputResolver resolver) { m_resolver = resolver; DefineControls(); } private void DefineControls() { foreach (var field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)) { if (!typeof(InputControl_C).IsAssignableFrom(field.FieldType)) continue; var controlIns = Activator.CreateInstance(field.FieldType, this, field.Name) as InputControl_C; field.SetValue(this, controlIns); m_controlMapper[field.Name] = controlIns; } } public void Update() { AnyKeyDown = false; foreach (var control in m_controlMapper.Values) { control.Update(); if (control.Start) { AnyKeyDown = true; } } } public override string ToString() { return Resolver.GetDeviceName(this); } } }