DirectInput - Joystick   zodpovězená otázka

C#, VB.NET, DirectX

Navazuji na: http://vbnet.cz/forum-tema--2441-joystic...

Stáhnul jsem si Microsoft DirectX SDK (June 2010) a tam, bylo pouze C++ které vůbec neovládám, ovšem jejich sample funguje ikdyž se zobrazí dvě chyby. Poté jsem si stáhl Microsoft Microsoft DirectX SDK (August 2006) a tam jsem našel i samle s C# který mi ve VB 2010 Express vypíše chybu: "Mixed mode assembly is built against version 'v1.1.4322' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information."

Můj dotaz zní:"Jak nastavit VB 2010 aby to fungovalo v C# a později ve VB?"

Předem děkuji za odpověď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zásadně nepoužívejte zastaralé technologie jenom kvůli tomu, že tam nejsou příklady pro .NET jazyky. Součástí posledního SDK pro DirectX je i Managed DirectX a jeho dokumentace, to co potřebujete je Microsoft.DirectX.DirectInput. Příklady pro .NET jazyky tam nejsou proto, že se Microsoft snaží tímto kriplovským způsobem protlačit XNA Framework. API nové generace pro obsluhu herních zařízení je XInput, který je sice nesrovnatelně jednodušší, ale obsahuje tak desetinu funkčnosti co DirectInput a podporuje pouze ovladač Xbox 360 a nic jiného.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mě ta technologie nepřijde stará, když v ní může funguvat to co pořebuji. Teď jsem našel na netu návod pro delphi s API, ale ten sample od microsoftu se mi líbí víc. V DX SDK 2010 jsem našel pouze samply pro C++ a dokumentaci co je taky pro C++. Potřebuji nějaký navod jak začít ve VB2010 s DirectInputem. Co mám hledat,...?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

4 roky staré SDK JE zastaralá a nepoužitelná technologie. Kromě toho už jsem vám říkal, že vše potřebné je v nejnovějším DirectX SDK. Příklady jsou součástí dokumentace pro Managed DirectX, která je rovněž k dispozici online: http://msdn.microsoft.com/en-us/library/...

Ve VB2010 stačí pouze přidat referenci na příslušnou assembly (Microsoft.DirectX.DirectInput) a vše ostatní lze dohledat na MSDN.

Pokud jste neschopný to v tom nejnovějším SDK najít, nebo použít dokumentaci a příklady z webu, ani se do ničeho nepouštějte.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Neviem, čo konkrétne chcete vedieť, ale napríklad tento kód vypíše aktuálne hodnoty joysticku.

Imports Microsoft.DirectX.DirectInput

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim joy As New Microsoft.DirectX.DirectInput.JoystickState
        Label1.Text = joy.ToString
    End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Toto samozřejmě nebude fungovat, respektive vrácené hodnoty budou výchozí hodnoty nepatřící žádnému zařízení. Aby to fungovalo, je nejdříve nutné získat seznam požadovaných typů připojených zařízení, z konkrétního zařízení získat identifikátor a pomocí něj vytvořit instanci třídy, která představuje zařízení. Teprve potom můžete použít metody této třídy ke získání hodnot ze zařízení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Toto som našiel, ale je to na použitie klávesnice, myslím však, že s drobnými úpravami by to malo ísť na joystick.

http://gpwiki.org/index.php/DirectX:DirectInput:Tutorials:VBNET:

DX9:Keyboard_Handling_Immediate

a ešte toto na joystick, ale C#:

http://www.codeproject.com/KB/directx/jo...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přeložen první odstavec z http://www.codeproject.com/KB/directx/jo...

Imports Microsoft.DirectX.DirectInput
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Find all the GameControl devices that are attached.

        Dim gameControllerList As DeviceList = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly)
        ' check that we have at least one device.

        If gameControllerList.Count > 0 Then
            ' Move to the first device

            gameControllerList.MoveNext()
            Dim deviceInstance As DeviceInstance = DirectCast(gameControllerList.Current, DeviceInstance)

            ' create a device from this controller.

            joystickDevice = New Device(deviceInstance.InstanceGuid)
            joystickDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.Background Or CooperativeLevelFlags.NonExclusive)
        End If

        ' Tell DirectX that this is a Joystick.

        joystickDevice.SetDataFormat(DeviceDataFormat.Joystick)
        ' Finally, acquire the device.

        joystickDevice.Acquire()

    End Sub
End Class

hází chybu(pokud přeskočím nedeklarované"joystickDevice"řádky): Mixed mode assembly is built against version 'v1.1.4322' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

Jinak již zkompilovaný projekt mě funguje až na to, že nerozpozná jednu osu (Slider) a POV

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vyřešeno!

Narazil jsem na SlimDX SDK ktrá podporuje .NET 4. Všechny jejich samply v C#. přeložil jsem ho na webu do VB a poopravil a přidal referenci na knihovnu. Funguje to!

Imports System.Globalization
Imports System.Windows.Forms
Imports SlimDX
Imports SlimDX.DirectInput
Imports System.Collections.Generic
Partial Public Class Form1
    Inherits Form
    Private joystick As Joystick
    Private state As New JoystickState()
    Private numPOVs As Integer
    Private SliderCount As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If joystick Is Nothing Then
            CreateDevice()
        Else
            ReleaseDevice()
        End If
        UpdateUI()
    End Sub
    Private Sub UpdateUI()
        If joystick Is Nothing Then
            Button1.Text = "Create Device"
        Else
            Button1.Text = "Release Device"
        End If
        Dim strText As String = Nothing
OSY:
        Label1.Text = state.X.ToString(CultureInfo.CurrentCulture)
        ProgressBar1.Value = state.X.ToString(CultureInfo.CurrentCulture) + 1000
        Label2.Text = state.Y.ToString(CultureInfo.CurrentCulture)
        ProgressBar2.Value = state.Y.ToString(CultureInfo.CurrentCulture) + 1000
        Label3.Text = state.Z.ToString(CultureInfo.CurrentCulture)
ROTACE:
        Label4.Text = state.RotationX.ToString(CultureInfo.CurrentCulture)
        Label5.Text = state.RotationY.ToString(CultureInfo.CurrentCulture)
        Label6.Text = state.RotationZ.ToString(CultureInfo.CurrentCulture)
        ProgressBar3.Value = state.RotationZ.ToString(CultureInfo.CurrentCulture) + 1000
PLYN:
        Dim slider As Integer() = state.GetSliders()

        Label7.Text = slider(0).ToString(CultureInfo.CurrentCulture)
        ProgressBar4.Value = slider(0).ToString(CultureInfo.CurrentCulture) + 1000
        label21.Text = slider(1).ToString(CultureInfo.CurrentCulture)
PADY:
        Dim pov As Integer() = state.GetPointOfViewControllers()

        Label8.Text = pov(0).ToString(CultureInfo.CurrentCulture)
        If CInt(Label8.Text) = -1 Then
            LineShape1.Y1 = 79
            LineShape1.X1 = 346
        ElseIf CInt(Label8.Text) = 0 Then
            LineShape1.Y1 = 51
            LineShape1.X1 = 346
        ElseIf CInt(Label8.Text) = 31500 Then
            LineShape1.Y1 = 62
            LineShape1.X1 = 323
        ElseIf CInt(Label8.Text) = 27000 Then
            LineShape1.Y1 = 81
            LineShape1.X1 = 314
        ElseIf CInt(Label8.Text) = 22500 Then
            LineShape1.Y1 = 100
            LineShape1.X1 = 323
        ElseIf CInt(Label8.Text) = 18000 Then
            LineShape1.Y1 = 111
            LineShape1.X1 = 346
        ElseIf CInt(Label8.Text) = 13500 Then
            LineShape1.Y1 = 100
            LineShape1.X1 = 369
        ElseIf CInt(Label8.Text) = 9000 Then
            LineShape1.Y1 = 81
            LineShape1.X1 = 378
        ElseIf CInt(Label8.Text) = 4500 Then
            LineShape1.Y1 = 62
            LineShape1.X1 = 369
        End If


        Label9.Text = pov(1).ToString(CultureInfo.CurrentCulture)
        Label22.Text = pov(2).ToString(CultureInfo.CurrentCulture)
        Label23.Text = pov(3).ToString(CultureInfo.CurrentCulture)
TLAČÍTKA:
        Dim buttons As Boolean() = state.GetButtons()

        For b As Integer = 0 To buttons.Length - 1
            If buttons(b) Then
                strText += b.ToString("00 ", CultureInfo.CurrentCulture)
            End If
        Next
        Label13.Text = strText
    End Sub
    Private Sub ReleaseDevice()
        Timer1.[Stop]()

        If joystick IsNot Nothing Then
            joystick.Unacquire()
            joystick.Dispose()
        End If
        joystick = Nothing
    End Sub
    Private Sub CreateDevice()
        Dim dinput As New DirectInput()

        ' search for devices
        For Each device As DeviceInstance In dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly)
            ' create the device
            Try
                joystick = New Joystick(dinput, device.InstanceGuid)
                joystick.SetCooperativeLevel(Me, CooperativeLevel.Exclusive Or CooperativeLevel.Foreground)
                Exit Try
            Catch generatedExceptionName As DirectInputException
            End Try
        Next

        If joystick Is Nothing Then
            MessageBox.Show("There are no joysticks attached to the system.")
            Return
        End If
        For Each deviceObject As DeviceObjectInstance In joystick.GetObjects()
            If (deviceObject.ObjectType And ObjectDeviceType.Axis) <> 0 Then
                joystick.GetObjectPropertiesById(CInt(deviceObject.ObjectType)).SetRange(-1000, 1000)
            End If

            Unlocking(deviceObject)
        Next

        ' acquire the device
        joystick.Acquire()

        ' set the timer to go off 12 times a second to read input
        ' NOTE: Normally applications would read this much faster.
        ' This rate is for demonstration purposes only.
        Timer1.Interval = 1000 \ 24

        Timer1.Start()
    End Sub
    Private Sub Unlocking(ByVal d As DeviceObjectInstance)
        If ObjectGuid.XAxis = d.ObjectTypeGuid Then
            Label1.Enabled = True
        End If
        If ObjectGuid.YAxis = d.ObjectTypeGuid Then
            Label2.Enabled = True
        End If
        If ObjectGuid.ZAxis = d.ObjectTypeGuid Then
            Label3.Enabled = True
        End If
        If ObjectGuid.RotationalXAxis = d.ObjectTypeGuid Then
            Label18.Enabled = True
        End If
        If ObjectGuid.RotationalYAxis = d.ObjectTypeGuid Then
            Label19.Enabled = True
        End If
        If ObjectGuid.RotationalZAxis = d.ObjectTypeGuid Then
            Label6.Enabled = True
        End If
        If ObjectGuid.Slider = d.ObjectTypeGuid Then
            Select Case System.Math.Max(System.Threading.Interlocked.Increment(SliderCount), SliderCount - 1)
                Case 0
                    Label21.Enabled = True
                    Exit Select
                Case 1
                    Label7.Enabled = True
                    Exit Select
            End Select
        End If
        If ObjectGuid.PovController = d.ObjectTypeGuid Then
            Select Case System.Math.Max(System.Threading.Interlocked.Increment(numPOVs), numPOVs - 1)
                Case 0
                    Label9.Enabled = True
                    Exit Select
                Case 1
                    Label8.Enabled = True
                    Exit Select
                Case 2
                    Label22.Enabled = True
                    Exit Select
                Case 3
                    Label23.Enabled = True
                    Exit Select
            End Select
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        ReadImmediateData()
    End Sub
    Private Sub ReadImmediateData()
        If joystick.Acquire().IsFailure Then
            Return
        End If
        If joystick.Poll().IsFailure Then
            Return
        End If
        state = joystick.GetCurrentState()
        If Result.Last.IsFailure Then
            Return
        End If
        UpdateUI()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        MsgBox("Vytvořeno pomocí 'SlimDX SDK 2010'  http://slimdx.org/", MsgBoxStyle.SystemModal)
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě dodám odkaz: http://slimdx.org/

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback