F-Zero (SSF 83)

Den Gedanken an sich finde ich sehr gut und richtig, die Ausführung dann aber komplett falsch, weil man sie mit der Taufe dann praktisch in diese Religionsschiene reingezwungen hat. Sie ist da dann Mitglied ob sie will oder nicht, MUSS in der Schule am Religionsunterricht teilnehmen. Wahlfreiheit hätte sie gehabt, wenn sie sich selber später dazu entschieden hätte können, irgend einer Religion beizutreten - das hat z.B. mein damals bester Kumpel auf der Schule gemacht, war konfessionslos, hat freiwillig aus Interesse am Unterricht teilgenommen und sich dann mit 14 taufen lassen.

Ich muss tatsächlich öfter mal an die Folge denken, weil ich das beim hören damals einfach absurd fand

3 „Gefällt mir“

Ich habe es immer gehasst, dass meine Eltern mich zwar getauft haben, ich den ganzen Reli Quatsch mitmachen musste und selber die totalen Religions Verweigerer waren.

Kam mir vor wie Wasser predigen und Wein saufen.

1 „Gefällt mir“

Natürlich kennt jeder die eine Ankedote von dem einen Typen, der sich dann als Teenager taufen lassen, aber das ist imo ein superunwahrscheinlicher Outcome.

Aber mei, kann ja jeder machen, wie er will. Wenn du unseren Weg für falsch hältst, be my guest. Ich kann nur sagen, es hat für die Tochter zu einer sanften Exposure von Religion in der Grundschule geführt, Religionsunterricht ist ja nicht gerade das Auswendiglernen von Katechismen oder so, dann zu Fragen und eigenem Nachdenken, dann zur Entscheidung für das Alternativfach, dann zur Entscheidung, sich nicht konfirmieren zu lassen.

1 „Gefällt mir“

Kenne auch nur 1 solchen Fall: die Eltern wollten ihren Mädchen die volle freie Wahl lassen.
Zur Konfirmation haben sich beide dann auch taufen lassen.
Kann man als Außenstehender ja immer so oder so urteilen, aber als Eltern trifft man eben auch Entscheidungen. Z.B. wären unsere Kindern konfessionslos in keinem der beiden kirchlichen Kindergärten aufgenommen worden.
Als Evangelist habe ich mich als Kind auch nie so gefühlt, als hätte ich einen glühenden Stempel auf der Stirn. Ich fühlte und fühle mich immer vollständig frei.

Kommt sicher auch auf die Umgebung, Schule und Lehrer an, in meinen ersten vier Jahren unserer Dorfgrundschule hat man uns Bibeltexte, Lieder etc. regelrecht eingeprügelt und keinerlei Infragestellen etc. zugelassen. Ob ich mich konfirmieren lassen will oder nicht, stand auch nicht zur Debatte, „das macht man halt so“, sonst hätte es wahnsinnigen Ärger gegeben (weniger von meiner Mutter, eher vom Rest der Verwandtschaft, Nachbarn, Vermieter usw). Die Relilehrerin von der 5.-9. war dann deutlich offener und gesprächsbereiter. Ich bin dann später mit 21 ausgetreten, witzigerweise sind mein Bruder und meine Mutter dann direkt auch mit aufs Amt und sind raus.

Und klar, wie ihr euer Kind erzieht ist letztendlich allein euer Ding, den Grundsatz sie selbst entscheiden zu lassen finde ich ja generell richtig!

2 „Gefällt mir“

Der „Zwang“ zur Konfirmation, soweit ich mich erinnere, kam so halb halb. Ich meine noch, ich sei von meinen Eltern gefragt worden ob ich denn überhaupt will, die Omas hätten sicher mehr Stunk gemacht. Und mein ganzer Freundeskreis hat das eh wegen der Kohle gemacht.

Ich bin aber auch sonst gar nicht traurig drum, weil auch die Konfirmationszeit für mich interessant war. Ich mochte meinen Pfarrer sehr und habe neben Bibelstellen (die wir mit ihm sehr sachlich analysiert haben, Wahnsinn) auch sehr viel über das Leben mitgenommen. Z.B. waren wir in inklusiven Werkstätten.

