Seite 2 von 2

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 16:23
von STARGÅTE
Ja wäre sie, aber wenn du dieses "zwischen" Sprite dann auch wieder darstellen willst (auf dem Bildschirm), musst du trotzdem immer wieder alles neu Zeichnen musst!

Edit: Für Drago^^

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 16:32
von Drago
Offtopic:

Ups, Stargate spricht Starwarsisch...

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 16:48
von ts-soft
<OT>Hov lengvaD chenmoHlu' tlhIngan Hol'e' 'ej DaH 'oH ghojtaH ghot law'. Qapbej Holvam wIcha'meH, qawHaqvam chenmoHlu'. taHjaj wo', taHjaj Hol!</OT>

manch einer kann auch klingonisch :mrgreen:

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 17:05
von Skyhawk
STARGÅTE hat geschrieben:Ja wäre sie, aber wenn du dieses "zwischen" Sprite dann auch wieder darstellen willst (auf dem Bildschirm), musst du trotzdem immer wieder alles neu Zeichnen musst!

Edit: Für Drago^^
Hmm. *am Kopf Kratz*
ich denke jetzt mal (leihenhaft) das bei einem 2D -Shoot Em up z.B. doch vieles in Layern abläft, Layer=0 Hintergrund, Layer=1 Sprites, Layer=2 Vordergrund.
also wenn ich jetzt das Sprite zeichnen möchte in einer bewegung MUSS ich das Drawimage immer dazu nehmen im repeat, wie ihr mir ja schon erklärt habt.
Jetzt stelle ich mir diese vorgehensweise im Spiel z.B. recht langsam vor da ja alles neu gezeichnet werden müsste. Ja ich weiß, ich kann noch kein Spiel proggramieren :mrgreen:
war jetzt nur als Beispiel genannt.

wenn ich aber dies so mache wie schon erwähnt (danke übrigens an alle die mir helfen)
verstehe ich nicht wieso meine Buttons nicht angezeigt werden, sondern erst nach ablauf der Spriteverschiebung, oder müssten die dann auch in eine REPEAT schleife mit einegbunden werden?

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 17:15
von ts-soft
Du hast 2 schleifen, deswegen werden die Buttons nicht erneut gezeichnet, weil die WindowEvents nicht bearbeitet werden.

Code: Alles auswählen

Repeat
  Select WaitWindowEvent(10)
    Case #PB_Event_CloseWindow
      
      End
      
    Case #PB_Event_Gadget
      If EventGadget() = 0
        event = 1
      EndIf
      
    ElseIf EventGadget() = 1
      event = 2
      MessageRequester("ups...Sorry", "i`m so sorry, but this Loader ist still in progress", 0)
    EndIf      
EndSelect

FlipBuffers()

If StartDrawing(ScreenOutput())
  
  
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(0), 0, 0, 550, 480)
  
  StopDrawing()
  
EndIf
x=0     

ClipSprite(1,0,0,282,93)

x=x+1
DisplayTransparentSprite(1, x, 10)
DisplayAlphaSprite(2, x, 10)


Until x=268 Or event = 1
Dieser Code soll Dein Problem nur verdeutlichen, ungetestet, hab wirklich keine Lust Bilder rauszusuchen usw.

Ich hoffe mal, jetzt kommst Du weiter.

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 17:45
von Drago
Ich hoffe, dieses hilft dir es zu verstehen. Du solltest dir die Beispiele von PureBasic mal anschauen.

Code: Alles auswählen

EnableExplicit ; Daran solltest du dich direkt gewöhnen, dieses immer an den Anfang schreiben

If InitSprite() = 0
     MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
     End
EndIf

UsePNGImageDecoder()

; Wenn du EnableExplicit eingeschaltet hast, MUSST du ALLE Variablen vorher 
;              durch Define / Global u.s.w. declarieren, sehr sinnvoll

Define event.i, x.i, quit.b, Gadget.i 
Define Pfad$ = #PB_Compiler_Home + "Examples\Sources\Data\"

If OpenWindow(0, 550, 550, 550, 550, "Lena X-perience Patcher", #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_ScreenCentered)
     
     ButtonGadget(0, 460, 500, 80, 40, "EXIT")
     GadgetToolTip(0, "schade das du uns verlassen möchtest")
     
     ButtonGadget(1, 10, 500, 80, 40, "PLAY")
     GadgetToolTip(1, "Tauche ein in die Fantastische Welt")
     
     If OpenWindowedScreen(WindowID(0), 0, 0, 550, 480, 0, 0, 0)
          
          LoadImage(0, Pfad$ + "Background.bmp" )
          LoadSprite(1, Pfad$ + "world.png", #PB_Sprite_AlphaBlending | #PB_Sprite_Texture)
          LoadSprite(2, Pfad$ + "world.png", #PB_Sprite_AlphaBlending | #PB_Sprite_Texture)
          
          Repeat  
               ;------------------------------------------------------------------------------------------------------------------------------------------------------------------------
               ;                                             Ab hier werden nur die Events abgearbeitet 
               ;------------------------------------------------------------------------------------------------------------------------------------------------------------------------
               Repeat
                    
                    event = WindowEvent()
                    
                    Select  event
                              
                         Case #PB_Event_CloseWindow
                              
                              quit = #True
                              
                         Case #PB_Event_Gadget
                              
                              Gadget = EventGadget()
                              
                              If EventGadget() = 1
                                   
                                   MessageRequester("ups...Sorry", "i`m so sorry, but this Loader ist still in progress", 0)
                              EndIf
                              
                              
                    EndSelect
                    
               Until event = 0
               
               ;------------------------------------------------------------------------------------------------------------------------------------------------------------------------
               ;                                    Und hier geht es weiter, wenn kein Event eingetreten ist
               ;                                             Jetzt mußt du ALLES neu zeichnen
               ;------------------------------------------------------------------------------------------------------------------------------------------------------------------------
               
               ClearScreen(RGB(0,0,0))                                                 ; den Bildschirm löschen
               
               If StartDrawing(ScreenOutput())
                    
                    
                    DrawingMode(#PB_2DDrawing_Default)
                    DrawImage(ImageID(0), 0, 0, 550, 480)
                    
                    StopDrawing()
                    
               EndIf  
               
               x = x + 1
               
               DisplayTransparentSprite(1, x, 50)
               DisplayAlphaSprite(2, x, 10)
               
               Delay( 0 )                 ; auch daran solltest du dich gewöhnen, schont die CPU
               
               ; der Flipper gehört an das Ende der Zeichenoperationen
               ; Die Begründung liegt darin, wenn ich ein Objekt an x = 100  starten will
               ; würde ( wie bei dir es der Fall war ) das Objekt dann bei 101 starten,
               
               FlipBuffers() 
               
               If  x=268: x = 0: EndIf
               
          Until quit
          
     EndIf
EndIf
End

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 18:44
von ts-soft
Drago hat geschrieben:

Code: Alles auswählen

 Delay( 0 )                 ; auch daran solltest du dich gewöhnen, schont die CPU
Delay(0) hat nur unter Windows eine Wirkung!
WaitWindowEvent(10) ist aber eigentlich die besser Wahl um die CPU zu schonen!
Werte zwischen 1 und 20 ergeben aufgrund des Ungenauigkeit der Zeitauflösung keinen Unterschied.

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 23:05
von Skyhawk
@Drago

:shock: Herzlichen dank für deine Mühe die du da reingesteckt hast (und die Anderen natürlich auch)
Ich werde morgen dein Code mal zu gemüte führen und versuchen deine Vorschläge zu begreifen und nachzuvollziehen. :D

Ich weiß das ich noch viele Fehler mache und ihr andere Lösungswege habt.
Ich versuche gerade PB zu lernen (von NULL) in dem ich mir die HBs durchlese und gleichzeitig was versuche zu proggen,
daher habe ich noch viele Befehle noch nicht kennegelernt die ihr schon aus dem Eff-Eff kennt :-)

Das mit dem DEFINE, EXPLICIT, DELAY und den TIMEOUTs werde ich versuchen zu nutzen :-)

@TS-soft
Das mit dem Timeout verstehe ich ehrlich gesagt noch nicht so ganz.
Also delay habe ich benutzt als ich mit der Console rumexperimentiert habe, jetzt sagst du das dies aber nur unter windows verwendung hat und nur
Timouts "waitwindowevent(xx)" verwenden sollte...(Screen)...
Hat es ansonsten an sich den selben effekt?

Auch wen ich denke das ich in euren Augen als großen depp vorkomme, danke ich euch für eure schnelle Hilfe und tipps.

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 03.09.2012 23:27
von ts-soft
Das hast Du jetzt missverstanden. Delay(0) hat unter windows, also nicht unter linux oder macos, eine besondere Bedeutung und funktioniert deshalb auch nur unter windows mit dem Wert 0 wie gewünscht!

Delay() sollte man in Programmen mit einer GUI (Window) grundsätzlich meiden.
Stattdessen ist es besser z.B: WaitWindowEvent(10) zu nutzen.
Delay mit einem Wert <> 0 entlasted die CPU nicht sondern führt eher zum verschlucken
von Ereignissen. In Spielen spielt das ganze keine so grosse Rolle, aber man sollte es sich
gleich angewöhnen, das Delay nur eine Notlösung ist.

Gruß
Thomas

Re: Sprite zieht Spur hinter sich...?? wie bekomme ich den w

Verfasst: 04.09.2012 00:06
von HeX0R
Verschlucken sollte es eigentlich keine Events (oder passiert das etwa unter Li-Nix/Apfelmus?), nur eben immer weiter in die Queue schieben.

Allerdings war da ja noch der ewig nervige Fenster-Verschiebe/Event-Verschwinde-Effekt,
den ich vermutlich in meiner noch verbleibenden Lebenszeit nicht verschwinden sehen werde...