Problem mit Menüs am Mauszeiger
Übersicht

![]() |
AnaBetreff: Problem mit Menüs am Mauszeiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo zusammen,
ich ärger mich nun schon einige Tage mit einem Problem herum auf dessen Lösung ich nicht komme und eigentlich auch gar nicht so genau weiß wo ich da noch suchen soll (deshalb verzeiht das ich (fast) den Gesamtencode der function reinstelle, weil ich nicht weiß welche Teile nicht wichtig dafür sind. Die Function wird angewendet wenn erfolgreich festgestellt wurde das Mauszeiger und Objekt übereinander liegen. (Also imagecollide, wobei ich gelesen hab, dass das verbuggt sein soll, da lieber was anderes verwenden?) Sinn und zweck des Ganzen soll es sein, dass ein kleines menü am Mauszeiger entsteht und erstmal nur untersuchen da steht, wenn das an geklickt wurde soll die figur zu dem objekt gehen und dann soll das Menü wieder aufgehen und die verschieden möglichen interaktionen damit anzeigen und sie ausführen wenn auf die entsprechede geklickt wurde. Nun ging das zwischenzeitlich ganz gut aber mittlerweile hab ich das ganze doch ziemlich zerfusselt auf der fehler suche und bekomm es auch nicht mehr so recht in gang ... Probleme dabei sind allerdings immer: 1. Nach dem die Figur am Ziel ist kommt immer erstmal nochmal Untersuchen (nicht soo schlimm deshalb hab ich mich noch nicht wirklich damit beschäftigt, aber wenn jemanden gleich was auffällt wäre ich sehr dankbar) 2. Das Menü mit den Interaktionen ist nur immer eine Bildwiederholung da, außer man hält die Maus gedrückt 3. Wenn nun das menü über einem objekt liegt wird gleich nach dem es sich schließt wieder ein neues aufgemacht, da ja alle mit der linken maustaste aufgerufen werden. und nun der Code Code: [AUSKLAPPEN] Function untersuchen(art) men = 4 SetFont font20 mauskoorx = MouseX() mauskoory = MouseY() timer = MilliSecs ; Noch keine Funktion soll aber in den Schleifen die fps im Zaum halten Repeat Cls map(level) ;Funktion für die Karte leiste() ; funktion für die Leiste DrawImage pfeile, xf,yf, 0 ; Figur zeichnen wobei xf und yf die x und y Koordinaten der Figur sind Color 127,127,127 Rect mauskoorx,mauskoory,200,30 Color 255,255,255 Text mauskoorx + 20,mauskoory + 5, "Untersuchen" Mauszeiger() If MouseDown(1) And MouseX() > mauskoorx And MouseX() < mauskoorx + 200 And MouseY() > mauskoory And MouseY() < mauskoory + 50 And (xf <> xziel Or yf <> yziel) Then walkfigur (xp + 75,yp + 130) ; Xp und Yp sind die Koordinaten des Objekts Mauszeiger() mauskoorx2 = MouseX() mauskoory2 = MouseY() Else Return men = 0 EndIf Flip Until xf <= xp + 80 And xf >= xp + 70 And yf <= yp + 140 And yf >= 120 Repeat Select art Case 1 Cls ;Objekt ist ein Baum map(level) leiste() DrawImage pfeile, xf,yf, 0 fenstery= 2 ; Anzahl der Verfügbaren Interaktionen zeilex = 20 + mauskoorx zeiley = 5 + mauskoory Color 127,127,127 Rect mauskoorx,mauskoory,200,44 Color 255,255,255 Text zeilex,zeiley,"Sammeln" zeiley = zeiley + 22 Text zeilex,zeiley,"Beobachten" zeiley = zeiley + 22 If Faehig.faehigkeiten\holzfaellen <> 0 Then ;Charakter Eigenschaften überprüfen Color 127,127,127 Rect mauskoorx,mauskoory + fenstery * 22,200,22 Color 255,255,255 Text zeilex,zeiley,"Holzfällen" hx = mauskoorx hy = mauskoory + fenstery * 22 zeiley = zeiley + 22 fenstery = fenstery + 1 Holz = 1 EndIf If Faehig.faehigkeiten\insekten <> 0 Then Color 127,127,127 Rect mauskoorx,mauskoory + fenstery * 22,200,22 Color 255,255,255 Text zeilex,zeiley,"Insekten suchen" ix = mauskoorx iy = mauskoory + fenstery * 22 zeiley = zeiley + 22 fenstery = fenstery + 1 Insekt = 1 EndIf If Faehig.faehigkeiten\wurzeln <> 0 Then Color 127,127,127 Rect mauskoorx,mauskoory + fenstery * 22,200,22 Color 255,255,255 Text zeilex,zeiley,"Wurzeln ziehen" wx = mauskoorx wy = mauskoory + fenstery * 22 zeiley = zeiley + 22 fenstery = fenstery + 1 wurzel = 1 EndIf Mauszeiger() Flip ;Überprüfung was angeklickt wurde While (MouseDown(1) And MouseX() <> mauskoorx2) Or (MouseDown(1) And MouseX() <> mauskoorx2) If MouseX() > mauskoorx And MouseX() < mauskoorx + 200 And MouseY() > mauskoory And MouseY() < mauskoory + 22 Then sammeln(1,gewaehlterbaum) men = 0 ; Zustand der Menüs 0 = geschlossen, 1- 3 Taskleisten Menüs und 4 aktionen m = 1 ElseIf MouseDown(1) And MouseX() > mauskoorx And MouseX() < mauskoorx + 200 And MouseY() > mauskoory + 22 And MouseY() < mauskoory + 44 Then beobachten(1) men = 0 ElseIf MouseDown(1) And MouseX() > hx And MouseX() < hx + 200 And MouseY() > hy And MouseY() < hy + 22 And hy <> 0 Then holzfaellen() men = 0 ElseIf MouseDown(1) And MouseX() > ix And MouseX() < ix + 200 And MouseY() > iy And MouseY() < iy + 22 And iy <> 0 Then ;insekten(1) men = 0 ElseIf MouseDown(1) And MouseX() > wx And MouseX() < wx + 200 And MouseY() > wy And MouseY() < wy + 22 And wy <> 0 Then ;wurzeln(1) ;Funktion noch nicht vorhanden deshalb die ; davor men = 0 Else men = 0 EndIf Flip Wend men = 0 [...] End Select Until men = 0 End Function Ich hoffe das ist einigermaßen verständlich und jemand nimmt sich die Zeit sich das Ganze mal anzuschauen. Vielen Dank schon mal im Vorraus |
||
![]() |
Badudel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
Habe das Problem gefunden. Schau mal in den Debugger, nachdem du geklickt hast. Er behandelt nur noch If mousehit(1) then untersuchen, aber das wilst du ja gar nicht, weil die Anzeige ja schon gemacht ist. Das heißt, du musst in der Funktion noch einen Zustand zB txt_angezeigt=1 oder so schreiben, und dann in der Hauptschleife machen: if txt_angezeigt=1 and mousehit(1) and (koordinaten prüfen, ob man nicht außerhalb des Untersuchenfelds geklickt hat). Verstanden? Gruß, Badudel |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Theoretisch ja, Umsetzung nein ![]() Also vor die erste Schleife auch eine if bedinung setzen damit sie nur ausgeführt wird wenn die erfüllt ist? Ich dachte das wäre schon erledigt, in dem die Repeat schleifen ja nach einander ablaufen sobald die eine erfüllt ist, geht das programm doch von oben nach unten weiter zur nächsten Repeat Scheilfe und bleibt da bis die erfüllt ist oder nicht? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Code sieht insgesamt wenig aufgeräumt aus ![]() Für mich sieht das nicht nach einer Hauptschleife aus, sondern wie mehrere ineinander verschachtelte... Mehrfach Flip, cls und Zeichenbefehle, das muss auf die Dauer Verwirrung stiften. 1. Mauskoordinaten und Tastendrücke zu Anfang der Hauptschleife in globalen variablen speichern. 2. Aktionen verarbeiten. 3. Zeichnen & 1x Flippen Verwende Funktionen um wiederkehrende Probleme zu lösen, z.B. ob die Maus in einem Rechteck ist. Sobald das Programm in erkennbaren Einzelteilen funktioniert, kann man sich um jeden Teilschritt kümmern, ohne den gesamten Code berücksichtigen zu müssen. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Badudel |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK.
Pass auf (habe nur die Funktionen, die ich nicht habe, als Kommentar gemacht) Code: [AUSKLAPPEN] Color 127,127,127
Rect mauskoorx,mauskoory,200,30 Color 255,255,255 Text mauskoorx + 20,mauskoory + 5, "Untersuchen" ;Mauszeiger() If MouseDown(1) And MouseX() > mauskoorx And MouseX() < mauskoorx + 200 And MouseY() > mauskoory And MouseY() < mauskoory + 50 And (xf <> xziel Or yf <> yziel) Then ;walkfigur (xp + 75,yp + 130) ; Xp und Yp sind die Koordinaten des Objekts ;Mauszeiger() Das Problem hier ist, dass du unmittelbar, nachdem du das Menü geöffnet hast, auf Untersuchen klicken möchtest. Das geht aber nicht. Also stellst du stattdessen eine Variable auf 1 Code: [AUSKLAPPEN] Color 127,127,127
Rect mauskoorx,mauskoory,200,30 Color 255,255,255 Text mauskoorx + 20,mauskoory + 5, "Untersuchen" ;Mauszeiger() ;anstatt gleich hier die Maus abzufragen, stellst du eine Variable auf 1 txt_ang=1 So, und in der Hauptschleife (das, das du in deine Code ganz zu Anfang geschriben hast, schreibst du: Code: [AUSKLAPPEN] While Not KeyHit(1)
mouse=mousehit(1);Mousehit resettet sich nach jedem Abruf, wir brauchen den Wert aber öfter, also definieren wir eine Variable mit dem Wert, die wir stattdessen benutzen if mouse and txt_ang=1 and (koordinaten überprüfen);Wenn man die Maus drückt und das Menü eingeblendet ist. In diese Anweisung musst du noch die Überprüfung von Mousex und Mousey vornehmen, da sich das Menü ja wahrscheinlich schließt, wenn du woanders hinklickst endif If mouse Then untersuchen(1) Wend Vergiss nicht, dass wenn das Menü wieder geschlossen wird, auch der txt_ang auf 0 gesetzt werden muss! Gruß, Badudel |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group