
Ich hab gestern einen alten StarWars-Scroller von Froggerprogger ausgegraben und ein wenig damit herumgebastelt.
Momentan häng ich an dem Punkt fest, wo ich die berechneten Images gegen Sprites austauschen müßte, damit die Image-Hintergrundfarbe (schwarz) mit DisplayTransparentSprite() das durchscheinen läßt, was darunter liegt.
Code: Alles auswählen
;- PB-StarWars
;- http://www.purebasic.fr/german/viewtopic.php?t=4100&start=24
;- Froggerprogger 06.08.2005
#win_nr = 1
#ScreenX = 400
#ScreenY = 400
#numLines = 19
#StretchFactor = 3.0
#HeightScale = 0.75
#WidthScale = 1.2
#FontSize = 18 ; pt
#LineHeight = 40 ; pixel
#SizeFactor = 1
#TextSpeed = 3.0
#LineSpace = 0.05
Define ScreenX_halb.l = #ScreenX/2
Define ScreenY_halb.l = #ScreenY/2
InitSprite()
sw_font = LoadFont(#PB_Any, "Verdana", #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"
Textlines(4) = "skrupellosen Sith-Lords,"
Textlines(5) = "Count Dooku. Es gibt Helden"
Textlines(6) = "auf beiden Seiten."
Textlines(7) = "Das Böse ist überall."
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)
ImageID(tempImage)
StartDrawing(ImageOutput(tempImage))
DrawingFont(FontID(sw_font))
For i=0 To #numLines-1
LineWidths(i) = TextWidth(Textlines(i))
Next
StopDrawing()
FreeImage(tempImage)
;- open a windowed screen
hwnd = OpenWindow(#win_nr, #PB_Ignore, #PB_Ignore, #screenx+20,#screeny+20, "PB-StarWars", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(hwnd)
OpenWindowedScreen(hwnd,10,10,#screenx,#screeny,0,0,0)
ClearScreen(RGB(0,0,0))
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(RGB(255,200,60))
DrawText(0,0,"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)
ImageID(tempImage)
StartDrawing(ImageOutput(tempImage))
Box(0,0,lineWidth,#LineHeight,0)
DrawingMode(1)
FrontColor(RGB(255,200,60))
DrawingFont(FontID(sw_font))
DrawText((lineWidth - TextWidth(Textlines(i)))/ 2, 0,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)
ImageID(i)
StartDrawing(ImageOutput(i))
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
EventID = WindowEvent()
framecounter + 1
If ElapsedMilliseconds() - lastFpsTime > 1000
fps = framecounter
framecounter = 0
lastFpsTime = ElapsedMilliseconds()
EndIf
ClearScreen(RGB(120,120,120))
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(RGB(100,100,100))
DrawText(0,0,Str(fps)+ " fps")
StopDrawing()
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) / ScreenY_halb - 1.0
ImageID(i)
h = Int(ImageHeight(i) * sizeFac * #HeightScale)
w = Int(ImageWidth(i) * sizeFac * #WidthScale)
xpos = ScreenX_halb - 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 >= #ScreenY
Break
EndIf
If w > 0 And h > 0
StartDrawing(ScreenOutput())
DrawImage(ImageID(i), xpos, ypos, w, h)
StopDrawing()
EndIf
Next
FlipBuffers()
Until EventID = #PB_Event_CloseWindow
Was muß ich wo wie ändern/hinzufügen damit z.B. ein Hintergrundbild nur durch die Buchstaben und nicht durch die schwarzen Rahmen drumherum überdeckt wird?
mDv...