Example #1
0
        public void tポーリング(bool bWindowがアクティブ中, bool bバッファ入力を使用する)
        {
            for (int i = 0; i < 256; i++)
            {
                this.bKeyPushDown[i] = false;
                this.bKeyPullUp[i]   = false;
            }

            if (((bWindowがアクティブ中 && (this.devKeyboard != null)) && !this.devKeyboard.Acquire().IsFailure) && !this.devKeyboard.Poll().IsFailure)
            {
                //this.list入力イベント = new List<STInputEvent>( 32 );
                this.list入力イベント.Clear();                                        // #xxxxx 2012.6.11 yyagi; To optimize, I removed new();
                int posEnter = -1;
                //string d = DateTime.Now.ToString( "yyyy/MM/dd HH:mm:ss.ffff" );

                if (bバッファ入力を使用する)
                {
                    #region [ a.バッファ入力 ]
                    //-----------------------------

                    var length = this.devKeyboard.GetDeviceData(_rawBufferedDataArray, false);
                    if (!Result.Last.IsSuccess)
                    {
                        return;
                    }
                    for (int i = 0; i < length; i++)
                    {
                        var rawBufferedData = _rawBufferedDataArray[i];
                        var key             = DeviceConstantConverter.DIKtoKey(rawBufferedData.Offset);
                        var wasPressed      = (rawBufferedData.Data & 128) == 128;

                        STInputEvent item = new STInputEvent()
                        {
                            nKey       = (int)key,
                            b押された      = wasPressed,
                            nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換(rawBufferedData.Timestamp),
                        };
                        this.list入力イベント.Add(item);

                        this.bKeyState[item.nKey]    = wasPressed;
                        this.bKeyPushDown[item.nKey] = wasPressed;
                        this.bKeyPullUp[item.nKey]   = !wasPressed;
                    }

                    //-----------------------------
                    #endregion
                }
                else
                {
                    #region [ b.状態入力 ]
                    //-----------------------------
                    KeyboardState currentState = this.devKeyboard.GetCurrentState();
                    if (Result.Last.IsSuccess && currentState != null)
                    {
                        foreach (Key key in currentState.PressedKeys)
                        {
                            if (this.bKeyState[(int)key] == false)
                            {
                                var ev = new STInputEvent()
                                {
                                    nKey       = (int)key,
                                    b押された      = true,
                                    nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,                                     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
                                };
                                this.list入力イベント.Add(ev);

                                this.bKeyState[(int)key]    = true;
                                this.bKeyPushDown[(int)key] = true;

                                //if ( (int) key == (int) SlimDX.DirectInput.Key.Space )
                                //{
                                //    Trace.TraceInformation( "FDK(direct): SPACE key registered. " + ct.nシステム時刻 );
                                //}
                            }
                        }
                        foreach (Key key in currentState.ReleasedKeys)
                        {
                            if (this.bKeyState[(int)key] == true)
                            {
                                var ev = new STInputEvent()
                                {
                                    nKey       = (int)key,
                                    b押された      = false,
                                    nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,                                     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
                                };
                                this.list入力イベント.Add(ev);

                                this.bKeyState[(int)key]  = false;
                                this.bKeyPullUp[(int)key] = true;
                            }
                        }
                    }
                    //-----------------------------
                    #endregion
                }
                #region [#23708 2011.4.8 yyagi Altが押されているときは、Enter押下情報を削除する -> 副作用が見つかり削除]
                //if ( this.bKeyState[ (int) SlimDX.DirectInput.Key.RightAlt ] ||
                //     this.bKeyState[ (int) SlimDX.DirectInput.Key.LeftAlt ] )
                //{
                //    int cr = (int) SlimDX.DirectInput.Key.Return;
                //    this.bKeyPushDown[ cr ] = false;
                //    this.bKeyPullUp[ cr ] = false;
                //    this.bKeyState[ cr ] = false;
                //}
                #endregion
            }
        }
Example #2
0
        public void tポーリング(bool bWindowがアクティブ中, bool bバッファ入力を使用する)
        {
            for (int i = 0; i < 256; i++)
            {
                this.bKeyPushDown[i] = false;
                this.bKeyPullUp[i]   = false;
            }

            if (bWindowがアクティブ中 && (this.devKeyboard != null))
            {
                this.devKeyboard.Acquire();
                this.devKeyboard.Poll();

                //this.list入力イベント = new List<STInputEvent>( 32 );
                this.list入力イベント.Clear();                            // #xxxxx 2012.6.11 yyagi; To optimize, I removed new();
                int posEnter = -1;
                //string d = DateTime.Now.ToString( "yyyy/MM/dd HH:mm:ss.ffff" );

                if (bバッファ入力を使用する)
                {
                    #region [ a.バッファ入力 ]
                    //-----------------------------
                    var bufferedData = this.devKeyboard.GetBufferedData();
                    //if ( Result.Last.IsSuccess && bufferedData != null )
                    {
                        foreach (KeyboardUpdate data in bufferedData)
                        {
                            // #xxxxx: 2017.5.7: from: DIK (SharpDX.DirectInput.Key) を SlimDX.DirectInput.Key に変換。
                            var key = DeviceConstantConverter.DIKtoKey(data.Key);
                            if (SlimDXKey.Unknown == key)
                            {
                                continue;                                   // 未対応キーは無視。
                            }
                            //foreach ( Key key in data.PressedKeys )
                            if (data.IsPressed)
                            {
                                // #23708 2016.3.19 yyagi; Even if we remove ALT+ENTER key input by SuppressKeyPress = true in Form,
                                // it doesn't affect to DirectInput (ALT+ENTER does not remove)
                                // So we ignore ENTER input in ALT+ENTER combination here.
                                // Note: ENTER will be alived if you keyup ALT after ALT+ENTER.
                                if (key != SlimDXKey.Return || (bKeyState[(int)SlimDXKey.LeftAlt] == false && bKeyState[(int)SlimDXKey.RightAlt] == false))
                                {
                                    STInputEvent item = new STInputEvent()
                                    {
                                        nKey       = (int)key,
                                        b押された      = true,
                                        b離された      = false,
                                        nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換(data.Timestamp),
                                        nVelocity  = CInput管理.n通常音量
                                    };
                                    this.list入力イベント.Add(item);

                                    this.bKeyState[(int)key]    = true;
                                    this.bKeyPushDown[(int)key] = true;
                                }
                                //if ( item.nKey == (int) SlimDXKey.Space )
                                //{
                                //    Trace.TraceInformation( "FDK(buffered): SPACE key registered. " + ct.nシステム時刻 );
                                //}
                            }
                            //foreach ( Key key in data.ReleasedKeys )
                            if (data.IsReleased)
                            {
                                STInputEvent item = new STInputEvent()
                                {
                                    nKey       = (int)key,
                                    b押された      = false,
                                    b離された      = true,
                                    nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換(data.Timestamp),
                                    nVelocity  = CInput管理.n通常音量
                                };
                                this.list入力イベント.Add(item);
                                this.bKeyState[(int)key]  = false;
                                this.bKeyPullUp[(int)key] = true;
                            }
                        }
                    }
                    //-----------------------------
                    #endregion
                }
                else
                {
                    #region [ b.状態入力 ]
                    //-----------------------------
                    KeyboardState currentState = this.devKeyboard.GetCurrentState();
                    //if ( Result.Last.IsSuccess && currentState != null )
                    {
                        foreach (SharpDXKey dik in currentState.PressedKeys)
                        {
                            // #xxxxx: 2017.5.7: from: DIK (SharpDX.DirectInput.Key) を SlimDX.DirectInput.Key に変換。
                            var key = DeviceConstantConverter.DIKtoKey(dik);
                            if (SlimDXKey.Unknown == key)
                            {
                                continue;                                   // 未対応キーは無視。
                            }
                            if (this.bKeyState[(int)key] == false)
                            {
                                if (key != SlimDXKey.Return || (bKeyState[(int)SlimDXKey.LeftAlt] == false && bKeyState[(int)SlimDXKey.RightAlt] == false))                                    // #23708 2016.3.19 yyagi
                                {
                                    var ev = new STInputEvent()
                                    {
                                        nKey       = (int)key,
                                        b押された      = true,
                                        b離された      = false,
                                        nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,                                         // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
                                        nVelocity  = CInput管理.n通常音量,
                                    };
                                    this.list入力イベント.Add(ev);

                                    this.bKeyState[(int)key]    = true;
                                    this.bKeyPushDown[(int)key] = true;
                                }

                                //if ( (int) key == (int) SlimDXKey.Space )
                                //{
                                //    Trace.TraceInformation( "FDK(direct): SPACE key registered. " + ct.nシステム時刻 );
                                //}
                            }
                        }
                        //foreach ( Key key in currentState.ReleasedKeys )
                        foreach (SharpDXKey dik in currentState.AllKeys)
                        {
                            // #xxxxx: 2017.5.7: from: DIK (SharpDX.DirectInput.Key) を SlimDX.DirectInput.Key に変換。
                            var key = DeviceConstantConverter.DIKtoKey(dik);
                            if (SlimDXKey.Unknown == key)
                            {
                                continue;                                                         // 未対応キーは無視。
                            }
                            if (this.bKeyState[(int)key] == true && !currentState.IsPressed(dik)) // 前回は押されているのに今回は押されていない → 離された
                            {
                                var ev = new STInputEvent()
                                {
                                    nKey       = (int)key,
                                    b押された      = false,
                                    b離された      = true,
                                    nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,                                     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
                                    nVelocity  = CInput管理.n通常音量,
                                };
                                this.list入力イベント.Add(ev);

                                this.bKeyState[(int)key]  = false;
                                this.bKeyPullUp[(int)key] = true;
                            }
                        }
                    }
                    //-----------------------------
                    #endregion
                }
                #region [#23708 2011.4.8 yyagi Altが押されているときは、Enter押下情報を削除する -> 副作用が見つかり削除]
                //if ( this.bKeyState[ (int) SlimDXKey.RightAlt ] ||
                //     this.bKeyState[ (int) SlimDXKey.LeftAlt ] )
                //{
                //    int cr = (int) SlimDXKey.Return;
                //    this.bKeyPushDown[ cr ] = false;
                //    this.bKeyPullUp[ cr ] = false;
                //    this.bKeyState[ cr ] = false;
                //}
                #endregion
            }
        }