Seite 1 von 2

DrawText()

Verfasst: 15.12.2008 14:02
von carter
Hi,

ich wollte fragen ob es mit DrawText() möglich ist, dass der text nach x sekunden wieder verschwindet, und was auch ein netter effekt wäre, wenn der text dann noch oben richtig bildschirm verschwindet und seine farbe ändert, ist das möglich?

mfg carter

Verfasst: 15.12.2008 14:21
von Kaeru Gaman
aaaaalso.....

Die Draw befehle ebenso wie Sprite-Display-Befehle erzeugen keine eigenständigen Objekte,
sondern bringen direkt pixel auf einen Hintergrund auf.
das ist so ähnlich, wie wenn du in PAINT ne Kopie machst, und dann mehrfach "einfügen" durchführst.

bei PAINT kannst du auch eine Linie oder einen Text nicht nachträglich entfernen oder ändern,
sondern du müßtest ihn komplett löschen indem du den alten Hintergrund drübermalst
und dann den Text in veränderter Form wieder aufbringst.

Natürlich ist das dementsprechend in PB lösbar, auf jeden beliebigen Context wo du DrawText benutzen kannst,
aber wie genau du das machen musst ist sehr stark davon abhängig,
auf was für einen Context du dein Draw überhaupt ausführst.
(Fenster, Fensterelement, Image, Screen, oderwasauchimmer)


wenn du mehr infos gibst, was du wie machst, kann dir konkret geholfen werden (auch ohne 11880) ;)

Verfasst: 15.12.2008 14:41
von carter
der text soll auf einen background kommen, welcher mit folgendem befehl includet wird:

LoadSprite(1,"data\background.bmp" ,0)


mfg carTer

Verfasst: 15.12.2008 14:43
von Kaeru Gaman
also arbeitest du mit einem Screen.

du solltest den Text nicht auf das Sprite selber drawen, sondern auf den Screen.

da du diesen sowieso zig mal pro sekunde neu darstellen musst,
ist es kein problem, die koordinaten und farbe zu ändern.

Verfasst: 15.12.2008 14:59
von Dare Devil
Wie Kaeru gesagt hat, solltest du den Text nicht auf das Sprite sondern auf den Screen zeichnen.

Code: Alles auswählen

InitSprite()

OpenWindow(0, 0, 0, 400, 200, "DrawText", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

OpenWindowedScreen(WindowID(0), 0, 0, 400, 200, 0, 0, 0)

StartDrawing(ScreenOutput())
For x = 1 To 399
  For y = 1 To 199
    Plot(x, y, RGB(Random(255), Random(255), Random(255)))
  Next
Next
StopDrawing()

FlipBuffers()

GrabSprite(0, 0, 0, 400, 200) ;Das als Ersatz fuer dein Background im Spiel

StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(20, 20, "Text mit transparentem Hintergrund", 0)
DrawText(20, 40, "Geht gleich weg!", 0)
StopDrawing()
FlipBuffers()

For i = 0 To 200 ;2 Sekunden warten
  If WindowEvent() = #PB_Event_CloseWindow
    End
  EndIf
  
  Delay(10)
Next

DisplaySprite(0, 0, 0)
FlipBuffers()

For i = 0 To 200
  If WindowEvent() = #PB_Event_CloseWindow
    End
  EndIf
  
  Delay(10)
Next

Hab allerdings keine Ahnung wie du das meinst mit der Farbe aendern und wie er "verschwinden" soll...

Verfasst: 15.12.2008 15:04
von Kaeru Gaman
ermn...
sorry, Dare Devil,
aber ein Beispiel mit etwas anderem als einer einzigen sauberen Event- und Screen-Schleife ist leider kein gutes Beispiel.

ist bestimmt gut gemeint gewesen, aber trotzdem ein how-not-to-do.

Verfasst: 15.12.2008 15:12
von Dare Devil
Kaeru Gaman hat geschrieben:ermn...
sorry, Dare Devil,
aber ein Beispiel mit etwas anderem als einer einzigen sauberen Event- und Screen-Schleife ist leider kein gutes Beispiel.

ist bestimmt gut gemeint gewesen, aber trotzdem ein how-not-to-do.
Mhm - war nur so auf die schnelle programmiert. Hab aber schon so einige Programme mit mehreren Event-Schleifen programmiert - wieso ist das nicht ueblich, wenns doch funktioniert? :oops:

Naja das Grundprinzip versteht carter jetzt, denk ich jetz mal.

Verfasst: 15.12.2008 15:15
von Kaeru Gaman
> wieso ist das nicht ueblich, wenns doch funktioniert?

weil es eben der Übersichtlichkeit extrem abträglich ist.

wenn dein proggi eh nur 100 zeilen lang ist und recht spagettimäßig,
dann fällt das weder auf noch ins gewicht.

aber wenn du ein ein bissel größeres projekt hast, dann kannst du dich ganz schnell in deinen mehreren eventloops verlaufen wenn du was hinzufügen willst,
und wunderst dich, warum dein button nicht funktioniert, dabei fragst du ihn wo ab wo er nicht existiert.

Verfasst: 15.12.2008 15:23
von Dare Devil
Kaeru Gaman hat geschrieben:> wieso ist das nicht ueblich, wenns doch funktioniert?

weil es eben der Übersichtlichkeit extrem abträglich ist.

wenn dein proggi eh nur 100 zeilen lang ist und recht spagettimäßig,
dann fällt das weder auf noch ins gewicht.

aber wenn du ein ein bissel größeres projekt hast, dann kannst du dich ganz schnell in deinen mehreren eventloops verlaufen wenn du was hinzufügen willst,
und wunderst dich, warum dein button nicht funktioniert, dabei fragst du ihn wo ab wo er nicht existiert.
Bei Anwendungen brauch ich nie mehrere Event-Loops - aber bei Spielen war das schon oefter der Fall...

Aber was meinst du jetgzt mit "Spaghetti-maessig"? Ich dachte bisher das haette nur was mit Benutzung von goto zu tun.

Verfasst: 15.12.2008 15:29
von Kaeru Gaman
nein das hat eigentlich garnichts mit Goto direkt zu tun.
spagetti-code heißt, dass der code unübersichtlich und unstrukturiert ist.



@Topic

so, hier mal ne kleine Demo mit einem Mainloop
(hat ein bissel gedauert, aber ich hab ja auch noch anderes zu tun und 'n alter mann is numal kein d-zug)

DynamicText_Demo.pb

Code: Alles auswählen

EnableExplicit

#Window = 0
#Background = 0

InitSprite()

OpenWindow( #Window, #PB_Ignore,0, 300,200, "Fade Text Demo")
OpenWindowedScreen(WindowID(#Window),0,0,300,200,0,0,0)

Define n.l, counter.l

Define EvID.l, EXIT.l

Define TextX.l, TextY.l, TextCol.l
Define col1.l

; ***
; *** Hintergrund erzeugen
; ***
; *** ersetzt LoadSprite()
; ***
CreateSprite(#Background,300,200)
StartDrawing(SpriteOutput(#Background))
  For n=0 To 199
    Line(0,n,300,0,RGB(0,127-n/2,255-n))
  Next
StopDrawing()

; ***
; *** Hauptschleife
; ***

Repeat
  Repeat
    EvID = WaitWindowEvent(20)
    Select EvID
      Case #PB_Event_CloseWindow
        EXIT = 1
    EndSelect
  Until EvID = #Null

  ;ClearScreen( $201008 )  ; unnötig, da deckendes Hintergrundsprite
  DisplaySprite(#Background,0,0)

  counter +1

  Select counter
    Case 0 To 199
      TextX   = 300 - counter
      TextY   = 100
      col1    = 56 + counter
      TextCol = RGB( col1, col1, col1 ) ; heller werdendes grau
    Case 200 To 399
      TextX   = 100
      TextY   = 100
      col1    = 60 + 10 * ( counter % 20 )
      TextCol = RGB( 255, col1, 255 ) ; pulsierendes Lila
    Case 400 To 599
      TextX   = 100
      TextY   = 100 - (counter-400) / 2
      col1    = 255 - (counter-400)
      TextCol = RGB( col1, col1, col1 ) ; dunkler werdendes grau
    Case 600 To 999
      counter = 0
  EndSelect

  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText( TextX, TextY, "Ich bin eine Demo!", TextCol)
  StopDrawing()

  FlipBuffers()

Until EXIT