Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

GetJoystick (XBox360 Controller)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 25.11.2015, 10:06    Titel: GetJoystick (XBox360 Controller) Antworten mit Zitat

Hi,

Da ich seit neustem Besitzer zwei 'XBox 360' Controller bin wollte ich damit mal ein wenig herumexperimentieren und habe da gleich mal ein paar Fragen zur Verwendung unter FreeBASIC.


  • Wenn der Controller vor dem Start des Programms nicht aktiv (Ausgeschaltet/Nicht angeschlossen....) war, wird bei laufender Anwendung auch nach dem Anschließen/Einschalten kein Controller erkannt (bzw wohl nicht mehr abgefragt?!)
    Erst nach einem Neustart bei aktivierten Controller wird dieser wieder erkannt (lässt sich das ändern?)

  • Das auslesen funktioniert weitestgehend problemlos bis auf das Steuerkreuz von denen ich keine Rückgabe erhalte... (Wie lässt sich das auslesen?)

  • Wie verhalten sich andere Controller... und wie sieht es da mit der Tastenbelegung aus, sind die quasi pc-standard?
    (Also zB das einer mit einem 360controller genauso gut mit einer 08/15 tastatur-belegung klar kommt wie einer mit einem zB nintendo controller?!)




Code:
screenres 800,600,32

CONST JoystickID = 0
Dim as Single   x, y, z, r, u, v
Dim as Integer  JoystickBUTTONS



' Prüfe, ob die Joystick-Abfrage arbeitet:

IF GETJOYSTICK(JoystickID, JoystickBUTTONS, x, y, z, r, u, v) THEN
   PRINT "Joystick existiert nicht, oder ein Fehler ist aufgetreten."
   PRINT
   PRINT "Beliebige Taste drücken um fortzusetzen"
   SLEEP
   END
END IF

Dim as String JoystickEXT
DO
   GETJOYSTICK JoystickID, JoystickBUTTONS, x, y, z, r, u, v
   JoystickEXT = inkey
   
   LOCATE 1,1
   PRINT USING "x: +#.###  y: +#.###  Buttons: #### "; x; y; JoystickBUTTONS
   PRINT USING "z: +#.###  r: +#.### "; z; r
   PRINT USING "u: +#.###  v: +#.### "; u; v
   ?JoystickEXT;"          "
   ' Zeige an, welche Buttons gerade gedrückt werden:
   FOR i as Integer = 0 TO 7
      IF (JoystickBUTTONS AND (1 SHL i)) THEN
         PRINT "Button ";i ;" gedrueckt.      "
      ELSE
         PRINT "Button ";i ;".                "
      END IF
   NEXT
' Bei ESC beenden.
sleep 1
LOOP until multikey(&h01)

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 25.11.2015, 14:05    Titel: Antworten mit Zitat

Hallo Eternal_pain!

Einen XBox - Controller habe ich zwar nicht, aber ein Gamepad, das eine gewisse Ähnlichkeit damit hat. Ich benutze es meistens, um bequem in den Sessel gefläzt Winamp und ein paar andere Programme zu bedienen.

Die Abfrage erfolgt mit "GetJoystick", das Erkennen und Wiedererkennen beim Ab- und Anstöpseln funktioniert problemlos (entsprechende Abfrageschleife vorausgesetzt). Von den 13 Knöpfen werden 10 erkannt (keine Ahnung, ob das am Pad oder an FB liegt), und das Steuerkreuz wird als Joystick x/y zurückgemeldet (nur "quasi-analog", die Werte springen zwischen 0 und +/-1).

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 26.11.2015, 10:01    Titel: Antworten mit Zitat

Du brauchst hier einen XID-Treiber. Die Pad's sind zwar ähnlich einem normalem Gamepad, aber eben nur ähnlich. Sie nutzen ein etwas anderes Protokoll.

sofern du unter linux arbeitest: https://www.freebasic-portal.de/projekte/xid-userspace-treiber-81.html

für win gibts treiber von microsoft.

Alternativ, im oben genanntem source "nach klonen".


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.12.2015, 14:56    Titel: Antworten mit Zitat

Unter Windows wird für Controller wohl meist DirectInput verwendet welches moderne Gamepads wohl nicht vollständig unterstützt.
Soweit ich das gelesen habe sollte man speziell für den xbox360 controller xinput verwenden....
Im Freebasic Verzeichnis und beim googlen hab ich aber dazu noch nicht viel gefunden ausser eine XInput.h die man vielleicht übersetzen könnte

blick blos diverse defines nicht so ganz zwinkern

Code:
 /***************************************************************************
*                                                                          *
*   XInput.h -- This module defines XBOX controller APIs                   *
*               and constansts for the Windows platform.                   *
*                                                                          *
*   Copyright (c) Microsoft Corp. All rights reserved.                     *
*                                                                          *
***************************************************************************/
#ifndef _XINPUT_H_
#define _XINPUT_H_

#include <windef.h>

// Current name of the DLL shipped in the same SDK as this header.
// The name reflects the current version
#ifndef XINPUT_USE_9_1_0
#define XINPUT_DLL_A  "xinput1_3.dll"
#define XINPUT_DLL_W L"xinput1_3.dll"
#else
#define XINPUT_DLL_A  "xinput9_1_0.dll"
#define XINPUT_DLL_W L"xinput9_1_0.dll"
#endif
#ifdef UNICODE
    #define XINPUT_DLL XINPUT_DLL_W
#else
    #define XINPUT_DLL XINPUT_DLL_A
#endif

//
// Device types available in XINPUT_CAPABILITIES
//
#define XINPUT_DEVTYPE_GAMEPAD          0x01

//
// Device subtypes available in XINPUT_CAPABILITIES
//
#define XINPUT_DEVSUBTYPE_GAMEPAD       0x01

#ifndef XINPUT_USE_9_1_0

#define XINPUT_DEVSUBTYPE_WHEEL         0x02
#define XINPUT_DEVSUBTYPE_ARCADE_STICK  0x03
#define XINPUT_DEVSUBTYPE_FLIGHT_SICK   0x04
#define XINPUT_DEVSUBTYPE_DANCE_PAD     0x05
#define XINPUT_DEVSUBTYPE_GUITAR        0x06
#define XINPUT_DEVSUBTYPE_DRUM_KIT      0x08

#endif // !XINPUT_USE_9_1_0



//
// Flags for XINPUT_CAPABILITIES
//
#define XINPUT_CAPS_VOICE_SUPPORTED     0x0004

//
// Constants for gamepad buttons
//
#define XINPUT_GAMEPAD_DPAD_UP          0x0001
#define XINPUT_GAMEPAD_DPAD_DOWN        0x0002
#define XINPUT_GAMEPAD_DPAD_LEFT        0x0004
#define XINPUT_GAMEPAD_DPAD_RIGHT       0x0008
#define XINPUT_GAMEPAD_START            0x0010
#define XINPUT_GAMEPAD_BACK             0x0020
#define XINPUT_GAMEPAD_LEFT_THUMB       0x0040
#define XINPUT_GAMEPAD_RIGHT_THUMB      0x0080
#define XINPUT_GAMEPAD_LEFT_SHOULDER    0x0100
#define XINPUT_GAMEPAD_RIGHT_SHOULDER   0x0200
#define XINPUT_GAMEPAD_A                0x1000
#define XINPUT_GAMEPAD_B                0x2000
#define XINPUT_GAMEPAD_X                0x4000
#define XINPUT_GAMEPAD_Y                0x8000


//
// Gamepad thresholds
//
#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE  7849
#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD    30

//
// Flags to pass to XInputGetCapabilities
//
#define XINPUT_FLAG_GAMEPAD             0x00000001


#ifndef XINPUT_USE_9_1_0

//
// Devices that support batteries
//
#define BATTERY_DEVTYPE_GAMEPAD         0x00
#define BATTERY_DEVTYPE_HEADSET         0x01

//
// Flags for battery status level
//
#define BATTERY_TYPE_DISCONNECTED       0x00    // This device is not connected
#define BATTERY_TYPE_WIRED              0x01    // Wired device, no battery
#define BATTERY_TYPE_ALKALINE           0x02    // Alkaline battery source
#define BATTERY_TYPE_NIMH               0x03    // Nickel Metal Hydride battery source
#define BATTERY_TYPE_UNKNOWN            0xFF    // Cannot determine the battery type

