Frage zu beispiel aus einem Tutorial

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Bassmaster

Betreff: Frage zu beispiel aus einem Tutorial

BeitragDo, Jan 10, 2008 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir von der Seite www.robsite.de folgendes Tutorial runtergeladen.

Rob´s BB-Kurs 2

an dieser Stelle komm ich nicht weiter:


Jetzt könne wir bilder anzeigen. Jubel.
Was aber wenn wir seit 5 Jahren an C&C 6 basteln und erstaunt feststellen dass unsere Figuren keine Animationen haben? Dann nehmen wir uns einen Keks und schauen uns LoadAnimImage an.
Blitz Basic bietet nämlich auch die Möglichkeit ganz einfach aus mehreren Einzelbildern intern "ein" animiertes zu machen. Oder besser gesagt aus einem Filmstreifen die einzelnen Bilder zu extrahieren und gemeinsam in eine Bildvariable zu laden. Also, erstmal der Befehl:

bildvariable = LoadAnimImage("bild.bmp", hoehe, breite, erstes_bild, bilder_anzahl)



hoehe und breite geben die Höhe und breite eines Einzelbildes im großen Gesamtbild an (alle Einzelbilder müssen gleich groß sein, klar). erstes_bild ist das erste Bild in der Reihe. Gewöhnlich ist es 0. bilder_anzahl ist die Gesamtanzahl der Bilder die in dem "Filmstreifen" drin sind. Wenn man sehr viele Einzelbilder hat muss man auch nicht unbedingt alle in einer Reihe haben, man kann das ganze auch wie in einem Comic anordnen, also von links nach rechts und von oben nach unten.

Da nun mehrere Bilder in einer Bildvariable sind muss man die ganzen Bilder-Mal-Befehle um einen Parameter erweitern, nämlich um die Nummer des Einzelbildes (des Frames). Einfach hinten dranhängen:

DrawImage bildvariable, x, y, frame
DrawBlock bildvariable, x, y, frame
TileImage bildvariable, x, y, frame
TileBlock bildvariable, x, y, frame



Zählt man jetzt in einer Schleife die Framezahl immer eins weiter (mit kleinen Pausen dazwischen) und fängt nach dem letzten wieder von vorne an, hat man schonmal eine einfache Animation. Kann man natürlich noch beliebig ausweiten...

Beispiel:


[img]
http://img-up.net/?up=trooprunnetDjAtRg.gif
[/img]

[img]
http://img-up.net/?up=trooprunnePu80w.GIF
[/img]


Wie muss ich den jetzt genau den Source Code aufbauen kann mir da wer ein beispiel geben ?

und muss ich das erste bild komplett in den speicher laden oder nur einzelene davon O_o ??

Smily

BeitragDo, Jan 10, 2008 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann es versuchen so zu erklären:

Loadanimimage liefert nicht nur ein Bild zurück, sondern ein "Bündel" aus mehreren Bildern.

bildvariable = LoadAnimImage("bild.gif", 56, 48, 0, 12)

wäre jetzt das Konkrete beispiel für das beispielbild.
Damit hast du jetzt gleichzeitig 12 bilder, mit denen du arbeiten kannst:

Drawimage img, x, y, 0
Drawimage img, x, y, 1
Drawimage img, x, y, 2
....
Drawimage img, x, y, 11

der Rest ist genauso handzuhaben wie bekannt.

Eine idee der umsetzung wäre z.B., dass du eine Variable Frame hast, die in der Schleife immer um 1 erhöht wird. und dann schreibst
Code: [AUSKLAPPEN]
Drawimage img, x, y, frame mod 12

"mod" ist btw die restrechnung
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Bassmaster

BeitragDo, Jan 10, 2008 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das jetzt so versucht.




Graphics 800,600

Global frame

For frame = 1 To 11 Step 1

bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)

DrawImage bild, x, y, frame
DrawBlock bild, x, y, frame
TileImage bild, x, y, frame
TileBlock bild, x, y, frame

Next







Da bewegt sich zwar was aber dann is das ganze Fenster voll mit den Bildern und das ist nach ein paar Sekunden wieder zu ende. Oder geht das nur mit gif bilder den ich bin gerade aufer arbeit und hier hab ich nur die Demo ich hab vergessen die Vollversion mit zu nehmen Confused Und die Demo Unterstützt kein gif Sad

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 10, 2008 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach Graphics sollte man den Puffer angeben (meistens SetBuffer BackBuffer()). Ladebefehle gehören nicht in eine Schleife. Nach dem zeichnen sollte man mit Flip die Puffer tauschen und den hinteren (nur bei 2D) mit Cls löschen. Dann kann das ganze wieder von vorne beginnen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ozzi789

BeitragDo, Jan 10, 2008 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Bassmaster hat Folgendes geschrieben:
Da bewegt sich zwar was aber dann is das ganze Fenster voll mit den Bildern


Lass das TileImage weg.

Das bewirkt das das Bild möglichst viel "gezeichnet" wird.
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Bassmaster

BeitragDo, Jan 10, 2008 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Bewegen tut er sich ja aber nach ca. 3 Sec bekomm ich die meldung.

Runtime Error
Image Frame out of range



und das ganze fenster ist auch noch immer voll mit dem bild Sad

Ach ja und noch eine Frage^^

Gibt es auch noch andere Compiler als den Blitz 3D ?

Weil der zeigt ja leider nicht an in welcher Zeile z.b. der Fehler ist.

Neben Blitz Basic mache ich ja auch noch C++ und die C++ Compiler zeigen halt an wo man einen Fehler gemacht hat deswegen dachte ich das es sowas auch vielleicht für Blitz Basic gibt.

Der Eisvogel

BeitragDo, Jan 10, 2008 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Denk mal nach!
Code: [AUSKLAPPEN]
TileImage
;und
TileBlock


Du must beides entfernen.

EDIT: Zu deiner Fehlermeldung, übersetzt mal, dann weißt du was falsch ist. Wink
 

Bassmaster

BeitragDo, Jan 10, 2008 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja der Frame ist nicht in Range also nicht im Bereich aber das sagt mir nix Crying or Very sad

Ich mach Blitz Basic erst seit 2 Tagen und will das Tutorial durcharbeiten.

Aber wenigstens ist jetzt nicht mehr das ganze fenster voller bilder^^





Graphics 800,600
SetBuffer BackBuffer()


Global frame


For frame = 1 To 12 Step 11

bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
DrawImage bild, x, y, frame
Cls
DrawBlock bild, x, y, frame


Flip


Next

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 10, 2008 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
- Du lädst immer noch innerhalb einer Schleife deine Bild immer wieder neu.

- Nach einem Flip sollte der Bildschirm gelöscht werden, nicht weitere Bilder gezeichnet werden.

- Die Variablen x und y sind nicht deffiniert und müssten beide den Wert 0 haben (nur als Info).


Da du grad mit programmieren anfängst, gewöhne dir gleich folgendes an:

- Rücke den Code immer mit Tabulator ein, oder bei der Blitz3D-Vollversion eine andere IDE ausprobieren.

- Deklariere jede deiner Variable zuvor mit ql:Local oder ql:Global

- Installiere dir die deutsche Onlinehilfe von TheShadow


Hier mal meine Ergenzung zum Code:

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()

Local Frame,X,Y
Local Bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)


For Frame = 1 To 11
   X=X+20
   Y=100
   DrawImage Bild, X, Y, Frame
   DrawBlock Bild, X, Y, Frame
   Flip
   Cls
Next


Print "Taste drücken um zu beenden."
WaitKey
End


Exclamation Beachte dass Print eher für Debugingzweke benötigt wird. In diesem Fall nur eine Info für dich. In späteren Projekten (die du also so im Umlauf bringst) benutze dann ql:Text.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Der Eisvogel

BeitragDo, Jan 10, 2008 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast geschrieben
Zitat:
Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()


Global frame


For frame = 1 To 12 Step 11

   bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
   DrawImage bild, x, y, frame
   Cls
   DrawBlock bild, x, y, frame


Flip


Next

es muss aber heisen:
Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()

Global frame
bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)

For frame = 0 To 1 ;-->Step 11 das kannst du weglassen
   Cls
   DrawBlock bild, x, y, frame
   Flip
Next

wenn du mit "LoadAnimImage" arbeitest musst, wenn das erste Frame haben wilst schreiben:
Code: [AUSKLAPPEN]
DrawImage bild,x,y,0

und nicht:
Code: [AUSKLAPPEN]
DrawImage bild,x,y,1

denn dann würde das 2. Frame angezeigt werden. Wink

EDIT: Hectic war schneller.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Jan_

Ehemaliger Admin

BeitragDo, Jan 10, 2008 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo mein lieber Neuling.
Willkommen in der Welt der Programmierung.

Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()
Global frame
For frame = 1 To 12 Step 11 ; gehe von 1 bis 12 in 11er schritten !!!
  bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
  DrawImage bild, x, y, frame
  Cls
  DrawBlock bild, x, y, frame
  Flip
Next

wir wollen dioch nciht jedes 11. Bild sehen, sondern jedes.
Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()
Global frame
For frame = 1 To 12 Step 1 ;<--  in 1ser schritten bitte
  bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
  DrawImage bild, x, y, frame ;<-- Anzeigen des Bildes
  Cls ; <-- den Bildschirm schwarz machen
  DrawBlock bild, x, y, frame ; <-- Bild anzeigen
  Flip ;<-- Bildschirm anzeigen
Next

das macht wenig sinn, denn das drawimage, wird von uns nicht gesehen, weil wir danach ein CLS machen.
das cls muss immer VOR allen draw - befehlen stehen
Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()
Global frame
For frame = 1 To 12 Step 1
  bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
  cls
  DrawImage bild, x, y, frame ;<-- Bild anzeigen
  DrawBlock bild, x, y, frame ; <-- Bild anzeigen
  Flip ;<-- Bildschirm anzeigen
Next

jetzt sehen wir noch, wir zeigen 2 mal des selbe bild an, also, nehmen wir 1mal raus
Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()
Global frame
For frame = 1 To 12 Step 1
  bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
  cls
  DrawImage bild, x, y, frame
  Flip
Next

nun geht das unheimlich schnell (60 Bilder prosekunde --> 12 bilder in 0.2 Sekunden), darum machen wir eine Pause rein,.
Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()
Global frame
For frame = 1 To 12 Step 1
  bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
  cls
  DrawImage bild, x, y, frame
  Flip
  delay 1000; <-- eine sekunde warten bitte
Next

so, nun beschwerde, der fehler kommt immernoch?
lass uns doch herrausfidnen, bei welchem bild:
Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()
Global frame
For frame = 1 To 12 Step 1
  bild = LoadAnimImage ("runner.bmp", 20, 20, 0, 12)
  cls
  DrawImage bild, x, y, frame
  text 0,0,frame ; <-- einen kleine infotext zur hilfe
  Flip
  delay 1000
Next


so alles einiger massen klar?
between angels and insects
 

Bassmaster

BeitragDo, Jan 10, 2008 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt funktioniert Very Happy ty

Aber ein paar Fragen hätte ich noch zum Code

X=X+20 <--- bestimmt das wie weit das bild laufen soll ?

Local Frame,X,Y <---- ist das dass selbe wie Local Frame = X,Y

Der Eisvogel

BeitragDo, Jan 10, 2008 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
X=X+20 -->Das bedeuted, wenn du ein Bild an der Position gemalt hast, das es um 20 Pixel verschoben wird
Local Frame=x,y ist (meinesachrens) nicht das Gleiche, bei Local Frame,x,y gibt es warscheinlich sogar eine Fehlermeldung.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

Bassmaster

BeitragDo, Jan 10, 2008 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke an alle für die hilfe =)

Eingeproggt

BeitragDo, Jan 10, 2008 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Local Frame,X,Y <---- ist das dass selbe wie Local Frame = X,Y


