Problem mit Menüs am Mauszeiger

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Ana

Betreff: Problem mit Menüs am Mauszeiger

BeitragDi, Mai 12, 2009 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Mai 12, 2009 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Mai 12, 2009 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Theoretisch ja, Umsetzung nein Laughing

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?

Xeres

Moderator

BeitragDi, Mai 12, 2009 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code sieht insgesamt wenig aufgeräumt aus Confused
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Badudel

BeitragDi, Mai 12, 2009 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group