Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 25.06.2005, 22:49 Titel: Wie in FB am besten bewegte Grafiken flimmerfrei darstellen? |
|
|
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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 25.06.2005, 23:06 Titel: |
|
|
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, 23:19, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 25.06.2005, 23:18 Titel: |
|
|
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, 23:21, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 25.06.2005, 23:21 Titel: |
|
|
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, 23:27, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 25.06.2005, 23:22 Titel: |
|
|
siehe editiertes reply oben |
|
Nach oben |
|
|
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 25.06.2005, 23:35 Titel: |
|
|
Kann es sein, dass der Sleep Befehl in FB verändert wurde? |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.06.2005, 00:18 Titel: |
|
|
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 |
|
|
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 26.06.2005, 00:23 Titel: |
|
|
Ahsooo praktisch
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 |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 26.06.2005, 11:08 Titel: |
|
|
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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 26.06.2005, 12:22 Titel: |
|
|
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 |
|
|
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 26.06.2005, 14:31 Titel: |
|
|
also ich benutze (hoehe*breite) + 4
Hab ich irgendwo mal aufgeschnappt...warum die +4 dahinter muss weiß ich aber selber nicht genau |
|
Nach oben |
|
|
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 26.06.2005, 14:40 Titel: |
|
|
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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 26.06.2005, 15:12 Titel: |
|
|
Stimmt, sind nur 24bit. Sorry. Dann habe ich die Felder ja auch immer viel zu groß gemacht. DANKE!!!!
Mfg
Michael |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 26.06.2005, 15:25 Titel: |
|
|
marzec hat Folgendes geschrieben: |
höhe * breite * anzahl_bytes_pro_pixel
|
Ich glaube, du meinst anzahl_bits_pro_pixel...
jb |
|
Nach oben |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 26.06.2005, 15:47 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 26.06.2005, 17:15 Titel: |
|
|
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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 26.06.2005, 18:45 Titel: |
|
|
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 |
|
|
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 27.06.2005, 06:59 Titel: |
|
|
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 |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 27.06.2005, 12:42 Titel: |
|
|
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 |
|
|
|