Tastatur Configuration und Mousebuttons "Binden"?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Haubitze

Betreff: Tastatur Configuration und Mousebuttons "Binden"?

BeitragMi, Aug 25, 2010 8:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute ich bins mal wieder,

ich habe zwar die einige freds gefunden die das schon behandeln nur nicht mit
den Mousebuttons und der weel, darum frage ich einfach nochmal nach.
falls es dazu schon eine loesung giebt so bitte ich darum das der fred geloescht wird
und mir bitte ein link per PM gesendet wird.

ich habe mir eine datei namens KeyDefs.bb gebastelt wo ich alle tasten scancodes
in constanten gespeichert habe. diese sieht wie folgt aus

Code: [AUSKLAPPEN]

...
Const VKEY_W          =17   
Const VKEY_X         =45   
Const VKEY_Y          =21   
Const VKEY_Z         =44   

Const VKEY_F1         =59   
Const VKEY_F2         =60   
Const VKEY_F3         =61   
Const VKEY_F4         =62   
...


nun habe ich mir eine datei gebastelt namens Keybinder.bb
wo ich tasten den einzelnen aktionen zuordnen kann, diese sieht wie folgt aus.

Code: [AUSKLAPPEN]

Const MKEY_Up      =0
Const MKEY_Down      =1
Const MKEY_Left      =2
Const MKEY_Right   =3

Const MKEY_Jump      =4
Const MKEY_MJump   =24

Const MKEY_Debug   =5


Dim MKeys(259)

Function BindKey(Mkey, ScanCode)
   MKeys(Mkey)=ScanCode
End Function

Function SetupKeys()
   BindKey(MKEY_Up,    VKEY_W)
   BindKey(MKEY_Down,    VKEY_S)
   BindKey(MKEY_Right, VKEY_D)
   BindKey(MKEY_Left,    VKEY_A)
   BindKey(MKEY_Jump,    VKEY_Up)
   BindKey(MKEY_MJump, VKEY_Down)
   
   BindKey(MKEY_Debug, VKEY_F1)
   
End Function


dabei sind die constanten die aktionen und die function BindKey weist nun jeder aktion die
dazugehoerige taste zu. nun moechte ich ueber diese funktion aber auch die maustasten und
das mausrad einbinden.

leider steh ich da grade aufn schlauch und habe keine richtige idee wie ich dies umsetzen soll.
darum bitte ich euch hiermit um eure hilfe.

danke im vorraus euer noob Haubitze

Edit: ich benutze BB3D

Silver_Knee

BeitragMi, Aug 25, 2010 10:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Dim MKeys(259)


dem entnehme ich mal dass du 259 Tasten benutzt
dann mach doch einfach

Code: [AUSKLAPPEN]
Dim MKeys(264)


wobei 260-264 die mausklicks(rechts,links,mitte,rseite,lseite) sind und bei der Tastenabfrage:

Code: [AUSKLAPPEN]
Function KeyMouseDown(keycode)
  if keycode<260
    Return KeyDown(keycode)
  else
    Return MouseDown(keycode-259)
  endif
end Function
 

Haubitze

BeitragMi, Aug 25, 2010 10:22
Antworten mit Zitat
Benutzer-Profile anzeigen
meine guete is das einfach....
naja is ja immer so das einfache is oft schwerer Very Happy

nur wie wuerdest du denn dann da noch das mausrad einbinden?
nochmal 3 "tasten" dazu die die zustaende des mausrades uebergeben?

ich hab da irgendwie keine idee wie ich das machen soll... im endeffekt moechte
ich ein menue haben wo ich die tasten neudefinieren kann und ich dann zB
bei NextWeapon einfach das mausrad nach oben drehe und dieses dann
als "aktionstaste" uebernommen wird. natuerlich muss die tastenabfrage
wie du sie gepostet hast dann noch ein wenig angepasst werden aber wie ist mir ein raetsel.


Edit:
Habe deinen code nun so gaendert und das funktioniert zumindest bei der steuerung dann
auch nun muss ich zumindest fuer die maustasten nurnoch eine eigene"bindroutine" basteln

Code: [AUSKLAPPEN]

Function KeyMouseDown(mkeycode)
   If mkeycode<255
      Return KeyDown(MKeys(mkeycode))
   Else If MKeys(mkeycode)>=1000 And MKeys(mkeycode)<=1002
      Return MouseZSpeed()
   Else
      Return MouseDown((MKeys(mkeycode)-1002))
   EndIf
End Function


eine frage noch kann man diese funktion hier noch effectiefer gestallten?
Code: [AUSKLAPPEN]

Function SetKeyMouse(mkeycode)
   Local tmp=False,scan=-1
   Repeat
      scan=scan+1
      If MouseZSpeed()=-1 Then MKeys(mkeycode)=1000:tmp=True
      If MouseZSpeed()=1 Then MKeys(mkeycode)=1002:tmp=True
      If MouseHit(1) Then MKeys(mkeycode)=1003:tmp=True
      If MouseHit(2) Then MKeys(mkeycode)=1004:tmp=True
      If MouseHit(3) Then MKeys(mkeycode)=1005:tmp=True
      If KeyHit(scan) Then MKeys(mkeycode)=scan:tmp=True
      If scan>255 Then scan=-1
   Until tmp=True
End Function


danke fuer die antwort und gruesse Haubitze
 

Haubitze

Betreff: Options Menue mit Draw3D2

BeitragDo, Aug 26, 2010 1:13
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo leute ich nochmal,

ich haette diesmal eine Draw3D2 frage. ich habe mir ein menue gebastelt und moechte nun
damit die tasten abfrage configurieren. dabei hab ich das problem das ich
1. nicht genau weis wie ich die felder in einem SGGROOSTER abfragen kann; und
2. ob ich bestimmte tasten sperren bzw fuer andere zwecke freigeben kann wenn ich
mit der maus ueber einem "MENUE" bin?
3. haette ich gern einen MenueEditor fuer die DrawSGG koennt ihr mir sagen ob es da schon was giebt oder muesst ich mir da auch etwas selbercoden?

ich benutz Draw3D2 da ich der meinung bin das dies ein echt gutes teil ist um menues zu basteln
und mein menue befindest sich in einer 3D umgebung so wie in dem demo nr 5 von DrawSGG.
nur das ich mich in diesem raum auch noch bewegen kann... im grunde ist es wie ein "holodeck"
wo ich mir profile erstellen und die optionen einstellen kann.

ich hoffe das ich mich nicht ganz undeutlich ausgedrueckt habe und das ihr mir weiterhelfen
koennt.

Gruesse Euer Noob Haubitze

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Aug 26, 2010 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu 1:

GetStringSGG( Handle ) liefert dir den Inhalt des aktuell ausgewählten SGGROSTER, SGGINTAKE oder SGGBUTTON

SetSelectSGG( Handle, 5, Wert ) setzt die aktuelle Auswahlposition (''Wert'' ab 0) eines SGGROSTER oder SGGBUTTON.

Statt der 5 kann man auch SGGSLCT eingeben.

Die Zahl (zweiter Parameter) bestimmt, was gemacht werden soll:

1 = SGGXPOS = Die X·Position des Nebenelementes
2 = SGGYPOS = Die Y·Position des Nebenelementes
3 = SGGALGN = Die Textausrichtung vom String (0=links, 1=mitte, 2=rechts)
4 = SGGXRAN = Die Breite des Nebenelementes bzw. Angle beim OUTLAY
5 = SGGSLCT = Die Auswahlposition vom BUTTON oder ROSTER bei mehreren Einträgen
6 = SGGVIEW = Die Sichtbarkeitsgröße (Anzahl Zeilen) beim ROSTER
7 = SGGLPOS = Die Listen-Scroll-Position beim ROSTER
8 = SGGSUMM = Anzahl Einträge vom BUTTON oder ROSTER (nur GetSelectSGG)

Wie man mit SetSelectSGG die Werte setzen kann, kann man mit GetSelectSGG die Werte auch wieder abfragen.

Hoffe das hilft erstmal weiter.

- - -

Zu 2:

Hab ich nicht eingebaut. Und ich hätte es auch schon gebrauchen können. Die SGG war ursprünglich wirklich nur als absolute MiniGUI gedacht. Man kann sich jedoch mehrere Hauptelemente erstellen und diese dann ein- bzw. ausblenden. Das erscheint dann wie eine Reitersteuerung. Aber dazu sei gesagt, wird es dann wirklich schnell zu einer Friemelarbeit. Mein Tipp dann: Wenn zu viele Kompromisse eingegangen werden müssen, dann lieber sich selbst eine GUI schreiben. Die SGG war auch nur ein Test von mir, ob man eine schnelle GUI schaffen kann, die direkt zeichnet und nicht erst auf Texturen rendern muss.

- - -

Zu 3:

Ich hatte mal einen Menueditor für die SGG schon begonnen gehabt. Wie auch andere Editoren die mit der Draw3D2 hätten raus gehen sollten. Aber dann passiert genau das, was man Leben nennt. Zwischenfälle Wink Ansonsten kannst du auch auf jeden Pivot als Bezugspunkt auch normale Bilder über DrawImage3D zeichnen und diese dann als Button abfragen. Egal wie sie im Raum positioniert sind. Siehe dazu das Schachbrettmuster unter _Draw3D2 / Draw3D2 Stuff, 3D Board Game.bb

Gruß.

Silver_Knee

BeitragDo, Aug 26, 2010 10:27
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Function SetKeyMouse(mkeycode)
Local scan
Repeat
If MouseZSpeed()<0 Then MKeys(mkeycode)=1000:Exit
If MouseZSpeed()>0 Then MKeys(mkeycode)=1002:Exit
If MouseHit(1) Then MKeys(mkeycode)=1003:Exit
If MouseHit(2) Then MKeys(mkeycode)=1004:Exit
If MouseHit(3) Then MKeys(mkeycode)=1005:Exit
If KeyHit(scan) Then MKeys(mkeycode)=scan:Exit
scan=(scan+1) Mod 265;Zählt bis 255. Mod=Rest
;(scan+1)/256 hat wenn scan<255 ist immer scan+1 Rest
Forever
End Function


Bei der hier ab ich selbst nen fehler eingebaut sry
BlitzBasic: [AUSKLAPPEN]
Global Wheel
Function KeyMouseDown(mkeycode)
If MKey(mkeycode)<255;wenn der vom user ausgewählte button<255
Return KeyDown(MKey(mkeycode))
ElseIf MKey(mkeycode)=1000
Return Wheel<0
ElseIf MKey(mkeycode)=1002
Return Wheel>0
ElseIf MKey(mkeycode)>1002 And MKey(mkeycode)>1008
Return MouseDown(MKey(mkeycode)-1002)
EndIf
End Function

;In die Main-Schleife
Wheel=MouseZSpeed()


Den Umweg mit der Globalen ist die Antwort auf Mausklicks richtig abfragen, denn den gleichen Effekt hast du wenn du MouseZSpeed() öfterin der Schleife abfragst.
 

Haubitze

BeitragFr, Aug 27, 2010 5:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Silver_Knee

ich verstehe gerade nicht warum dies

Code: [AUSKLAPPEN]

...
      scan=(scan+1) Mod 265;Zählt bis 255. Mod=Rest
                           ;(scan+1)/256 hat wenn scan<255 ist immer scan+1 Rest

effektiver sein soll bzw warum du so vorgehst, koenntest du mir das mal bitte erlaeutern?

