Autorennen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Bobo220673
Beiträge: 21
Registriert: 29.04.2010 22:50

Autorennen

Beitrag von Bobo220673 »

Hallo!
Ich würde gerne ein Autorennen ( 2D ) programmieren, so in der Art von einem stark vereinfachten Outrun. Ohne Berge und Hügel, also erstmal nur eine einfache Strecke mit Kurven. Und genau bei der Strecke liegt mein Problem. Ich bekomme es einfach nicht hin die Strecke zu Zeichnen. Also Links und Rechts die Fahrbahnmarkierung, die Mittelstriche und halt die Kurven. Ich habe es mit direktem Zeichnen versucht, aber das sieht nicht besonders schön aus, und ist sehr langsam. Dann habe ich es mit Sprites versucht, aber da klappt das mit den Entfernungen und den Kurven nicht. Hat einer von euch vielleicht ein Beispiel was man dafür verwenden kann?
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Autorennen

Beitrag von Mijikai »

Die Render-Technik heisst Mode 7 :)

Ist nicht ganz einfach, hab mal einen Link rausgesucht der das Ganze erklärt.
-> https://www.coranac.com/tonc/text/mode7.htm
Bobo220673
Beiträge: 21
Registriert: 29.04.2010 22:50

Re: Autorennen

Beitrag von Bobo220673 »

Danke für den Link. Das ist aber um einiges Komplexer als wie ich mir das gedacht habe. Meine ersten Versuche hatte ich mit TransformSprite gemacht, aber wie oben bereits geschrieben ging das voll daneben, was auch klar ist wenn ich mir die Mode 7 Technik anschaue.

Code: Alles auswählen

InitSprite() 
InitKeyboard()

 Procedure RollSpriteUp2Down(iSpriteID.i, iPixel.i)
  Protected iSHeight.i
  Protected *Sprite, iLineSize.i
  Protected *Buffer1, *Buffer2
  
  iSHeight = SpriteHeight(iSpriteID)
  
  StartDrawing(SpriteOutput(iSpriteID))
  *Sprite = DrawingBuffer()
  iLineSize  = DrawingBufferPitch()
  
  *Buffer1 = AllocateMemory(iLineSize * (iSHeight - 0 - iPixel))
  *Buffer2 = AllocateMemory(iLineSize * iPixel)

  CopyMemory(*Sprite, *Buffer1, iLineSize * (iSHeight - 0 - iPixel))
  CopyMemory(*Sprite + (iLineSize * (iSHeight - 0 - iPixel)), *Buffer2, iLineSize * iPixel)
  
  CopyMemory(*Buffer1, *Sprite + iLineSize * iPixel, iLineSize * (iSHeight - 0 - iPixel))
  CopyMemory(*Buffer2, *Sprite, iLineSize * iPixel)
  
  StopDrawing()
  FreeMemory(*Buffer1)
  FreeMemory(*Buffer2)  
EndProcedure


OpenScreen(640, 480, 32, "")

CreateSprite(0, 256,256)

SetFrameRate(60)
SpriteQuality(1)

StartDrawing(SpriteOutput(0))
For n=0 To 7
  LineXY( n*32     , 0, n*32     , 255, $0FF0FF )
  LineXY( n*32 + 31, 0, n*32 + 31, 255, $0FF0FF )
  LineXY( 0, n*32     , 255, n*32     , $0FF0FF )
  LineXY( 0, n*32 + 31, 255, n*32 + 31, $0FF0FF )
Next
StopDrawing()

Repeat
  ClearScreen(RGB(0,50,128))
  RollSpriteUp2Down(0, 1)
  TransformSprite(0,64,0,64,192,0,64,256,256,32,0,256,32)
  DisplaySprite(0, 192, 100)
  ExamineKeyboard()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Autorennen

Beitrag von Mijikai »

Netter Scroll-Effekt :)

Hab noch ein Video Tutorial auf youtube gefunden.
https://www.youtube.com/watch?v=ybLZyY655iY
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Autorennen

Beitrag von mk-soft »

Da kann ich wohl nicht helfen...

Mein letztes Autorennen habe ich auf einen Sinclair ZX81 programmiert.
Habe ich bestimmt noch irgend wo auf Kassette :mrgreen:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Autorennen

Beitrag von GPI »

DIe 8bit- und 16bit-Racer nutzten meist einen ganz anderen Trick.
Die Strecke war quasi ein "statisches" Bild. Die grafiken waren damals mit paletten, sprich man hatte bspw. 16 Farbtöpfe und konnte dort beliebige Farben platzieren.
Die Strecke selbst ist dann eine statische grafik, grauer Asphalt, durchgezogenen Mittelstreifen und am Rand eine rote Begrenzung bspw.
Und jetzt kommt der Trick: Der Grafikchip der Systeme baut ja die Grafik Zeilenweise auf den Monitor. Nach jeder Zeile ist etwas Zeit, wo der Processor schnell reingrätschen kann. in dieser Zeit wurden die Farbtöpfe ausgetauscht. Der asphalt wird zwischen hellgrau und dunkelgrau getauscht, der Rand von rot zu weis, die mittellinie von weis auf asphalt-grau. wenn man das geschickt macht, bekommt man eine flüssige Bewegung hin, ohne das man Grafiken ändern muss. Das war für die damaligen Systeme entscheidend. Natürlich darf man natürlich diesen Wechsel nicht in jeder Zeile machen.

Das erzeugt halt auch diesen typischen Style, diese zweifarbigen Streifen-Grafik. Man nutzt dafür keine "bitmaps" mit Grasmuster, weil ansonsten diese Illusion nicht mehr funktioniert.

Zu den Kurven. Man fährt eigentlich keine "Kurven", sondern das Spielerauto wird nach rechts gedrückt/bewegt. Das ist schon alles. Deshalb sieht es auch selten so aus, als würde man tatsächlich eine Kurve fahren, weil die Kurven bspw. nie einen 90Grad winkel erreichen könnte, trotz biegen, gehen sie immer in den Horizont rein. Man kann auch nicht in die Kurven wirklich reinlenken.

Anders ist natürlich Super Mario Kart, die nutzen mode-7 und damit eine Streckenführung. Das ist ungleich mächtiger.

Edit: Was ich dir empfehlen würde. Mach das Zeilenweise. Mach eine Strecke mit seitlich grün, Begrenzung und mittelstreifen. In zwei Variationen. Am besten ein Bitmap. Du malst dann die strecke von oben nach unten und wechselst durch. den Startwert (ob hell oder dunkles bitmap) bestimmt die Streckenposition. Bei einer kurve verschiebst du das Linien seitlich und addierst ein verschiebungsfaktor in das Auto.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Autorennen

Beitrag von #NULL »

Mijikai hat geschrieben:Erinnert mich an ColorCycling :D

Genial!
-> https://www.youtube.com/watch?v=aMcJ1Jvtef0
Ich habe viele dieser Artworks schonmal gesehen, aber die daylight cycles kannte ich noch nicht und die haben es nochmal getoppt :o :D
@10:25 https://youtu.be/aMcJ1Jvtef0?t=625
@11:11 https://youtu.be/aMcJ1Jvtef0?t=671
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten