Animationen Erstellen

Anfängerfragen zum Programmieren mit PureBasic.
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Animationen Erstellen

Beitrag 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?
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Beitrag 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+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag 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
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag 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:
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Beitrag 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?
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag 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.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Beitrag von Raphi »

Und wie mach ich das am Codebeispiel von Christian+
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag 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 
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Beitrag von Raphi »

Danke, klappt wunderbar :allright:

Müssen die bilder denn ein bestimtes format (bmp,png ...)
haben oder ist das egal
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag 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.
Zuletzt geändert von Mok am 13.08.2009 18:31, insgesamt 1-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Antworten