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:

Wie in FB am besten bewegte Grafiken flimmerfrei darstellen?
Gehe zu Seite 1, 2  Weiter
 
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
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 25.06.2005, 21:49    Titel: Wie in FB am besten bewegte Grafiken flimmerfrei darstellen? Antworten mit Zitat

Hi ich habe eine bmp in ein programm geladen mit:

DIM image(307204) AS UBYTE
SCREEN 18
BLOAD "C:\fb\bild.bmp", VARPTR(image(0))
PUT (0,0), image
sleep



Anschließend habe ich dann die Koordinaten von PUT in x und y geändert und versucht mit Inkey$ = CHR$(0) + CHR$(77)
nach rechts zu bewegen (x=x+1)
Hat aber nicht geklappt.
Stattdessen sah ich einen Schleier der sich vom Anfangsplatz des Bildes nach rechts zog. Anscheinend hatte sich das Bild bereits aus dem Bild geschoben obwohl ich noch nicht die Taste gedrückt hatte. Wie kann das sein?
Und wie stellt man die bewegung dann flimmerfrei dar und mit welchem Screen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 25.06.2005, 22:06    Titel: Antworten mit Zitat

Hallo.
Da arbeit ich immer mit
Code:
put (x,y),image,XOR

'dein Fall:
DIM image(307204) AS UBYTE
SCREEN 18
BLOAD "C:\fb\bild.bmp", VARPTR(image(0))
put(0,0),image,xor
do
   sleep 1
   PUT(xalt,yalt), image,xor
   put(x,y),image,xor
   inky$=inkey$
   select case inky$
      case "d"
          x=x+1
      case "a"
          x=x-1
      case CHR$(27)
          end
   end select
   xalt=x
   yalt=y
loop


So müsste das klappen.

Mfg
Michael


Zuletzt bearbeitet von Michael712 am 25.06.2005, 22:19, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 25.06.2005, 22:18    Titel: Antworten mit Zitat

und da bewegt sich was bei dir?
Da tut sich gar nichts bei mir.
Was bewirkt das XOR denn?

/edit.

Hm ohne "Sleep 1" geht das, aber dann flackerts.


Zuletzt bearbeitet von surfer87 am 25.06.2005, 22:21, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 25.06.2005, 22:21    Titel: Antworten mit Zitat

Hmm. Ich hab das gerade auch getestet und das funzt nicht. XOR ist "definitiv oder". Wenn du ein Bild mit xor auf dem bildschirm machst und es wieder mit xor überschreibst, dann ist das wieder wie vorer. Was "definitiv oder" genau heißt, weiß ich auch nicht. Bei dem was ich gepostet hab, siehst du warscheinlich nur das erste bild und danach wird das so überschrieben, dass man das nicht sieht. Ich verbesser das sofort.

EDIT:
Code:

'kleinerer code(zum testen)
dim image(307204) as ubyte
screen 20,,,1
BLOAD "D:\test.bmp",VARPTR(image(0))

put(xalt,yalt),image,xor
x=200
do
   sleep 100
   x=x+1
   put(xalt,yalt),image,xor
   put(x,y),image,xor
   xalt=x
   yalt=y
loop


Das ist jetzt wohl ohne tastenunterstützung. Das geht von alleine nach rechts. du musst nur D:\test.bmp nach deinem bild ändern. Dann klappt das.

Mfg
Michael


Zuletzt bearbeitet von Michael712 am 25.06.2005, 22:27, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 25.06.2005, 22:22    Titel: Antworten mit Zitat

siehe editiertes reply oben
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 25.06.2005, 22:35    Titel: Antworten mit Zitat

Kann es sein, dass der Sleep Befehl in FB verändert wurde?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 25.06.2005, 23:18    Titel: Antworten mit Zitat

ja, Sleep 1 (QB) = 1 Sek, Sleep 1 (FB) = 1 MilliSek
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 25.06.2005, 23:23    Titel: Antworten mit Zitat

Ahsooo praktisch happy
Und jetzt weiß ich auch warum das mit den Pfeiltasten erst nicht klappte.
Ich hatte Oldschool-Like CHR$(0) statt CHR$(255) verwendet.

Aber was mache ich nun wenn sich das Bild zwar auf Tastendruck schnell, jedoch nicht abgehackt bewegen soll?

x=x+1 ist zwar sehr flüssig, dauert aber lange

x=x+20 ist natürlich schnell, aber man sieht die Schritte sehr deutlich.

Wie kann man eine höhere Geschwindigkeit erreichen aber dabei eine fließende Bewegung erzeugen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 26.06.2005, 10:08    Titel: Antworten mit Zitat

Größere Auflösung + größere Schritte, dann sieht man's nicht so genau, oder
verkleinere die Wartezeit. (Wobei 1ms schon OK sein sollte)

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

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

Hallo.

Wie legt man fest, wie groß das array für ein Bild sein muss?? Ich hab das jetzt immer ausgetestet, da habe ich aber bestimmt zuviel festgelegt. Es gibt doch bestimmt so eine Formal dafür.

Mfg
Michael

EDIT: Ich mach das im Moment noch so: dim image(hoehe*breite*4)
So kann ich ein 32bit bild laden. Wenn ich das dann aber um ca.200 verkleinere klappt das auch noch. Ist das denn die richtige formel?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 26.06.2005, 13:31    Titel: Antworten mit Zitat

also ich benutze (hoehe*breite) + 4

Hab ich irgendwo mal aufgeschnappt...warum die +4 dahinter muss weiß ich aber selber nicht genau zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 26.06.2005, 13:40    Titel: Antworten mit Zitat

surfer das ist leider nicht richtig. im prinzip reicht zum dimensioniern für ein bild folgende formel aus ( höhe * breite * anzahl_bytes_pro_pixel ). zum thema 32-bit bilder: ich glaube bei bmps gibts keine 32-bit sondern nur 24-bit d.h. wenn du ein bmp lädst dann reicht ist anzahl_bytes_pro_pixel = 3.

zum thema xor: darunter versteht man eine logische verknüpfung von zwei Aussagen die beide entweder wahr oder falsch sein können. resultat is wieder ein wahrheitswert. hier eine kleine tabelle

Code:

  a | b | resultat a xor b
  -------------------------
  f  | f  |   f
  w | f  |  w
   f | w | w
  w | w | f


d.h. zwei wahrheitswerte mit xor verknüpft ergeben nur wahr wenn der eine oder der anderewahrheitswert wahr ist nicht aber wenn beide wahr sind.
_________________
Yagl - yet another gameprogramming library
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 26.06.2005, 14:12    Titel: Antworten mit Zitat

Stimmt, sind nur 24bit. Sorry. Dann habe ich die Felder ja auch immer viel zu groß gemacht. DANKE!!!!

Mfg
Michael
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 26.06.2005, 14:25    Titel: Antworten mit Zitat

marzec hat Folgendes geschrieben:

höhe * breite * anzahl_bytes_pro_pixel

Ich glaube, du meinst anzahl_bits_pro_pixel...

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 26.06.2005, 14:47    Titel: Antworten mit Zitat

Hmm...Ich hab das gerade mal getestet. Bei mir klappt das nicht. Ich hab ein bild(64*64) geladen, und da fehlte ein Stück. Das war ein 24bit Bild.
Code:

DIM test(64*64*3) as ubyte
BLOAD "D:\64.bmp",VARPTR(test(0))

So müsste das doch klappen. Ich muss da aber "*4" schreiben. Muss ich da vielleicht was anderes als ubyte nehmen??

Mfg
Michael
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.06.2005, 14:55    Titel: Antworten mit Zitat

@jb: Ich denke "Bytes" ist schon richtig.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 26.06.2005, 16:15    Titel: Antworten mit Zitat

So das klappt ansich ja schonmal ganz gut.
Jetzt wollte ich Bild1 als Hintergrund haben und Bild2 als eine bewegliche Figur.

Hat teilweise auch geklappt aber das Bild2 hat eine Art Transparenzeffekt gehabt.

Es hat innerhalb seines Umfangs/seiner Größe
die Farben des Hintergrunds scheinbar inventiert und nicht seine eigenen Farben beibehalten. Woher kommt das?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 26.06.2005, 17:45    Titel: Antworten mit Zitat

XOR klappt meiner Meinung nach nur auf schwarzem hintergrund gescheit. dafür kannst du aber was anderes nehmen. Ich wollte bis vorgestern noch einen Wave-player machen, ich mache aber jetzt einen Moorhuhn clone. Da hatte ich so ein Problem auch. Ich hab das hier einem geschickt, dem ich bilder laden/maus ein wenig erklären wollte:
Code:

SCREEN 20,32,2,1 '1024*768 auf vollbild, 2 bildschirmseiten,32bit farbe
bildname$="C:\test.bmp" '<--- da musst du den bildnamen eingeben
h=100 'höhe des bilds eingeben
b=100 ' und die breite
h1=1024
b1=768
DIM bild(h*b*4)
dim backgr(h1*b1*4)

cls
setmouse 1024/2,768/2,0 'maus in der mitte des Bildschirms machen und auf unsichtbar stellen

BLOAD bildname$,VARPTR(bild(0)) 'hier wird das bild geladen
BLOAD "C:\hintergrund.bmp", VARPTR(backgr(0))

screenset 1,0 'Hiemit sieht man eine Bildschirmseite(seite1) und bearbeitet eine andere(nicht sichtbare)

do until t = 3 'so lange machen, bis linke und rechte maustaste gedrückt sind
    getmouse x,y,scroll,t 'mausstatus holen t=taste: 1 für links,2->rechts,3->beide,4->mitte,5->mitte+links,6->mitte+rechts,7->alle
    cls
    put(0,0),backgr
    put(x,y),bild,trans 'das bild an den mauskoordinaten machen(hellpink wird transparent dargestellt
    screencopy 1,0 'den bearbeiteten teil zum sichtbaren teil kopieren
loop

test.bmp sieht so aus:
[img]http://img17.echo.cx/img17/4421/test0px.png[/iimg]
hintergrund.bmp: ein 1024*768 grünes bild. Mach das auch mal so und teste das.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
surfer87



Anmeldungsdatum: 16.09.2004
Beiträge: 103

BeitragVerfasst am: 27.06.2005, 05:59    Titel: Antworten mit Zitat

Ja klappt auch gut. Jetzt wollte ich eine Kollisionsabfrage mit Point machen aber das hat nicht geklappt.
Funktioniert Point nicht bei geladenen Bitmaps?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 27.06.2005, 11:42    Titel: Antworten mit Zitat

Ich würde generell von POINT() abraten, da man sich damit auf Farben beschränkt.
Schau mal in die MonsterFAQ, da gibt es unter
der Rubrik Spiele programmieren ein Thema namens Wie programmiere ich eine einfache Kollisionserkennung.

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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