Erweiterte Joystickbefehle

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Joypads sind normallerweise Digital, aufgrund des kurzen Tastenweges ja auch
kaum anders möglich. Joystick (Freudenknüppel) ist für PCs normallerweise
Analog, für Flugsimulatoren usw.

Sicherlich wird das ganze heutzutage auch von einigen Herstellern gemixt,
um dem User einen Doppelnutzen vorzugaukeln, aber sie sind trotz allem
nur in einem gleich, sie sind unnütz :mrgreen: (jedenfalls für mich)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Was ist A6?

Beitrag von Xaby »

Gut dann anders:

- ich bin ein kleiner Fan von diversen Eingabegeräten.
Hab sogar noch ein eingeschweistes Buch

JoySticks
Eine illustrierte Geschichte der
Game-Controller 1972 - 2004

Ich wollte mir damals als ich für den MIDI-Port echte JoySticks hatte und ich wusste, dass BasicA 2 Achsen und 2 Tasten pro Stick und 2 Sticks unterstützt folgendes basteln:

Ich hab einen aufgemacht und einer ist mir runter gefallen :shock:
Der eine hatte zwei Drehwiderstände
Bild

Der andere zwei silberne Streifen auf denen man einen Kontakt bewegt hatte. Diese Variante ist wohl billiger, auch nicht so zuverlässig.

Aber beide hatten ihren Reiz. Ich wollte ein Mischpult bauen.
4 Tasten für Funktionen, zwei Quellen Input.
Die Schieber für das Volume-Fading und die Drehregler vielleicht für Balance. Natürlich in der Software dann noch einstellbar. Ist nur die Frage, wie es angeordnet wird.

Die visuelle Seite mit den Knöpfen und Reglern hatte ich schon programmiert als meine Sticks noch in Ordnung waren, brauchte sie ja noch zum Spielen. Aber dann kam der große Niederschlag. (es regnete nicht)
BasicA hat keinen direkten Zugriff auf meine Soundkarte. Und auch mit Pascal war mir die Sache zu umständlich. Und heute hab ich keine Midi-Geräte außer meinem KeyBoard mehr.

Damit ihr euch vorstellen könnt, wovon ich rede:
Bild

Nun zu den Mäusen:

Problem bei dem Maustreiber auch unter XP ist, dass ich zwar einen Haufen Mäuse anschließen kann, aber leider alle nur ein und den selben Zeiger bewegen. Dadurch wird mixen mit Mäusen schwierig.

Nun zur Nullstellung von JoySticks:

- ich behaupte, dass es auch mit einem RAD funktioniert, was ebenfalls nur weiß, in welche Richtung es gedreht wird.
Ich behaupte, es gibt JoySticks, die sehen aus wie Kugelmäuse nur andersrum. Wenn man die Maus dreht und in die Kugel einen Stift sticht, kann man die Kugel auch nur noch bedingt drehen.
Damit man eine Nullstellung erreicht, gibt es die Federn, die den Stifft wieder in die Mitte bringen.

Ein Chip sendet nun den Wert der intern gezählten Schritte in eine Richtung.

Die Hardwareseite ist also egal. Und den Rest regelt der Treiber.

Achso nun noch zu PAD und Stick.
Für BasicA hat es damal keine Rolle gespielt.
Das D-PAD hat wie schon beschrieben ähnliche Werte ausgegeben wie meine Sticks. Ich bin mir nicht sicher, aber vielleicht gab es sogar einen Schalter an dem man es zwischen digital und analog umstellen konnte.
So dass es entweder nur 0|1 oder -255 0 +255 lieferte.

Ansonsten schaut euch doch mal die JoySticks und Pads an:

http://de.wikipedia.org/wiki/Gamepad
Bild - Joystick : http://upload.wikimedia.org/wikipedia/c ... is.svg.png
Bild - Gamepad : http://upload.wikimedia.org/wikipedia/c ... Shock2.jpg

Der Laie mag es anders denken, aber die beiden Geräte sind exakt gleich:

JoyStick: (7) Cooliehead (entspricht D-PAD auf Playstation-Controller)
http://de.wikipedia.org/wiki/Cooliehat
(3) und (6) schubkontrolle und Analoger Knopf (wie bei XBOX-Controllern)
Die beiden zusammen bilden jeweils eine Achse, also auch zwei Achsen

Nun zum Playstation PAD.
Die beiden AnalogSTICKs bestehen jeweils aus zwei Achsen.
Gesamt also vier Achsen.

Der JoyStick hat zwei Achsen im Griff und noch zwei wie oben beschrieben, also auch vier.

Und beide haben ein D-PAD.

Über die Anzahl der zusätzlichen Knöpfe brauchen wir nicht streiten, das ist bei jedem PAD und jedem STICK anders.
Beim Stick sind sie mit (4) gekenntszeichnet.

...

Es ist also das gleiche, es sieht nur anders aus

>>zu TS-Soft: Dafür find ich die Spiele, zu denen du Links auf deiner Seite hast, aber richtig cool :D


http://de.wikipedia.org/wiki/Force_Feedback
Bild - Innenleben: http://upload.wikimedia.org/wikipedia/c ... amepad.jpg

Oder wadd? :allright:

Bilder in Links geändert - bitte in zukunft selber anders machen
Kaeru fecit
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Xaby

bitte nimm die riesen-bilder raus und verlinke sie.
...hab ich jetzt grad mal gemacht...
gerne mit thumbnails, aber nicht so.

Hab sogar noch ein eingeschweistes Buch
der wahre Nutzen eines Buches entfaltet sich beim öffnen und lesen, probiers mal.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Hey kann mir mal einer erklären wie das, was Stefan geposted hat funktioniert? Ich meine es funtkioniert halt, aber wie??

wo kommt "GetDeviceState" her?

und was macht "*Joystick"?

Schon wieder so´ne alte Foren-Leiche die ich ausgrabe, hoffe ich komme nicht wegen Leichenfledderei dran...

//edit:
Also gut: GetDeviceState scheint eine Api zu sein, die ich allerdings in der API-Beschreibung in MSDN nicht finde. (Nur GetDevicePowerState, hier nutzlos)

und *Joystick hat was mit Pointern zu tun.Rückgabewert ist dann *Joystick mit der Struktur: "IDirectInputDevice7A" wo auch immer die herkommt (wo findet man sowas?)
Das ganze wird dann mittels:*Joystick\GetDeviceState(SizeOf(DIJOYSTATE),State.DIJOYSTATE) auf die Struktur von "State" übertragen.(Wenn man jetzt wüßte wie GetDeviceState abläuft...)
Und via ProcedureReturn dann zum Aufrufpunkt zurückgegeben (z.B.: "JoystickX()" ). In diesem Fall genauer gesagt: State.lX

Irgendwas falsch? Wäre echt nett wenn sich mal einer erbarmt.
Vielleicht muß ich mir ja bloß die passende Lektüre besorgen?
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Stefan´s Code etwas gekürzt:

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 

Enumeration 
#x  = 1   ; Steuerknüppel links/rechts
#y        ; Steuerknüppel hoch/runter
#z        ; Schubregler vor/zurück
#u        ; Slider?
#v        ; Slider?
#Axes     ; Anzahl der Axen
#Buttons  ; Anzahl der Taster
#Name
EndEnumeration

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

; Prozedur für Numerische Werte
Procedure Joystick(switch.w) 
  *Joystick.IDirectInputDevice7A=GetJoystickDevice()
  *Joystick\GetDeviceState(SizeOf(DIJOYSTATE),State.DIJOYSTATE) ; Struktur von "State" freihalten,definiere und füllen
  
   Caps.DIDEVCAPS\dwSize=SizeOf(DIDEVCAPS)                      ; Struktur von "Caps" definieren und freihalten
  *Joystick\GetCapabilities(Caps)                               ; Struktur von "Caps" füllen
  
  Select switch
   Case #x
    ProcedureReturn State\lX  ;returns a number from -1000 to 1000 
   Case #y
    ProcedureReturn State\lY ;returns a number from -1000 to 1000
   Case #z
    ProcedureReturn State\lZ  ; returns a number from 0 to 65535
   Case #u
    ProcedureReturn State\rglSlider[0] ;  hab´ ich nich´
   Case #v
    ProcedureReturn State\rglSlider[1] ;  hab´ ich nich´
   Case #Axes
    ProcedureReturn Caps\dwAxes
   Case #Buttons
    ProcedureReturn Caps\dwButtons
  EndSelect
  
EndProcedure 

; Prozedur für String Werte
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,"enhanced Joystick-commands",flags) 
OpenWindowedScreen(WindowID(1),0,0,250,250,0,0,0) 

Repeat 
  ExamineJoystick() 
  
  ClearScreen(RGB(0,0,0)) 
  
  StartDrawing(ScreenOutput()) 
  
  LineXY(0,125,250,125,#White) 
  LineXY(125,0,125,250,#White) 
  
  If JoystickButton(1)
  ;Debug 1
  EndIf
  
  ;Debug Joystick(#Buttons)
  ;Debug Joystick(#Axes)
  
  ;Locate(0,0) 
  FrontColor(RGB(255,255,0)) 
  BackColor(RGB(0,0,0)) 
  DrawingFont(GetStockObject_(#ANSI_VAR_FONT)) 
  DrawText(0,0,JoystickName()) 
  
  Circle(Joystick(#x)/8+125,Joystick(#y)/8+125,10,#Red) 
  
  StopDrawing() 
  
  FlipBuffers() 
Until WindowEvent()=#PB_Event_CloseWindow 
Macht mir persönlich die Handhabung einfacher. Weniger Prozedurennamen die man sich merken muß.

//edit:
Doppelposting, ich weiß. Hoffe das kann man mir verzeihen...
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Antworten