Seite 1 von 1

Animation Bewegen?

Verfasst: 04.11.2006 00:19
von D4uS1
Folgendes Problem,

Ich habe eine Flieger Animation, ein Jet dessen Turbinen am laufen sind. Diese möchte ich über den Bildschrim bewegen können, per Tastatur. Aber wenn ich die jeweilige Taste drücke, ruckelt das Spiel, weil der Computer erst die Animation an der Stelle zu Ende bringt an der sie angefangen hat, bis er zur nächsten stelle übergeht. Kann mir jemand sagen wo der Fehler liegt? Hier der Code:

Code: Alles auswählen

Procedure Spiel()

For x = 1 To #Max_Flieger
FliegerX = 100
FliegerY = 100
Next

For x = 1 To #Max_Flieger
LoadSprite(x+5, "Bilder/Spiel/Jet/Jet" +Str(x) +".bmp")
TransparentSpriteColor(x+5, RGB(255, 0, 255))
Next

Repeat
ClearScreen(RGB(0, 0, 0))
ExamineKeyboard()

For x = 1 To #Max_Flieger
If KeyboardPushed(#PB_Key_Up)
BewegFliegerY = -4
EndIf
If KeyboardPushed(#PB_Key_Down)
BewegFliegerY = 4
EndIf
Next

FliegerY + BewegFliegerY

For x = 1 To #Max_Flieger
DisplayTransparentSprite(x+5, FliegerX, FliegerY)
FlipBuffers()
Next

Until KeyboardPushed(1)
EndProcedure

Verfasst: 04.11.2006 01:42
von STARGÅTE

Code: Alles auswählen

Procedure Spiel() 

For x = 1 To #Max_Flieger 
FliegerX = 100 
FliegerY = 100 
Next 

For x = 1 To #Max_Flieger 
LoadSprite(x+5, "Bilder/Spiel/Jet/Jet" +Str(x) +".bmp") 
TransparentSpriteColor(x+5, RGB(255, 0, 255)) 
Next 

Repeat 
ClearScreen(RGB(0, 0, 0)) 
ExamineKeyboard() 

For x = 1 To #Max_Flieger 

If KeyboardPushed(#PB_Key_Up) 
BewegFliegerY = -4 
EndIf 
If KeyboardPushed(#PB_Key_Down) 
BewegFliegerY = 4 
EndIf 

FliegerY + BewegFliegerY 

DisplayTransparentSprite(x+5, FliegerX, FliegerY) 
FlipBuffers() 

Next 

Until KeyboardPushed(1) 
EndProcedure
Einfach nur eine For Next Schleife machen, in der Abfrage und Anzeige drin sind

So würde es gehen, obwohl das auch nicht gerade das erfeckte ist ^^

Verfasst: 04.11.2006 04:10
von tobe
hi,

also auf den ersten blick, springt mich sofort das FlipBuffers() an.
da in der for next schleife kann das nicht gutgehen,
obwohl...wenn man einfach alles in die schleife packt geht es ja auch ;)
hier mal mein vorschlag:

Code: Alles auswählen

Procedure Spiel()
  FliegerX = 100
  FliegerY = 100
  For x = 1 To #Max_Flieger
    LoadSprite(x+5, "Bilder/Spiel/Jet/Jet" +Str(x) +".bmp")
    TransparentSpriteColor(x+5, RGB(255, 0, 255))
  Next
  Repeat
    For x = 1 To #Max_Flieger
      ClearScreen(0)
      ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Up)
        BewegFliegerY = -4
      EndIf
      If KeyboardPushed(#PB_Key_Down)
        BewegFliegerY = 4
      EndIf
      FliegerY + BewegFliegerY
      DisplayTransparentSprite(x+5, FliegerX, FliegerY)
      FlipBuffers()
    Next
  Until KeyboardPushed(1)
EndProcedure

Verfasst: 04.11.2006 13:11
von D4uS1
Danke für die Antworten, habs schon eingebaut und es funktioniert perfekt!

Verfasst: 04.11.2006 15:04
von D4uS1
Hab doch noch ein Problem, der Jet soll natürlich auch noch schießen können. Da das Bild 200 Pixel breit ist und der Schuss eine Box(blabla) mit der größe 2 und 2 sein soll hab ich SchussX = FliegerX + 99 und SchussY = FliegerY +2 gesetzt. Wenn ich aber schiesse klappt es einfach nicht! Die Schüsse sollen ausserdem in einem bestimmtem Abstand auftauchen und danach nicht verschwinden. Praktisch ein MG, aber wie soll ich das machen?

Verfasst: 04.11.2006 18:45
von tobe
da kommen sicher noch mehr probleme auf dich zu ;)
ich hab das alte beispiel nochmal überarbeitet, dabei hab ich die for next schleife für den spritewechsel rausgeschmissen und durch einen zähler ersetzt, den hab ich dann noch in einen 30ms timer reingepackt, dann kann man die geschwindigkeit des spritewechsels schöner anpassen.
jetzt zu den schüssen, da musst du ja irgendwo die koordinaten jedes schusses speichern, dafür hab ich einfach mal ne linked list genommen.
wenn ein schuss aus dem bildschirmbereich rausfliegt sollte man ihn löschen weil sonst hast irgendwann 100000 schüsse in der liste.
ich hoffe der rest erkärt sich von selbst ;)

Code: Alles auswählen

Procedure Spiel()
  FliegerX = 100
  FliegerY = 100
  bildschirmbreite = 800
  NewList schuss.POINT()
  If CreateSprite(#schuss,2,2)
    StartDrawing(SpriteOutput(#schuss))
    Box(0, 0, 2, 2, $909090)
    StopDrawing()
  EndIf
  
  For x = 1 To #Max_Flieger
    LoadSprite(x+5, "Bilder/Spiel/Jet/Jet" +Str(x) +".bmp")
    TransparentSpriteColor(x+5, RGB(255, 0, 255))
  Next
  
  Repeat
    zeit = ElapsedMilliseconds()
    ClearScreen(0)
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)
      BewegFliegerY = -4
    EndIf
    If KeyboardPushed(#PB_Key_Down)
      BewegFliegerY = 4
    EndIf
    
    FliegerY + BewegFliegerY
    
    If spritewechseltimer < zeit
      spritewechseltimer = zeit + 30
      x + 1
      If x > #Max_Flieger
        x = 1
      EndIf
    EndIf
    DisplayTransparentSprite(x+5, FliegerX, FliegerY)
    
    If KeyboardPushed(#PB_Key_Space)
      AddElement(schuss())
      schuss()\x = FliegerX + 99
      schuss()\y = FliegerY + 2
    EndIf
    ForEach schuss()
      schuss()\x + 5
      If schuss()\x > bildschirmbreite
        DeleteElement(schuss())
      Else
        DisplayTransparentSprite(#schuss, schuss()\x, schuss()\y)
      EndIf
    Next
    
    FlipBuffers()
  Until KeyboardPushed(1)
EndProcedure
ps: mit einem lauffähigen stück code wäre es wesentlich einfacher zu testen ob das auch funktioniert.

Verfasst: 04.11.2006 19:09
von D4uS1
bei mir verfielfältigt sich dann das flugzeug und wandert nach rechts oder nach links :lol: !

Verfasst: 04.11.2006 19:41
von Ghost
Vileicht solltest du noch einen timer für die schüsse reinpacken damit du die Feuerate optimieren kannst, ansonsten erzeugt er jeden Frame ein schuss. Also:

Code: Alles auswählen

Global TimerSchuss.f
...
repeat

TimerSchuss +1

If KeyboardPushed(#PB_Key_Space) AND TIMERSCHUSS = (dann einen Wert je höher sesto länger dauert es eh der nächste schuss fällt)
      AddElement(schuss()) 
      schuss()\x = FliegerX + 99 
      schuss()\y = FliegerY + 2 
      TIMER = 0
    EndIf 
    ForEach schuss() 

...
und am besten noch vor repeat "SetFrameRate(X)" reinseten, damitmüsste es auf allen rechnern gleichschnell laufen.
(X durch einen beliebigen wert austauschen ... mit dem Befehl regelst du wievieleFrames Pro Sekunde ablaufen)

Edit
Irgendwo gibt es auch ein tutorial zu diesem Spiel ... musst mal schauen weiß leider net mehr wo ich das her habe ... da stand es sei für fortgescrittene aber so schwer wars nicht

Edit2:
habs gefunden ist auf folgendem link
http://www.purearea.net/pb/german/

Es heist Spieleprogrammieren für Fortgeschrittene.

Verfasst: 04.11.2006 20:38
von tobe
@Ghost
das hab ich doch extra weggelassen damit St@ndFurz nicht langweilig wird ;)

jetzt hab ich mal lauffähigen code draus gemacht und auch den 2ten timer mit eingebaut:

Code: Alles auswählen

EnableExplicit
#bildschirmbreite = 800
#bildschirmhoehe = 600
#schuss = 0
#Max_Flieger = 5

Procedure Spiel()
  Define FliegerX, FliegerY, x, zeit, BewegFliegerY, spritewechseltimer, wEvent, SchussTimer
  FliegerX = 100
  FliegerY = 100
  NewList schuss.POINT()
  If CreateSprite(#schuss,2,2)
    StartDrawing(SpriteOutput(#schuss))
    Box(0, 0, 2, 2, $909090)
    StopDrawing()
  EndIf
  
  For x = 1 To #Max_Flieger
    CreateSprite(x, 200, 50)
    StartDrawing(SpriteOutput(x))
    ;Box(0, 0, 199, 199, $909090)
    LineXY(0,0,199,25,$909090)
    LineXY(0,49,199,25,$909090)
    LineXY(0,0,0,49,$909090)
    DrawText(70,18,Str(x))
    StopDrawing()
  Next
  
  Repeat
    zeit = ElapsedMilliseconds()
    ClearScreen(0)
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)
      BewegFliegerY = -4
    ElseIf KeyboardPushed(#PB_Key_Down)
      BewegFliegerY = 4
    Else
      BewegFliegerY = 0
    EndIf
    
    FliegerY + BewegFliegerY
    
    If spritewechseltimer < zeit
      spritewechseltimer = zeit + 300
      x + 1
      If x > #Max_Flieger
        x = 1
      EndIf
    EndIf
    DisplayTransparentSprite(x, FliegerX, FliegerY)
    
    If KeyboardPushed(#PB_Key_Space)
      If SchussTimer < zeit
        SchussTimer = zeit + 100
        AddElement(schuss())
        schuss()\x = FliegerX + 200
        schuss()\y = FliegerY + 25
      EndIf
    EndIf
    ForEach schuss()
      schuss()\x + 5
      If schuss()\x > #bildschirmbreite
        DeleteElement(schuss())
      Else
        DisplayTransparentSprite(#schuss, schuss()\x, schuss()\y)
      EndIf
    Next
    
    FlipBuffers()
    wEvent = WindowEvent()
    While wEvent
      Select wEvent
        Case #PB_Event_CloseWindow
          End
      EndSelect
      wEvent = WindowEvent()
    Wend
    
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

InitSprite()
InitKeyboard()
If OpenWindow(0, 0, 0, #bildschirmbreite, #bildschirmhoehe, "test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered) = 0
  End
EndIf
OpenWindowedScreen(WindowID(0), 0, 0, #bildschirmbreite, #bildschirmhoehe, 1, 0, 0)
SetFrameRate(75)
Spiel()