Diesen Fehlglauben sollten wir aber ganz schnell aus der Welt schaffen.
Wenn du es selber probieren willst, schau dir die deutsche Beschreibung zu ql:Local an.

Hier mal schnell in meinen Worten:
An Local kannst du beliebig viele Variablen übergeben, mit Beistrich getrennt. DieseVarialben sind ab dann lokal, also nur innerhalb des Hauptprogramms oder innerhalb einer Funktion gültig sind.
"=" ist hingegen eine Zuweisung. Diese ist bei Local auch möglich, hat aber eine vollkommen andere Bedeutung. Damit wird eben einer der aufgelisteten Variablen ein Wert zugewiesen.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Bassmaster

BeitragDo, Jan 10, 2008 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich bin jetzt zuhause jetzt wollte ich das nochmal mit der Vollversion ausprobieren und einem gif bild aber ich bekomme immer die fehlermeldung "image does not exist" aber das Bild hab ich den denn Ordner kopiert da wo auch der Source Code ist.

Oder ist hier was falsch dran O_o



Graphics 800,600
SetBuffer BackBuffer()
Global frame
For frame = 1 To 12 Step 1


bild = LoadAnimImage ("runner.gif", 20, 20, 0, 12)

Cls
DrawImage bild, x, y, frame
Text 0,0,frame ; <-- einen kleine infotext zur hilfe



Flip
Delay 1000
Next
 

ChristianK

BeitragDo, Jan 10, 2008 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Es reicht, wenn du das Bild einmal lädst. Außerdem ist der vierte Parameter bei LoadAnimImage 0, das heisst, die Frames gehen von 0 bis 11. Du hast aber in der Schleife 1 bis 12.

So ungefähr:
Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer( )

Global bild = LoadAnimImage( "runner.gif", 20, 20, 0, 12 )

For frame = 0 To 11
   Cls
   DrawImage bild, 0, 0, frame
   Text 0, 0, frame ; <-- einen kleine infotext zur hilfe

   Flip
   Delay 1000
Next
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Bassmaster

BeitragDo, Jan 10, 2008 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieder die selbe Fehlermeldun Sad
ach ja noch eine Frage wie kann man bei Blitz Basic die Programme als exe abspeichern ?


Graphics 800,600
SetBuffer BackBuffer( )

Global bild = LoadAnimImage( "runner.gif", 20, 20, 0, 12 )

For frame = 0 To 11
Cls
DrawImage bild, 0, 0, frame
Text 0, 0, frame ; <-- einen kleine infotext zur hilfe

Flip
Delay 1000
Next

The_Nici

BeitragDo, Jan 10, 2008 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm bitte Codetags.
Code: [AUSKLAPPEN]
[code][/code]

In deinen Forenpost einfügen.

Dazu brauchst du für gifs und um in eine Exe zu kompilieren, die Vollversion.
(Program->Create Executable)
Und nicht jedes Gif geht, nimm lieber PNG's mit Frames.[/code]
 

DennY

BeitragDo, Jan 10, 2008 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi !

Bassmaster hat Folgendes geschrieben:

ach ja noch eine Frage wie kann man bei Blitz Basic die Programme als exe abspeichern ?


geh einfach oben im Menü auf "Programm" und dann auf "Create Executable..."

Bassmaster hat Folgendes geschrieben:

Graphics 800,600
SetBuffer BackBuffer( )

Global bild = LoadAnimImage( "runner.gif", 20, 20, 0, 12 )

For frame = 0 To 11
Cls
DrawImage bild, 0, 0, frame
Text 0, 0, frame ; <-- einen kleine infotext zur hilfe

Flip
Delay 1000
Next



Du hast wieder den selben Fehler gemacht! er lädt mehr Frames als es gibt!

Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer( )

Global bild = LoadAnimImage( "runner.gif", 20, 20, 0, 11 )     ;<------ von 0 bis 11!
 
For frame = 0 To 11
   Cls
   DrawImage bild, 0, 0, frame
   Text 0, 0, "frame" ; <-- einen kleine infotext zur hilfe

   Flip
   Delay 1000
next

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group