Problem mit If Abfrage(n) in einer Schleife

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Gray Fox

Betreff: Problem mit If Abfrage(n) in einer Schleife

BeitragMi, Nov 22, 2006 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe folgendes Problem: Ich bastel grad an einer kleinen WiSim. Ich habe mich "beim Handeln" von Fugger 2 inspirieren lassen d.h. fahre ich mit der Maus im Handelsmenü über "die Mengenanzahl" soll sich der Mauszeiger verändern, Entweder soll ein + am oberen Ende der Zahl oder ein Minus am unteren Ende der Zahl erscheinen.

Ich habe 4 Zahlen, die Funktion "Wert hoch/runter" funktioniert, aber nur bei der der letzten Zahl verändert sich der Mauszeiger.

Code: [AUSKLAPPEN]
For i = 4 To 7
   If ImageRectCollide(maus_zeiger,mx,my,0,x_temp(i),y_temp(0),10,10) Then
   maus_status = 2
      If mouse = 1 Then
         If warenlager_handel(i) < 9 Then
         warenlager_handel(i) = warenlager_handel(i) + 1
         End If
              Select i
                     Case 4
              warenlager_handel(3) = warenlager_handel(3) + 1000
                     Case 5
              warenlager_handel(3) = warenlager_handel(3) + 100
                    Case 6
              warenlager_handel(3) = warenlager_handel(3) + 10
                    Case 7
                   warenlager_handel(3) = warenlager_handel(3) + 1
                  End Select
      End If
   Else
      If ImageRectCollide(maus_zeiger,mx,my,0,x_temp(i),y_temp(0)+10,10,10) Then
      maus_status = 1
         If mouse = 1 Then
            If warenlager_handel(i) > 0 Then
               warenlager_handel(i) = warenlager_handel(i) - 1
            End If
         End If
      Else
   maus_status = 0
   End If
   End If
   Next


Code in der Hauptschleife:

Code: [AUSKLAPPEN]
DrawImage maus_zeiger,mx,my,0
DrawImage mauszeiger,mx,my,maus_status


Vielleicht sieht einer was ich falsch mache?

Zur Info: Ich zeichne den Mauszeiger und einen 4 Pixel großen Maus_Zeiger mit dem ich die "Kollisonsabfragen mache.

TheMatrix

BeitragMi, Nov 22, 2006 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Gib mal den ganzen Code, vielleicht ist es dann ersichtlicher?
°_° °.° °~° °v° .. -.-
 

Gray Fox

BeitragMi, Nov 22, 2006 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
TheMatrix hat Folgendes geschrieben:
Gib mal den ganzen Code, vielleicht ist es dann ersichtlicher?


Vielleicht hilft auch der Hinweis, sobald ich " maus_status = 0 " ausklammere, funktioniert es wie es soll. Nur das Problem ist dann, dass sich der Mauszeiger zwar verändert, aber er kehrt nach Verlassen der Schaltfläche nicht mehr in den "Urzustand" zurück. Versteht ihr was ich meine?

Falls das nicht hilft, werde ich den Code posten.
 

Ava

Gast

Betreff: Re: Problem mit If Abfrage(n) in einer Schleife

BeitragDo, Nov 23, 2006 1:54
Antworten mit Zitat
Gray Fox hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
DrawImage maus_zeiger,mx,my,0
DrawImage mauszeiger,mx,my,maus_status


Zur Info: Ich zeichne den Mauszeiger und einen 4 Pixel großen Maus_Zeiger mit dem ich die "Kollisonsabfragen mache.



Hallöchen,


also Du brauchst ein Image, das Du lediglich zur Kollisionsprüfung nimmst,
nicht zeichnen! - und solltest Du auch nicht tun, wenn es darüber hinaus
keinen grafischen Nutzen hat. *zwinker*

Im Übrigen ganz schlimmer Spaghetti-Code, wenn ich das mal so äussern
darf ... Dein Probem liegt aber eigentlich auf der Hand: Du durchläuftst
eine Schleife, überprüfst dort bestimmte Bedingungen und setzt dann den
Maus_Status entsprechend. Letztendlich wird der Maus_Status aber immer
wieder auf 0 zurückgesetzt, wenn die Bedingung eines nächsten Schleifen-
Loops nicht erfüllt ist! - von daher klappt Dein Funktionsblock (wie Du es
auch selbst schon erkannt hast) nur bei der letzten Abfrage ... da musst Du
grundsetzlich nochmal Deine Logik überdenken ... ^^

Die einfachste Möglichkeit wäre, dass Du das Zurücksetzen der
Maus_Status Variable aus dem Bedingungsblock herausnimmst und es
direkt vor den Schleifenbeginn positionierst.

Code: [AUSKLAPPEN]
maus_status = 0
For i = 4 To 7
   If ImageRectCollide(maus_zeiger,mx,my,0,x_temp(i),y_temp(0),10,10) Then
   maus_status = 2
      If mouse = 1 Then
         If warenlager_handel(i) < 9 Then
         warenlager_handel(i) = warenlager_handel(i) + 1
         End If
              Select i
                     Case 4
              warenlager_handel(3) = warenlager_handel(3) + 1000
                     Case 5
              warenlager_handel(3) = warenlager_handel(3) + 100
                    Case 6
              warenlager_handel(3) = warenlager_handel(3) + 10
                    Case 7
                   warenlager_handel(3) = warenlager_handel(3) + 1
                  End Select
      End If
   Else
      If ImageRectCollide(maus_zeiger,mx,my,0,x_temp(i),y_temp(0)+10,10,10) Then
      maus_status = 1
         If mouse = 1 Then
            If warenlager_handel(i) > 0 Then
               warenlager_handel(i) = warenlager_handel(i) - 1
            End If
         End If
   End If
   End If
   Next


+ AvA +
 

Gray Fox

Betreff: Re: Problem mit If Abfrage(n) in einer Schleife

BeitragDo, Nov 23, 2006 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ava hat Folgendes geschrieben:
Gray Fox hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
DrawImage maus_zeiger,mx,my,0
DrawImage mauszeiger,mx,my,maus_status


Zur Info: Ich zeichne den Mauszeiger und einen 4 Pixel großen Maus_Zeiger mit dem ich die "Kollisonsabfragen mache.



Hallöchen,


also Du brauchst ein Image, das Du lediglich zur Kollisionsprüfung nimmst,
nicht zeichnen! - und solltest Du auch nicht tun, wenn es darüber hinaus
keinen grafischen Nutzen hat. *zwinker*

Im Übrigen ganz schlimmer Spaghetti-Code, wenn ich das mal so äussern
darf ... Dein Probem liegt aber eigentlich auf der Hand: Du durchläuftst
eine Schleife, überprüfst dort bestimmte Bedingungen und setzt dann den
Maus_Status entsprechend. Letztendlich wird der Maus_Status aber immer
wieder auf 0 zurückgesetzt, wenn die Bedingung eines nächsten Schleifen-
Loops nicht erfüllt ist! - von daher klappt Dein Funktionsblock (wie Du es
auch selbst schon erkannt hast) nur bei der letzten Abfrage ... da musst Du
grundsetzlich nochmal Deine Logik überdenken ... ^^

Die einfachste Möglichkeit wäre, dass Du das Zurücksetzen der
Maus_Status Variable aus dem Bedingungsblock herausnimmst und es
direkt vor den Schleifenbeginn positionierst.

Code: [AUSKLAPPEN]
maus_status = 0
For i = 4 To 7
   If ImageRectCollide(maus_zeiger,mx,my,0,x_temp(i),y_temp(0),10,10) Then
   maus_status = 2
      If mouse = 1 Then
         If warenlager_handel(i) < 9 Then
         warenlager_handel(i) = warenlager_handel(i) + 1
         End If
              Select i
                     Case 4
              warenlager_handel(3) = warenlager_handel(3) + 1000
                     Case 5
              warenlager_handel(3) = warenlager_handel(3) + 100
                    Case 6
              warenlager_handel(3) = warenlager_handel(3) + 10
                    Case 7
                   warenlager_handel(3) = warenlager_handel(3) + 1
                  End Select
      End If
   Else
      If ImageRectCollide(maus_zeiger,mx,my,0,x_temp(i),y_temp(0)+10,10,10) Then
      maus_status = 1
         If mouse = 1 Then
            If warenlager_handel(i) > 0 Then
               warenlager_handel(i) = warenlager_handel(i) - 1
            End If
         End If
   End If
   End If
   Next


+ AvA +



Dank erstmal für deine Antwort ( Scheiß Logik Very Happy) werde es mal ausprobieren - Es klappt.

Zu deinen Anmerkungen:

Wenn ich den "richtigen" Mauzeiger anstelle des 4*4 Pixel großen Bildes für die "Imagerectcollide" Abfrage benutze, habe ich das Problem, dass bei einem Mausklick gleich mehrere Zähler nach oben gehen, da die "Abfragevierecke" der Zahlen so nahe beieinander liegen.

Warum Spaghetti-Code, sprichst du damit die Formatierung an? Falls ja, daran ist das Forum schuld nicht ích Wink
Aber ich habe mich schon verbessert Smile
 

Ava

Gast

BeitragDo, Nov 23, 2006 22:00
Antworten mit Zitat
Du sollst ja auch nicht den richtigen Mauszeiger für den Collisionscheck verwenden - aber es ist völlig unnötig, dass Du Deinen Collisionscursor zeichnest! (Zitat: "DrawImage maus_zeiger,mx,my,0") Im Übrigen kommt ein ImageRectCollide vollkommen ohne zusätzliche Ressource aus, erfüllt den selben Zweck genauso gut und ist - meine ich - sogar auch noch einen winzigen Tick schneller. Smile

@ Spaghetti-Code ... die Art und Weise, wie Du Deine Bedingungen verschachtel hast ist alles andere als intuitiv zu durchschauen Very Happy ... könnte man wesendlich vereinfachen das Ganze.

Freut mich aber, das ich Dir helfen konnte. Smile

+ Ava +
 

Gray Fox

BeitragDo, Nov 23, 2006 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ava hat Folgendes geschrieben:
Du sollst ja auch nicht den richtigen Mauszeiger für den Collisionscheck verwenden - aber es ist völlig unnötig, dass Du Deinen Collisionscursor zeichnest! (Zitat: "DrawImage maus_zeiger,mx,my,0") Im Übrigen kommt ein ImageRectCollide vollkommen ohne zusätzliche Ressource aus, erfüllt den selben Zweck genauso gut und ist - meine ich - sogar auch noch einen winzigen Tick schneller. Smile

@ Spaghetti-Code ... die Art und Weise, wie Du Deine Bedingungen verschachtel hast ist alles andere als intuitiv zu durchschauen Very Happy ... könnte man wesendlich vereinfachen das Ganze.

Freut mich aber, das ich Dir helfen konnte. Smile

+ Ava +


Learning by doing Razz

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group