Seite 1 von 3

Erweiterte Joystickbefehle

Verfasst: 08.02.2005 18:31
von Stefan
Hallo

Hab gerade ein paar Joystickfunktionen programmiert, mit denen man
den Status des Joystick genauer abfragen kann als mit JoystickAxisX() bzw. JoystickAxisY(). :wink:

Code: Alles auswählen

Structure DIJOYSTATE 
  lX.l 
  lY.l 
  lZ.l 
  lRx.l 
  lRy.l 
  lRz.l 
  rglSlider.l[2] 
  rgdwPOV.l[4] 
  rgbButtons.b[32] 
EndStructure 

Structure DIDEVICEINSTANCE 
  dwSize.l 
  guidInstance.guid 
  guidProduct.guid 
  dwDevType.l 
  tszInstanceName.b[#MAX_PATH] 
  tszProductName.b[#MAX_PATH] 
  guidFFDriver.guid 
  wUsagePage.w 
  wUsage.w 
EndStructure 

Structure DIDEVCAPS 
  dwSize.l
  dwFlags.l
  dwDevType.l 
  dwAxes.l
  dwButtons.l 
  dwPOVs.l
  dwFFSamplePeriod.l
  dwFFMinTimeResolution.l 
  dwFirmwareRevision.l
  dwHardwareRevision.l 
  dwFFDriverVersion.l
EndStructure

Procedure GetJoystickDevice() 
  !extrn _PB_Joystick_Current 
  !MOV Eax,[_PB_Joystick_Current] 
  ProcedureReturn 
EndProcedure 


Procedure JoystickX();returns a number from -1000 to 1000 
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  *Joystick\GetDeviceState(SizeOf(DIJOYSTATE),State.DIJOYSTATE) 
  ProcedureReturn State\lX 
EndProcedure 

Procedure JoystickY();returns a number from -1000 to 1000 
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  *Joystick\GetDeviceState(SizeOf(DIJOYSTATE),State.DIJOYSTATE) 
  ProcedureReturn State\lY 
EndProcedure 

Procedure JoystickZ();returns a number from -1000 to 1000 
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  *Joystick\GetDeviceState(SizeOf(DIJOYSTATE),State.DIJOYSTATE) 
  ProcedureReturn State\lZ
EndProcedure 

Procedure JoystickU();returns a number from -1000 to 1000 
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  *Joystick\GetDeviceState(SizeOf(DIJOYSTATE),State.DIJOYSTATE) 
  ProcedureReturn State\rglSlider[0]
EndProcedure

Procedure JoystickV();returns a number from -1000 to 1000 
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  *Joystick\GetDeviceState(SizeOf(DIJOYSTATE),State.DIJOYSTATE) 
  ProcedureReturn State\rglSlider[1]
EndProcedure

Procedure GetNumberOfButtons()
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  Caps.DIDEVCAPS\dwSize=SizeOf(DIDEVCAPS)
  *Joystick\GetCapabilities(Caps)
  ProcedureReturn Caps\dwButtons
EndProcedure

Procedure GetNumberOfAxes()
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  Caps.DIDEVCAPS\dwSize=SizeOf(DIDEVCAPS)
  *Joystick\GetCapabilities(Caps)
  ProcedureReturn Caps\dwAxes
EndProcedure

Procedure.s JoystickName() 
  *Joystick.IDirectInputDevice7A=GetJoystickDevice() 
  Info.DIDEVICEINSTANCE\dwSize=SizeOf(DIDEVICEINSTANCE) 
  *Joystick\GetDeviceInfo(Info) 
  ProcedureReturn PeekS(@Info\tszProductName[0]) 
EndProcedure 






;Example: 
If InitJoystick()=0 Or InitSprite()=0 
  MessageRequester("Error","Can't initialize DirectX 7.") 
  End 
EndIf 


flags=#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered 
OpenWindow(1,0,0,250,250,flags,"enhanced Joystick-commands") 
OpenWindowedScreen(WindowID(),0,0,250,250,0,0,0) 

Repeat 
  ExamineJoystick() 
  
  ClearScreen(0,0,0) 
  
  StartDrawing(ScreenOutput()) 
  
  LineXY(0,125,250,125,#white) 
  LineXY(125,0,125,250,#white) 
  
  Locate(0,0) 
  FrontColor(255,255,0) 
  BackColor(0,0,0) 
  DrawingFont(GetStockObject_(#ANSI_VAR_FONT)) 
  DrawText(JoystickName()) 
  
  Circle(JoystickX()/8+125,JoystickY()/8+125,10,#red) 
  
  StopDrawing() 
  
  FlipBuffers() 
Until WindowEvent()=#PB_Event_CloseWindow 
Gruß
Stefan

Verfasst: 08.02.2005 18:42
von Hroudtwolf
Net schlecht Herr Specht.
Darf ich das für ein Spiel verwenden ? Natürlich mit deinen Credits.

Verfasst: 08.02.2005 19:07
von Stefan
@Hroudtwolf

Klar, ich würde mich freuen. :D
Gruß
Stefan

Verfasst: 08.02.2005 19:18
von Hroudtwolf
OK.Danke
:allright:

Verfasst: 08.02.2005 19:31
von mipooh
Fragt das nur x y ab oder hab ich nicht genau genug geguckt?
Gruss
Mipooh

Verfasst: 08.02.2005 19:37
von Hroudtwolf
Wenn du da jetzt noch ForceFeedback und Z-Achse (Pod) rein machen würdest. Dann würden dir einige die Füße küssen (Inklusive ich(War nur symbolisch gemeint))

Verfasst: 08.02.2005 19:50
von orange-blue
am besten sollten alle achsen abfragbar sein.

Verfasst: 08.02.2005 20:32
von remi_meier
Kleiner Tipp:
Include Pack von GPI unter Joystick (ohne FF aber sonst viel)
http://gpihome.de/purebasic/jaPBe/IncludePack.exe

Verfasst: 08.02.2005 21:06
von hardfalcon
Jepp, da hat remi_meier wieder mal recht. Ihr solltet sowieso mal jaPBe ausprobieren, ihr werdet das Programm nicht mehr missen wollen. Der Unterschied zwischen dem Standard-PB-Editor und jaPBe istungefähr vergleichbar mit dem Unterschied zwischen Paint und Photoshop 7.
Oder wie zwischen Notepad und UltraEdit 10. Oder wie zwischen Word und OpenOffice (von der Stabilität her gesehen!).

cya
Pascal

Verfasst: 08.02.2005 21:21
von Stefan
Hallo

Hab noch folgende Funktionen hinzugefügt:
JoystickZ(),JoystickU(),JoystickV(),GetNumberOfButtons(),GetNumberOfAxes()

Beim Thema Force-Feedback kann ich euch leider nicht helfen.
Mein Joystick unterstützt leider kein Force-Feedback. :(
Hier ein Code mit dem ihr testen könnt ob euer Joystick Force-Feedback unterstützt:

Code: Alles auswählen

#DIDC_FORCEFEEDBACK=256 

Structure DIDEVCAPS 
  dwSize.l 
  dwFlags.l 
  dwDevType.l 
  dwAxes.l 
  dwButtons.l 
  dwPOVs.l 
  dwFFSamplePeriod.l 
  dwFFMinTimeResolution.l 
  dwFirmwareRevision.l 
  dwHardwareRevision.l 
  dwFFDriverVersion.l 
EndStructure 

Procedure GetJoystickDevice() 
  !extrn _PB_Joystick_Current 
  !MOV Eax,[_PB_Joystick_Current] 
  ProcedureReturn 
EndProcedure 

InitJoystick() 

*Joystick.IDirectInputDevice7A=GetJoystickDevice() 
Caps.DIDEVCAPS\dwSize=SizeOf(DIDEVCAPS) 
*Joystick\GetCapabilities(Caps) 


If Caps\dwFlags & #DIDC_FORCEFEEDBACK 
Debug "Force-Feedback is supported !" 
Else 
Debug "Force-Feedback is NOT supported !" 
EndIf 
Gibt es hier Jemanden bei dem es unterstützt wird ?

Gruß
Stefan