Seite 1 von 1

[gelöst] Wie Images durch Sprites ersetzen?

Verfasst: 23.03.2008 15:23
von scholly
buenos Eires :lol:

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
Ich hab Einiges erfolglos ausprobiert, deswegen:
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...

Verfasst: 23.03.2008 16:36
von Riacon

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) 
CreateSprite(1,#ScreenX,#ScreenY)

  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(SpriteOutput(1)) 
          DrawImage(ImageID(i), xpos, ypos, w, h) 
        StopDrawing() 
        DisplayTransparentSprite(1,0,0)
      EndIf 
    Next 
      
  
  
  FlipBuffers() 
Until EventID = #PB_Event_CloseWindow

Verfasst: 23.03.2008 17:04
von tobe
@Riacon
gut gelöst, aber DisplayTransparentSprite(1,0,0) würde ich nach der for next schleife platzieren sonst wird es oft umsonst gezeichnet ;)

Code: Alles auswählen

    If w > 0 And h > 0
      StartDrawing(SpriteOutput(1))
        DrawImage(ImageID(i), xpos, ypos, w, h)
      StopDrawing()
    EndIf
  Next
  DisplayTransparentSprite(1,0,0)
mfg
tobe

Verfasst: 23.03.2008 17:21
von scholly
@Riacon: :allright:

Ich hatte mich total darin verzettelt, jedes einzelne Image durch ein Sprite zu ersetzen - auf die Idee mit dem einzelnen, Screen-großen Sprite bin ich garnicht gekommen :oops:

Jetzt versuch ich mal ein Rezept gegen das "Zittern" zu finden.

Danke, und nochn schönen Tag...

Verfasst: 23.03.2008 17:39
von Riacon
@scholly
da bleiben jetzt aber artefakte über, wenn die schrift durch ist.
entweder das sprite mit freesprite wegwerfen oder mit einem leeren bild löschen. clearsprite() äquivalent zu clearscreen() gibts ja nicht

Verfasst: 23.03.2008 17:52
von scholly
Ich lass als Hintergrund den Sternen-Scroller von benny
http://www.purebasic.fr/german/archive/ ... 52&start=7
laufen, Sterne und Schrift in gelb, da fällt eigentlich kaum was auf.