Seite 3 von 4

Verfasst: 31.07.2005 19:28
von Green Snake
naja, das is nich ganz das was ich gesucht habe, aber es geht in die richtung. :mrgreen:

aber funktioniert denn die ausstreckung mit den 3d sprites nicht?
dass sie den starwars effekt bekommen?

Verfasst: 31.07.2005 19:32
von Batze
Nö, das scheint unmöglich zu sein. :freak::freak::freak::freak::freak::freak::freak::freak::freak::freak::freak::freak:

Verfasst: 06.08.2005 17:58
von dllfreak2001
Hab mal bisschen rumgebastelt...
Sieht zwar nicht ganz wie der aus StarWars aus aber ich glaube die richtung ist schon mal vorgegeben...

Code: Alles auswählen

InitSprite()
InitSprite3D()
file.s = OpenFileRequester("Text öffnen...","","Textdatei *.txt|*.txt",0)
If file = ""
    End
EndIf
ReadFile(0,file)
NewList texta.s()
Repeat
    AddElement(texta())
    texta() = ReadString()
Until Eof(0)
CloseFile(0)
OpenScreen(800,600,32,"StarWars-Intro v1.0")
    Dim fade.f(CountList(texta())-1)
    Dim posy.l(CountList(texta())-1)
    Dim zoom.f(CountList(texta())-1)
    LoadFont(1, "Verdana", 24)
    FirstElement(texta())
    For x = 0 To CountList(texta())-1
        CreateSprite(x,800,64,#PB_Sprite_Texture)
        
        StartDrawing(SpriteOutput(x))
            DrawingMode(1)
            FrontColor(255,255,0)
            DrawingFont(UseFont(1))
            DrawText(texta())
        StopDrawing()
        CreateSprite3D(x,x)  
        fade(x) = 255
        posy(x) = x*64
        zoom(x) = 1
        NextElement(texta())
    Next
    Global a.f,b.f ,ar.f
Repeat
    ExamineKeyboard()
    Start3D()
        For x = 0 To (CountList(texta())-1)
            If fade(x) > 0
                posy(x) - 1
            EndIf
            If posy(x) < 0 And fade(x) > 0
                fade(x) - 0.5
                zoom(x) + 0.5
                b = 1 - zoom(x)/400
                a = 1 - zoom(x)/800
                TransformSprite3D(x,zoom(x),0,a,800-zoom(x),0,a,800-zoom(x)/2,64,b,zoom(x)/2,64,b)
                DisplaySprite3D(x,0,600+posy(x),fade(x))
            EndIf
        Next
    Stop3D()
    FlipBuffers()
    ClearScreen(0,0,0)
Until KeyboardPushed(#PB_Key_Escape)
CloseScreen()
End

Verfasst: 06.08.2005 19:04
von Green Snake
jo, is noch nich ganz star wars, aber auch egal.
ich habe trotzdem gute verwändung für deinen code.

danke dir, und allen anderen auch :wink:

Verfasst: 06.08.2005 20:54
von Froggerprogger
Wenn wir uns zusammentun, sollten wir was schönes hinbekommen :wink:
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)

Verfasst: 06.08.2005 21:01
von Green Snake
wow, der code is ja noch besser. :D
aber das ruckeln....is wirklich schlimm....wie könnte man das nur schneller machen?.....

Verfasst: 06.08.2005 21:15
von bluejoke
Blendet doch die ersten Zeilen aus, nachdem man sie gelesen hat.

Muss aber noch deutlich langsamer fliegen, sonst kommt man fast nicht mit

Verfasst: 06.08.2005 22:02
von Froggerprogger
Hab noch nen #TextSpeed nachgerüstet.

Ich denke mal, das Ruckeln kann man nur durch eine ganz andere Rangehensweise lösen, z.B. könnte man vielleicht nicht jede Zeile einzeln, sondern jeweils einen ganzen Abschnitt in ein Image packen.
Und: Noch werden >>Images<< genutzt, vielleicht sind Sprites da viieeel schneller, allerdings weiß ich bei Sprties nicht, wie das mit dem Resizen geht. (Ich mache sonst nix mit Grafiken)

Aber vielleicht findet jemand die Zeit, obigen Code zu beschleunigen ?

Verfasst: 06.08.2005 22:21
von Andre
Das geht wegen der Hardware-Beschleunigung bei Sprites sicherlich schneller. :)

TransformSprite3D ausprobieren?

Verfasst: 06.08.2005 22:54
von Froggerprogger
Hmmm. Ein 3D-Sprite muss doch quadratisch sein, oder sehe ich da was falsch ?
Aus der Hilfe zu CreateSprite3D():
Die Textur muss ein Quadrat in den folgenden Grössen sein: 16*16, 32*32, 64*64, 128*128 oder 256*256.