Sprite-Kette von oben nach unten Durchlaufen lassen?

Previous topic - Next topic

Veritas

Hey hey,
bin neu hier und hab noch wirklich nicht viel Ahnung.
Ich möchte Sprites laden, die dann in einer Kette vertikal durch ein vorgegebenes Fenster wandern ( so etwa 200*200 Pixel).
Also nicht, das jedes einzelne Bild geladen wird und dann das nächste kommt. Der Verlauf muss auf jeden Fall mit drin sein und man sollte mit hoher geschwindikeit starten und sich zum Ende hin verlangsamen, sodaß er beim letzten Bild zum stehen kommt.

Danke für eure Hilfe.
Gruß Veritas
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Schranz0r

Willkommen im Forum :)

Spritekette?
Meinst du ne Art Tileset?
Wenn ja, dann nimm LOADANIM, sollte dein Problem lösen.
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Veritas

Danke für den Tipp, hab ich gleich mal probiert. Ehrlich gesagt habe ich aber keine Ahnung was ein Tileset ist. Habe Loadani eingebaut steig aber noch nicht wirklich durch wie das ganze funktioniert. Zunächst wofür steht das %-Zeichen (LOADANIM datei$, id%, w%, h%) . Steht es real für Prozent oder für die Pixelanzahl? Habe beides versucht, sah trotzdem gleich aus ^^.
Also nochmal. Loadanim ermöglicht es eine Grafik in Blöcke zu unterteilen und diese dann "abzuspielen".
Code (glbasic) Select
LOADANIM "E:/Programmierung/GLBasic/GLBasic/REG/Grafik/Rolle.png", 2, 1305, 97
LOADFONT "E:/Programmierung/GLBasic/GLBasic/REG/smalfont.png", 1
WHILE TRUE
SETFONT 1
IF KEY (57) THEN PRINT "Los Geht's", 400,300
IF KEY (57) THEN FOR x=0 TO 200
FOR y=0 TO 97
DRAWANIM 2, x + y*1, 1*x, 1*y
NEXT
NEXT

SHOWSCREEN
WEND
Ich weiß ehrlich nicht wie ich es anpacken soll. Habe natürlich erstmal das Hilfe-Beispiel übernommen und dann daran rumgespielt, weil ich die Leseart noch nicht blicke. Da immer das selbe Ergebnis rauskam kam bin ich durch meine learning-by-doing- Strategie auch nicht  weiter.
Sagen wir mal ich möchte von dieser 1305*97 Pixel großfen Grafik 200*97 pixel Ausschnitte weiterlaufen sehen. Was müsste ich verändern oder was muss ich dazu noch wissen? Tschuldigt bitte für absolute Non-Knowhow aber ich bin wirklich absolutes Frischfleisch hier ; ). Mit der Zeit kann ich meine Fragen sicher auch präziser stellen. Danke für euer Verständnis. Lg Veritas
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Kitty Hello

In der Hilfe ist
% -> Ein Fehler, muss # sein :P
# -> Eine Zahl
$ -> eine Zeichenkette
## -> Eine Zahlenvariable (BYREF)
$$ -> Eine Zeichenkettenvariable (BYREF)

Code (glbasic) Select
IF KEY (57) THEN FOR x=0 TO 200
                FOR y=0 TO 97
DRAWANIM 2, x + y*1, 1*x, 1*y
NEXT
NEXT
AU!!!

Muss so sein:
Code (glbasic) Select
IF KEY (57) // THEN
   FOR x=0 TO 200
      FOR y=0 TO 97
         DRAWANIM 2, x + y*1, 1*x, 1*y
      NEXT
   NEXT
ENDIF

Veritas

Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

D2O

Hi Veritas,
mir ist da was aufgefallen was früher oder später ein Problem für Deine Programme werden wird.

Du schreibst die Path angaben alle Absolut, besser wäre es Relative Path angaben zu nutzen.

Hier,
QuoteLOADANIM "E:/Programmierung/GLBasic/GLBasic/REG/Grafik/Rolle.png", 2, 1305, 97
LOADFONT "E:/Programmierung/GLBasic/GLBasic/REG/smalfont.png", 1
muss de "Nutzer" Deines Programms alles geau so Installieren damit es Läuft,

E:/Programmierung/GLBasic/GLBasic/REG/Grafik/Rolle.png

Sollte es anstatt auf dem Laufer E:/ ins Laufwerk D:/ gespeichert sein, läuft es nicht mehr!

Besser ist es also Relative zur *.exe datei schreiben.
Also wenn die *.exe im Ordner REG sein soll, muss es so heisen:

QuoteLOADANIM "Grafik/Rolle.png", 2, 1305, 97
LOADFONT "smalfont.png", 1
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

Vollkommen richtig D²0 :P

Das macht jeder mal am Anfang mit ^^

@ Veritas:

Egal was du für Fragen hast, frag einfach!
Hier sind lauter nette Leute ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Veritas

Ja, das mit den relativen Pfadangaben kenn ich schon aus HTML-Zeiten =). Da ich aber Anfangs so Probleme mit den Pfadangaben hatte, wollte ich diese Fehlerquelle zumindest am Anfang auf jeden Fall ausschließen. Nicht das ich dann vlt sogar was richtig programmiere und mich Tage aufrege weil ich nichts sehe und dann nur der Pfad nicht stimmt. Sowas wäre echt ärgerlich.
Ja ich merk schon ^^ Ihr seid sehr genügsam was Anfänger angeht *knicks*.
Danke
LG Nico.
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Veritas

#8
So lang lang hats gedauert. Hab mich bemüht keinen neuen Thread aufzumachen sondern HIER anzuknüpfen. Es ging ja um die Sprite-"kette". Alle meine Mitleser haben ja mitbekommen worum es sich später drehen soll. Es soll eine Art einarmiger Bandit sein. Wenn man also den Knopf drückt soll auf dem Monitor so ein Szenario ablaufen wie man das von den Dattelautomaten kennt.

Habe die Idee etwas verändert. Man soll die Illusion einer drehenden Rolle haben. Habe also einen Viewport gebastelt. Über dem Viewport und somit im nicht sichtbaren Berreich liegen die Bilder alle auf einem Stapel. Startet man das Programm läuft das erste Bild los und ab einem gewissen Punkt hängt sich das Zweite einfach dran usw.. Verlassen die Bilder den Viewport werden sie automatisch in den Stapel zurückgeschoben. Wenn das letzte Bild diesen gewissen Punkt erreicht wird statt dem nächsten wieder das erste Bild geladen.
Also an und für sich eine "perfekte" Rolle.

Das war soweit meine Theorie. Geschrieben habe ich es auch "schon". Allerdings "zuckt" die Animation und es gibt noch andere Problemchen.

1. Die Animation zuckt, nach jedem Durchlauf kurz.
2. Die Schleife ist nach einem Durchlauf nicht schnell genug wieder "oben" um eine lückenlose Anzeige zu gewähren. Es ist also ein Zeitproblem. An der Stelle an der Anfang und Ende der Bilderkette zu einer Rolle verklebt werden sollen ist ein kleiner Abstand zu sehen.
Der kommt wohl durch das Neustarten der Schleife zuststande. Habe diesen Abstand primitiv behoben, indem ich das ERSTE Bild nach dem ersten Durchlauf einfach 4 Pixel weiter unten Anzeigen lasse. So sieht man keine Lücke mehr. Eine Profilösung ist es jedoch auch nicht.

Code (glbasic) Select
AUTOPAUSE FALSE

LOADFONT "smalfont.png", 10
LOADSPRITE "Pics/01.png", 1
LOADSPRITE "Pics/02.png", 2
LOADSPRITE "Pics/03.png", 3
LOADSPRITE "Pics/04.png", 4
LOADSPRITE "Pics/05.png", 5
LOADSPRITE "Pics/06.png", 6
LOADSPRITE "Pics/07.png", 7
LOADSPRITE "Pics/08.png", 8
LOADSPRITE "Pics/09.png", 9

GLOBAL displayUpdateFreq = 60  // set this to the actual freq of your display
GLOBAL uDelay = displayUpdateFreq
SETFONT 10

Geschwindigkeit=3
Va=Geschwindigkeit
// Startwerte: kein Bild bewegt sich AUSSER bild a (Velocity A daher auch = Geschwindikeit )
Vb=0
Vc=0
Vd=0

od=0
oa=0
ob=0
oc=0

Obenmin=150
Untenmax=350

LIMITFPS displayUpdateFreq // Von OCEAN

bs = 0 // Pixeladdition --> Zeitausgleich es wird nichts addiert
WHILE TRUE

VIEWPORT 250, 100, 265, 193  // lädt das "Guckloch" die Koordinaten des Rechtecks müssen dann automatisch 0,0, sein
DRAWRECT 0, 0, 265, 193, RGB(255, 255, 255)

DRAWSPRITE 1, 35, oa-150

oa=oa+Va // 1. Bild läuft los

IF oa>Obenmin THEN Vb=Geschwindigkeit // 2. Bild läuft los
IF oa>Untenmax
   oa=0 + bs // 1. Bild wird nullgesetzt // + Faktor bs (Zeitausgleich)
   Va=0 // 1. Bild bleibt wieder stehen
ENDIF

bs = 4 // Pixeladdition --> Zeitausgleich es werden 4 Pixel für alle folgenden Durchläufe addiert

DRAWSPRITE 2, 35, ob-150

ob=ob+Vb // Laufbefehl 2.Bild
IF ob>Obenmin THEN Vc=Geschwindigkeit //3. Bild läuft los
IF ob>Untenmax
   ob=0 // 2. Bild wird nullgesetzt
   Vb=0 // 2.Bild bleibt wieder stehen
ENDIF
DRAWSPRITE 3, 35, oc-150

oc=oc+Vc // Laufbefehl 3.Bild
IF oc>Obenmin THEN Vd=Geschwindigkeit //4. Bild läuft los
IF oc>Untenmax
   oc=0 // 3. Bild wird nullgesetzt
   Vc=0 // 3.Bild bleibt wieder stehen
ENDIF
DRAWSPRITE 4, 35, od-150

// Hier irgendwo Bug?
od=od+Vd // Laufbefehl 4.Bild
IF od>Obenmin THEN Va=Geschwindigkeit //1. Bild läuft los
IF od>Untenmax
   od=0 // 4. Bild wird nullgesetzt
   Vd=0 // 4.Bild bleibt wieder stehen
ENDIF

printfps(100,10)

   SHOWSCREEN

GOSUB update_uDelay
   SLEEP uDelay
WEND


Natürlich hier das ganze nochmal komplett.
http://www.fileden.com/files/2007/10/4/1481495/cpu2.rar
Bin offen für alles. Wenn die Idee, die ich hatte totaler Müll ist und jemand eine besseren Ansatz für so eine "Rolle" hat, dann gerne raus damit =).
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Veritas

Hey Leute, hat wirklich keiner eine Idee warum oder wieso es zum zucken kommt? Seh nur ich das?
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Schranz0r

ich mach dir gleich mal ein beispiel ;)

EDIT:

Muss bis zum Wochenende warten :/
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

BumbleBee

Was zuckt da? Bei mir zuckt (noch) nix. =D Ich würde das eh bisschen anders machen, aber so hat halt jeder seinen eigenen Stil. :)

Nebenbei, wenn die Sprites eh den gleichen Namen haben, gehts einfacher wenn du
anstatt:

Code (glbasic) Select

LOADSPRITE "Pics/01.png", 1
LOADSPRITE "Pics/02.png", 2
LOADSPRITE "Pics/03.png", 3
LOADSPRITE "Pics/04.png", 4
LOADSPRITE "Pics/05.png", 5
LOADSPRITE "Pics/06.png", 6
LOADSPRITE "Pics/07.png", 7
LOADSPRITE "Pics/08.png", 8
LOADSPRITE "Pics/09.png", 9


zum Beispiel so lädtst:

Code (glbasic) Select

FOR i=1 TO 9
  LOADSPRITE "Pics/0" + i + ".png",i
NEXT   


und etwas übersichtlicher.  :)

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Veritas

ja naja, also bei mir zuckt es so alle paar Schleifen. Ich finds persönlich als Anfänger immer übersichtlicher wenn man erstmal alles sieht, deswegen mach ichs dann lieber noch so. Trotzdem danke für den Hinweis, könnt man später noch einbaun. LOADANIM ist so ne Sache ^^ ich wollte in dem Fall alle Bilder wirklich einzeln haben, bin ich altmodisch :P?
Obwohls später sicher ne gute alternative wäre, wenn man einen Bildersatz durch andere ersetzen möchte muss man nicht 9 sonder nur 1 Bilddatei austauschen.
Vielleicht bin ich auch nur zu sensibel und kritisch, das ist einfach so ein naja, wie wenn man die Herzrate kurz sieht. Nur das man es nur im Viewport sieht und nicht über dem ganzen Bildschirm. Das Programm ist ja doppelt und dreifach auf 60Hz und mein Tft ist es logischerweise auch ^^. Deswegen dürfts eigentlich an nix anderem liegen.
Aber dabei fällt mir was ein. Könnte das was mit V-Sync zu tun haben?

Weiß ja nicht wie GlBasic das macht aber im Normalfall würd ich sagen, wenn mans ihm nicht mitteilt tuts auch nix.
Also vielleicht braucht mein Programm einfach ne V-Synchronisation. Hat davon jemand Ahnung hier?
LG Veritas
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

peterpan

Hallo Veritas,

Du hast einen Tft, der hat keinen Vertical Blank, das
gibt es nur bei Monitore, alte Fernsehapparate.
Vertical Blank steht für Zeilen Rücklauf.
Das heißt, wenn der Elektronenstrahl unten angekommen ist, dann
wird er wieder Diagonal  zu seiner Ausgangsposition geführt.
Und das ist dann die Black phase, der VSync, der dann abgefragt wird.

Hier mal ein Beispiel, wie Ich das früher gemacht habe.

Proc WaitRetrace
mov dx,3dah   ;input Status Register 1
wait1:           
in al,dx          ;Bit 3 wird 0 wenn Strahl beim Bildaufbau
test al,8
jnz wait1
wait2:
in al,dx          ;Bit 3 wird 1 wenn Retrace
test al,8
jz wait2
ret               ;jetzt ist Strahl ganz unten am Bildrand
EndProc

Ist heutzutage nicht mehr nötig, wir haben Page flipping.
LIMITFPS ist nicht Deine Frequenz, dass sind die Frames.

GOSUB update_uDelay
SLEEP uDelay   
kann ganz weggelassen werden, hat überhaupt keine Funktion!
Die Geschwindigkeit bleibt immer gleich.

Bei mir zuckt gar nichts, es bleiben immer 60 - 61 Frames.

Und was sollen die Globale in einer Function ?