PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Joystick Programmierung und Windows 2000



Magge2k
29.12.2004, 18:06
Hi Leute,

ich sitze jetzt schon zwei Tage dran und versuche im Internet irgendwelche Nützlichen unterlagen zum Thema Joystick und BCB zu finden aber ich kann nicht finden. Jetzt wollte ich einmal fragen ob sich hier jemand mit dem Thema auskennt.

Ich möchte zunächst nur einmal ein Beispiel programm programmieren welches mir die Position des Joysticks wiedergibt ähnlich wie die Joystick kalibrierung unter Windows.

wäre auf Tipps und Hinweise sehr dankbar.

grüßla

andi84
04.01.2005, 00:51
Der joystick wird über die winmm32.dll abgefragt.
Was für eine Programmiersprache verwendest du denn?

Magge2k
04.01.2005, 01:41
Hi andi,

also ich verwende C++.

Wäre nett wenn du mir weiterhelfen köntest!

andi84
04.01.2005, 01:55
Also für Visual Basic habe ich schon mal routinen gesehen.
Ergo muss es mit C++ gehen.
Bei C++ sollte eigentlich eine Headerdatei für die winmm.dll dabeisein.
Andernfalls könnte man natürlich auch einen VB Quelltext als Vorlage nehmen und dann entsprechend in C++ umsetzen (primär geht es dabei nur um die Initialisierung/Geräteauswahl).

Es gibt sogar Fensternachrichten für Joysticks:

// Multimedia Window Messages
const int MM_JOY1MOVE = &H3A0;
const int MM_JOY2MOVE = &H3A1;
const int MM_JOY1ZMOVE = &H3A2;
const int MM_JOY2ZMOVE = &H3A3;
const int MM_JOY1BUTTONDOWN = &H3B5;
const int MM_JOY2BUTTONDOWN = &H3B6;
const int MM_JOY1BUTTONUP = &H3B7;
const int MM_JOY2BUTTONUP = &H3B8;



Die folgenden Deklarationen sind für VB:
Public Declare Function joyGetDevCaps Lib "winmm.dll" Alias "joyGetDevCapsA" (ByVal id As Long, lpCaps As JOYCAPS, ByVal uSize As Long) As Long
Public Declare Function joyGetNumDevs Lib "winmm.dll" Alias "joyGetNumDev" () As Long
Public Declare Function joyGetPos Lib "winmm.dll" Alias "joyGetPos" (ByVal uJoyID As Long, pji As JOYINFO) As Long
Public Declare Function joyGetPosEx Lib "winmm.dll" Alias "joyGetPosEx" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long
Public Declare Function joyGetThreshold Lib "winmm.dll" Alias "joyGetThreshold" (ByVal id As Long, lpuThreshold As Long) As Long
Public Declare Function joyReleaseCapture Lib "winmm.dll" Alias "joyReleaseCapture" (ByVal id As Long) As Long
Public Declare Function joySetCapture Lib "winmm.dll" Alias "joySetCapture" (ByVal hwnd As Long, ByVal uID As Long, ByVal uPeriod As Long, ByVal bChanged As Long) As Long
Public Declare Function joySetThreshold Lib "winmm.dll" Alias "joySetThreshold" (ByVal id As Long, ByVal uThreshold As Long) As Long

Ich denke, dass man also zuerst mit joyGetNumDevs versuchen sollte, herauszufinden, ob überhaupt ein Joystick vorhanden ist.
Um dann mittels joyGetPos herauszufinden, wo der Stick gerade steht.

andi84
04.01.2005, 01:58
Die oben genannten Funktionen in der winmm.dll dürften so in etwa alle sein, die es für joysticks gibt.
Alternativ dazu könnte man vermutlich auch über DirectX (DirectInput) auf den Joystick zugreifen und dann sogar Force Feedback oder Rumble-Features nutzen.
Mit der winmm.dll sollte es allerdings doch etwas einfacher gehen.

andi84
04.01.2005, 02:02
Die beiden wichtigsten Strukturen für das mit den Joysticks sollte ich vielleicht auch noch erwähnen:
Type JOYCAPS
wMid As Integer
wPid As Integer
szPname As String * 32
wXmin As Integer
wXmax As Integer
wYmin As Integer
wYmax As Integer
wZmin As Integer
wZmax As Integer
wNumButtons As Integer
wPeriodMin As Integer
wPeriodMax As Integer
End Type

Type JOYINFO
wXpos As Long
wYpos As Long
wZpos As Long
wButtons As Long
End Type

Leider alles nur Basic, aber man kann es 1:1 in eine typedef struct umsetzen. Der szPname müsste einem char Pname[32] entsprechen

Magge2k
04.01.2005, 02:26
hmm danke das hört sich ja alles mal seh interesannt an. Nur ich muss eins noch dazu sagen ich habe mit VB noch nie etwas zu tun gehabt! Daher tue ich mir vielleicht etwas schwer. Aber ich werde mein bestes versuchen! Danke mal, wenn dir noch etwas einfällt kannst es ja posten ;o)

gruß und gute nacht

NumberFive
05.01.2005, 14:25
Um die Funktion in c++ ein zu binden muß du nur die richtigen header ein bin den unter MS C++ ist das ganz einfach lat dir ein fach das DiretX SDK bei ms runter da ist ein sehr einfacheres beispiel dabei.




.....
#define DIRECTINPUT_VERSION 0x0800

#include <dinput.h>
#include "resource.h"

CMNJoystick* g_pMNJoy;

.....

// Register with the DirectInput subsystem and get a pointer
// to a IDirectInput interface we can use.
// Create a DInput object
if( SUCCEEDED( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,IID_IDirectInput8, (VOID**)&g_pDI, NULL ) ) )
{
// Look for a simple joystick we can use for this sample program.
if(SUCCEEDED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,EnumJoysticksCallback,NULL, DIEDFL_ATTACHEDONLY ) ) )
{
// Make sure we got a joystick
if( NULL == g_pJoystick )
{
MessageBox( NULL, TEXT("Keinen JoyStick gefunden. Oder kann nicht Initalisieren"),TEXT("MN Joystickclass"),MB_ICONERROR | MB_OK );
return FALSE;
}
// Set the data format to "simple joystick" - a predefined data format
//
// A data format specifies which controls on a device we are interested in,
// and how they should be reported. This tells DInput that we will be
// passing a DIJOYSTATE2 structure to IDirectInputDevice::GetDeviceState().
if(SUCCEEDED( hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 ) ) )
{
// Set the cooperative level to let DInput know how this device should
// interact with the system and with other DInput applications.
//DISCL_EXCLUSIVE |DISCL_FOREGROUND
if(SUCCEEDED( hr = g_pJoystick->SetCooperativeLevel( hDlg, DISCL_EXCLUSIVE|DISCL_BACKGROUND ) ) )
{
// Enumerate the joystick objects. The callback function enabled user
// interface elements for objects that are found, and sets the min/max
// values property for discovered axes.
if(SUCCEEDED( hr = g_pJoystick->EnumObjects( EnumObjectsCallback,(VOID*)hDlg, DIDFT_ALL ) ) )
{
ATLTRACE("Nun kann es los gehen\n");
g_hClientThreadMsg = CreateEvent(NULL,TRUE,FALSE,NULL);
g_hClientThreadExit = CreateEvent(NULL,TRUE,FALSE,NULL);

m_hClientThreadHandle=(HANDLE)_beginthreadex(NULL, 0,ClientThread,this,CREATE_SUSPENDED,reinterpret_c ast<unsigned int*>(&m_dwClientThreadId));
SetThreadPriority(m_hClientThreadHandle, THREAD_PRIORITY_NORMAL);
ResumeThread(m_hClientThreadHandle);
if(WaitForSingleObject(g_hClientThreadMsg,30000) == WAIT_OBJECT_0)
{
ATLTRACE("Thread läuft mal sehen ob daten kommen\n");
}
}
}
else
{
m_pRoboclient->TraceIt("SetCooperativeLevel not OK");
}
}

...


so ähnlich halt ist ein aus zug aus meinem code per DirektX

andi84
05.01.2005, 20:50
Die Deklarationen findet man meistens im Internet (Google: "winmm.dll joystick c++")
Die Typdefinitionen sollte man auch schon fix und fertig bekommen können.
Der Rest sollte recht einfach gehen:
1. mit joyGetNumDevs prüfen, ob Joysticks vorhanden sind
2. mit joyGetDevCaps die Eigenschaften des Joysticks abfragen
3. mit joyGetPos (in regelmäßigen Intervallen) die Position abfragen

Magge2k
05.01.2005, 23:03
Hmm...nur das Problem das ich kein C++ von MS benutze sondern von Borland. Aber auch dazu müsste es ja dann nützliche ergebnisse geben!

NumberFive
06.01.2005, 11:26
aber warum sollten den bitte die header und die libs nicht auh bei borland passen ? c++ ist ++ egal von wem oder ?

08.02.2005, 22:28
Moin, moin,

Die Lib-Dateien passen leider nicht direkt mit Borland zusammen, aber da gibt es welche für Borland. Die DLLs + Header kannst du wieder von MS nehmen!
Die Libs gibt es bei Borland direkt auf der Seite. Oder du lädst sie von hier:
http://www.geocities.com/foetsch/borland_dx8_libs.zip
Das sind alle libs für DirectX 8 - jetzt brauchst du nur noch die Headerdateien aus dem SDK (kannst mir ne Mail schicken und dann helfe ich dir) jafu9876/a/ hotmail.com

Prinzipiell kann man auch die Funktion GetJoystickState nehmen - sie unterstützt kein Force-Feedback, aber ist gut geeignet um absolute Standardsachen auszulesen.

Gruß,
Jan

NumberFive
09.02.2005, 09:23
GetJoystickState

ist aber kein MS funktion sondern ein funktion aus der Kapsel klasse von Borland. so weit ich das sehe.

Gruß

09.02.2005, 12:16
das sehe ich auch so

16.02.2005, 16:17
Ich habe ein Beispiel mit DirectX und dem Borland CBuilder geschrieben.
Siehe http://www.fragthe.net/index.php?cat=15&topic=22857

bei Fragen zum Quelltext bitte an JogDiveZero wenden

Magge2k
17.04.2006, 18:00
Hiho Leute nach langer Zeit melde ich mich wieder mit einer Lösung!!! :-)
Eigentlich ist es ganz einfach. Man muss nur wie immer drauf kommen.





#include <mmSystem.h>

//Definitionen
UINT JOYSTICKID;
JOYINFO joyinfo;
JOYCAPS joycaps;
unsigned int Xwert, Ywert, Zwert;

//Auswahl des Joysticks
JOYSTICKID = 0;

//Abfrage (in Programm einbinden)
joyGetPos(JOYSTICKID, &joyinfo); //Hole X,Y,Z und Buttonwerte
Xwert = joyinfo.wXpos;
Ywert = joyinfo.wYpos;
Zwert = joyinfo.wZpos;



Gruß an alle!

PS: Ich hoffe der eine oder andere kann es gebrauchen. Ich habe als anlage noch ein Beispielprogramm drangehängt. OK es ist nicht ganz sauber Programmiert aber es soll ja nur als beispiel dienen.

ExtreamCoder
20.04.2006, 21:04
Ich würde mal sagen wenn du dich nicht intensiv mit directX einarbeiten willst und dass kann Wochen dauern, ich weiß von was ich spreche dann verwende Allegro.
Eine plattformunabhängige Library mit der geht das spielend und mit guter performance.
Probiers doch mal du wirst es sicher gleich verwenden wollen.
Allegro ist ins C geschrieben und funktioniert für ziemlich jeden C/C++ Compiler.