// These are only valid for wireless, connected devices, with known battery types
// The amount of use time remaining depends on the type of device.
#define BATTERY_LEVEL_EMPTY             0x00
#define BATTERY_LEVEL_LOW               0x01
#define BATTERY_LEVEL_MEDIUM            0x02
#define BATTERY_LEVEL_FULL              0x03

// User index definitions
#define XUSER_MAX_COUNT                 4

#define XUSER_INDEX_ANY                 0x000000FF


//
// Codes returned for the gamepad keystroke
//

#define VK_PAD_A                        0x5800
#define VK_PAD_B                        0x5801
#define VK_PAD_X                        0x5802
#define VK_PAD_Y                        0x5803
#define VK_PAD_RSHOULDER                0x5804
#define VK_PAD_LSHOULDER                0x5805
#define VK_PAD_LTRIGGER                 0x5806
#define VK_PAD_RTRIGGER                 0x5807

#define VK_PAD_DPAD_UP                  0x5810
#define VK_PAD_DPAD_DOWN                0x5811
#define VK_PAD_DPAD_LEFT                0x5812
#define VK_PAD_DPAD_RIGHT               0x5813
#define VK_PAD_START                    0x5814
#define VK_PAD_BACK                     0x5815
#define VK_PAD_LTHUMB_PRESS             0x5816
#define VK_PAD_RTHUMB_PRESS             0x5817

#define VK_PAD_LTHUMB_UP                0x5820
#define VK_PAD_LTHUMB_DOWN              0x5821
#define VK_PAD_LTHUMB_RIGHT             0x5822
#define VK_PAD_LTHUMB_LEFT              0x5823
#define VK_PAD_LTHUMB_UPLEFT            0x5824
#define VK_PAD_LTHUMB_UPRIGHT           0x5825
#define VK_PAD_LTHUMB_DOWNRIGHT         0x5826
#define VK_PAD_LTHUMB_DOWNLEFT          0x5827

#define VK_PAD_RTHUMB_UP                0x5830
#define VK_PAD_RTHUMB_DOWN              0x5831
#define VK_PAD_RTHUMB_RIGHT             0x5832
#define VK_PAD_RTHUMB_LEFT              0x5833
#define VK_PAD_RTHUMB_UPLEFT            0x5834
#define VK_PAD_RTHUMB_UPRIGHT           0x5835
#define VK_PAD_RTHUMB_DOWNRIGHT         0x5836
#define VK_PAD_RTHUMB_DOWNLEFT          0x5837

//
// Flags used in XINPUT_KEYSTROKE
//
#define XINPUT_KEYSTROKE_KEYDOWN        0x0001
#define XINPUT_KEYSTROKE_KEYUP          0x0002
#define XINPUT_KEYSTROKE_REPEAT         0x0004

#endif //!XINPUT_USE_9_1_0

//
// Structures used by XInput APIs
//
typedef struct _XINPUT_GAMEPAD
{
    WORD                                wButtons;
    BYTE                                bLeftTrigger;
    BYTE                                bRightTrigger;
    SHORT                               sThumbLX;
    SHORT                               sThumbLY;
    SHORT                               sThumbRX;
    SHORT                               sThumbRY;
} XINPUT_GAMEPAD, *PXINPUT_GAMEPAD;

typedef struct _XINPUT_STATE
{
    DWORD                               dwPacketNumber;
    XINPUT_GAMEPAD                      Gamepad;
} XINPUT_STATE, *PXINPUT_STATE;

typedef struct _XINPUT_VIBRATION
{
    WORD                                wLeftMotorSpeed;
    WORD                                wRightMotorSpeed;
} XINPUT_VIBRATION, *PXINPUT_VIBRATION;

typedef struct _XINPUT_CAPABILITIES
{
    BYTE                                Type;
    BYTE                                SubType;
    WORD                                Flags;
    XINPUT_GAMEPAD                      Gamepad;
    XINPUT_VIBRATION                    Vibration;
} XINPUT_CAPABILITIES, *PXINPUT_CAPABILITIES;

#ifndef XINPUT_USE_9_1_0

typedef struct _XINPUT_BATTERY_INFORMATION
{
    BYTE BatteryType;
    BYTE BatteryLevel;
} XINPUT_BATTERY_INFORMATION, *PXINPUT_BATTERY_INFORMATION;

typedef struct _XINPUT_KEYSTROKE
{
    WORD    VirtualKey;
    WCHAR   Unicode;
    WORD    Flags;
    BYTE    UserIndex;
    BYTE    HidCode;
} XINPUT_KEYSTROKE, *PXINPUT_KEYSTROKE;

#endif // !XINPUT_USE_9_1_0

//
// XInput APIs
//
#ifdef __cplusplus
extern "C" {
#endif

DWORD WINAPI XInputGetState
(
    DWORD         dwUserIndex,  // Index of the gamer associated with the device
    XINPUT_STATE* pState        // Receives the current state
);

DWORD WINAPI XInputSetState
(
    DWORD             dwUserIndex,  // Index of the gamer associated with the device
    XINPUT_VIBRATION* pVibration    // The vibration information to send to the controller
);

DWORD WINAPI XInputGetCapabilities
(
    DWORD                dwUserIndex,   // Index of the gamer associated with the device
    DWORD                dwFlags,       // Input flags that identify the device type
    XINPUT_CAPABILITIES* pCapabilities  // Receives the capabilities
);

void WINAPI XInputEnable
(
    BOOL enable     // [in] Indicates whether xinput is enabled or disabled.
);

DWORD WINAPI XInputGetDSoundAudioDeviceGuids
(
    DWORD dwUserIndex,          // Index of the gamer associated with the device
    GUID* pDSoundRenderGuid,    // DSound device ID for render
    GUID* pDSoundCaptureGuid    // DSound device ID for capture
);

#ifndef XINPUT_USE_9_1_0

DWORD WINAPI XInputGetBatteryInformation
(
    DWORD                       dwUserIndex,        // Index of the gamer associated with the device
    BYTE                        devType,            // Which device on this user index
    XINPUT_BATTERY_INFORMATION* pBatteryInformation // Contains the level and types of batteries
);

DWORD WINAPI XInputGetKeystroke
(
    DWORD dwUserIndex,              // Index of the gamer associated with the device
    DWORD dwReserved,               // Reserved for future use
    PXINPUT_KEYSTROKE pKeystroke    // Pointer to an XINPUT_KEYSTROKE structure that receives an input event.
);

#endif //!XINPUT_USE_9_1_0

#ifdef __cplusplus
}
#endif

#endif  //_XINPUT_H_

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 03.12.2015, 11:42    Titel: Antworten mit Zitat

https://msdn.microsoft.com/de-de/library/windows/desktop/ee417001(v=vs.85).aspx#using_xinput

Wollte testweise mal ein schritt für schritt workaround mit der xinput basteln, allerdings scheint das so nicht ganz zu klappen...

Code:

#define XUSER_MAX_COUNT                 4
#Define ERROR_SUCCESS                   0

Type _XINPUT_GAMEPAD
    as SHORT                            wButtons
    as BYTE                             bLeftTrigger
    as BYTE                             bRightTrigger
    as SHORT                            sThumbLX
    as SHORT                            sThumbLY
    as SHORT                            sThumbRX
    as SHORT                            sThumbRY
End Type
Type XINPUT_GAMEPAD as _XINPUT_GAMEPAD
Type PXINPUT_GAMEPAD as _XINPUT_GAMEPAD ptr


Type _XINPUT_STATE
    as Integer                          dwPacketNumber
    as XINPUT_GAMEPAD                   Gamepad
End Type
Type XINPUT_STATE as _XINPUT_STATE
Type PXINPUT_STATE as _XINPUT_STATE ptr


Declare Function XInputGetState LIB"XInput9_1_0" ALIAS"XInputGetState" (dwUserIndex as Integer, pState as PXINPUT_STATE) as Integer

Dim as Integer dwResult
Dim as PXINPUT_STATE state

For i as Integer = 0 to XUSER_MAX_COUNT-1

    state = NEW XINPUT_STATE
    'ZeroMemory( &state, sizeof(XINPUT_STATE) );

    '' Simply get the state of the controller from XInput.
    dwResult = XInputGetState(i, state)

    If (dwResult = ERROR_SUCCESS) Then
        '' Controller is connected
    Else
        '' Controller is not connected
    End If
    DELETE state
Next i

sleep


Hier bekomme ich den Fehler:
Zitat:
Compiler output:
./XInput9_1_0.dll: file not recognized: File format not recognized


Verstehe nicht ganz warum....

Edit:

Das xid wollte ich mal testen, bekomme aber nur fehlermeldungen, dieses fehlt, das gibts ned... ect... beim umbauen der FB Versionen is wohl einiges nicht ganz fertig oder schief gelaufen... etliche defines und types spucken nur fehlermeldungen......

Edit:
Habs mal bissle weitergesponnen....
Code:
''
'' Structures used by XInput APIs
''
Type _XINPUT_GAMEPAD
    as SHORT                   wButtons
    as BYTE                    bLeftTrigger
    as BYTE                    bRightTrigger
    as SHORT                   sThumbLX
    as SHORT                   sThumbLY
    as SHORT                   sThumbRX
    as SHORT                   sThumbRY
End Type
Type XINPUT_GAMEPAD as _XINPUT_GAMEPAD
Type PXINPUT_GAMEPAD as _XINPUT_GAMEPAD ptr

Type _XINPUT_STATE
    as Integer                  dwPacketNumber
    as XINPUT_GAMEPAD           Gamepad
End Type
Type XINPUT_STATE as _XINPUT_STATE
Type PXINPUT_STATE as _XINPUT_STATE ptr

''
'' Structure to XBox360 Gamepad
''
Type XInputUseStruct
    NoErrors                    as Integer
   
    xinputlib                   as any ptr 'Lib entry
    'Lib Symbols
    XInputGetState              as Function (dwUserIndex as Integer, pstate as PXINPUT_STATE) as Integer
   
   
    '
    Connected                   as Integer
    ControllerState(0 to 3)     as PXINPUT_STATE
   
    '
    DeadZoneCheck               as Sub ()
    ControllerUpdate            as Sub ()
   
    '
    Declare Constructor()
    Declare Destructor()
    Declare Sub InitController()
End Type

Constructor XInputUseStruct()
    InitController()
End Constructor

Destructor XInputUseStruct()
    If xinputlib Then DyLibFree(xinputlib)
   
    For i as Integer = 0 to 3
        If ControllerState(i) Then DELETE ControllerState(i)
    Next i

End Destructor

Sub XInputUseStruct.InitController()
    Dim as Integer              dwResult
    NoErrors = 0 'No Errors
   
    xinputlib = DYLIBLOAD( "XInput9_1_0" ) 'Load Lib
   
    If xinputlib Then
        'Get Lib Symbols
        XInputGetState = DYLIBSYMBOL(xinputlib, "XInputGetState")
        'Check Lib Symbols
        If XInputGetState = 0 Then NoErrors = 1 ''Note: decide for different Errors
    Else
        'Couldn't load Lib
        NoErrors = 1 ''Note: decide for different Errors
    End If
   
    'get state
    For i as Integer = 0 to 3
        If ControllerState(i) Then DELETE ControllerState(i)
       
        ControllerState(i) = NEW XINPUT_STATE
           
        dwResult = XInputGetState(i, ControllerState(i))
        If dwResult = 0 Then
            Connected = BitSet(Connected,i)
        Else
            Connected = BitReset(Connected,i)
        End If
    Next i
End Sub
   



screenres 800,600,32
Dim as XInputUseStruct          Controller

Do
    locate 1,1:?Bin(Controller.Connected,4);"           "
   
   
    sleep 100
    Controller.InitController()
Loop until multikey(&h01)



Was mich noch interessieren würde ob die API auch mit anderen Controllern funktioniert... evtl auch alten analogen Joysticks/Gamepads?
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz