質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

2161閲覧

VB.NETとDirectX SDKを利用してJoyPadの入力回数を正しく取得したい

Morris

総合スコア13

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/12/30 08:14

前提・実現したいこと

VB.NETとDirectX SDKを利用してJoyPadの入力回数を正しく取得したいと思っています。
以下のコードで入力情報の取得はできたのですが、カウントがうまくいきません。
Bボタンが押された際の処理にTextBoxへ回数を加算するようにしているのですが、
一度の押下で2回カウントされたり4回カウントされたり、とても不安定です。
これをきちんと押した回数分、TextBoxに表示させるには、どのようにしたらよいでしょうか。

該当のソースコード

Imports Microsoft.DirectX Imports Microsoft.DirectX.DirectInput Public Class Form1 Private m_JoysTick As Device = Nothing Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'ゲームパッド検索 For Each wDeviceInstance As DeviceInstance In Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly) Me.m_JoysTick = New Device(wDeviceInstance.InstanceGuid) Exit For Next wDeviceInstance If Me.m_JoysTick Is Nothing Then MessageBox.Show("No JoyStick Found!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Me.Close() Else '入力値範囲設定 For Each wObjects As DeviceObjectInstance In Me.m_JoysTick.Objects If (wObjects.ObjectId And DeviceObjectTypeFlags.Axis) <> 0 Then Me.m_JoysTick.Properties.SetRange(ParameterHow.ById _ , wObjects.ObjectId, New InputRange(-5000, 5000)) End If Next wObjects '絶対位置取得 Me.m_JoysTick.Properties.AxisModeAbsolute = True '協調レベル Me.m_JoysTick.SetCooperativeLevel(Me, CooperativeLevelFlags.NonExclusive _ Or CooperativeLevelFlags.Background) '情報取得 Me.m_JoysTick.Acquire() 'タイマー開始 Me.Timer1.Interval = 100 Me.Timer1.Enabled = True End If End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick With Me.m_JoysTick.CurrentJoystickState '十字ボタン(ハットスイッチ) Me.CheckBox_Up.Checked = (.GetPointOfView(0) = 0) Me.CheckBox_Right.Checked = (.GetPointOfView(0) = 9000) Me.CheckBox_Down.Checked = (.GetPointOfView(0) = 18000) Me.CheckBox_Left.Checked = (.GetPointOfView(0) = 27000) '右側ボタン Me.CheckBox_X.Checked = (.GetButtons(0) > 0) Me.CheckBox_A.Checked = (.GetButtons(1) > 0) Me.CheckBox_B.Checked = (.GetButtons(2) > 0) Me.CheckBox_Y.Checked = (.GetButtons(3) > 0) '上部ボタン Me.CheckBox_LB.Checked = (.GetButtons(4) > 0) Me.CheckBox_RB.Checked = (.GetButtons(5) > 0) Me.CheckBox_LT.Checked = (.GetButtons(6) > 0) Me.CheckBox_RT.Checked = (.GetButtons(7) > 0) 'アナログスティック中央ボタン Me.CheckBox_LCenter.Checked = (.GetButtons(10) > 0) Me.CheckBox_RCenter.Checked = (.GetButtons(11) > 0) End With End Sub Private Sub CheckBox_B_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox_B.CheckedChanged TextBox1.Text = TextBox1.Text + 1 End Sub End Class

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CheckBox.CheckedChangedイベントはCheckedプロパティが変化したときに発生します。
したがって、False→Trueの変化の時とTrue→Falseの変化時になります。
この為、ボタンを押したときと離したときがカウント対象となります。
よって、ボタンが押された時のみ(もしくはボタンが離された時のみ)カウントするようにしなくてはいけません。

VB.NET

1Private ButtonB_Count As Integer 2Private Sub CheckBox_B_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox_B.CheckedChanged 3 4 If CheckBox_B.Checked = True Then 5 ButtonB_Count += 1 6 End If 7 TextBox1.Text = ButtonB_Count.ToString 8End Sub

投稿2018/12/30 09:32

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Morris

2018/12/30 09:40

YAmaGNZ様 ご回答ありがとうございました。 元々のコードは引用だったため全容をあまり把握しておらず、 こちらへ投稿した後、Checkedプロパティについて気付きました。 buttonに変更してtimer内にifを入れ呼び出し、 ということをしていたのですが、timer内に入れてしまうと押しっぱなしでカウントされ続けるのでダメだなあとあれこれ頭を抱えていたところ、YAmaGNZ様から助言により、あっさりと解決してしまいました。ありがとうございました。 今後の参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問