2 „Gefällt mir“

Die Konfirmation habe ich nur wegen des Geldes mitgenommen, wer nicht? Ich kann mich auch an Sonntage erinnern, da habe ich mich auf dem Friedhof „herumgetrieben“ anstelle zu dem Konfirmationsunterricht zu gehen.

Ein moderner Ablass Handel 10x Sonntags nicht ausschlafen, um dann Geld von der Verwandtschaft abzugreifen.

2 „Gefällt mir“

Ist auch schon wieder 30 Jahre her, und aus heutiger Sicht würde ich es so nicht mehr machen, aber damals … ja klar.
Ich war aber 50x Mittwoch abend im Gottesdienst :sweat_smile: ich versau mir doch nicht noch das Wochenende

So, jetzt gehen wir aber mal wieder F-Zero 99 zocken! :rocket:

1 „Gefällt mir“

Ich spiele F-Zero jetzt mal ernsthaft, und bin überrascht, wie viele Spielelemente es da noch gibt, die ich früher nie gesehen habe. Zum Beispiel sind da die grünen Magneten am Streckenrand, die rutschigen Eisflächen, oder auch einfach die Tatsache, dass man den eigenen Sprung wie in einem Flugzeug beeinflussen kann, indem man den Gleiter im Sprung nach oben oder unten zieht.

Da ist schon echt viel Abwechslung und viel spassiges Gameplay drin! Top!

Das mit der am Horizont abgeschnittenen Strecke stört mich überhaupt nicht. Man sieht im echten Leben ja auch fast nie den echten Horizont. Sobald eine Strasse nur leicht nach oben geht beziehungsweise das Terrain leicht hügelig ist, sieht man statt dem Horizont immer nur den höchsten Punkt des nächsten Hügels. Oder, noch häufiger, sind da halt irgendwelche nahen Kurven, Bäume oder Häuser die den Horizont auch abschneiden.

4 „Gefällt mir“

Ich frage mich, was man aus solchen Pseudo-3D Effekten heutzutage noch rausholen könnte, weil moderne Computer Sprites und Ebenen extrem schnell zeichnen und skalieren können, ohne dafür nennenswerte Rechenzeit zu brauchen.

Das Programmieren eines Pseudo-3D Rennspieles ist mit modernen Mitteln kinderleicht. Ich habe mal so eine typische animierte Strasse in Love2D in Lua programmiert, die berechne ich in einem Pixelshader mit ein paar Zeilen Code. Das Resultat ist eher ein Effekt wie bei Lotus auf dem Amiga oder Outrun in der Spielhalle:

Executable für MacOS und Windows:
https://files.coolatoms.org/Racing.zip

Mit Cursortasten kann man steuern (mehrmals drücken), mit z und x Kurven erzeugen (ebenfalls mehrmals drücken).

Das hat nur ein paar Stunden gedauert.

Hier ist der komplette Sourcecode (habe ich früher vor vielen Jahren auch mal bei Github reingestellt):

function love.load()
   --rasterRoad1 = love.graphics.newImage("nolines.png")
   --rasterRoad2 = love.graphics.newImage("nolines2.png")
   rasterRoad1 = love.graphics.newImage("test1.png")
   rasterRoad2 = love.graphics.newImage("test2.png")
   rasterRoadWidth = rasterRoad1:getWidth()
   rasterRoadHeight = rasterRoad1:getHeight()
   screenWidth = 512
   screenHeight = 512
   horizonHeight = 320
   fixPointYOffset = 10
      
   
   roadShader=love.graphics.newShader
   [[
      extern Image rasterRoad1;
      extern Image rasterRoad2;
      extern vec4 zMap[256];
      extern number zOffset;
      extern number x;
      extern number curveX;
      extern number rasterRoadWidth;
      extern number screenWidth;
      extern number screenHeight;
      extern number horizonHeight;
      extern number fixPointYOffset;
		
      vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
      {
         float screenY=screenHeight-screen_coords.y;
         int index=int(screenY);
         int a=int(index/256);
         int b=int(mod(index,256));
         float z = (zMap[b])[a];			
			
         float xCoord=screen_coords.x-x*screenWidth*(1-screenY/horizonHeight)-curveX*z*screenWidth;
         float xOffset=(rasterRoadWidth-screenWidth)/2;
         float xFactor=1/rasterRoadWidth;
         float texelX=(xCoord+xOffset)*xFactor;
         float texelY=1-screenY/(horizonHeight+fixPointYOffset);
         if (texelX>1) texelX=1;
         if (texelX<0) texelX=0;
         if (texelY>1) texelY=1;
         if (texelY<0) texelY=0;
         vec4 texcolor = Texel(rasterRoad1,vec2(texelX,texelY));
         if (mod(z+zOffset,1)<=0.5) 
         texcolor = Texel(rasterRoad2,vec2(texelX,texelY));
         if (screenY>horizonHeight)
         texcolor = vec4(0,0,1,1);
         return texcolor;
      }
   ]]
   
   zMap = calculateZMap(-horizonHeight,horizonHeight,screenHeight)
   zOffset=0
   vZ=0
   z=0
   x=0
   vX=0
   curveVX=0
   curveX=0
   obj={}
   for i=1,80 do
      obj[i]={}
      if i<=40 then
         obj[i].x=1
      else
         obj[i].x=-1
      end
      obj[i].y=0
      obj[i].z=zMap[100]*1.5*(i%40)
   end


   roadShader:send("rasterRoad1",rasterRoad1)
   roadShader:send("rasterRoad2",rasterRoad2)
   roadShader:send("rasterRoadWidth",rasterRoadWidth)
   roadShader:send("screenWidth",screenWidth)
   roadShader:send("screenHeight",screenHeight)
   zMapVec={}
   for i=1,256 do
      zMapVec[i]={0,0,0,0}
   end
   for i=1,256 do
      for a=1,4 do
         zMapVec[i][a]=0
      end
   end
	
   for i=1,screenHeight do
      a=math.floor((i-1)/256)+1
      b=math.floor((i-1)%256)+1
      zMapVec[b][a]=zMap[i]
   end
   roadShader:send("zMap",unpack(zMapVec))
   roadShader:send("zOffset",zOffset)
   roadShader:send("x",x)
   roadShader:send("curveX",curveX)
   roadShader:send("horizonHeight",horizonHeight)
   roadShader:send("fixPointYOffset",fixPointYOffset)	
--   rectZ=-640/((640-rectY)-700)
end

function unpack (t, i)
      i = i or 1
      if t[i] ~= nil then
        return t[i], unpack(t, i + 1)
      end
    end

function love.update(dt)
   zOffset=zOffset+dt*vZ
   z=z+dt*vZ
   x=x+vX*dt
   curveX=curveX+curveVX*dt

   for i=1,80 do
      if obj[i].z-z<=0 then
         obj[i].z=z+zMap[100]*1.5*40
      end
   end
   
   --rectX=x*(1-rectY/320)+curveX*rectZ
   --rectY=-320/rectZ+640/2
   if zOffset>=1 then
      zOffset=0
   end
   roadShader:send("zOffset",zOffset)
   roadShader:send("x",x)
   roadShader:send("curveX",curveX)
end

function love.keypressed(key)
   if key == "up" then
      vZ=vZ+0.4
   end
   if key == "down" then
      vZ=vZ-0.4
   end
   if key == "left" then
      vX=vX+0.1
   end
   if key == "right" then
      vX=vX-0.1
   end
   if key == "x" then
      curveVX=curveVX+0.02
   end
   if key == "z" then
      curveVX=curveVX-0.02
   end
end

function calculateZMap(camHeight,horizonHeight,screenHeight)
   local zMap={}
   for screenY=1,screenHeight do
		if screenY>horizonHeight then zMap[screenY]=0 else
			zMap[screenY]=camHeight/(screenY-horizonHeight)
		end
   end
   return zMap
end

