
Denn folgender Code sieht eigentlich genau aus wie bei StarWars, allerdings ist das Resizen zu lahm, daher ruckelt er, sobald einige Zeilen im Bild sind.
Vielleicht findet jemand die Zeit, den Code entsprechend umzubauen ?
Zumindest generiert er je Zeile ein eigenes Image, welches entsprechend verzerrt ist, und nur noch skaliert zu werden braucht.
[edit] Source geupdated[/edit]
Code: Alles auswählen
;- PB-StarWars
;-
;- Froggerprogger 06.08.2005
#ScreenX = 1024
#ScreenY = 768
#numLines = 19
#StretchFactor = 3.0
#HeightScale = 0.75
#WidthScale = 1.2
#FontSize = 36 ; pt
#LineHeight = 60 ; pixel
#SizeFactor = 1
#TextSpeed = 3.0
#LineSpace = 0.03
InitSprite()
InitKeyboard()
*font = LoadFont(#PB_Any, "Arial", #FontSize, #PB_Font_Bold |#PB_Font_HighQuality)
;- create the textlines
Dim Textlines.s(#numLines-1)
Textlines(0) = "Episode III"
Textlines(1) = "DIE RACHE DER SITH"
Textlines(2) = "Krieg! Die Republik zerfällt"
Textlines(3) = "unter den Angriffen des skrupellosen"
Textlines(4) = "Sith-Lords, Count Dooku."
Textlines(5) = "Es gibt Helden auf beiden Seiten."
Textlines(6) = "Das Böse ist überall."
Textlines(7) = ""
Textlines(8) = "Mit einem überwältigendem Schlag gelingt"
Textlines(9) = "es dem teuflischen Droidenanführer, General"
Textlines(10) = "Grievous, auf die Hauptwelt der Republic"
Textlines(11) = "vorzudringen und den Führer des Galaktischen"
Textlines(12) = "Senats, den Obersten Kanzler Palpatine, zu "
Textlines(13) = "entführen. Als die Droidenarmee der"
Textlines(14) = "Seperatisten mit der wertvollen Geisel"
Textlines(15) = "aus der belagerten Hauptstadt fliehen will,"
Textlines(16) = "leiten zwei Jedi-Ritter"
Textlines(17) = "eine verzweifelte Mission ein, um den"
Textlines(18) = "gefangenen Kanzler zu retten..."
;- get the linewidths
Dim LineWidths.l(#numLines-1)
tempImage = CreateImage(#PB_Any, 100, #LineHeight)
UseImage(tempImage)
StartDrawing(ImageOutput())
DrawingFont(UseFont(*font))
For i=0 To #numLines-1
LineWidths(i) = TextLength(Textlines(i))
Next
StopDrawing()
FreeImage(tempImage)
;- open a screen
OpenScreen(#ScreenX, #ScreenY, 32, "PB-StarWars")
ClearScreen(0,0,0)
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(255,200,60)
DrawText("please wait...")
StopDrawing()
FlipBuffers()
;- create and transform the images
Dim OrigTextLineImages.l(#numLines-1)
For i=0 To #numLines-1
lineWidth = LineWidths(i) + 10
tempImage = CreateImage(#PB_Any, lineWidth, #LineHeight)
Dim TempImage.l(lineWidth-1, #LineHeight-1)
UseImage(tempImage)
StartDrawing(ImageOutput())
Box(0,0,lineWidth,#LineHeight,0)
DrawingMode(1)
FrontColor(255,200,60)
DrawingFont(UseFont(*font))
Locate((lineWidth - TextLength(Textlines(i)))/ 2, 0)
DrawText(Textlines(i))
For j=0 To #LineHeight-1
For k=0 To lineWidth-1
TempImage(k, j) = Point(k,j)
Next
Next
StopDrawing()
FreeImage(tempImage)
CreateImage(i, lineWidth, #LineHeight)
UseImage(i)
StartDrawing(ImageOutput())
Box(0,0,lineWidth,#LineHeight,0)
For j=0 To #LineHeight-1
lineoffset.f = #StretchFactor * (#LineHeight-1 - j) / 1000.0
For k=0 To lineWidth/2 - 1
offset = lineoffset * k
If k+offset >= lineWidth/2
Break
EndIf
Plot(lineWidth/2 + k, j, TempImage(lineWidth/2 + k + offset, j))
Plot(lineWidth/2 - k, j, TempImage(lineWidth/2 - k - offset, j))
Next
Next
StopDrawing()
Next
;- display the images
starttime = ElapsedMilliseconds()
lastFpsTime = ElapsedMilliseconds()
framecounter = 0
firstlinedist.f = 1.0
Dim lastImagePosXY.l(#numLines-1, 1)
For i=0 To #numLines-1
lastImagePosXY(i, 0) = $80000000
lastImagePosXY(i, 1) = $7FFFFFFF
Next
Repeat
framecounter + 1
If ElapsedMilliseconds() - lastFpsTime > 1000
fps = framecounter
framecounter = 0
lastFpsTime = ElapsedMilliseconds()
EndIf
ClearScreen(0,0,0)
ExamineKeyboard()
StartDrawing(ScreenOutput())
Locate(0, 0)
DrawingMode(1)
FrontColor(100,100,100)
DrawText(Str(fps)+ " fps")
firstlinedist.f = 1.0 + #TextSpeed * 1.0 * (ElapsedMilliseconds() - starttime) / 100000.0
For i=0 To #numLines - 1
liney.f = firstlinedist - #LineSpace * (i * #HeightScale * #LineHeight) / (#numLines - 1)
If liney < 1.0
Break
EndIf
liney * liney
yposf.f = (#ScreenY * liney + #ScreenY) / (2.0 * liney)
sizeFac.f = (#SizeFactor * yposf) / 384.0 - 1.0
UseImage(i)
h = Int(ImageHeight() * sizeFac * #HeightScale)
w = Int(ImageWidth() * sizeFac * #WidthScale)
xpos = 512 - w/2
ypos = Int(yposf)
If xpos < lastImagePosXY.l(i, 0)
xpos = lastImagePosXY.l(i, 0)
EndIf
If ypos > lastImagePosXY.l(i, 1)
ypos = lastImagePosXY.l(i, 1)
EndIf
lastImagePosXY.l(i, 0) = xpos
lastImagePosXY.l(i, 1) = ypos
If ypos >= 768
Break
EndIf
If w > 0 And h > 0
DrawImage(UseImage(i), xpos, ypos, w, h)
EndIf
Next
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)