Technik hinter 'Night Driver', 'OutRun', 'Lotus' und co. ?

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

Bura.Tino

Betreff: Technik hinter 'Night Driver', 'OutRun', 'Lotus' und co. ?

BeitragMi, Sep 23, 2009 3:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Die (ehemaligen) Dos-Aktivisten unter uns kennen sie sicherlich und lieben sie vielleicht genauso sehr wie ich...Die guten alten Spiele aus den Anfängen der Computer. Einer Zeit in der es noch kein Bump-Mapping und keine Shader gab.
Ich persönlich fand die ersten Rennsimulationen wie 'Pole Position' und 'OutRun' schon immer klasse und meiner Meinung nach können NfS, GTR etc. denen in Sachen Spielspaß nicht mal annähernd das Wasser reichen.
Ich habe mir schon öfters Gedanken darüber gemacht welche Technik hinter diesen alten Spielen steckt und dementsprechend viele Stunden mit meinem Freund Google verbracht. Leider bisher erfolglos und deswegen wollte ich hier mal fragen, ob sich jemand von Euch damit auskennt.
Diese alten Spiele sind ja nicht auf einer 3D-Engine basierend, täuschen die dritte Dimension aber sehr gut vor. Im Prinzip also Pseudo-3D. Nur wie funktoniert das ?
Das einfachste was mir dazu einfällt dürfte wohl das Spiel 'Night Driver' sein. Man hat einen schwarzen Hintergrund, sowie links und rechts jeweils weiße Balken als Straßenbegrenzungen. Ungeachtet der simplen Grafik kommt dennoch ein recht realistisches Fahrgefühl rüber, da die Position dieser weißen Balken korrekt berechnet wird. Bei dem Spiel 'Lotus' beispielsweise gibt es sogar Höhenunterschiede die simuliert werden.
Nur welche Mathematik steckt da dahinter ? Kennt sich jemand damit aus und kann mir das erklären ?

[Edit] Ich habe gerade bemerkt das ich den Thread im völlig falschen Forum erstellt habe, weil ich bei den FAQs gerade gesucht habe. Sorry deswegen. Vielleicht kann sie ein Admin ja verschieben !?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

orpheus_2003

BeitragMi, Sep 23, 2009 7:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow.

Jemand der Night Driver noch kennt. Meine Hochachtung.
http://www.ilovethe80s.com/arc...river1.htm

Wie die Technik funktioniert kann ich dir aber auch nicht sagen.
Ich denke es ist nur eine mathematische Annäherung.
Grafisch wurde das ja mit Sprites gemacht die einfach gezoomt wurden. (outrun usw)

Bin mal gespannt was da rauskommt. Würde mich auch interessieren..

Gruß M
GazerStar - the beginning
http://gazerstar.lexigame.de/
Wizard (Worktitel)
http://wizard.lexigame.de

BladeRunner

Moderator

BeitragMi, Sep 23, 2009 8:44
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.


Das Grundprinzip solcher Spiele ist recht simpel, es gibt intern eine Z-Order für alle MOBs auf dem Screen, und die werden dann von hinten nach vorne eingezeichnet. Die Bewegung wird durch ein verschieben auf dieser Z-Achse und zeitgleich durch ein anpassen von Grösse und leichtes verschieben auf der Y-Achse simuliert.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Bura.Tino

BeitragMi, Sep 23, 2009 10:06
Antworten mit Zitat
Benutzer-Profile anzeigen
@orpheus_2003
Ja natürlich kenne ich die erste Simulation dieser Art. Das war ja einer der Meilensteine in der Computergeschichte. Wink

Das bei 'OutRun' das Auto und die Werbeschilder Sprites sind ist mir klar, aber die Kurven und Höhenunterschiede müssen ja auch irgendwie berechnet werden.
Wenn man sich die weißen Balken auf dem von Dir geposteten Screenshot anschaut, dann sieht man ja das diese (rein zweidimensional gedacht) eine Kurve beschreiben. Im Screenshoot ist ja eine leichte Rechtskurve zu sehen. Wie man diese Kurve beschreibt wäre quasi der erste Schritt der mich interessieren würde. Sollte man dafür zwei Bezierkurven nehmen oder gibt es eine simplere Lösung ?


@Bladerunner
Vielen Dank fürs Verschieben.
Was meinst Du denn mit 'MOBs' ? Kennst Du ein Sourcecode-Beispiel oder ein Tutorial für die von Dir beschriebene Technik ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

BladeRunner

Moderator

BeitragMi, Sep 23, 2009 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein vorbestehendes Beispiel habe ich nicht zur Verfügung, sorry. Vielleicht krieg ich was simples gebastelt.
Ein MOB ist ein "MObile Object", also in etwa ein Sprite.

EDIT:
Das hier ist BMaxCode, und auch sehr unsauber programmiert. Zeigt nur in etwa den Weg wie es gehen kann.
Code:
SuperStrict
Local counter:Int,counter2:Int = -50,counter3:Int = -100

Local maxcounter:Int = 150
Local poscount:Int = 0, poscount2:Int = 1,poscount3:Int = 2
Local pos:Int[]=[0,10,20,30,40,30,20,10,0,-10,-20,-30,-20,-10]
Graphics 640 , 480

Repeat
   counter:+1
   If counter >= maxcounter Then
      counter = 0
      poscount:+ 3
      If poscount >= pos.length Then poscount = 0
   EndIf
   If counter <> 0 Then DrawLine 320-counter+pos[poscount]*(maxcounter*1.0/(counter*.5)),counter,320+counter+pos[poscount]* (maxcounter*1.0/(counter*.5)),counter
   counter2:+1
   If counter2 >= maxcounter Then
      counter2 = 0
      poscount2:+ 3
      If poscount2 >= pos.length Then poscount2 = 0
   EndIf
   If counter2 <>0 Then DrawLine 320-counter2+pos[poscount2]*(maxcounter*1.0/(counter2*.5)),counter2,320+counter2+pos[poscount2]* (maxcounter*1.0/(counter2*.5)),counter2
   counter3:+1
   If counter3 >= maxcounter Then
      counter3 = 0
      poscount3:+ 3
      If poscount3 >= pos.length Then poscount3 = 0
   EndIf
   If counter3 <>0 Then DrawLine 320-counter3+pos[poscount3]*(maxcounter*1.0/(counter3*.5)),counter3,320+counter3+pos[poscount3]* (maxcounter*1.0/(counter3*.5)),counter3

   Flip
   Cls
Until KeyHit(key_escape)=True Or AppTerminate()=True

Im Prinzip ist es sehr einfach, das austarieren der einzelnen Variablen dürfte das meiste Arbeit daran sein.

Bura.Tino

BeitragMi, Sep 23, 2009 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Code. Leider kann ich ihn nicht ausprobieren, da ich nur Blitz3D habe.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

BladeRunner

Moderator

BeitragMi, Sep 23, 2009 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein umsetzen auf Blitz3D sollte nicht allzuschwer sein, ich habe bewusst auf Objektorientierung etc verzichtet.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Eingeproggt

BeitragMi, Sep 23, 2009 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil mir grad fad war, die Umsetzung auf BlitzBasic (aollte auf B+ und B3D laufen)
Und bitte entschuldigt die etwas dämliche Lösung mit dem BlitzArray, ginge sicher schöner...

Code:
Local counter,counter2=-50,counter3=-100

Local maxcounter=150
Local poscount=0,poscount2=1,poscount3=2

Local pos[13]
pos[0]=0
pos[1]=10
pos[2]=20
pos[3]=30
pos[4]=40
pos[5]=30
pos[6]=20
pos[7]=10
pos[8]=0
pos[9]=-10
pos[10]=-20
pos[11]=-30
pos[12]=-20
pos[13]=-10
Local pos_length=13
;Local pos:Int[]=[0,10,20,30,40,30,20,10,0,-10,-20,-30,-20,-10]
Graphics 640,480
SetBuffer BackBuffer()

Local timer=CreateTimer(50)

Repeat
   counter=counter+1
   If counter >= maxcounter Then
      counter = 0
      poscount=poscount+ 3
      If poscount >= pos_length Then poscount = 0
   EndIf
   If counter <> 0 Then Line 320-counter+pos[poscount]*(maxcounter*1.0/(counter*.5)),counter,320+counter+pos[poscount]* (maxcounter*1.0/(counter*.5)),counter
   counter2=counter2+1
   If counter2 >= maxcounter Then
      counter2 = 0
      poscount2=poscount2+ 3
      If poscount2 >= pos_length Then poscount2 = 0
   EndIf
   If counter2 <>0 Then Line 320-counter2+pos[poscount2]*(maxcounter*1.0/(counter2*.5)),counter2,320+counter2+pos[poscount2]* (maxcounter*1.0/(counter2*.5)),counter2
   counter3=counter3+1
   If counter3 >= maxcounter Then
      counter3 = 0
      poscount3=poscount3+ 3
      If poscount3 >= pos_length Then poscount3 = 0
   EndIf
   If counter3 <>0 Then Line 320-counter3+pos[poscount3]*(maxcounter*1.0/(counter3*.5)),counter3,320+counter3+pos[poscount3]* (maxcounter*1.0/(counter3*.5)),counter3
   
   Flip 0
   WaitTimer timer
   Cls
Until KeyHit(1)


mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Noobody

BeitragMi, Sep 23, 2009 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe hier mal eine Allgemeine Lösung auf Basis eines Objekt-Kamera-Systems geschrieben.

Man müsste einfach die Linien durch Sprites ersetzen und noch Bodenteile einfügen (einfach statt Linien einen Type für Vierecke mit vier Vertices machen), dann kommt schon ein Streckengefühl auf Razz

Gesteuert wird mit den Pfeiltasten Code:
Const GWIDTH  = 800
Const GHEIGHT = 600

Graphics GWIDTH, GHEIGHT, 0, 2
SetBuffer BackBuffer()

Const AOV# = 60.0

Type TVertex
   Field X#
   Field Y#
   Field Z#
   
   Field ProjX#
   Field ProjY#
End Type

Type TEdge
   Field V1.TVertex
   Field V2.TVertex
End Type

Type TCamera
   Field X#
   Field Y#
   Field Z#
   
   Field Yaw#
End Type

Local Cam.TCamera = New TCamera

CreateLevel()

Local Timer = CreateTimer( 60 )

While Not KeyHit( 1 )
   Cls
   
   UserInput( Cam )
   Render( Cam )
   
   Flip 0
   WaitTimer Timer
Wend
End

Function CreateLevel()
   For Z# = 2 To 100 Step 5
      CreateEdge( CreateVertex( -3, -1, Z# ), CreateVertex( -3, 1, Z# ) )
      CreateEdge( CreateVertex(  3, -1, Z# ), CreateVertex(  3, 1, Z# ) )
   Next
   
   For Angle# =90 To 180
      CreateEdge( CreateVertex( Cos( Angle# )*100 +  97, -1, 100 + Sin( Angle# )*100 ), CreateVertex( Cos( Angle# )*100 +  97, 1, 100 + Sin( Angle# )*100 ) )
      CreateEdge( CreateVertex( Cos( Angle# )*100 + 103, -1, 100 + Sin( Angle# )*100 ), CreateVertex( Cos( Angle# )*100  + 103, 1, 100 + Sin( Angle# )*100 ) )
   Next
End Function

Function UserInput( Camera.TCamera )
   Camera\Yaw# = Camera\Yaw# + KeyDown( 203 ) - KeyDown( 205 )
   Camera\X# = Camera\X# + Sin( Camera\Yaw# )*( KeyDown( 208 ) - KeyDown( 200 ) )
   Camera\Z# = Camera\Z# - Cos( Camera\Yaw# )*( KeyDown( 208 ) - KeyDown( 200 ) )
End Function

Function Render( Camera.TCamera )
   Local PlaneDist# = 1/Tan( AOV#/2.0 )
   Local AspectRatio# = GHEIGHT/Float( GWIDTH )
   
   For Vertex.TVertex = Each TVertex
      Local TransformedX# = Vertex\X# - Camera\X#
      Local TransformedY# = Vertex\Y# - Camera\Y#
      Local TransformedZ# = Vertex\Z# - Camera\Z#
      
      Local Length# = Sqr( TransformedX#*TransformedX# + TransformedZ#*TransformedZ# )
      Local Angle#  = ATan2( TransformedZ#, TransformedX# )
      
      TransformedX# = Length#*Cos( Angle# - Camera\Yaw# )
      TransformedZ# = Length#*Sin( Angle# - Camera\Yaw# )
      
      If TransformedZ# > 0 Then
         Vertex\ProjX# = ( TransformedX#*PlaneDist/TransformedZ# + 1 )*GWIDTH/2.0
         Vertex\ProjY# = ( AspectRatio# - TransformedY#*PlaneDist/TransformedZ# )*GWIDTH/2.0
      Else
         Vertex\ProjX# = -10
         Vertex\ProjY# = -10
      EndIf
   Next
   
   For Edge.TEdge = Each TEdge
      Line Edge\V1\ProjX#, Edge\V1\ProjY#, Edge\V2\ProjX#, Edge\V2\ProjY#
   Next
End Function

Function CreateVertex.TVertex( X#, Y#, Z# )
   Local Vertex.TVertex = New TVertex
      Vertex\X# = X#
      Vertex\Y# = Y#
      Vertex\Z# = Z#
   
   Return Vertex
End Function

Function CreateEdge( V1.TVertex, V2.TVertex )
   Local Edge.TEdge = New TEdge
      Edge\V1 = V1
      Edge\V2 = V2
End Function


Edit: Hoppla, da war noch ein kleiner Fehler im Culling. Ist gefixt.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
  • Zuletzt bearbeitet von Noobody am Mi, Sep 23, 2009 17:34, insgesamt 2-mal bearbeitet

orpheus_2003

BeitragMi, Sep 23, 2009 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow.

@Noobody

Ich bin immer wieder begeistert wie schnell und gut du so was machst.
Ist echt gigantisch. Du bist doch sicher Hauptberuflich Programmierer!

Da komm ich mir mit meiner Kollision echt dämlich vor......

Back to topic....
Machen wir ein Retro Spiel..?
GazerStar - the beginning
http://gazerstar.lexigame.de/
Wizard (Worktitel)
http://wizard.lexigame.de

Bura.Tino

BeitragMi, Sep 23, 2009 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
@Noobody
Das ist zwar nicht schlecht, kommt aber diesen Spielen nicht wirklich nahe. Oder versteh ich das einfach nicht ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

BIG BUG

BeitragDo, Sep 24, 2009 0:25
Antworten mit Zitat
Benutzer-Profile anzeigen
letztendlich wird dieser typische Straßeneffekt einfach dadurch erreicht, dass eben jede Zeile einzeln ggf versetzt gezeichnet wird. Eine Zeile kann dabei ggf. aus mehreren Pixelreihen bestehen.
Da eine horizontale Pixelreihe im Grafikspeicher quasi ein zusammenhängendes "Array" ist, konnte ein solcher Grafikeffekt auch auf den früheren Konsolen/Amigas/PCs ausreichend schnell dargestellt werden.

Wäre vielleicht auchmal eine Idee für eine BCC-Aufgabe: Versuche einen dieser klassischen Grafikeffekte nachzuprogrammieren.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Bura.Tino

BeitragDo, Sep 24, 2009 5:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal schnell etwas gecodet, was noch lange nicht perfekt ist, aber zumindestens ist es ein erster Versuch.

Beispiel: Download

Gas und Bremse mit den Cursortasten
Steigung/Gefälle mit W/S
Kurven mit A und D

Ich habe absichtlich eine Exe hochgeladen und keinen Quelltext. Außerdem hat das Programm bei mir trotz Timer und Flip 0 immernoch 100% Auslastung. Keine Ahnung warum, aber es ist ja erstmal auch nur ein erster Test.
Meinungen erwünscht. Smile
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
  • Zuletzt bearbeitet von Bura.Tino am Do, Okt 01, 2009 18:01, insgesamt einmal bearbeitet

Noobody

BeitragDo, Sep 24, 2009 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau das könnte man auch mit der Herangehensweise machen, die ich in meinem Code verwende - Kurven werden so kinderleicht Razz

Ich hab das mal angepasst, damit die Bodenlinien ungefähr deinem Beispiel entsprechen Code:
Const GWIDTH  = 800
Const GHEIGHT = 600

Graphics GWIDTH, GHEIGHT, 0, 2
SetBuffer BackBuffer()

Const AOV# = 60.0

Type TVertex
   Field X#
   Field Y#
   Field Z#
   
   Field ProjX#
   Field ProjY#
   
   Field Projected
End Type

Type TEdge
   Field V1.TVertex
   Field V2.TVertex
End Type

Type TCamera
   Field X#
   Field Y#
   Field Z#
   
   Field Yaw#
End Type

Local Cam.TCamera = New TCamera

CreateLevel()

Local Timer = CreateTimer( 60 )

While Not KeyHit( 1 )
   Cls
   
   UserInput( Cam )
   Render( Cam )
   
   Flip 0
   WaitTimer Timer
Wend
End

Function CreateLevel()
   For Z# = 2 To 100 Step 5
      CreateEdge( CreateVertex( -3, -1, Z# ), CreateVertex( 3, -1, Z# ) )
      
      CreateEdge( CreateVertex( -3, -1, Z# + 5 ), CreateVertex( -3, -1, Z# ) )
      CreateEdge( CreateVertex(  3, -1, Z# + 5 ), CreateVertex(  3, -1, Z# ) )
   Next
   
   For Angle# = 90 To 180 Step 5
      CreateEdge( CreateVertex( Cos( Angle# )*100 +  97, -1, 100 + Sin( Angle# )*100 ), CreateVertex( Cos( Angle# )*100 + 103, -1, 100 + Sin( Angle# )*100 ) )
      
      CreateEdge( CreateVertex( Cos( Angle# )*100 +  97, -1, 100 + Sin( Angle# )*100 ), CreateVertex( Cos( Angle# + 5 )*100 +  97,  -1, 100 + Sin( Angle# + 5 )*100 ) )
      CreateEdge( CreateVertex( Cos( Angle# )*100 + 103, -1, 100 + Sin( Angle# )*100 ), CreateVertex( Cos( Angle# + 5 )*100  + 103, -1, 100 + Sin( Angle# + 5 )*100 ) )
   Next
End Function

Function UserInput( Camera.TCamera )
   Camera\Yaw# = Camera\Yaw# + KeyDown( 203 ) - KeyDown( 205 )
   Camera\X# = Camera\X# + Sin( Camera\Yaw# )*( KeyDown( 208 ) - KeyDown( 200 ) )*0.6
   Camera\Z# = Camera\Z# - Cos( Camera\Yaw# )*( KeyDown( 208 ) - KeyDown( 200 ) )*0.6
End Function

Function Render( Camera.TCamera )
   Local PlaneDist# = 1/Tan( AOV#/2.0 )
   Local AspectRatio# = GHEIGHT/Float( GWIDTH )
   
   For Vertex.TVertex = Each TVertex
      Local TransformedX# = Vertex\X# - Camera\X#
      Local TransformedY# = Vertex\Y# - Camera\Y#
      Local TransformedZ# = Vertex\Z# - Camera\Z#
      
      Local Length# = Sqr( TransformedX#*TransformedX# + TransformedZ#*TransformedZ# )
      Local Angle#  = ATan2( TransformedZ#, TransformedX# )
      
      TransformedX# = Length#*Cos( Angle# - Camera\Yaw# )
      TransformedZ# = Length#*Sin( Angle# - Camera\Yaw# )
      
      If TransformedZ# > 0 Then
         Vertex\ProjX# = ( TransformedX#*PlaneDist/TransformedZ# + 1 )*GWIDTH/2.0
         Vertex\ProjY# = ( AspectRatio# - TransformedY#*PlaneDist/TransformedZ# )*GWIDTH/2.0
         Vertex\Projected = True
      Else
         Vertex\ProjX# = -10
         Vertex\ProjY# = -10
         Vertex\Projected = False
      EndIf
   Next
   
   LockBuffer BackBuffer()
   
   For Edge.TEdge = Each TEdge
      If Edge\V1\Projected And Edge\V2\Projected Then Line Edge\V1\ProjX#, Edge\V1\ProjY#, Edge\V2\ProjX#, Edge\V2\ProjY#
   Next
   
   UnlockBuffer BackBuffer()
End Function

Function CreateVertex.TVertex( X#, Y#, Z# )
   Local Vertex.TVertex = New TVertex
      Vertex\X# = X#
      Vertex\Y# = Y#
      Vertex\Z# = Z#
   
   Return Vertex
End Function

Function CreateEdge( V1.TVertex, V2.TVertex )
   Local Edge.TEdge = New TEdge
      Edge\V1 = V1
      Edge\V2 = V2
End Function


Ich schraube gerade an einer Version mit Texturierung, damit es einer Strecke ein wenig näher kommt.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

theotheoderich

BeitragFr, Sep 25, 2009 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe auch mal was (simples und ausbaufähiges) zusammengehackt. Das Thema gefällt mir Very Happy
Hoffentlich sieht mein Chef nicht, was ich hier nebenbei so tippe Rolling Eyes

Pfeiltasten für Links/Rechts

Code:
Global aufh=640,aufv=480
Graphics aufh,aufv,32,2
SetBuffer BackBuffer()

Local frameTimer=CreateTimer(50)

Global posGenX=aufh/2, posGenY=50
Global movx#=1,movy#=1
Global streetlinelen,streetlinelenmax=200
Global streetlinecolor
Global roadcolR,roadcolG,roadColB
Global timer, oldtimer
Global oldx,oldy,oldleng
Global pole
Global mover=1,moverdir=1


Type streetlinetype
   Field x#,y#
   Field leng, height
   Field colorr, colorg, colorb
   Field img
   Field speed#
   Field moved
   Field obj
   Field pole
End Type

Global streetline.streetlinetype


Type plytype
   Field x#,y#
   Field speed#
   Field colorr, colorg, colorb
   Field img
   Field damage
   Field accel#
   Field ps
   Field id
   Field scrollx#,scrolly#
End Type

Global ply.plytype
ply.plytype = New plytype
ply\x=aufh/2-32
ply\y=aufv-128


Global trackdir,track,trackpause, tracktimer


Color 255,255,255
create_streetline()


Repeat
   
   update_track(mover)
   update_streetline()
   Color 255,0,0
   Rect posGenX,posGenY,5,5,1
   Color 255,255,255
   

   If MilliSecs()>oldtimer+200 Then
      create_streetline()
   End If
   
   If moverdir=1 Then
      mover=mover+1
   End If
   
   update_ply()
   
   Text 10,10,movx
   Text 10,30,movy
   
   
   If KeyDown(203)=True Then
      ply\scrollx=ply\scrollx+5
   End If
   
   If KeyDown(205)=True Then
      ply\scrollx=ply\scrollx-5
   End If
   


Flip 0
WaitTimer frameTimer
SeedRnd (MilliSecs())
Cls
Until KeyHit(1)



Function update_streetline()

   For streetline.streetlinetype= Each streetlinetype
      
      counter=counter+1
      
      streetline\moved=streetline\moved+1
      
      streetline\speed#=streetline\moved*.025
      streetline\height=streetline\moved*.5
      
      streetline\y=streetline\y+streetline\speed#
      
      streetline\leng=streetline\moved*streetline\speed#;streetline\y*.75
      
      If counter>1 Then
         Color 200,200,200
               
         ; Connecting Line Left
         Line oldx-(oldleng/2)+ply\scrollx,oldy+ply\scrolly, streetline\x-(streetline\leng/2)+ply\scrollx,streetline\y+ply\scrolly
         
         ; Connecting Line Right
         Line oldx+oldleng+ply\scrollx,oldy+ply\scrolly, streetline\x+streetline\leng+ply\scrollx,streetline\y+ply\scrolly
      End If
      
      
      ; Top Line
      Color 255,255,255
      
      Line  streetline\x-(streetline\leng/2)+ply\scrollx,streetline\y+ply\scrolly,streetline\x+streetline\leng+ply\scrollx,streetline\y+ply\scrolly
      
      
      ; Draw pole
      If streetline\pole=True Then
         Rect streetline\x-(streetline\leng/2)-(streetline\leng/10)+ply\scrollx,streetline\y-streetline\height/2+ply\scrolly,streetline\leng/15,streetline\height,1
         Rect streetline\x+streetline\leng+(streetline\leng/10)+ply\scrollx,streetline\y-streetline\height/2+ply\scrolly,streetline\leng/15,streetline\height,1
      End If
      
      oldx=streetline\x
      oldy=streetline\y
      oldleng=streetline\leng
      
      If streetline\y>aufv+64 Then
         Delete streetline
      End If

   Next
   
End Function


Function create_streetline()

      streetline.streetlinetype = New streetlinetype
      streetline\y=posGenY
      streetline\leng=50
      streetline\x=posGenX-(streetline\leng/2)
      streetline\speed#=1
      oldtimer=MilliSecs()
      
      pole=pole+1
      If pole>5 Then
         pole=1
         streetline\pole=True
      End If

End Function


Function update_track(i)
   
   posGenX=aufh/2-Sin(i)*(aufh/2*.75)
   posGenY=220-Sin(i)*(150*.75)

End Function

Function update_ply()

   Color 128,128,128
   Rect ply\x,ply\y,64,96,1
   Color 255,255,255
   
End Function
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

Bura.Tino

BeitragFr, Sep 25, 2009 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Nettes Beispiel, aber sieht trotzdem nicht wirklich nach OutRun und Co. aus.

@Noobody
Ich finde das passt noch weniger, da die Kurve keine wirkliche Kurve ist, sondern die Straßenbegrenzung 'zusammenschmilzt'. Außerdem ist das ja schon fast eine Mini-3D-Engine, aber mit wirklichem 3D hatten diese Spiele ja gar nix zu tun.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
  • Zuletzt bearbeitet von Bura.Tino am Mo, Sep 28, 2009 13:03, insgesamt einmal bearbeitet

Noobody

BeitragSo, Sep 27, 2009 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe den Code mal um eine Texturierungseinheit erweitert, mehr dazu ist hier zu finden.

Vielleicht ist es das, was du dir ungefähr vorstellst - zumindest sieht es pixelig aus Wink
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

theotheoderich

BeitragMo, Sep 28, 2009 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde es sieht toll aus, was Du da programmiert hast. Aber ich denke nicht, dass es das ist, was der Themenersteller gemeint hat.

Dein Programm ist schon "richtiges 3D", er meint wahrscheinlich das "Bilineare Parallax Scrolling", welches bei OutRun Verwendung gefunden hat.

Im Grunde reines 2D, revolutionär war damals nur, dass die Objekte am Rand stufenlos mathematisch skaliert werden konnten. Dadurch lief das Spiel sehr ruckelfrei.

Wie so etwas gemacht wird (auch diese "Balkenstrassen") weiss ich aber leider auch nicht.
Immerhin lief es auf Maschinen mit 7-8 MHz, es konnte also nicht so aufwendig sein.
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

Bura.Tino

BeitragMo, Sep 28, 2009 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@Noobody
Das sieht wirklich gut aus, aber hat eben nichts mit Outrun und Co. zu tun, da das was Du geschrieben hast eine Mini-3D-Engine ist und sicherlich nicht auf einem 386er laufen würde.

@theotheoderich
Du hast den Kopf auf den Nagel getroffen und hast endlich einen Namen für die Technik gefunden. Wie die Technik aussieht wusste ich ja von verschiedenen Spielen, aber nicht wie sie heist.

Das Zauberwort -> 'bilineares Parallax Scrolling'

Habe hier einen tollen Artikel gefunden der Outrun mal bissl unter die Lupe nimmt.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

orpheus_2003

BeitragDi, Sep 29, 2009 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Woah...

Und schon sind wir in Google aus Platz 2:
http://www.google.at/search?hl...&meta=
GazerStar - the beginning
http://gazerstar.lexigame.de/
Wizard (Worktitel)
http://wizard.lexigame.de

Gehe zu Seite 1, 2  Weiter

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group