function drawRoadSideObjects()
   table.sort(obj,function(obj1,obj2) return obj1.z<obj2.z end)
   for i=80,1,-1 do
      local rectX=obj[i].x
      local rectY=obj[i].y-horizonHeight/(obj[i].z-z)+horizonHeight
      local rectZ=obj[i].z-z
      local scaleFactor=1/rectZ+fixPointYOffset/horizonHeight   -- add 50/512 if fixpoint is not at top, also below first rectY/512 becomes eg rectY/562 depending on virtual y of real fixpoint
      love.graphics.setColor(0,0,0,255)
      love.graphics.rectangle("fill", screenWidth/2+rectX*screenWidth*(1-rectY/(horizonHeight+fixPointYOffset))+x*screenWidth*(1-rectY/horizonHeight)+curveX*rectZ*screenWidth-10*scaleFactor, screenHeight-rectY-80*scaleFactor, 20*scaleFactor, 80*scaleFactor)
      love.graphics.setColor(255,0,255,255)
      love.graphics.rectangle("fill", screenWidth/2+rectX*screenWidth*(1-rectY/(horizonHeight+fixPointYOffset))+x*screenWidth*(1-rectY/horizonHeight)+curveX*rectZ*screenWidth-10*scaleFactor, screenHeight-rectY-100*scaleFactor, 20*scaleFactor, 20*scaleFactor)
   end
end

function love.draw()
   love.graphics.setShader(roadShader)
   love.graphics.rectangle("fill", 0, 0, 512, 512)
   love.graphics.setShader()
   drawRoadSideObjects()
   
   --love.graphics.draw(hamster, x, y)
   -- draw things
   love.graphics.setShader()
   -- draw more things
end

Dazu habe ich noch schnell diese zwei Bilder in Photoshop (oder war es MSPaint?) gekritzelt, die die Strasse mit und ohne Streifen darstellen:


Diese Seite hat hervorragende Ressourcen zum Thema Pseudo 3D Grafik:

Horizon Chase 1 macht übrigens das Zeichnen der Objekte am Rand „falsch“: Die werden vom Horizont her ganz unrealistisch aufgeblasen wenn sie näher kommen, und bleiben auch nicht fest mit dem Boden verankert, d.h. die Strasse rutscht unter den Objekten komisch weg. Da darf man nicht drauf achten, weil es die Illusion zerstört. Horizon Chase 2 hat es dann perfekt gemacht, allerdings ist das echtes 3D (auf dem Steamdeck perfekt flüssig, auf Switch ruckelt es leider):

Mit modernen Mitteln hat man bei Pseudo-3D Grafik eigentlich keinerlei Begrenzung, was die Anzahl der Objekte oder die Framerate angeht. 80’s Overdrive auf der Switch ist ein schönes Beispiel für so einen Retrolook:

Arcadia für die Apple Watch enthält auch ein schönes modernes Pseudo-3D Rennspiel:

Die Sequenz The Runaway in 198x macht sowas finde ich auch sehr schön:

Auf dem Amiga gab es neben den typischen Pseudo 3D Spielen wie Lotus 1-3, Jaguar XJ 220, und Crazy Cars III, die mit Rastereffekten programmiert wurden, die der Amiga sehr schnell darstellen konnte, auch Mode 7 artige Spiele wie zum Beispiel Xtreme Racing AGA:

Die Grafik war bei solchen Spielen auch ganz nett, es krankte eher am Gameplay, siehe auch Street Racer und Virtual Karting. Man muss auch bedenken, dass solche Spiele dann erst auf dem Amiga 1200 halbwegs performant liefen. Da hatte das SNES mit F-Zero und später Mario Kart von Anfang an klar die Nase vorn.

8 „Gefällt mir“

Ich ergänze mal noch um Victory Heat Rally, das ist so ein 2D / 3D Hybrid und ganz toll.

1 „Gefällt mir“

Das sieht wirklich spitze aus! Danke für den Tipp. Genau an sowas habe ich gedacht.

Gerade endlich mal die „Wusstet ihr schon…“-Folge gehört. Die ganze F-Zero Folge ist ja schon wirklich gut, aber das Ende der Trivia-Folge, wo ihr in die AX Hintergründe eintaucht, ist ja mal der Hammer.

4 „Gefällt mir“