mehrere Animationen auf einmal!

Anfängerfragen zum Programmieren mit PureBasic.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

mehrere Animationen auf einmal!

Beitrag von D4uS1 »

Ich habe 3 Animationen die gleichzeitig laufen müssen und da ich den ganzen array Scheiß hasse, komm ich einfach nicht weiter.

Wenn ich eine Animation ablaufen lasse klappt alles einwandfrei, doch wenn ich noch eine dazu nehmen möchte nimmt der PC den flipbuffers() Befehl nicht mehr an und man muss FlipBuffers() bei beiden Animationen einfügen, was ein ruckelndes Spielvergnügnen als Resultat bedeuted.

Füge ich Flipbuffers hinter den beiden Animationen ein, sieht man bei beiden nur ein StandBild.

usw.

Kann mir jemand helfen?
Ghost
Beiträge: 141
Registriert: 10.04.2006 09:10

Beitrag von Ghost »

Wo genau hast du den Flipp Buffers Befhl stehen?
falls du ihn nicht kurz vor until hast packe ihn mal dahin.

>>>doch wenn ich noch eine dazu nehmen möchte nimmt der PC den flipbuffers() Befehl nicht mehr an und man muss FlipBuffers() bei beiden Animationen einfügen,

Niemals 2mal Flipp Buffers in einer repeat until schleife verweden ! einmal reicht völlig aus da dieser Befhel nur den Backbuffer in den Frontbuffer zeichnet.

Kannst du vll. mal den ganzen code reinstellen (oder zumindestens ein Teil) das würde das lösen des Problemes vll. vereinfachen.
(nutze v. 3.3)
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(1024, 768, 16, "Test")

