If Variable wird nicht gespeichert

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Seven

Betreff: If Variable wird nicht gespeichert

BeitragDi, Aug 23, 2011 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Tag,
Ich wollte ein kleines Programm schreiben, nur scheitert das ganze an einer Stelle.
Mein Problem ist, dass ich eine If Abfrage gestartet habe. Das Ergebnis wird aber zurück-
gesetzt, sobald die If Abfrage nicht mehr erfüllt wird.
Wie änder ich das?
 

Animator

BeitragDi, Aug 23, 2011 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
könntest du den Codeteil mal posten? Ich kann mir so nicht vorstellen wie du das meinst =)
 

Seven

BeitragDi, Aug 23, 2011 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach ja, klar^^
Code: [AUSKLAPPEN]

Function Scroll(X, Y, Width = 400, Height = 2) ; Position, Breite und Höhe werden festgelegt
  Rect X,Y,Width,Height ; Erste Line wird erstellt
  X2 = MouseX()
  Y2 = MouseY()
  Cursor = CreateImage(3,3)
  DrawImage(Cursor,X2,Y2) ; Bild beim Cursor erstellt
  clicked = MouseDown(1)
  S = ImageRectOverlap(Cursor,X2,Y2,X,Y-Width/20,Width,Width/20*2+Height)
  If S=1 And clicked=1 Then X=X2-((Width)/2+X-Width/40)+X K = K + 1 ; Klick und Position werden
  ; als Bedingung gestellt. Davon abhängig wird die Position des 2. Rechtecks geändert.
 
  Rect (Width)/2+X-Width/40,Y-Width/20,Width/40,Width/20*2+Height ;2. Rechteck wird gezeichnet
Text 10,50, K ; Ist lediglich eine Gedanken Hilfe für mich gewesen. Es geht nur um das 2. Rechteck
End Function


Das ist der Abschnitt.

Midimaster

BeitragDi, Aug 23, 2011 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ich denke mal es liegt daran, dass der Wert X in der Funktion geändert wird, aber nicht via RETURN zurückgegeben wird. Dadurch hat X beim nächsten Aufruf wieder den alten Wert. Du müssest um das zu testen X GLOBAL machen und testweise gar nicht an die Funktion übergeben....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

Seven

BeitragDi, Aug 23, 2011 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Scheint zu stimmen. Ich habe deinen Vorschlag für "K" übernommen, zurückgegeben
und habe es außerhalb der Funktion schreiben lassen.
K erhöht sich in dem Fall. Jetzt weiß ich endlich woran es liegt^^
Leider ist die Umsetzung bei X etwas anders. Immerhin wird das 2. Rechteck innerhalb
der Funktion gezeichnet und dafür ist X wichtig.

EDIT: Ich habe es mir jetzt einfach gemacht und X1 als global festgelegt und etwas geändert:
Code: [AUSKLAPPEN]

Function Scroll(Y, Width = 400, Height = 2)
  Rect X,Y,Width,Height
  X2 = MouseX()
  Y2 = MouseY()
  Cursor = CreateImage(3,3)
  DrawImage(Cursor,X2,Y2)
  clicked = MouseDown(1)
  S = ImageRectOverlap(Cursor,X2,Y2,X,Y-Width/20,Width,Width/20*2+Height)
  If S=1 And clicked=1 Then X1=X2-((Width)/2+X-Width/40)+X K = K + 1
  Rect (Width)/2+X1-Width/40,Y-Width/20,Width/40,Width/20*2+Height
Return X1


Es kommt aber auf das selbe hinaus. Das dürfte doch eigentlich nicht passieren-.-
Immerhin kann X in dem Fall gleichbleiben (was es ja auch tut: X = 0 ) und
die Position des 2. Rechtecks wird nur von MouseX() bestimmt.

ZEVS

BeitragDi, Aug 23, 2011 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe ehrlich gesagt den Sinn der Variable Cursor nicht. Außerdem wären Variablendeklarationen mittels Local praktisch, um zu wissen, wann eine lokale Variable erstellt wird und wann eine globale geändert wird. Das macht den Code besser zu lesen und vermeidet schwer zu findende Fehler, wenn man eine globale Variable erstellt, deren Name auch als lokale Variable verwendet wird.

Du musst natürlich darauf achten, dass die Variable Y2 nun außerhalb der Funktion aktualisiert werden muss.

Außerdem sehe ich keinen Grund, verschiedene Variablen X und X1 zu verwenden (Vor allem, da es kein Y1 gibt).
Zitat:
Code: [AUSKLAPPEN]
If S=1 And clicked=1 Then X1=X2-...
Rect (Width)/2+X1-...
Return X1


Unbekannte Variablen haben in BB immer einen Standartwert, der bei Ints 0 ist - und es kommt gar kein Fehler. Das ist eine der großen Schwächen von BB.

Wieso heißt die Variable S eigentlich S? collision fände ich besser benannt.

ZEVS
 

Seven

BeitragDi, Aug 23, 2011 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, das mit Local werde ich übernehmen. Ich wollte eigentlich damit anfangen, sobald das
Projekt weiter wächst, aber es macht jetzt wohl schon Sinn.

Y2 aktualisiert? Ich hab es zur Sicherheit (und weil mir momentan die Ideen ausgehen^^) Y2
zum global gemacht und sie außerhalb der Funktion mit MouseY() gleichgesetzt. Meinst du das?

X1 hab ich erschaffen, weil ich eine von X weitgehend unabhängige Variable wollte, da von X
die Liene, bzw. das erste Rechteck abhängt und im Falle eines globalen X mit verschoben werden
würde. (hab ich bereits ausprobiert)

S entstand aus Eile. Aber gut, ich werde das ganze mal übersichtlicher gestalten.

EDIT: Zu Cursor: Ich erstelle ein (eigentlich nicht existierendes) Bild und übernehme es mit Cursor.
Danach wird das Bild gezeichnet und zwar genau dort, wo der Cursor ist (bzw. die Maus. Die Variable
Cursor ist ja nicht der Cursor selbst, sondern nur das Bild, dass ich erschaffen habe).
Das Bild benutze ich um dann abzufragen, ob eine Kollision zwischen dem Bild und einer
Fläche besteht. Das hab ich, bevor ich die Kollision benutzt habe, noch etwas umständlicher gelöst.

EDIT2: Es geht:D
Bzw. beinahe. Ich weiß jetzt woran es lag. Ich hatte noch eine andere Funktion, in der
ich die Variablen verwendet habe. Ich sollte wirklich übersichtlicher arbeiten^^
Danke für den Tipp.
Ich habe alles entfernt was nicht dazu gehört. X1 habe ich unter Global gesetzt (X1 ist nötig).
Return ist nicht nötig und ich darf X und alle anderen Variablen vorher bestimmen. So
sieht das aus:
Code: [AUSKLAPPEN]

timer = CreateTimer (60)
Graphics 1024,756,32,2
SetBuffer BackBuffer()
Global X1
Function Scroll(X,Y,Width = 400, Height=2)
  Rect X,Y,Width,Height
  X2 = MouseX()
  Y2 = MouseY()
  Cursor = CreateImage(3,3)
  DrawImage(Cursor,X2,Y2)
  clicked = MouseDown(1)
  Collision = ImageRectOverlap(Cursor,X2,Y2,X,Y-Width/20,Width,Width/20*2+Height)
  If Collision = 1 And clicked = 1 Then X1=X2-((Width)/2+X-Width/40)+X
  Rect (Width)/2+X1-Width/40,Y-Width/20,Width/40,Width/20*2+Height
End Function
While Not KeyDown(1)
Cls
Scroll(100,100,300,3)
WaitTimer Timer
Flip 0
Wend

Muss noch die Mitte benutzten und die andere Funktion abändern, aber ansonsten geht es. Danke für
eure Hilfe:)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group