 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Apfel
Anmeldungsdatum: 01.07.2008 Beiträge: 13
|
Verfasst am: 01.07.2008, 22:01 Titel: Bild Datei Manipulation Problem |
|
|
Hallo, ich bin was das programmieren angeht sehr unerfahren. Besonders im FreeBasic.
Ich habe also kleinen Code geschrieben, was ein kleines BMP Bildchen dort und hier anzeigen lässt.
Code: | SCREENRES 400,400,32
Dim As String dateiname = "Schlange.bmp"
dim x as integer
dim y as integer
Dim As Integer n = 1
Dim fensterBild As ANY PTR
fensterBild = ImageCreate(8,8)
Do
If n > 2 Then Exit Do
RANDOMIZE TIMER
x = RND *399
y = RND *399
Bload dateiname, fensterBild
Put (x,y), fensterBild
loop
Sleep |
Das Problem ist es das jedes zweites oder drittes Bild anzeige nicht verschwindet.
Kann mir jemand kurz sagen oder Beispiel Code zeigen wie ich das hinkriege das immer nur ein Bild gezeigt wird und das Bild an der alte Position gelöscht wird?
Danke. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.07.2008, 22:17 Titel: |
|
|
1) Du legst ja einen Puffer an (fensterBild). Deswegen (und eigenltich immer) ist es unsinnig, mit BLOAD das bild jedes mal neu zu laden. ein BLOAD vor der DO-Schleife reicht also völlig.
2) Zum PUT-Befehl gehört ein Verknüpfungsmodus, der angibt, wie hintergrund und die daraufzulegende grafik miteinander gemischt werden sollen. Standardmäßig werden diese glaub ich mit OR (oder AND) verknüpft. du willst aber sicherlich, dass das Bild nicht mit dem Hintergrund gemischt wird. deswegen muss der PUT-Befehl erst mal mit dem Modus PSET (hintergrund wird komplett überschrieben) oder TRANS (transparente farbe im bild überschreibt nicht den hintergrund) versehen werden:
Code: | PUT (x,y), fensterBild, PSET |
Das Bild verschwindet dann natürlich nicht. vorher muss der Bildschirm geleert werden, und zwar mit dem Befehl CLS. Damit dabei kein Flackern entsteht, sperrt man den Bildschirm für diese zeit:
Code: |
ScreenLock
Cls
Put(x,y), fensterBild, PSET
ScreenUnlock
|
für die einzelnen modi und schlüsselwörter steht die FB-Referenz allzeit bereit  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 01.07.2008, 23:05 Titel: |
|
|
3) Wenn du IMAGECREATE verwendest, musst du am Ende des Programms den Speicher mit IMAGEDESTROY wieder freigeben - das passiert nicht automatisch! _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Apfel
Anmeldungsdatum: 01.07.2008 Beiträge: 13
|
Verfasst am: 04.07.2008, 21:39 Titel: |
|
|
Prima hat alles so funktioniert wie gewünscht.
Aber beim meinem nächsten Schriet ist wider ein Problem da. Ich hab den Code ein bisschen verändert so dass das Bild jetzt nicht hin und her spring sonder sich gleichmäßig nach dem Zufallsgenerator in vier Richtungen bewegt.
Das Problem gibt es mit Positions Variablen, wenn ich die Variablen außerhalb der DO-Schleife definiere, werden die nicht in die Schleife übernommen. Setzt ich die Variablen in die Schleife werden die jedes mal neu definiert so das das Bild sich praktisch immer auf einer Stelle bewegt.
Hier ist der Code.
Code: |
SCREENRES 400,400,32
Dim As String dateiname = "Schlange.bmp"
dim i as integer
Dim As Integer n = 1
'''''''''''''''''''''''''
'Dim As Integer x = 200''
'Dim As Integer y = 200''
'''''''''''''''''''''''''
Dim fensterBild As ANY PTR
fensterBild = ImageCreate(8,8)
Bload dateiname, fensterBild
Do
If n > 2 Then Exit Do
Dim As Integer x = 200
Dim As Integer y = 200
RANDOMIZE TIMER
i = RND *3
if i = 0 then
x -= 5
end if
if i = 1 then
x += 5
end if
if i = 2 then
y -= 5
end if
if i = 3 then
y += 5
end if
SCREENLOCK
CLS
PUT(x,y), fensterBild, PSET
SCREENUNLOCK
Loop
Sleep |
Wahrscheinlich muss ich die Variablen im so etwas wie “Puffer“ speichern und dort die Operationen Durchführen. In Referenzen und im Forum hab leider nichts gefunden, man weist auch gar nicht richtig was man nach schlagen soll .
[/quote] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 04.07.2008, 22:11 Titel: |
|
|
Zitat: | Das Problem gibt es mit Positions Variablen, wenn ich die Variablen außerhalb der DO-Schleife definiere, werden die nicht in die Schleife übernommen. |
Das sollte eigentlich nicht so sein - außer du definierst sie außen und dann innen noch einmal.
Der folgende Code funktioniert bei mir jedenfalls:
Code: | SCREENRES 400,400,32
Dim As String dateiname = "Schlange.bmp"
dim i as integer
Dim As Integer n = 1
Dim As Integer x = 200
Dim As Integer y = 200
Dim fensterBild As ANY PTR
fensterBild = ImageCreate(8,8)
Bload dateiname, fensterBild
Do
If n > 2 Then Exit Do
RANDOMIZE TIMER
i = RND *3
if i = 0 then
x -= 5
end if
if i = 1 then
x += 5
end if
if i = 2 then
y -= 5
end if
if i = 3 then
y += 5
end if
SCREENLOCK
CLS
PUT(x,y), fensterBild, PSET
SCREENUNLOCK
SLEEP 100 ' damit man was sieht
Loop
Sleep
IMAGEDESTROY fensterBild ' wichtig
|
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|