Seite 1 von 2

[gelöst] Sprite endlos vertikal scrollen ?

Verfasst: 23.02.2008 19:57
von scholly
moin, moin...

Ich möchte einen Text von unten nach oben endlos über einen Screen scrollen. Bisher schaffe ich das nur 1x :cry:

Code: Alles auswählen

InitSprite()

LoadFont(0,"courier new",32,#PB_Font_Bold)

#screen_height = 540
#sprite_height = 480

OpenWindow(0, #PB_Ignore, #PB_Ignore, 900, 600, "DisplaySprite3D", #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),5,5,890,#screen_height,0,0,0)

CreateSprite(0, 830, #sprite_height, #PB_Sprite_Texture)
  StartDrawing(SpriteOutput(0))
    
    DrawingMode(1)
    FrontColor(#Red)
    DrawingFont(FontID(0)) 
    DrawText(0,  0,"Ich will ja nur mal testen")
    DrawText(0, 40,"ob ich das hinbekomme und")
    DrawText(0, 80,"für Geschwindigkeit muß am")
    DrawText(0,120,"'Y-Wert' gedreht werden und")
    DrawText(0,160,"als nächstes probier ich")
    DrawText(0,200,"dann endlosscrollen und dann")
    DrawText(0,240,"zu zentrieren und danach daß")
    DrawText(0,280,"es nach oben schmaler wird")
    DrawText(0,320,"und dann eine Texur statt")
    DrawText(0,360,"einer Textfarbe setzen")
    DrawText(0,400,"und dann..............")
    
  StopDrawing()

y = #screen_height

Repeat

  EventID = WindowEvent()

  ClearScreen(RGB(0, 0, 0))
 
  DisplaySprite(0, 30,  0 + y)
      
  y - 1
  If y < (#screen_height-#sprite_height) ;mindestens 1x
    ; DAS HIER ist bestimmt falsch, aber was scrollt endlos ???
    y = #screen_height
  EndIf
 
  FlipBuffers()

Until EventID = #PB_Event_CloseWindow
Mag jemand versuchen, (mir) zuerst mit einfachen Worten und dann eventuell mit Code zu erklären, was gemacht werden muß, damit der Text (das Sprite) endlos durchscrollt?

mDv... scholly

Verfasst: 23.02.2008 20:11
von ZeHa
Ich weiß nicht, ob es das ist, was Du willst, aber probier's mal hiermit:

Code: Alles auswählen

  If y < (0 - #sprite_height) ;mindestens 1x 
    ; DAS HIER ist bestimmt falsch, aber was scrollt endlos ??? 
    y = #screen_height 
  EndIf
Oder willst Du daß es direkt dahinter kommt? Dann mußt Du das Sprite natürlich mehrfach anzeigen...

Verfasst: 23.02.2008 20:20
von scholly
ZeHa hat geschrieben:Oder willst Du daß es direkt dahinter kommt? Dann mußt Du das Sprite natürlich mehrfach anzeigen...
Ja direkt dahinter. Einen Mini-Abstand kann ich ja über die Sprite-Höhe und einen unteren Bereich ohne Text realisieren.
Und ich kann ja nich absehen, wie dusselig ein Leser ist und spätestens nach dem 2. Zeile merkt, daß da nix neues kommt. :lol:

Wie zeige ich das Sprite denn dann mehrfach untereinander bzw hintereinander an ?

Verfasst: 23.02.2008 20:39
von Kaeru Gaman
ohne mehrfachanzeige:
jede zeile ein eigenes sprite, eins mehr als den screen füllt.

Code: Alles auswählen

InitSprite()
OpenWindow(0, #PB_Ignore, #PB_Ignore, 400,300,"scrolltext")
OpenWindowedScreen(WindowID(0),0,0,400,300,0,0,0)

Dim koor(15)

TransparentSpriteColor( #PB_Default, $000000 )
For n=0 To 15
  CreateSprite(n, 200, 20)
  StartDrawing(SpriteOutput(n))
    DrawText(50,2,"- Zeile " + RSet(Str(n),2,"0") + " -", $FFFF00, $000000)
  StopDrawing()
  koor(n) = 20*n
Next

Repeat
  EvID = WaitWindowEvent(20)

  ClearScreen($300000)
    For n=0 To 15
      DisplayTransparentSprite(n,100,koor(n))
      koor(n) -1
      If koor(n) < -20
        koor(n) + 320
      EndIf
    Next
  FlipBuffers()

Until EvID = #PB_Event_CloseWindow
mit mehrfachanzeige:
screen ist mit 3 sprites voll, ich muss 4 anzeigen.

Code: Alles auswählen

InitSprite()
OpenWindow(0, #PB_Ignore, #PB_Ignore, 200,300,"scrolltext")
OpenWindowedScreen(WindowID(0),0,0,200,300,0,0,0)

CreateSprite(0,200,100)
StartDrawing(SpriteOutput(0))
  Line( 0,   0, 200, 100,$C00000)
  Line( 0, 100, 200,-100,$C00000)
  For n=0 To 199
    Plot(Random(199),Random(99),RGB(100+Random(155),155+Random(100),200+Random(55)))
  Next
StopDrawing()

koor = 0

Repeat
  EvID = WaitWindowEvent(20)

  ClearScreen($300000)

  For n=0 To 3
    DisplaySprite(0,0,100*n-koor)
  Next

  koor +1
  If koor > 99 : koor = 0 : EndIf

  FlipBuffers()

Until EvID = #PB_Event_CloseWindow

Verfasst: 23.02.2008 21:36
von scholly
@Kaeru Gaman
hm...
ich versteh das (Dein erster Code) nicht so ganz.
Warum hast Du für jede Text-Zeile ein Sprite erstellt ?
Ich könnte ja auch ein Grafisches Sprite (z.B.) ein Logo nehmen wollen.

Und ich kann den prinzipiellen Unterschied zwischen meiner und Deiner Repeat-Schleife nicht erkennen, der bewirkt, daß Deine kontinuierlicher scrollt als meine (nach der von Zeha empfohlenen Änderung).

Magst Du (mir) das erklären ?

Verfasst: 23.02.2008 21:42
von Kaeru Gaman
das erste hab ich gemacht, weil du von text gesprochen hast.

das zweite ist das beispiel für kontinuierliches scrollen von blöcken.
ich hab immer einen block mehr als den screen ausfüllt, das ist der ganze trick.
soviel ich vom ersten rausscrolle, soviel scroll ich vom letzten wieder rein.
wenn der letzte ganz zu sehen ist, ist der erste komplett verschwunden.

Verfasst: 23.02.2008 21:51
von scholly
Ich verstehs immer noch nicht.
z.B. wieso in Deiner Schleife steht koor(n) + 320.
Wie errechnen sich die 320?

Kannst Du nicht mein Beispiel so verändern, daß es funktioniert?
Dann werd ichs hoffentlich schnallen...

Verfasst: 23.02.2008 22:02
von Kaeru Gaman
die 320 sind 20*16. jede zeile ist 20 pix hoch, 16 haben wir.
da der screen 300 hoch ist, haben wir genau eine mehr als wir brauchen um den screen zu füllen.
dadurch kann eine reinscrollen während eine andere rausscrollt.
das ist der kernpunkt.

> Kannst Du nicht mein Beispiel so verändern, daß es funktioniert?

mom ich guck mal drüber und edite dann

[edit]
da dein screen höher als das sprite ist, brauchst du es drei mal.
wäre es genauso hoch, bräuchtest du zwei.
bis maximal 2x so hoch brauchst du drei, bis 3x so hoch bräuchtest du 4, usw.

Code: Alles auswählen

InitSprite()

LoadFont(0,"courier new",32,#PB_Font_Bold)

#screen_height = 540
#sprite_height = 480

OpenWindow(0, #PB_Ignore, #PB_Ignore, 900, 600, "DisplaySprite3D", #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),5,5,890,#screen_height,0,0,0)

CreateSprite(0, 830, #sprite_height, #PB_Sprite_Texture)
  StartDrawing(SpriteOutput(0))
   
    DrawingMode(1)
    FrontColor(#Red)
    DrawingFont(FontID(0))
    DrawText(0,  0,"Ich will ja nur mal testen")
    DrawText(0, 40,"ob ich das hinbekomme und")
    DrawText(0, 80,"für Geschwindigkeit muß am")
    DrawText(0,120,"'Y-Wert' gedreht werden und")
    DrawText(0,160,"als nächstes probier ich")
    DrawText(0,200,"dann endlosscrollen und dann")
    DrawText(0,240,"zu zentrieren und danach daß")
    DrawText(0,280,"es nach oben schmaler wird")
    DrawText(0,320,"und dann eine Texur statt")
    DrawText(0,360,"einer Textfarbe setzen")
    DrawText(0,400,"und dann..............")
   
  StopDrawing()

y = #sprite_height

Repeat

  EventID = WindowEvent()

  ClearScreen(RGB(0, 0, 0))
 
  DisplaySprite(0, 30, -1 * #sprite_height + y)
  DisplaySprite(0, 30,  0 * #sprite_height + y)
  DisplaySprite(0, 30,  1 * #sprite_height + y)
     
  y - 1
  If y < 0
    y = #sprite_height
  EndIf
 
  FlipBuffers()

Until EventID = #PB_Event_CloseWindow

Verfasst: 23.02.2008 22:29
von scholly
Kaeru Gaman hat geschrieben:da dein screen höher als das sprite ist, brauchst du es drei mal.
wäre es genauso hoch, bräuchtest du zwei.
bis maximal 2x so hoch brauchst du drei, bis 3x so hoch bräuchtest du 4, usw.
Puh... is dat kompliziert... :?
...und ab Fuffzich fällt der Groschen auch nur noch pfennigweise :cry:

Wenn ich das also ganz unabhägig machen will, muß ich die Anzahl der darzustellenden Sprites berechnen:

Code: Alles auswählen

For spritecounter = 1 To (Round(#screen_height/#sprite_height,1) + 1)
  DisplaySprite(0, 30, (spritecounter -2) * #sprite_height + y)
Next spritecounter
Richtig gedacht ?

Verfasst: 23.02.2008 22:43
von Kaeru Gaman
round ist für floats, rechne mit integer, dann kannst du dir den krempel sparen:

Code: Alles auswählen

#screen_height = 512
#sprite_height = 256 

Anz.l = ( ( #screen_height -1 ) / #sprite_height ) +2

Debug Anz
aber machs dir nicht so kompliziert.

stell dir den hintergrund als ein kachelfeld vor, über dem du den screen wie eine öffnung hin und her schiebst.
damit nirgendwo eine lücke auftaucht, muss das kachelfeld eine kachelreihe breiter sein,
als die durchsehöffnung groß ist.

Bild