#Max_Anim2 = 34
#Max_Anim1 = 5
Dim Anim2.w(#Max_Anim2)
Dim Anim1.w(#Max_Anim1)



Procedure Animation() 

  For x = 1 To 5
    LoadSprite(x+5, "Bilder/Anim1" +Str(x) +".bmp") 
    TransparentSpriteColor(x+5, RGB(255, 0, 255)) 
  Next 
   For x = 1 To 5
    LoadSprite(x+34, "Bilder/Anim2" +Str(x) +".bmp") 
    TransparentSpriteColor(x+34, RGB(255, 0, 255)) 
   Next 
  
  Repeat 
  ExamineKeyboard() 
  ClearScreen(0) 
 
 For x = 1 To 5
  DisplayTransparentSprite(x+5, 300, 300)
 Next
  For x = 1 To 34
   DisplayTransparentSprite(x+34, 100, 100)
  Next
 FlipBuffers()
   
   
  Until KeyboardPushed(1) 
  
EndProcedure

Animation()
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, einrücken über wir noch, ebenso das sinnvolle verwenden von procedures...

dein kern-denkfehler ist, dass du for-next schleifen zum darstellen der anim verwendest.

Code: Alles auswählen

Repeat 
  ExamineKeyboard() 
  ClearScreen(0) 

  Anim1 +1
  If Anim1 > 5 : Anim1 = 1 : EndIf
  Anim2 +1
  If Anim2 > 34 : Anim2 = 1 : EndIf
  
  DisplayTransparentSprite(Anim1+5, 300, 300) 
  DisplayTransparentSprite(Anim2+34, 100, 100) 

  FlipBuffers() 
    
Until KeyboardPushed(1)
außerdem solltest du dir darüber einig werden, ob deine 2te anim nun 5 oder 34 frames hat.

und beginne mit dem zählen bei Null, nicht bei Eins,
bei Eins beginnt man nur wenn man Strings bearbeitet...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Danke erstmal, dat klappt ja jetzt, nur wenn ich die einzelnen Animationen bewegen möchte, durch tastaturbefehle, was mach ich denn dann? Ich hab jetzt folgenden Code, aber das Flugzeug bewegt sich nicht, ich kauere da jetzt schon seit ewigkeiten dran rum und hätte gerne ma ne Lösung um weiterzumachen :D .

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(1024, 768, 16, "Test")

Global Flieger.w
Global FliegerX.w
Global FliegerY,w
Global Flak.w
Global FlakX.w
Global FlakY.w
Global BewegFligerX.w
Global BewegFLigerY.w
FliegerX = 512
FliegerY = 568
    
   
  Repeat
  Flieger +1 
  If Flieger > 5 
  Flieger = 1 
  EndIf 

  Flak +1 
  If Flak > 34 
  Flak = 1 
  EndIf
  
  LoadSprite(Flieger+5, "Bilder/Spiel/Jet/Jet" +Str(Flieger) +".bmp")
  LoadSprite(Flak+34, "Bilder/Spiel/Flak/Flak" +Str(Flak) +".bmp")

  ExamineKeyboard()

  If KeyboardPushed(#PB_Key_All) = 0
  BewegFliegerX = 0
  BewegFligerY = 0
  EndIf
  If KeyboardPushed(#PB_Key_Up)
  BewegFliegerY = -4
  EndIf
  If KeyboardPushed(#PB_Key_Down)
  BewegFliegerY = 4
  EndIf
  If KeyboardPushed(#PB_Key_Left)
  bewegFliegerX = -4
  EndIf
  If KeyboardPushed(#PB_Key_Right)
  BewegFliegerX = 4
  EndIf
 
  
  BewegFliegerY + FliegerY
  BewegFliegerX + FliegerX
 

  DisplayTransparentSprite(Flieger+5, FliegerX+5, FliegerY+5) 
  DisplayTransparentSprite(Flak+34, FlakX, FlakY)
  FlipBuffers()
  ClearScreen(0)
 
  Until KeyboardPushed(1)
  
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

du solltest dich als erstes zwischen Flieger und Fliger oder FLiger entscheiden.


dann mußt du bei DisplayTransparentSprite) natürlich auch die 'Beweg'-variablen als koordinaten nehmen, und nicht die festen.


und du solltest die bilder einmal laden und nicht FramesPerSecond-mal pro sekunde.


ungetestet:

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(1024, 768, 16, "Test")

Global Flieger.w
Global FliegerX.w
Global FliegerY,w
Global Flak.w
Global FlakX.w
Global FlakY.w
Global BewegFliegerX.w
Global BewegFliegerY.w
FliegerX = 512
FliegerY = 568

For Flieger=1 To 5   
  LoadSprite(Flieger+5, "Bilder/Spiel/Jet/Jet" +Str(Flieger) +".bmp")
Next
For Flak=1 To 34
  LoadSprite(Flak+34, "Bilder/Spiel/Flak/Flak" +Str(Flak) +".bmp")
Next
   
Repeat
  Flieger +1
  If Flieger > 5
    Flieger = 1
  EndIf

  Flak +1
  If Flak > 34
    Flak = 1
  EndIf
 

  ExamineKeyboard()

  If KeyboardPushed(#PB_Key_All) = 0
    BewegFliegerX = 0
    BewegFliegerY = 0
  EndIf
  If KeyboardPushed(#PB_Key_Up)
    BewegFliegerY = -4
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    BewegFliegerY = 4
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    BewegFliegerX = -4
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    BewegFliegerX = 4
  EndIf
 
 
  BewegFliegerY + FliegerY
  BewegFliegerX + FliegerX
 

  DisplayTransparentSprite(Flieger+5, BewegFliegerX+5, FliegerY+5)
  DisplayTransparentSprite(Flak+34, FlakX, FlakY)
  FlipBuffers()
  ClearScreen(0)
 
Until KeyboardPushed(1)
 
my pb stuff..
Bild..jedenfalls war das mal so.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

jaaaaaaaaaaaaaaaaaaaa es klappt, daaaaankeee!!!!
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Hab doch noch n Problem, wollte jetzt n Gegner einfügen, jetzt verträgt sich das aber nicht mit der Animation des freundlichen Flugzeugs. Hier der Code, unnötiges bitte nicht beachten, weil ich dazu später noch was machen wollte.

Code: Alles auswählen

InitSprite() 
UseJPEGImageDecoder()
InitKeyboard() 

OpenScreen(1024, 768, 16, "Test") 

#Max_Gegner = 6
Dim Gegner.w(#Max_Gegner)
Dim GegnerX.w(#Max_Gegner)
Dim GegnerY.w(#Max_Gegner)
Global Flieger.w 
Global FliegerX.w 
Global FliegerY,w 
Global Flak.w 
Global FlakX.w 
Global FlakY.w 
Global BewegFliegerX.w 
Global BewegFliegerY.w 

Global MapX.w
Global MapY.w
Global BewegMapY.w

GegnerX = 200
GegnerY = 200
FliegerX = 512 
FliegerY = 568 
MapY = -9232
BewegMapY = 1
BewegGegnerY = 2

For Flieger=1 To 5    
  LoadSprite(Flieger+5, "Bilder/Spiel/Jet/Jet" +Str(Flieger) +".bmp") 
  TransparentSpriteColor(Flieger+5, RGB(255, 0, 255))
Next 
For Flak=1 To 34 
  LoadSprite(Flak+34, "Bilder/Spiel/Flak/Flak" +Str(Flak) +".bmp") 
  TransparentSpriteColor(Flak+34, RGB(255, 0, 255))
Next 
For Gegner=1 To 6
LoadSprite(Gegner+6, "Bilder/Spiel/Jet/Gegner/Gegner" +Str(Gegner) +".bmp")
TransparentSpriteColor(Gegner+6, RGB(255, 0, 255))
Next

LoadSprite(H1, "Bilder/Spiel/Maps/Deutschland.jpg")
    

Repeat 

Gegner +1
If Gegner > 6 
Gegner = 1
EndIf
 Flieger +1 
  If Flieger > 5 
    Flieger = 1 
  EndIf 
 Flak +1 
  If Flak > 34 
    Flak = 1 
  EndIf 
  

  ExamineKeyboard() 

  If KeyboardPushed(#PB_Key_All) = 0
   BewegFliegerX = 0
   BewegFliegerY = 0
  EndIf
  If KeyboardPushed(#PB_Key_Up) 
    BewegFliegerY = -4 
  EndIf 
  If KeyboardPushed(#PB_Key_Down) 
    BewegFliegerY = 4 
  EndIf 
  If KeyboardPushed(#PB_Key_Left) 
    BewegFliegerX = -4 
  EndIf 
  If KeyboardPushed(#PB_Key_Right) 
    BewegFliegerX = 4 
  EndIf 
  
  MapY = BewegMapY + MapY
  FliegerY = BewegFliegerY + FliegerY 
  FliegerX = BewegFliegerX + FliegerX 
  GegnerX = BewegGegnerX + GegnerX
  GegnerY = BewegGegnerY + GegnerY
  
  DisplayTransparentSprite(H1, MapX, MapY)
  DisplayTransparentSprite(Flieger+5, FliegerX+5, FliegerY+5) 
  DisplayTransparentSprite(Gegner+6, GegnerX+6, GegnerY+6)
  DisplayTransparentSprite(Flak+34, FlakX, FlakY) 
  FlipBuffers() 
  ClearScreen(0) 
  
Until KeyboardPushed(1) 
 
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

dann werde dir doch erstmal bitte drüber klar, welche sprites welche sind.

For Flieger=1 To 5 : LoadSprite(Flieger+5,

benutzt die spritenummern 6,7,8,9,10

For Gegner=1 To 6 : LoadSprite(Gegner+6

benutzt die spritenummern 7,8,9,10,11,12

oben hast du 5 frames, unten 6.

dazu fällt mir die parallelität auf, dass du bei der flak

For Flak=1 To 34 : LoadSprite(Flak+34

geschrieben hast. also anscheinend bist du dir nicht im klaren darüber,
was der unterschied zwischen dem startframe und der anzahl der frames ist.

wo auch immer du deine animations-vorkenntkisse herbekommen hast,
du solltest die quelle nochmal überprüfen.

außerdem solltest du deine kenntnisse davon, was variablen
eigentlich sind und was sie wie tun wesentlich erweitern.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

<edit: huch, na eben <) >

du meinst dass die animations-geschwindigkeit nicht mehr zusammen paßt? dann mußt du deine animationen zeit-gesteuert machen. z.b. statt in jedem frame den das bild hochzuzählen..

Code: Alles auswählen

  Gegner +1
  If Gegner > 6
    Gegner = 1
  EndIf
..machst du es aller 100 millisekunden

Code: Alles auswählen

Repeat

  ms=ElapsedMilliseconds()
  
  If ms>GegnerTimer
    Gegner +1
    GegnerTimer=ms+100
  EndIf
  If Gegner > 6
    Gegner = 1
  EndIf
  
das kannst du dann für die anderen animationen auch so machen, mit anderen geschwindigkweiten als 100 ms.



übrigens, solltest du deine ladevorgänge prüfen, also statt nur

Code: Alles auswählen

For Flieger=1 To 5   
  LoadSprite(Flieger+5, "Bilder/Spiel/Jet/Jet" +Str(Flieger) +".bmp")
  TransparentSpriteColor(Flieger+5, RGB(255, 0, 255))
Next
z.b.

Code: Alles auswählen

For Flieger=1 To 5   
  If Not LoadSprite(Flieger+5, "Bilder/Spiel/Jet/Jet" +Str(Flieger) +".bmp")
    MessageRequester("fehler", "'Bilder/Spiel/Jet/Jet" +Str(Flieger) +".bmp' konnte nicht geladen werden"
    End;Prgramm beenden
  EndIf
  TransparentSpriteColor(Flieger+5, RGB(255, 0, 255))
Next
[alles ungetestet]
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten