Star Wars {Episode PureBasic}

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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)
Zuletzt geändert von Froggerprogger am 07.08.2005 11:08, insgesamt 4-mal geändert.
!UD2
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag 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?.....
-.-"
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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 ?
!UD2
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Das geht wegen der Hardware-Beschleunigung bei Sprites sicherlich schneller. :)

TransformSprite3D ausprobieren?
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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.
!UD2
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

ich hab von einigen gehört dass auch 2*64 oder 4*256 oder so geht. Habs aber noch nicht probiert.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

es MUSS NICHT wuadatisch sein.
meine gfx karte zb unterstützt auch rechtecke, die zb 500*412 gross sind.
jedoch ist das nicht bei allen grafik karten so :wink:
-.-"
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Also wenn mein Code bei dir funzt dann kann deine Graka auch
Sprite3d´s ab die nicht quadratisch sind
I´a dllfreak2001
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Meine GraKa bekommt das auch hin, aber das kann doch trotzdem nicht die optimale Lösung sein ?
Alternativ könnte man eine Textzeile (z.B. mit Höhe 64) in mehrere nebeneinanderliegende Quadrate aufteilen.
Aber nach dem Resizen und dem späteren Zusammensetzen gibt es dann bestimmt Kanten an den Übergängen.
!UD2
Antworten