Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bild Datei Manipulation Problem

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Apfel



Anmeldungsdatum: 01.07.2008
Beiträge: 13

BeitragVerfasst am: 01.07.2008, 22:01    Titel: Bild Datei Manipulation Problem Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 01.07.2008, 22:17    Titel: Antworten mit Zitat

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 lächeln
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 01.07.2008, 23:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Apfel



Anmeldungsdatum: 01.07.2008
Beiträge: 13

BeitragVerfasst am: 04.07.2008, 21:39    Titel: Antworten mit Zitat

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 missbilligen .
[/quote]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 04.07.2008, 22:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz