Seite 1 von 1

Einstiegsfrage: 2D

Verfasst: 03.07.2008 13:47
von CNESM
Hallo,

aufgrund einer Anforderung aus dem Bereich muss ich eine Art interaktive Präsenation eines Tools erstellen. Ich hab mich dazu das erste mal mit 2D und animierten Geschichten befasst. Leider habe ich schon nach 2 Minuten das erste Problem /:->

Code: Alles auswählen

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

If OpenWindow(24,0,0,798,473,"Interaktive Präsentation",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

  If OpenWindowedScreen(WindowID(24),0,0,798,473,0,0,0)
    If StartDrawing(ScreenOutput())
      DrawImage(CatchImage(0,?Bild_1),0,0) 
    StopDrawing() 
  EndIf
  
  CreateSprite(0,13,22)
    If StartDrawing(SpriteOutput(0))
      DrawImage(CatchImage(0,?Bild_8),0,0) 
      StopDrawing()
    EndIf
    
   CreateSprite(3,13,22)
    If StartDrawing(SpriteOutput(3))
      DrawImage(CatchImage(2,?Bild_7),0,0) 
      StopDrawing()
    EndIf

Else
  MessageRequester("Error", "Can't open windowed screen!", 0)
  End
EndIf

direction = 5
x=200

Repeat
  Event.l = WindowEvent()    
    FlipBuffers() 
    ClearScreen(RGB(0,0,0))
    If StartDrawing(ScreenOutput())
      DrawImage(CatchImage(0,?Bild_1),0,0) 
      StopDrawing() 
    EndIf
    TransparentSpriteColor(0,RGB(255,0,255))
    DisplayTransparentSprite(0,x,245)

    x+direction
    If x > 320
      Event=1
    ElseIf x < 0
      direction = 5
    EndIf
    
    Delay(1)

Until Event=1

  Delay(1000)
   
    FlipBuffers() 
    ClearScreen(RGB(0,0,0))
    If StartDrawing(ScreenOutput())
      DrawImage(CatchImage(0,?Bild_1),0,0) 
      StopDrawing() 
    EndIf
    TransparentSpriteColor(3,RGB(255,0,255))
    DisplayTransparentSprite(3,150,245)

  Delay(1000)
  
EndIf
End   

Bild_1:IncludeBinary "_1.bmp"
Bild_2:IncludeBinary "_2.bmp"
Bild_3:IncludeBinary "_3.bmp"
Bild_7:IncludeBinary "_7.bmp"
Bild_8:IncludeBinary "_8.bmp"
Bild_9:IncludeBinary "_9.bmp"
Bild_10:IncludeBinary "_10.bmp"
Was macht der Code?

Der Code arbeitet nur mit Images. Der Code zeigt ein Fenster an und bewegt ein Sprite ("Mauszeiger") von A nach B. Dann wird ein ein Klick gezeigt, der Button wird eingedrückt und ein neues Fenster öffnet sich. Der Mauszeiger bewegt sich wie gewollt von A nach B, aber ab dem Verlassen der erste Schleife

Code: Alles auswählen

Until Event=1
Delay(1000)

passiert nichts mehr. Der anschließende Code wird zudem auch nicht mehr ausgeführt:

Code: Alles auswählen

    FlipBuffers() 
    ClearScreen(RGB(0,0,0))
    If StartDrawing(ScreenOutput())
      DrawImage(CatchImage(0,?Bild_1),0,0) 
      StopDrawing() 
    EndIf
    TransparentSpriteColor(3,RGB(255,0,255))
    DisplayTransparentSprite(3,150,245)
  Delay(1000)
obwohl PB den Code durchläuft. Da ist bestimmt nen Fehler von mir drinnen .... Vielleicht könnt ihr mal drüber schauen.

Verfasst: 03.07.2008 14:18
von Hoto
Also so richtig intensiv hab ich mich mit sowas auch noch nicht auseinander gesetzt, aber fehlt da am Ende nicht noch ein FlipBuffers()? Weil soweit ich weiß wird erstmal alles in einen Buffer geschrieben und erst nach FlipBuffers dort rausgeholt und angezeigt.

Verfasst: 03.07.2008 14:25
von Kaeru Gaman
ja, ein FlipBuffers() gehört ans Ende, das kann nur am Anfang stehen,
wenn es sich um eine Schleife handelt die garantiert immer durchlaufen wird.

ich habe schon angefragt, die Help-Beispiele dementsprechend anzupassen.

Verfasst: 03.07.2008 14:28
von CNESM
Hallo Hoto,

das wars! Und schon was gelernt :) Vielen Dank! Ich werd mich nach dem Ende des Projekts mal melden! Vielleicht gibt die ein oder andere Optimierungsmöglichkeit in Sachen 2D.

Edit: Ja ist aus der Hilfe nicht unbedingt zu erkennen. Im Beispiel wird das ja an den Anfang der Schleife gesetzt.

Verfasst: 03.07.2008 14:44
von Kaeru Gaman
> Vielleicht gibt die ein oder andere Optimierungsmöglichkeit
grundsätzlich würde ich dir dazu raten, deine ganzen objekte und
deren bewegungen in einer Liste oder etwas ähnlichem zu verwalten,
und in einer einzigen hauptschleife dementsprechend flexibel
alle bewegungen durchzuführen.