Seite 1 von 1

Autorennen

Verfasst: 23.02.2019 17:43
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?

Re: Autorennen

Verfasst: 23.02.2019 19:01
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

Re: Autorennen

Verfasst: 23.02.2019 21:39
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) 

Re: Autorennen

Verfasst: 24.02.2019 10:54
von Mijikai
Netter Scroll-Effekt :)

Hab noch ein Video Tutorial auf youtube gefunden.
https://www.youtube.com/watch?v=ybLZyY655iY

Re: Autorennen

Verfasst: 24.02.2019 11:57
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:

Re: Autorennen

Verfasst: 24.02.2019 12:12
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.

Re: Autorennen

Verfasst: 24.02.2019 16:27
von Mijikai
Erinnert mich an ColorCycling :D

Genial!
-> https://www.youtube.com/watch?v=aMcJ1Jvtef0

Re: Autorennen

Verfasst: 01.03.2019 13:39
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