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

![]() |
Bura.TinoBetreff: Technik hinter 'Night Driver', 'OutRun', 'Lotus' und co. ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !? |
||
![]() ![]() |
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
~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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@orpheus_2003
Ja natürlich kenne ich die erste Simulation dieser Art. Das war ja einer der Meilensteine in der Computergeschichte. ![]() 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 ? |
||
![]() ![]() |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für den Code. Leider kann ich ihn nicht ausprobieren, da ich nur Blitz3D habe. | ||
![]() ![]() |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Noobody
Das ist zwar nicht schlecht, kommt aber diesen Spielen nicht wirklich nahe. Oder versteh ich das einfach nicht ? |
||
![]() ![]() |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() ![]() |
- Zuletzt bearbeitet von Bura.Tino am Do, Okt 01, 2009 18:01, insgesamt einmal bearbeitet
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau das könnte man auch mit der Herangehensweise machen, die ich in meinem Code verwende - Kurven werden so kinderleicht ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe auch mal was (simples und ausbaufähiges) zusammengehackt. Das Thema gefällt mir ![]() Hoffentlich sieht mein Chef nicht, was ich hier nebenbei so tippe ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() ![]() |
- Zuletzt bearbeitet von Bura.Tino am Mo, Sep 28, 2009 13:03, insgesamt einmal bearbeitet
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. |
||
![]() ![]() |
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group