Smooth scrolling text like C64/Amiga how to do it in basic?
- Kaeru Gaman
- Addict
- Posts: 4826
- Joined: Sun Mar 19, 2006 1:57 pm
- Location: Germany
You had missed a number of things, including outputting to the screen.
It's really not that hard:
It's really not that hard:
Code: Select all
InitSprite()
InitKeyboard()
OpenScreen(1024, 768, 32, "Display System")
LoadFont(0,"Arial",72)
text.s = "Display System Version 0.1"
StartDrawing(ScreenOutput())
DrawingFont(FontID(0))
tw.l = TextWidth(text)
ImageToDrawOn = CreateImage(#PB_Any, tw, TextHeight(text), 32)
StopDrawing()
StartDrawing(ImageOutput(ImageToDrawOn))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(0))
DrawText(0, 0, text, RGB(255,255,255))
StopDrawing()
For x = 1024 To -tw Step -1
StartDrawing(ScreenOutput())
DrawImage(ImageID(ImageToDrawOn), x, 200)
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
Break
EndIf
Next
Last edited by Foz on Wed Jun 18, 2008 3:58 pm, edited 2 times in total.
-
- User
- Posts: 22
- Joined: Sun Jun 15, 2008 2:34 pm
I have gotten this to work now without flickering due to using ClearScreen($402010).
But the scroller is still slow and the movie gets played in the background instead of the foreground and there is no transperency either with the text just white text and black background.
Also about converting the image to a sprite how is this done maybe this will speed up things ?[/code]
But the scroller is still slow and the movie gets played in the background instead of the foreground and there is no transperency either with the text just white text and black background.
Also about converting the image to a sprite how is this done maybe this will speed up things ?
Code: Select all
InitKeyboard()
InitMovie()
InitSprite()
InitSprite3D()
OpenScreen(1024, 768, 32, "Display System")
LoadFont(0,"Arial",130)
text.s = "Display System Version 0.1"
LoadMovie(0, "(Fatboy Slim) - Weapon Of Choice.mpg")
Surface = CreateSprite(0, 256, 256, #PB_Sprite_Texture)
Surface2 = CreateSprite3D(0 , 0)
PlayMovie(0, #PB_Movie_Rendered)
StartDrawing(ScreenOutput())
DrawingFont(FontID(0))
tw.l = TextWidth(text)
ImageToDrawOn = CreateImage(#PB_Any, tw, TextHeight(text), 32)
StopDrawing()
StartDrawing(ImageOutput(ImageToDrawOn))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(0))
DrawText(0, 0, text, RGB(255,255,255))
StopDrawing()
For x = 1024 To -tw Step -1
StartDrawing(ScreenOutput())
DrawImage(ImageID(ImageToDrawOn), x, 200)
StopDrawing()
FlipBuffers()
ClearScreen($402010)
Start3D()
RenderMovieFrame(0,Surface)
DisplaySprite3D(0, 200, 200, x)
ZoomSprite3D(0, x, x)
RotateSprite3D(0, x, 0)
Stop3D()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
Break
EndIf
Next
- Kaeru Gaman
- Addict
- Posts: 4826
- Joined: Sun Mar 19, 2006 1:57 pm
- Location: Germany
> the movie gets played in the background instead of the foreground
mind the order of your commands.
first clear the screen, then output back to fore, then flip.
> Also about converting the image to a sprite how is this done
draw your chars to a sprite not to an image right in the beginning.
mind the order of your commands.
first clear the screen, then output back to fore, then flip.
> Also about converting the image to a sprite how is this done
draw your chars to a sprite not to an image right in the beginning.
oh... and have a nice day.
-
- User
- Posts: 22
- Joined: Sun Jun 15, 2008 2:34 pm
If i put clearscreen at the top i get the flickering.
I also tried to move around the start3d function but it does not matter where i move it still is not displayed in the foreground.
And if i move flip buffers down below stop3d i get flickering text again.
I also tried to convert chars to a sprite but i don't even get a error message or even a black screen.
I hope somebody can help me with this.
I also tried to move around the start3d function but it does not matter where i move it still is not displayed in the foreground.
And if i move flip buffers down below stop3d i get flickering text again.
I also tried to convert chars to a sprite but i don't even get a error message or even a black screen.
I hope somebody can help me with this.
Code: Select all
InitKeyboard()
InitMovie()
InitSprite()
InitSprite3D()
OpenScreen(1024, 768, 32, "Display System")
LoadFont(0,"Arial",130)
text.s = "Display System Version 0.1"
LoadMovie(0, "(Fatboy Slim) - Weapon Of Choice.mpg")
Surface = CreateSprite(0, 256, 256, #PB_Sprite_Texture)
Surface2 = CreateSprite3D(0 , 0)
PlayMovie(0, #PB_Movie_Rendered)
StartDrawing(ScreenOutput())
DrawingFont(FontID(0))
tw.l = TextWidth(text)
ImageToDrawOn = CreateSprite(0, tw, TextHeight(text),0)
StopDrawing()
StartDrawing(SpriteOutput(ImageToDrawOn))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(0))
DrawText(0, 0, text, RGB(255,255,255))
StopDrawing()
For x = 1024 To -tw Step -1
StartDrawing(ScreenOutput())
DisplaySprite(SpriteID(ImageToDrawOn), 200, 200)
StopDrawing()
ClearScreen($402010)
Start3D()
RenderMovieFrame(0,Surface)
DisplaySprite3D(0, 200, 200, x)
ZoomSprite3D(0, x, x)
RotateSprite3D(0, x, 0)
Stop3D()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
Break
EndIf
Next
You can't put RenderMovieFrame() in a Start block.
This is a little closer, but you'll need to deal with transparancy:
This is a little closer, but you'll need to deal with transparancy:
Code: Select all
InitKeyboard()
InitMovie()
InitSprite()
OpenScreen(1024, 768, 32, "Display System")
LoadFont(0, "Arial", 130)
text.s = "Display System Version 0.1"
StartDrawing(ScreenOutput())
DrawingFont(FontID(0))
tw.l = TextWidth(text)
ImageText = CreateImage(#PB_Any, tw, TextHeight(text), 32)
StopDrawing()
StartDrawing(ImageOutput(ImageText))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(0))
DrawText(0, 0, text, RGB(255, 255, 255))
StopDrawing()
LoadMovie(0, "C:\Documents\Projects\Scroller Test\a_movie2.mpeg")
MovieSprite = CreateSprite(#PB_Any, 352, 240)
PlayMovie(0, #PB_Movie_Rendered)
For x = 1024 To -tw Step -1
RenderMovieFrame(0, SpriteID(MovieSprite))
DisplaySprite(MovieSprite, 200, 200)
StartDrawing(ScreenOutput())
DrawImage(ImageID(ImageText), x, 200)
StopDrawing()
FlipBuffers(#PB_Screen_WaitSynchronization)
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
Break
EndIf
Next
-
- User
- Posts: 22
- Joined: Sun Jun 15, 2008 2:34 pm
Thanks alot yes this certainly is a step in the right direction but the text generation seems slow when the movie is on and if i try to speed it up it just gets jerky.Foz wrote:You can't put RenderMovieFrame() in a Start block.
This is a little closer, but you'll need to deal with transparancy:Code: Select all
InitKeyboard() InitMovie() InitSprite() OpenScreen(1024, 768, 32, "Display System") LoadFont(0, "Arial", 130) text.s = "Display System Version 0.1" StartDrawing(ScreenOutput()) DrawingFont(FontID(0)) tw.l = TextWidth(text) ImageText = CreateImage(#PB_Any, tw, TextHeight(text), 32) StopDrawing() StartDrawing(ImageOutput(ImageText)) DrawingMode(#PB_2DDrawing_Transparent) DrawingFont(FontID(0)) DrawText(0, 0, text, RGB(255, 255, 255)) StopDrawing() LoadMovie(0, "C:\Documents\Projects\Scroller Test\a_movie2.mpeg") MovieSprite = CreateSprite(#PB_Any, 352, 240) PlayMovie(0, #PB_Movie_Rendered) For x = 1024 To -tw Step -1 RenderMovieFrame(0, SpriteID(MovieSprite)) DisplaySprite(MovieSprite, 200, 200) StartDrawing(ScreenOutput()) DrawImage(ImageID(ImageText), x, 200) StopDrawing() FlipBuffers(#PB_Screen_WaitSynchronization) ExamineKeyboard() If KeyboardPushed(#PB_Key_Escape) Break EndIf Next
it's slow for two reasons:
1. It's waiting for the vsync. This would be 60hz for most people.
2. It's only moving the text on 1 pixel at a time. (step -1)
These two reasons combined is why it's slow - it's only doing 60 pixels a second.
The vsync gives constant speed, so you'll need to play with the pixel jump - step -2, step -3, etc
1. It's waiting for the vsync. This would be 60hz for most people.
2. It's only moving the text on 1 pixel at a time. (step -1)
These two reasons combined is why it's slow - it's only doing 60 pixels a second.
The vsync gives constant speed, so you'll need to play with the pixel jump - step -2, step -3, etc
-
- User
- Posts: 22
- Joined: Sun Jun 15, 2008 2:34 pm
Yes that's exactly what i changed but it stutters badly. It moves the text faster but it's just not smooth in any way it's basically dropping frames to keep up.Foz wrote:it's slow for two reasons:
1. It's waiting for the vsync. This would be 60hz for most people.
2. It's only moving the text on 1 pixel at a time. (step -1)
These two reasons combined is why it's slow - it's only doing 60 pixels a second.
The vsync gives constant speed, so you'll need to play with the pixel jump - step -2, step -3, etc
How do i get the text to display as a sprite instead of an image ? Maybe this will speed up things.
And i have a very solid C2D@2.8Ghz and 2GB ram and Radeon X1950Pro so the hardware should be able to handle it without any skipping or dramatic slowdown. I mean the movie is always running smoothly but everything else gets slowed down when it's enabled. And a simple MPEG1 is just not very processor intensive when u have a C2D.
The text is very smooth at high speeds when the movie is disabled. Thats why i think that maybe it's a good thing to try and convert the text to sprite instead of text to image but i don't know how to do that.
- Kaeru Gaman
- Addict
- Posts: 4826
- Joined: Sun Mar 19, 2006 1:57 pm
- Location: Germany
fusion_400 wrote:How do i get the text to display as a sprite instead of an image ?
...
convert the text to sprite instead of text to image but i don't know how to do that.
use SpriteOutput() instead of ImageOutput()Kaeru Gaman wrote:draw your chars to a sprite not to an image right in the beginning.
oh... and have a nice day.
-
- User
- Posts: 22
- Joined: Sun Jun 15, 2008 2:34 pm
To be honest, having a 30000x300x32 sprite is a Bad Idea anyway.
The correct method would be to chop the string into multiple parts and then only display what you need. For instance, at a minimum have one sprite per letter and then display just the required letters. Given the size of the letters though, it may be better to have a chopping function into say 64x64 pixel sprites and do the stitching on the fly.
The correct method would be to chop the string into multiple parts and then only display what you need. For instance, at a minimum have one sprite per letter and then display just the required letters. Given the size of the letters though, it may be better to have a chopping function into say 64x64 pixel sprites and do the stitching on the fly.