Tastatur im Vollbildspiel, Vista und anderes

Anfängerfragen zum Programmieren mit PureBasic.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Tastatur im Vollbildspiel, Vista und anderes

Beitrag von Syntacks_Error »

Guten Tag,

als Anfänger bitte ich um Beantwortung einiger Fragen:

1) Spiel läuft im Vollbildmodus. Ich moechte ein selbstgeschriebenes Programm im Hintergrund per Tastatur über nicht vom Spiel belegte Tasten steuern. Für so etwas wird im Forum die Funktion GetAsyncKeystate empfohlen.

a) Mein PB kennt diese Funktion nicht. Gibt es die nur in der Vollversion?

b) Bei MSDN heißt es zu dieser Funktion:
Windows NT/2000/XP: The return value is zero for the following cases:

* The current desktop is not the active desktop
* The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.

Das hoert sich nun so an, als würde die Tastaturabfrage dann doch nicht klappen. Oder soll man das so verstehen, daß mein Programm die Tastatureingabe zwar erreichen würde, ich aber keine Bestätigung oder so bekommen kann?

c) Oehm, Vista ist da gar nicht erwähnt, gibt/geht es auch unter Vista?

2) Die Joystickabfrage funktioniert bei mir unter XP, aber nicht bei einem Bekannten unter Vista (Auch nicht im Kompatibilitätsmodus; selbiges bei den weiteren folgenden Fragen). Ist das Problem bekannt, ist es keines oder muß man etwas besonderes beachten?

3) Ebenfalls nicht unter Vista läuft eine Prozedur, mit der man in das Vordergrundvollbildspiel etwas einblenden kann:

Code: Alles auswählen

farbe = RGB(255,255,255)
FontNr = LoadFont(#PB_Any, "Verdana",17)
FontID = FontID(FontNr)

Global Mem.l
Mem = AllocateMemory(1024)
Procedure.l DesktopOutput()
  PokeL(Mem, 1)
  ProcedureReturn Mem
EndProcedure


while (Joystickknopf drücken oder so)
 StartDrawing(DesktopOutput())
 DrawingFont(FontID) 
 DrawingMode( #PB_2DDrawing_Transparent)
 DrawText(tx,ty,"(Ausgabemeldung)", farbe)
 StopDrawing() 
wend
Gibt es hierfür unter Vista eine Loesung?

Egal ob ja oder nein:
Ohne das while ..wend wird die Enblendung vom Vordergrundspiel sofort überschrieben. Daher verbraucht der Spaß ordentlich CPU und die Einblendung flackert gleichwohl. Gibt es eine Moeglichkeit (Delay(irgendwas) in der Schlefe geht nicht, da dann wieder überschrieben wird), die Schleife mit der Bildschirmwiederholungsrate zu synchronisieren oder auch eine andere Loesung?

Vielen Dank im voraus.

Code-Tags ergänzt - Kaeru fecit
nächstmal bitte selber dran denken.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

zu 1.: API Funktionen sind nicht in der Demo verfügbar.

zu 3.: Du benutzt long als Variablendeklaration. Benutze Integer (.i) oder lasse den Buchstaben weg.(Dann ist es automatisch Integer)

Also

Code: Alles auswählen

Global Mem.i
Procedure.i DesktopOutput()
PokeL(Mem, 1)
ProcedureReturn Mem
EndProcedure
 
dann sollte es klappen.

Und ein Delay(1) sollte nicht wirklich wehtun um die CPU nicht zu braten...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

interessanter Name... "syntacks error", muss man erst mal drauf kommen.

Zu 2) wäre vllt. ein Code hilfreich.

Allgemein: Bitte packe deinen PureBasic-Code in Code-Tags.
Win11 x64 | PB 6.20
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Beitrag von Syntacks_Error »

Joystick: Schon das funktioniert bei meinem Bekannten unter Vista nicht, wobei ich eine Fehlbedienung ausschließen kann und unter XP auch bei ihm alles lief:

Code: Alles auswählen

InitJoystick()
OpenConsole()
Repeat
 For x = 1 To 32 
  ExamineJoystick()
  ergebnis = JoystickButton(x)
  If ergebnis > 0
   PrintN(Str(x))
  EndIf
 Next
Until unendlich = 1
Im eigentlichen Programm sieht es auch nicht viel anders aus:

Code: Alles auswählen

j = 1; Tatsächliche Knopfnr. aus ini-Datei gelesen
InitJoystick()
;................
repeat
 ;................
 ExamineJoystick()
 button = JoystickButton(j)
 While button > 0 
  ExamineJoystick() 
  button = JoystickButton(j)
   ; u.a. diese Einblendgeschichte
  wend
 ;...................
until ende
Da schon die Knopfabfrage nicht funktioniert, nehme ich an, daß es nichts mit dem Longwert in der Einblendprozedur zu tun hat. Ändere ich aber natürlich trotzdem!
Antworten