eigene mousehit function return von variablen ?

Previous topic - Next topic

xverbatim

hallo,

ich habe eine frage, kann mir jemand sagen, warum ich die variable value nicht zurückbekomme ?
der code dient nur testzwecken, möchte eine einfach mousehit function schreiben.

gruß tom
p.s. danke im vorfeld


Code (glbasic) Select
// --------------------------------- //
// Project: mousehit
// Start: Friday, November 14, 2008
// IDE Version: 6.058

WHILE KEY(57)=FALSE

zustand=mousehit()

PRINT zustand,100,100
SHOWSCREEN
WEND



// ------------------------------------------------------------- //
// ---  MOUSEHIT  ---
// ------------------------------------------------------------- //
FUNCTION mousehit:
// Diese Variablen sind als LOCAL definiert:
// value
MOUSESTATE mx,my,b1,b2



IF b1=0 THEN value=0; GOTO jump
IF b1=1 THEN value=1; GOTO jump

jump:

RETURN value


ENDFUNCTION // MOUSEHIT



Kitty Hello

THEN führt _NUR_ den direkt danach folgenden Befehl aus.
Dein GOTO jump wird sofort ausgeführt

Schranz0r

Wär eh falsch ;)

kannste gleich einfach b1 abfragen :P
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

xverbatim

Quote from: Schranz0r on 2008-Nov-14
Wär eh falsch ;)

kannste gleich einfach b1 abfragen :P

@Schranz0r
ja, ist schon klar ...
mir gings jetzt nur um die übergabe

@Kitty Hello
???
irgendwie ist mir das noch schleierhaft; wieso wird nach "then" die variable nicht geändert und NUR der danach folgende Befehl ausgeführt ?

ich dachte, das semikolon steht dafür, das mehrere befehle in einer zeile sind ?
   
if x=1 then var=2789;var2=9;showscreen;goto irgendwas

wäre nett, wenn Du mich aufklärst ;-)


Gruß Tom


D2O

Hi, Gernot hat ja für uns schon mal eine KeyHit() function geschrieben.

Die kann man selber dann etwas umschreiben für ein MouseHit().

Hier mal die Functionen und ein beispiel dazu für die linke und rechte Mousetaste

Code (glbasic) Select
// --------------------------------- //
// Project: Mousehit
// Start: Saturday, June 21, 2008
// IDE Version: 5.300



GLOBAL f1 = 200
GLOBAL f2 = 0
GLOBAL f3 = 50

GLOBAL f4 = 50
GLOBAL f5 = 50
GLOBAL f6 = 3

WHILE TRUE
MOUSESTATE mx,my,b1,b2  ///Mouse Initialisieren

MouseHitUpdate(b1,b2) // Abfrage welche Mousetasten überprüft werden sollen



// Mousbutton 1
IF MouseHit(1) = 1  // (1) = b1 | (2) = b2
// Returns >>  1 = MouseHit | 2 = MouseDown | -1 = release event | 0 = Nothing
f1 = RND(255)
f2 = RND(255)
f3 = RND(255)
ENDIF

// Mousbutton 2
IF MouseHit(2) = 1
f4 = RND(255)
f5 = RND(255)
f6 = RND(255)
ENDIF


DRAWRECT 10,10,100,100,RGB(f1,f2,f3)
DRAWRECT 115,10,100,100,RGB(f4,f5,f6)




SHOWSCREEN
WEND
END


//////////////////////////////////////////////////////////////////////////////////////////////////////

FUNCTION MouseHitUpdate : l_1 = 0, l_2 = 0

GLOBAL gMouseDown[], gMouseState[]
GLOBAL K[]
DIM K[3]

LOCAL i
    // First Time call/ zum ersten Mal hier
    IF BOUNDS(gMouseDown[],0)=0
        DIM gMouseDown[7]
        DIM gMouseState[7]
    ENDIF

    // For each key / für jede Taste
    FOR i=0 TO 2
       // k = KEY(i)  ////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       K[0] = 0  //Dummy, für das bessere verständnis ;)  Button 1 - 2

       K[1] = l_1
       K[2] = l_2


        // Key is pressed / Taste ist gedrückt
        IF K[i]
            IF gMouseDown[i]
                gMouseState[i]=2  // war 1
            ELSE
                gMouseDown[i]=2  // war 1
                gMouseState[i]=1 // war 2
            ENDIF
        ELSE
            // Key is not pressed / Taste nicht gedrückt

            // Has key been pressed before?
            // War die Taste gedrückt?
            IF gMouseDown[i]
                gMouseDown[i] = 0
                gMouseState[i] = -1
            ELSE
               gMouseState[i]=0
            ENDIF
        ENDIF
    NEXT
ENDFUNCTION





//  0 = not pressed / nicht gedrückt
//  1 = just pressed / gerade runtergedrückt
//  2 = pressed / gedrückt (gehalten)
// -1 = release event / wieder losgelassen

// Liefert den aktuellen zustand zurück, Max 6 Mousbuttons 1-6
FUNCTION MouseHit : mKEY
// SIcherheits abfrage
IF mKEY > 2 THEN mKEY = 0
IF mKEY < 0 THEN mKEY = 0

RETURN gMouseState[mKEY]
ENDFUNCTION




I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

xverbatim

@D²O

Danke für die Mühe, aber es geht mir jetzt um die Frage, warum die Variable nach "then" nicht gesetzt werden kann und "Goto" gleich ausgeführt wird...

ist mir ehrlich gesagt sehr schleierhaft, ich dachte "if x=1 then x1=2;y2=32; goto irgendwas" ist kein problem, irgendwie verstehe ich das momentan nicht wirklich !


gruß
tom

D2O

Ganz einfach, Du kommst nie zur möglichkeit das Value 1 ist auch wenn Du die Mouse drückst.
Warum? ;)

Das goto jump wird immer vor der If abfage ob die taste gedrückt ist aus geführt und Du Überspringst damit
die If abfrage.
Ist das so Verständlich??

Mach mal das hier:

Code (glbasic) Select
IF b1=1 THEN value=1; GOTO jump
IF b1=0 THEN value=0; GOTO jump


Ich persönlich meide GoTo wenns irgendwie geht.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

xverbatim

Quote from: D²O on 2008-Nov-14
Ganz einfach, Du kommst nie zur möglichkeit das Value 1 ist auch wenn Du die Mouse drückst.
Warum? ;)

Das goto jump wird immer vor der If abfage ob die taste gedrückt ist aus geführt und Du Überspringst damit
die If abfrage.
Ist das so Verständlich??

Mach mal das hier:

Code (glbasic) Select
IF b1=1 THEN value=1; GOTO jump
IF b1=0 THEN value=0; GOTO jump


Ich persönlich meide GoTo wenns irgendwie geht.

goto vor der if abfrage ?

ups, das ist aber gewöhnungsbedürftig...oder ?

nun gut, jedenfalls danke für den hinweis...

gruß tom


D2O

Ähmm nö,

so wie Du es geschrieben hast, wird das erste goto immer vor der zweiten If abfrage gestartet,
somit kann es nie zur der zweiten If abfrage kommen.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

S.O.P.M.

Und warum nicht lieber so?
Code (glbasic) Select
IF b1 = 1
   value = 1
ELSE
   value = 0
ENDIF

GOTO jump


Hierbei finden die nötigen Abfragen in jedem Fall immer vor dem GOTO statt.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

xverbatim

ich glaube, ich habe mein verständnisproblem erkannt ;-)

ich bin generell davon ausgegangen, das bei der if abfrage wenn die bedingung erfüllt ist oder nicht, der code weiter in der zeile bearbeitet/ausgeführt wird...

also diese zeile

IF  b1=1 THEN  PRINT "wieso ist value =-11 habe doch maustaste noch nicht gedrückt ? ",5,5;value=-11;GOTO jump


wird so nicht ausgeführt (also nicht wenn b1=1 gebe text aus und setze value=-1 und springe dann zu jump SO NICHT)

sondern obige zeile wird intern wohl so ausgeführt

if b1=1 then PRINT "wieso ist value =-11 habe doch maustaste noch nicht gedrückt ? ",5,5
value=-11
GOTO jump

DA KANN ICK JA HIER SCHREIBEN WAT ICK WILL -PASSIERT JA NISCHT ;-))))


jump:


Habe ich das JETZT richtig erkannt ?

@S.O.P.M.
ich wollte das nur wegen der übersichtlichkeit haben, ich habe sooooooooooooooo viele if abfragen, da geht mir ehrlich gesagt die übersicht verloren...



Gruß
Tom


BumbleBee

#11
Bei vielen Verzweigungen wäre SELECT CASE auch noch zu empfehlen. :) Und nimm nicht so viele GOTO's. Am Besten gar keine. :) Das ist BASIC-Steinzeit und schrecklicher Programmierstil. :P

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Schranz0r

Jo, ich z.B benutze nie GOTO ;)
Vorher würde ich mir nen Knoten in den Finger machen  :whistle:
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard