Einsteiger Schwierigkeiten...

Anfängerfragen zum Programmieren mit PureBasic.
Link2Death

Beitrag von Link2Death »

Das problem ist: wenn ich die Variable so stze, dass das bild vollständig zu sehen ist (eine schrift mit transparentem hintergrund....), dann bewegt es sich!

Wenn aber auch nur ein KLEINES BISSCHEN der schrift außerhab des Bildschirmrandes ist, bewegt sich das ding keinen milimeter.... :(

Das macht mich verrückt! Ich weiß einfach nicht wo der fehler liegt... seit 10 stunden probier ichs.... ABER ES WILL NICHT KLAPPEN!!!
:freak: :freak: :freak: :freak: :freak: :freak: :freak: :freak:

:mrgreen:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Batze hat geschrieben:Wie oft wird es denn in deinem Programm auf den Startwert gesetzt? :wink:
... mehr braucht man nicht mehr zu sagen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Link2Death

Beitrag von Link2Death »

So.... ich habe jetzt folgendes geschrieben:

Code: Alles auswählen

Repeat

FlipBuffers()
ClearScreen(RGB(0, 0, 0))

ExamineMouse()
a = MouseX()
b = MouseY()
MouseButton(#PB_MouseButton_Left)

SpriteX = -800

DisplayTransparentSprite(#Titel1, SpriteX, 0)
SpriteX + Direction
If SpriteX < 20 : direction = 2 
ElseIf            direction = 0
EndIf

DisplayTransparentSprite(#Cursor, MouseX(), MouseY())

Until SpriteX = 20 And MouseButton(#PB_MouseButton_Left)
Wenn ich anstelle von ElseIf nur Else angebe, dann funktioniert gar nix mehr... da steht dann "Garbage to the end of the line.... kA was das bedeutet.

Und es ist immernoch das selbe..... nochts außer meine Maus bewegt sich
Die schleife müsste doch eigentlich nur einmal durchlaufen..... und zwar bis SpriteX = 20 ist, und ich die linke Maustaste drücke... oder mache ich irgendetwas falsch, was meine schleife immer zurücksetzt??? sodaßß das bild bei x(-800) immer ein pixel weitergeht und dann wieder zurück :o
ich hoffe nicht.... ich hab langsam keinen bock mehr auf dieses problem.. ich sitze schon den ganzen tag dran und starte das programm alles 2min neu, mit irgendeiner codeänderung! Ich denke dass das genug eigeninitiative ist......... ich komme ienfach nicht drauf irgendeiner meiner befehle hat anscheinend eine nebenwirkung, die ich nicht kenne oder so... also bitte:

Keine "Anstrengung" mehr. Es ist nett gemeint, aber ich komm ienfach nicht drauf und ich will jetzt einfach weiter machen, sonst werd ich ja nie besser.........
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

OK, jetzt verstehe ich wo dein Problem liegt ...

In dem Verständnis von Schleifen.
So eine Repeat-Schleife funktioniert im Prinzip so:

1. Sie führt den Code aus der zwischen Repeat und Until steht.

2. Sie überprüft die Bedingung hinter Repeat. Trifft diese zu geht es mit dem Code hinter Until weiter. Trifft sie aber nicht zu wird der Code zwischen Repeat und Until ein weiteres mal ausgeführt, so lange bis die Bedingung erfüllt ist.

Dein SpriteX = -800 wird also immer wieder ausgeführt. Dein Wert wird sich maximal zu -798 ändern.

Das mit dem Else ist nur ein Notationsfehler, du musst wie bei einem If einen Doppelpunkt dahinter angeben um in der selben Zeile weiter schreiben zu können.

Guck dir am besten noch die Dokumentation zu den PB-Schlüsselwörtern genau an damit solche Fehler nicht dazu führen dass man nicht weiterkommt. :)
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Link2Death

Beitrag von Link2Death »

AAAH!!! DANKESCHÖN! Endlich........ eyeyey... das is ja aber auch doof...
jetzt hab ichs begriffen..... :allright: :allright: :allright:

Es funktioniert... ES LEBT!

Vielen herzelichen dank!
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Ich glaub ich geb dir mal einen Kraschkurs in Sachen Vollbildanwendungen.

Ein Vollbild wird immer erst aufgebaut und dann angezeigt. Danach wird es in der Regel mit ClearScrean() geleert und neu aufgebaut. Das wiederholt das Programm dann ganz oft und so sieht es für den Benutzer so aus, als ob sich das Bild bewegt.
Um ein Bewegtes Bild zu erzeugen muss man es beim aufbauen also immer weiter in eine Richtung bewegen. Damit der Computer weiß wo sich das Bild befindet, benutz man in der Regel Variabeln. Eine Variable für die X Kordinate und eine für die Y Kordinate. Bleibt das Bild auf einer Achse, so kann man hier auch eine Zahl hinschreiben.
Damit sich das Bild auch bewegt muss man die Variable immer um einen Bestimmten Wert erhöhen, beziehungsweise veringern. Dies kann eine Variable, Konstante, Zahl oder eine andere Speichermöglichkeit sein (lernst du später noch was es da noch so alles gibt).
Wichtig zu Wissen ist noch dass das Kordinatensystem von Purebasic anders ist als das normale Mathematische. Hier ist die Y-Achse verkehrt herum. Die Kordinate des Bildes ist also immer die obere linke Ecke.


Und noch einen in Sachen Abfragen.

Bei einer If Abfrage wird erst überprüft ob eine Bedingung stimmt und dann die Anweisung ausgefürht.

Code: Alles auswählen

if Bedingung
;Aktion
endif
Dann gibt es nicht die Ersatzbedinigung else. Sie kann keine Bedinigung haben. Sie wird erst aufgeführt wenn alle vorherigen Bedingungen fehlschlugen.
Dieses Beispiel zeigt es. Ist Bedingung Wahr dann wird Aktion1 ausgeführt. Ansonsten wird Aktion2 ausgeführt.

Code: Alles auswählen

if Bedinung
;Aktion1
else 
;Aktion
endif
Mit Elseif kann man ein Else mit Bedingung machen. Schlägt die Vorangegange Bedingung fehl so wird überprüft ob die Bedingung von Elseif wahr ist und die zugehörige Bedinung ausgefürht. (Schau mal in deinem Code dann merkst du was).
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Link2Death

Beitrag von Link2Death »

Ok! Ich habe es schon begriffen... ich war nur zu doof um das Variable setzen aus der repeat-schleife zu nehmen :mrgreen:

So.... jetzt bin ich vermutlich WIEDER zu schusselig, aber:

Ich habe ja am Anfang beschrieben, dass es mein Plan ist, Eine Überschrift zu machen, die sich aus einem Bild das von links einfliegt und einem, das von rechts einfliegt zusammensetzt.....

wenn ich allerdings das 2.Sprite mache, dann funktioniert es nicht mehr

Code: Alles auswählen

SpriteX1 = -800
SpriteX2 =  800

Repeat

ExamineMouse()
a = MouseX()
b = MouseY()
MouseButton(#PB_MouseButton_Left)


FlipBuffers()
ClearScreen(RGB(0, 0, 0))

DisplayTransparentSprite(#Titel1, SpriteX1, 0)
SpriteX1 + direction
If SpriteX1 < 0 : direction =  3 : EndIf
If SpriteX1 = 0 : direction =  0 : EndIf
If SpriteX1 > 0 : direction = -1 : EndIf

DisplayTransparentSprite(#Cursor, MouseX(), MouseY())

Until MouseButton(#PB_MouseButton_Left)
So wie oben funktioniert wenigstens das bild, das von links kommt.

Code: Alles auswählen

SpriteX1 = -800
SpriteX2 =  800

Repeat

ExamineMouse()
a = MouseX()
b = MouseY()
MouseButton(#PB_MouseButton_Left)


FlipBuffers()
ClearScreen(RGB(0, 0, 0))

DisplayTransparentSprite(#Titel1, SpriteX1, 0)
SpriteX1 + direction
If SpriteX1 < 0 : direction =  3 : EndIf
If SpriteX1 = 0 : direction =  0 : EndIf
If SpriteX1 > 0 : direction = -1 : EndIf

DisplayTransparentSprite(#Titel2, SpriteX2, 0)
SpriteX2 + direction
If SpriteX2 > 0 : direction = -3 : EndIf
If SpriteX2 = 0 : direction =  0 : EndIf
If SpriteX2 < 0 : direction =  1 : EndIf

DisplayTransparentSprite(#Cursor, MouseX(), MouseY())

Until MouseButton(#PB_MouseButton_Left)
So geht gar nix mehr...

Also die Maus schon.... und wenn ich klicke kommt auch der Menu-Bildschirm... aber das erste Bild bleibt schwarz
=> Die Sprites fliegen nicht ein....

Wieso???
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Du hast deine Abfragen an der falschen Position. Du setzt die Variable in der gespeichert ist in welche Richtung sich das Bild Bewegt auf die Bewegung des vorhergegangenen Bildes. Sprich also nachdem du das erste Bild bewegt hast setzt du die Bewegungsrichtung auf die des ersten Bildes, was zur folge hat dass das zweite Bild damit bewegt wird.
Setzt die Abfragen mal vor die Bewegungen. sprich so:

Code: Alles auswählen

DisplayTransparentSprite(#Titel1, SpriteX1, 0)
If SpriteX1 < 0 : direction =  3 : EndIf
If SpriteX1 = 0 : direction =  0 : EndIf
If SpriteX1 > 0 : direction = -1 : EndIf
SpriteX1 + direction

DisplayTransparentSprite(#Titel2, SpriteX2, 0)
If SpriteX2 > 0 : direction = -3 : EndIf
If SpriteX2 = 0 : direction =  0 : EndIf
If SpriteX2 < 0 : direction =  1 : EndIf
SpriteX2 + direction
Verstanden warum's nicht tat?
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Link2Death

Beitrag von Link2Death »

Ochso!!!!! Jetzt hab ichs Begriffen! Ich brauch für sowas eben mal ne erklärung, dannach weiß ichs normalerweise.... :mrgreen: :mrgreen:

Vielen Dank für diese erklärung! Aber vermutlich hab ich spätestens in ner halben Stunde ne neue Frage :D :D :D :D :D :D

Aber bis dahin Muchos Gracias! :allright: :allright:
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Link2Death hat geschrieben:Aber vermutlich hab ich spätestens in ner halben Stunde ne neue Frage
Das könnte daran liegen dass du etwas stark auf ausprobieren gehst und etwas wenig auf logik. Versuche im Kopf durchzugehen was dein Programm genau macht, mach dir zur not eine skizze oder was weiß ich. Bei so kleinen Programmen solltest du damit normalerweise Fehlerquellen die nicht auf fehlendem Verständnis der Befehle beruhen selbst finden können.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Antworten