Sprite zieht Spur hinter sich...?? wie bekomme ich den weg?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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^^
Zuletzt geändert von STARGÅTE am 03.09.2012 16:37, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

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

Beitrag von Drago »

Offtopic:

Ups, Stargate spricht Starwarsisch...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Skyhawk
Beiträge: 24
Registriert: 04.04.2005 20:41
Wohnort: Düsseldorf

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

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

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

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Skyhawk
Beiträge: 24
Registriert: 04.04.2005 20:41
Wohnort: Düsseldorf

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

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

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

Beitrag 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...
Antworten