bei letzterer function sehe ich auch nicht so recht warum du diese Globale Weel einfuehst,
ich benutze diese function so

Code: [AUSKLAPPEN]

if KeyMouseDown(MKEY_Jump) then....


ich uebergebe also nur die gewunschte aktion und fuehre diese dann aus
(dafuer baue ich mir gerade eine PerformAction funktion)
dabei sollte es doch ausreichen zu schaun ob der aktioncode 1000 oder groesser ist
und dann einfach den MouseZSpeed zurueckzugeben.
natuerlich kann dieser auch mal 0 sein aber das ist ja im grunde auch richtig so...

stell dir vor du hast eine Zoom funktion und eine zoomit variable, wuerdest du die ganze zeit ueber diese
globale variable diese veraendern, so wie ich mir das grade vorstelle passiert doch da eins,
ich drehe das mausrad um einen schrit nach hinten in Weel steht 1 und und zoomit wuerde staendig um 1 erhoet,der Zoom wuerde die ganze zeit zoomen obwohl ich doch nur um 1 zoomen moechte.

kann natuerlich auch sein das ich dich grade total falsch verstehe Smile

@hectic
ich habe nun versucht mit GetSelectSGG ein button anzusprechen. was mir leider nicht gelingt.
wenn ich innerhalb eines roosters bin kann ich damit wunderbar die einzelnen eintraege ansprechen
aber bei einem button will das nicht nicht.

hier mal die relevanten ausschnitte meines code evtl kannst du mir ja sagen was ich falsch mache.

Code: [AUSKLAPPEN]

...
Local Pivot=CreatePivot3D(Cube, 0,0,-1.01, 0,0,0, 0.008)
Local Menu1=CreateSGG(0,0,100,128,"SGG_FlatMalistic.sgg",Pivot,0)

Local M1Title     =AddingSGG(Menu1,SGGOUTLAY,0,+110,"<#ffff>Profilauswahl",1,0)
Local M1Profile   =AddingSGG(Menu1,SGGROSTER,0,0,ProfileString$,0,100)
Local M1NewProfile=AddingSGG(Menu1,SGGBUTTON,-50,-110,"<#4f4>Neues Profil",1,42)
Local M1Exit      =AddingSGG(Menu1,SGGBUTTON,50,-110,"<#4f4>Exit",1,42)

SetSelectSGG(M1Profile,6,12)
SetSelectSGG(M1Exit,5,0)
...
while not keyhit(1)
...
   SGGKey3D=GetKey()
   AddSelectSGG(M1Profile,7,-MZSpeed)
   DrawON=DrawSGG(Menu1,DrawXP,DrawYP)
   
   If DrawON>1 Then
      
      If SGGHit3D<>0 Then
         Value=GetStringSGG(SGGHit3D) ;SGGHit3D waere eine alternative um die einzelnen buttons auszulesen
         tmp=GetSelectSGG(M1Exit,5) ;tmp soll den button exit auswerten
         ;If tmp=1 Then tmp=0:Exit1=False Else Exit1=True
      EndIf
      
      ;Hier kommen sachen die die Nebenelemente bearbeiten
   End If
...
wend
...


mit SGGHit3D koennte ich zwar die buttons auslesen aber dann muesste ich fuer jedes menue die "rueckgabewerte" erstmal bestimmen... schoener waere es wenn mir ein Button einfach nur ein true
zurueckgiebt wenn es geklickt wurde. was aber wenn ich deine aussage richtig verstanden habe
nicht implementiert ist.


ich danke nochmals fuer eure aufmerksamkeit

salute Haubitze

Silver_Knee

BeitragFr, Aug 27, 2010 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit dem Mod ist soweit ich weiß n tick schneller weils intern weniger zu machen ist

Wenn du

Code: [AUSKLAPPEN]
KeyMouseDown(MKEY_Jump)
..
KeyMouseDown(MKEY_Up)
..
KeyMouseDown(MKEY_Down)
..


machst und mehreres ist an das Mausrad gebunden dann wird nur bei dem ersten die richtige MouseZSpeed raus kommen. Denn MouseZSpeed berechnet sich immer seit dem letzten Aufruf von MouseZSpeed.
Solltest du also einmal 1000 und einmal 1002 abfragen, hatte der Nutzer bei der ersten AbfrageZeit das mausrad zu drehen während flip, Renderworld, Cls und all die etwas länger dauernden sachen passieren. um bei der 2. Abfrage was zu machen muss er zwischen der ersten und der zweiten Abfrage das mausrad drehen. Deshalb speichere den wert einmal pro Schleifendurchlauf in eine Variable (Wheel) und lass die Funktion diese auswerten.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Aug 27, 2010 11:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@Haubitze,

dein Button M1Exit hat ja nur ein Eintrag drin ("<#4f4>Exit"). Da wird dir GetSelectSGG(M1Exit,5) immer nur eine 0 ausgeben. Erst wenn mehrere Einträge drin wären ("<#4f4>Exit|<#4f4>Zurück") würde sich der Button bei jedem Klick austauschen und GetSelectSGG(M1Exit,5) würde dir je nach Zustand eine 0 oder eine 1 zurück geben.

Was du brauchst sind die Rückgabewerte der globalen Variablen:

gibt das SGG-Nebenelement-Handle zurück,...

SGGHit3D ...das gerade geklickt wurde
SGGDown3D ...das gerade gedrückt wird
SGGSpz3D ...das mit der linken Maustaste geklickt wurde oder mit der rechten gedrückt wird

Für deine Zwecke in diesem Fall wäre wohl SGGHit3D das richtige und wird wie folgt angewendet:

Code: [AUSKLAPPEN]
...

Local Pivot=CreatePivot3D(Cube, 0,0,-1.01, 0,0,0, 0.008)
Local Menu1=CreateSGG(0,0,100,128,"SGG_FlatMalistic.sgg",Pivot,0)
Local M1Exit=AddingSGG(Menu1,SGGBUTTON,50,-110,"<#4f4>Exit",1,42)

; SetSelectSGG(M1Exit,5,0) ;KANNST DU NICHT NUTZEN, DA EH NUR EIN EINTRAG DRIN IST

...

While Not KeyHit(1)
   
   ...
   
   SGGKey3D=GetKey()
   DrawON=DrawSGG(Menu1,DrawXP,DrawYP)
   
   If DrawON>1 Then ;SUPER! NUR DANN SACHEN ABFRAGEN, WENN ES NÖTIG IST
      
      ; If SGGHit3D<>0 Then ;IST UNNÖTIG, DA BEREITS [DrawON AUS DER DrawSGG] ABGEFRAGT WIRD
      
      If SGGHit3D=M1Exit Then
         ;EXIT-BUTTON WURDE GEKLICKT
      End If
      
      ; End If
   End If
   
   ...
   
Wend

...
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Haubitze

BeitragFr, Aug 27, 2010 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
ah okay das klingt irgenwie einleuchtend Smile
ich danke dir fuer diese einsicht. hatte das problem sicher erst nach 1000 testlaeufen mitbekomm.

nun hoff ich nurnoch das mir hectic sagt wie ich das mit dem button loesen kann Smile

salute

Edit: oh tschuldige hectic da war ich wohl zu langsam Very Happy
nun klappt das auch so wie ich das will danke schoen.

PS:du solltest mal ein ausfuehrliches Tutorial fuer deine Draw3D2 machen falls noch nicht geschehen Wink
  • Zuletzt bearbeitet von Haubitze am Fr, Aug 27, 2010 12:48, insgesamt 2-mal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Aug 27, 2010 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich grad gesagt. Aber ich push das mal damit das nicht aus deinen Augen fällt (kann sich eh keiner gestört dran fühlen, außer die paar die sich innerhalb dieser 2 Minuten hier aufhalten).
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group