Seite 2 von 3

Re: Animationen Erstellen

Verfasst: 11.08.2009 19:21
von Raphi

Code: Alles auswählen

InitSprite()
OpenScreen(640,480,16,"Name") 
For X = 1  To 10
LoadSprite(10+x,"Fass"+Str(x) + ".bmp",0)
TransparentSpriteColor(10+x,RGB(255,0,255))
Next

flipbuffers()
for x=1 to 10
DisplayTransparentSprite(10+x,100,100)
next
das ist der gesamte code.

Ich weiß nich was daran falsch ist?

Verfasst: 11.08.2009 20:11
von Christian+
Bei deinem Code stimmt einiges noch nicht, denn du rufst FlipBuffers() nur einmal am Anfang auf und Zeigst dann alle Bilder übereinander an worauf du das Programm enden lässt ohne noch einmal FlipBuffers() aufzurufen damit man auch was sieht. Ich habe mal deinen Code kurz etwas verändert so dass er die Animation anzeigt bis man Escape drückt. Ich würde dir empfehlen zu den Befehlen in meinen Beispiel mal in der Hilfe nachzulesen was sie bewirken das wird dir viel helfen denn man kann dir ja nicht alles extra erklären wenn es dann immer noch nicht verstehst kannst immer noch fragen aber ich denke die Hilfe kann die meisten Fragen beantworten.

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(640,480,16,"Name")

For X = 1  To 10
 LoadSprite(10+x,"Fass"+Str(x) + ".bmp",0)
 TransparentSpriteColor(10+x,RGB(255,0,255))
Next

Repeat

ExamineKeyboard()

 x=x+1
 If x>10
  x=1
 EndIf

 DisplayTransparentSprite(10+x,100,100)
 
 FlipBuffers()

Until KeyboardReleased(#PB_Key_Escape)

End
mfg Christian+

Verfasst: 11.08.2009 20:48
von kswb73
Ich geb dir mal einen Crashkurs in Sachen Sprite and Screen.

Sprites
Sprites sind Bilder die du auf einen Screen (Vollbild) bzw. windowedScreen (ähnlich wie Vollbild, nur eben in einem Fenster) darstellen kannst. Jedes hat ein Nummer die größer/gleich 0 ist. An dieser Nummer, auch ID genannt, kann das Sprite eindeutig erkannt werden. Ein Sprite kann beliebig häufig auf einem Bild vorkommen. Man muss nicht für jedes Haus ein neues Sprite laden, wenn alle gleich aussehen.
Sprites können übringends auch eine Transparente Farbe haben. Standardmäßig ist dies Schwarz. Das heißt immer wenn du mit DisplayTransparentSprite() ein Bild anzeigst, wird alles was im Normalfalls schwarz wäre nicht angezeigt. Bei DisplaySprite() entfällt dieser Effeckt.

Screen
Ein Screen ist, wie du sicher erkannt hast ein schwarzer Bildschirm. Das ist vollkommen richtig so, solange du noch nichts mit ihm machst. Bei Screens musst du übringends aufpassen, das die Auflösung die du verwendest auch von deinem Bildschrim unterstüzt wird.
Screens arbeitem mit einem so genannten doublebuffer System. Das heißt du hast in wahrheit zwei Bildschirme und nicht einen. Einer wird angezeigt und auf dem anderen baust du das nächste Bild auf. Man kann sich das wie zwei Tafeln vorstellen. Eine zeigst du zum Publikum und auf der anderen bereitest du das nächste Schaubild vor. Wenn du jetzt die Tafeln vertauscht, musst du sie natürlich sauber machen, sonst wäre ja noch das alte Bild drauf. In der Realität muss man mühsam mit einem Schwamm wischen, in PureBasic reicht ClearScreen().
Bei ClearScreen() musst du die Farbe angeben mit die der Bildschirm gefüllt wird. Dies geschieht häufig mit ClearScreen(rgb(Rot,Blau,Grün)). Für Rot, Blau und Grün musst du dann nurnoch die Farbwerte eingeben.
Jetzt ist die Tafel sauber und kann bemalt werden. Dies kannst du, wie du schon festgestellt hast mit DisplaySprite() bzw. DisplayTransparentSprite() machen (siehe oben). Wenn du damit fertig bist musst du die Tafeln bzw. Bildschirme (auch Buffer genannt) wieder fertauschen. Dafür ist in PureBasic FlipBuffers() zuständig. Man könnte vereinfacht sagen, das FlipBuffers() deine Bilder anzeigt.

Beispiel

Code: Alles auswählen

;Die Init... Befehle werden immer am Anfang aufgerufen.
InitSprite()
InitKeyboard()

OpenScreen(1024,768,32,"Stadt") ;Den Bildschirm öffnet man am 
;besten so früh wie möglich

;Dannach lädt man für gewöhnlich seine Sprites usw. Wichtig ist
;das man die Sprites erst nach OpenScreen() ladt, da es sonst 
;zu Fehlern kommt.
LoadSprite(0,"Haus.bmp")


;WICHTIG: DisplaySprite() und DisplayTransparentSprite() haben nichts 
;außerhalb der Folgenden Schleife zu suchen, da sie sonst nur 1-mal
;ganz kurz angezeigt werden.

Repeat
;Diese Abfrage kannst du weglassen, sie erleichter dir aber später
;das Leben erheblich, wenn du mit 2ddrawing arbeitest.
  If IsScreen() 
  ClearScreen(RGB(0,0,255)) ;Wir haben jetzt einen Blauen Bildschirm
  ExamineKeyboard()
    
  ;WICHTIG: Baue immer eine Möglichkeit ein, dein Programm zu beenden.
  ;Das geht es viel leichter dein Programm zu beenden.
    If KeyboardPushed(#PB_Key_Escape)
    End
    EndIf
  
  ;Hier zeigen wir dann das an, was später zu sehen sein soll.
  DisplayTransparentSprite(0,400,500)
  
  EndIf
;Wir vertasuchen unsere beiden Bildschirme
;Lässt du diesen Befehl weg, meinst Windows dein Programm sei abgestürzt
FlipBuffers()
ForEver

Verfasst: 12.08.2009 00:02
von jojo1541
@Kai:

Wenn ich einen Code, der Sprites benutzt, die im Projektordner liegen, mit F5 kompiliere, benutzt er auch bei relativen Pfaden das Projektverzeichnis.
Würde er das nicht tun, hätte ich schon viele Fehlermeldungen bekommen. :wink:

Verfasst: 13.08.2009 17:49
von Raphi
Danke, ich hab noch ein

Code: Alles auswählen

ClearScreen
eingefügt und es funktioniert tadelos. <)

Aber kann ich die animation jetzt auch irgendwie langsamer laufen alssen,
ohne mehr bilder abzuspielen?

Verfasst: 13.08.2009 17:54
von kswb73
Die Funktion von ClearScreen() wird auch erst dann sichtbar, wenn du mehr Bewegung drinn hast. Alternativ kannst du auch den ganzen Bildschirm mit Bildern füllen. Dann ist ClearScreen() überflüssig.
Wenn du eine Animiation langsamer abspielen willst, ohne mehr Bilder zu werden, so zeigst du ein Bild einfach mehrfach an.

Verfasst: 13.08.2009 18:04
von Raphi
Und wie mach ich das am Codebeispiel von Christian+

Verfasst: 13.08.2009 18:12
von kswb73

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(640,480,16,"Name")

For X = 1  To 10
 LoadSprite(10+x,"Fass"+Str(x) + ".bmp",0)
 TransparentSpriteColor(10+x,RGB(255,0,255))
Next

Anim=0 ;Eine zusätzliche Variable
x=1 ;WICHTIG X muss jetzt vorher direkt auf 1 gesetzt werden.
Repeat

ExamineKeyboard()

Anim+1
  If Anim>3 ;Zeigt jedes Bild drei mal an.
  Anim=1
  x=x+1
    If x>10
    x=1
    EndIf
  EndIf

 DisplayTransparentSprite(10+x,100,100)
 
 FlipBuffers()

Until KeyboardReleased(#PB_Key_Escape)

End 

Verfasst: 13.08.2009 18:17
von Raphi
Danke, klappt wunderbar :allright:

Müssen die bilder denn ein bestimtes format (bmp,png ...)
haben oder ist das egal

Verfasst: 13.08.2009 18:22
von Mok
Das Format BMP kannst du ohne weiteres benutzen, nur ist es eines der bescheuertsten Formate, da es Platz frisst wie ein Wal das Wasser.
Alternativ könnte man
  • JPEG (Platzverbrauch: +++   Qualität: --)
  • JPEG-2000 (Platzverbrauch: +++ Qualität: --, jedoch höherer Rechenaufwand)
  • PNG (Platzverbrauch: ++ Qualität: ++)
  • TIFF (Platzverbrauch: ~ Qualität: ++)
  • TGA (Platzverbrauch: - Qualität: +)
benutzen, dafür braucht man aber spezielle Decoder, die nach den ganzen Init-Befehlen am Anfang des Programmes aufgerufen werden sollten.
Beispiel:

Code: Alles auswählen

InitSprite() : InitKeyboard() : InitMouse()
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

[... Code ...]
MfG, Mok


EDIT:
Ich persönlich benutze PNG, da es einfach und unaufwändig ist und es für mich ein ... "sympathisches" Format ist. Mach dir deine eigene Meinung zu den jeweiligen Formaten.