<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>retro game &#8211; Makerblog.at</title>
	<atom:link href="https://www.makerblog.at/tag/retro-game/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.makerblog.at</link>
	<description>Arduino Projekte, Tutorials, 3D-Druck und die Maker-Szene</description>
	<lastBuildDate>Sat, 04 Oct 2025 07:41:53 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.makerblog.at/wp-content/uploads/cropped-logo-100x100-2-32x32.jpg</url>
	<title>retro game &#8211; Makerblog.at</title>
	<link>https://www.makerblog.at</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flappy Bird am Arduino mit OLED Display</title>
		<link>https://www.makerblog.at/2025/10/flappy-bird-am-arduino-mit-oled-display/</link>
					<comments>https://www.makerblog.at/2025/10/flappy-bird-am-arduino-mit-oled-display/#respond</comments>
		
		<dc:creator><![CDATA[Adi Dax]]></dc:creator>
		<pubDate>Thu, 02 Oct 2025 06:34:13 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[flappy bird]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[oled]]></category>
		<category><![CDATA[retro]]></category>
		<category><![CDATA[retro game]]></category>
		<guid isPermaLink="false">https://www.makerblog.at/?p=1853</guid>

					<description><![CDATA[Flappy Bird kennen wahrscheinlich alle. Der Prototyp eines Casual Games wurde 2013 vom vietnamesischen Entwickler Dong Nguyen als Mobile App für Android und iOS veröffentlicht, war ein sensationeller Erfolg und zog unzählige ähnliche Spiele nach sich. Flappy Bird ist dabei]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Flappy Bird kennen wahrscheinlich alle. Der Prototyp eines Casual Games wurde 2013 vom vietnamesischen Entwickler Dong Nguyen als Mobile App für Android und iOS veröffentlicht, war ein sensationeller Erfolg und zog unzählige ähnliche Spiele nach sich. </p>



<p class="wp-block-paragraph">Flappy Bird ist dabei ein sehr simples Spiel. Gesteuert wird die Spielfigur am Smartphone durch Tippen auf eine beliebige Stelle des Touchscreens. Das eignet sich ideal zur Umsetzung am Arduino, da neben dem Display nur ein Pushbutton benötigt wird.</p>



<p class="wp-block-paragraph">Meine einfache Implementierung entspricht vom Verhalten her sicher nicht 1:1 dem Original, aber der Programmcode ist einfach zu verstehen und kann leicht an eigene Bedürfnisse (Schwierigkeitsgrad, Erweiterung um Buzzer für Soundeffekte) angepasst werden.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Flappy Bird am Arduino mit OLED Display - Tutorial" width="700" height="394" src="https://www.youtube.com/embed/d1sZDezaHHs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Hardware-Anforderungen</h2>



<p class="wp-block-paragraph">Das Das Projekt stellt minimale Anforderungen an die Hardware, mit einem Arduino Uno R3 (oder kompatiblem Klon), einem kleinen OLED Display mit SSD1306-Controller und einem Pushbutton ist man schon dabei.</p>



<p class="wp-block-paragraph">Für den Nachbau werden folgende Komponenten benötigt:</p>



<ul class="wp-block-list">
<li><strong>OLED I2C Display 128×64 mit SSD1306</strong>&nbsp;(separat erhältlich, z.B.&nbsp;<a href="https://amzn.to/3XJfjRi" target="_blank" rel="noreferrer noopener">hier im 3er Pack bei Amazon</a>)</li>
</ul>



<p class="wp-block-paragraph">und die folgende Teile, die in jedem&nbsp;<a href="https://amzn.to/4iHWCFJ" target="_blank" rel="noreferrer noopener">Arduino Starter Kit</a>&nbsp;enthalten sind:</p>



<ul class="wp-block-list">
<li><strong>Arduino UNO R3 (oder kompatibel) mit Breadboard</strong></li>



<li><strong>Push-Buttons</strong>für die Steuerung</li>



<li><strong>Ein paar Kabel</strong>&nbsp;zur Verbindung der Komponenten</li>
</ul>



<h2 class="wp-block-heading">Verkabelung am Breadboard</h2>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="834" src="https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-1024x834.png" alt="" class="wp-image-1867" srcset="https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-1024x834.png 1024w, https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-300x244.png 300w, https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-768x625.png 768w, https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine.png 1226w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Komponente</td><td>Arduino Pin</td></tr><tr><td>OLED SDA</td><td>A4</td></tr><tr><td>OLED SCL</td><td>A5</td></tr><tr><td>OLED VCC</td><td>5V</td></tr><tr><td>OLED GND</td><td>GND</td></tr><tr><td>Push Button</td><td>D2 und GND</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Der Arduino Sketch und ein paar Anmerkungen</h2>



<p class="wp-block-paragraph">Den kompletten Quellcode findest du gut dokumentiert hier auf Github <a href="https://github.com/adidax/oled-flappy-bird-arduino/tree/main" target="_blank" rel="noreferrer noopener">https://github.com/adidax/oled-flappy-bird-arduino/tree/main</a></p>



<p class="wp-block-paragraph">Mit einem Arduino Uno R3 (oder kompatibel) und bei korrektem Aufbau der Schaltung am Breadboard sollte der Sketch ohne Änderungen funktionieren. Solltest du ein anderes Arduino Modell oder eine andere Belegung der Pins verwenden, dann sind eventuell kleine Anpassungen notwendig.</p>



<p class="wp-block-paragraph">Der Sketch ist zwar gut dokumentiert, hier aber trotzdem ein paar kurze Anmerkungen zur Struktur. </p>



<figure class="wp-block-image size-large is-style-default"><img decoding="async" width="1024" height="683" src="https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-1024x683.jpg" alt="" class="wp-image-1856" srcset="https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-1024x683.jpg 1024w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-300x200.jpg 300w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-768x512.jpg 768w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-1536x1024.jpg 1536w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1.jpg 2040w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading"><strong>Gleitkommafrei durch Skalierung</strong></h4>



<p class="wp-block-paragraph">Wie schon beim ähnlichen Projekt <a href="https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/" data-type="post" data-id="1839">Retro Racer</a> werden auch hier alle Koordinaten am Spielfeld um den Faktor 10 hochskaliert und mit dem Datentyp <code>int</code> gespeichert. Damit können aufwändige Gleitkomma-Berechnungen vermieden werden, aber Spielmechaniken wie eine Änderung der Spielposition um 0,5 Pixel pro Frame sind trotzdem möglich. Das Display hat im Programmcode also nicht 128×64, sondern 1280×640 Pixel. Vor der Darstellung auf dem Display werden die Werte dann durch 10 geteilt, um diese auf die Koordinaten des OLED umzurechnen.</p>



<h4 class="wp-block-heading">Fixe Framerate für gleichmäßigen Spielablauf</h4>



<p class="wp-block-paragraph">Damit das Spiel auf dem Arduino gleichmäßig läuft, wird versucht mit einer festen Bildwiederholrate von <strong>25 FPS</strong> zu arbeiten. Das heißt: Die loop()-Funktion berechnet und zeichnet nur dann ein neues Frame, wenn mindestens <strong>40 Millisekunden</strong> seit dem letzten vergangen sind:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">const</span> int FRAME_TIME = <span class="hljs-number">40</span>; <span class="hljs-comment">// 40 ms per frame = 25 FPS</span>
<span class="hljs-keyword">if</span> (millis() - lastFrameTime &lt; FRAME_TIME) <span class="hljs-keyword">return</span>;
lastFrameTime = millis();</code></span></pre>


<p class="wp-block-paragraph">Das verhindert Timing-Probleme und sorgt dafür, dass Bewegung und Spielgeschwindigkeit stets konstant bleiben, unabhängig davon, wie schnell der Mikrocontroller gerade rechnet. Sollte die Berechnung und Ausgabe eines Frames länger als 40ms dauern, dann kommt es aber natürlich trotzdem zu Unregelmäßigkeiten im Ablauf. Das dürfte hier aber nicht der Fall sein.</p>



<h4 class="wp-block-heading"><strong>Spielfigur fliegt bei Knopfdruck</strong></h4>



<p class="wp-block-paragraph">Die Steuerung ist einfach. Pro Frame erhöht sich die Sinkgeschwindigkeit der Spielfigur um den Wert von <code>GRAVITY</code> und der Vogel bewegt sich nach unten. Wird der Pushbutton gedrückt, dann steigt der Vogel um den Wert von <code>JUMP_STRENGTH</code> und bewegt sich nach oben.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">        <span class="hljs-comment">// Wenn Button gedrückt, negative Beschleunigung (nach oben) addieren</span>
        <span class="hljs-keyword">if</span> (digitalRead(BUTTON_PIN) == LOW) {
            velocity = JUMP_STRENGTH;
        }
        velocity += GRAVITY; <span class="hljs-comment">// Schwerkraft anwenden (positiver Wert = nach unten)</span>
        velocity = constrain(velocity, <span class="hljs-number">-50</span>, <span class="hljs-number">50</span>); <span class="hljs-comment">// Begrenzung, damit Spielfigur nicht zu schnell fällt oder steigt</span>

        <span class="hljs-comment">// Position des Spielers berechnen</span>
        birdY += velocity;</code></span></pre>


<p class="wp-block-paragraph">So entsteht das typische “Flap”-Gefühl mit steigender und fallender Bewegung.</p>



<h4 class="wp-block-heading">Gnädige Kollisionsabfrage:&nbsp;</h4>



<p class="wp-block-paragraph">Die Spielfigur ist rund, die Hitbox zur Kollisionsabfrage aber rechteckig. Daher habe ich bei der Berechnung der möglichen Kollision einen kleinen Spielraum von 2px berücksichtig. </p>


<pre class="wp-block-code"><span><code class="hljs language-xml">if ((birdY - 2 * SCALE_FACTOR) <span class="hljs-tag">&lt; <span class="hljs-attr">pipes</span>&#91;<span class="hljs-attr">i</span>]<span class="hljs-attr">.height</span> || 
    (<span class="hljs-attr">birdY</span> + <span class="hljs-attr">2</span> * <span class="hljs-attr">SCALE_FACTOR</span>) &gt;</span> pipes&#91;i].height + PIPE_GAP)</code></span></pre>


<p class="wp-block-paragraph">Damit fühlt sich das Spiel deutlich fairer an, die Spielfigur kann auch an einem Rohr &#8222;anstreifen&#8220;, ohne sofort eine Kollision zu melden.</p>



<h2 class="wp-block-heading">Vorbereitung der Spielgrafik</h2>



<p class="wp-block-paragraph">Da das OLED-Display nur&nbsp;<strong>Schwarz-Weiß-Grafiken</strong>&nbsp;unterstützt, müssen Bilder in ein passendes&nbsp;<strong>Bitmap-Format</strong>&nbsp;umgewandelt und im Programmcode eingebunden werden. Dafür habe ich das kostenlose Online-Tool&nbsp;<a href="https://javl.github.io/image2cpp/" target="_blank" rel="noreferrer noopener"><strong>Image2CPP</strong></a>&nbsp;verwendet.</p>



<p class="wp-block-paragraph"><strong>Schritt-für-Schritt-Anleitung für eigene Grafiken:</strong></p>



<ol class="wp-block-list">
<li>Lade das gewünschte&nbsp;<strong>PNG-Bild</strong>&nbsp;hoch.</li>



<li>Stelle die&nbsp;<strong>Bildgröße</strong>&nbsp;passend zur benötigten Pixelgröße ein (z. B. 10×8 Pixel für ein Auto).</li>



<li>Wähle als&nbsp;<strong>Ausgabeformat</strong>&nbsp;→&nbsp;<strong>Arduino Code</strong>.</li>



<li>Kopiere den generierten&nbsp;<strong>PROGMEM-Code</strong>&nbsp;in das Arduino-Projekt.</li>



<li>Nutze display.drawBitmap(x, y, bitmap, width, height, SSD1306_WHITE); zur Anzeige des Bildes.</li>
</ol>



<p class="wp-block-paragraph">Diese Methode ermöglicht es, eigene Icons oder Sprites für das Spiel zu erstellen und ins&nbsp;<strong>Flash-Speicher</strong>&nbsp;(PROGMEM) des Arduino zu laden. Dabei muss man aber immer beachten, dass der Speicherplatz des Arduino sehr begrenzt ist :)</p>



<h2 class="wp-block-heading"><strong>Spielprinzip und Steuerung</strong></h2>



<ul class="wp-block-list">
<li>Die Spielfigur (ein Vogel) fliegt von links nach rechts durch das Bild. Die Flughöhe des Vogels verringert sich laufend durch die Schwerkraft, der Spieler kann über den Drucktaster einen Flügelschlag auslösen, welcher die Flughöhe wieder erhöht. </li>



<li>Gleichzeitig bewegen sich die Rohre als Hindernisse auf den Vogel zu. Die Spielfigur muss durch die Lücken in den Rohren gesteuert werden.</li>



<li>Kollidiert der Spieler mit einem Hindernis, ist das Spiel vorbei.</li>



<li>3 Sekunden nach Game over wird die Highscore-Liste angezeigt.</li>



<li>Ein Druck auf eine beliebige Taste startet das Spiel neu.</li>
</ul>



<h2 class="wp-block-heading">Was mir am Projekt gefällt</h2>



<p class="wp-block-paragraph">Wie schon beim <a href="https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/" data-type="post" data-id="1839">Retro Racer</a> sieht man auch bei dieser Flappy Bird Variante, wie man klassische Spielideen mit einfachster Hardware und etwas Programmcode nachbauen kann und damit ein vollständiges, unterhaltsames Spiel entsteht. Die Kombination aus Spielphysik, Animation und einfachster Steuerung macht Flappy Bird zum perfekten Arduino-Projekt, egal ob zum Lernen, Lehren oder einfach zum Spaß.</p>



<p class="wp-block-paragraph">Den kompletten Quellcode findest du gut dokumentiert hier auf Github <a href="https://github.com/adidax/oled-flappy-bird-arduino/tree/main" target="_blank" rel="noreferrer noopener">https://github.com/adidax/oled-flappy-bird-arduino/tree/main</a></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.makerblog.at/2025/10/flappy-bird-am-arduino-mit-oled-display/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Retro Racer mit OLED Display 128&#215;64 – Ein Arcade-Klassiker auf dem Arduino</title>
		<link>https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/</link>
					<comments>https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/#comments</comments>
		
		<dc:creator><![CDATA[Adi Dax]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 07:36:44 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[oled]]></category>
		<category><![CDATA[retro]]></category>
		<category><![CDATA[retro game]]></category>
		<guid isPermaLink="false">https://www.makerblog.at/?p=1839</guid>

					<description><![CDATA[Der Retro Pixel Racer ist ein kleines Arcade-Spiel für den Arduino UNO, das auf einem 128&#215;64 OLED-Display läuft. Angelehnt an die klassischen Rennspiele der 80er-Jahre steuerst du als Spieler ein Fahrzeug über mehrere Fahrspuren und musst dabei den anderen Fahrzeugen]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Der Retro Pixel Racer ist ein kleines Arcade-Spiel für den Arduino UNO, das auf einem 128&#215;64 OLED-Display läuft. Angelehnt an die klassischen Rennspiele der 80er-Jahre steuerst du als Spieler ein Fahrzeug über mehrere Fahrspuren und musst dabei den anderen Fahrzeugen ausweichen. Das Projekt nutzt einfache Hardware-Komponenten und zeigt eindrucksvoll, wie auch mit minimalistischen Mikrocontrollern halbwegs flüssige Animationen realisiert werden können.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Arduino Projekt Retro Racer – Mini Arcade-Spiel mit OLED-Display" width="700" height="394" src="https://www.youtube.com/embed/cnEbV9q5bLI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Trotz des einfachen Aufbaus des Projekts zu geringen Kosten ist das Ergebnis recht spannend und eignet sich auch gut für Gruppenprojekte, z.B. in der Schule.</p>



<h2 class="wp-block-heading"><strong>Hardware-Anforderungen</strong></h2>



<p class="wp-block-paragraph">Neben dem Arduino samt Breadboard, das in vielen Starter Kits enthalten ist, benötigt man lediglich ein zusätzliches OLED-Display mit SSD1306-Controller sowie zwei Push-Buttons für die Steuerung. Ein optionaler Buzzer sorgt für Soundeffekte.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-1024x683.jpg" alt="" class="wp-image-1847" srcset="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-1024x683.jpg 1024w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-300x200.jpg 300w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-768x512.jpg 768w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-1536x1024.jpg 1536w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Für den Nachbau werden folgende Komponenten benötigt:</p>



<ul class="wp-block-list">
<li><strong>OLED I2C Display 128&#215;64 mit SSD1306</strong> (separat erhältlich, z.B. <a href="https://amzn.to/3XJfjRi" target="_blank" rel="noreferrer noopener">hier im 3er Pack bei Amazon</a>)</li>
</ul>



<p class="wp-block-paragraph">und die folgende Teile, die in jedem <a href="https://amzn.to/4iHWCFJ" target="_blank" rel="noreferrer noopener">Arduino Starter Kit</a> enthalten sind:</p>



<ul class="wp-block-list">
<li><strong>Arduino UNO R3 (oder kompatibel) mit Breadboard</strong></li>



<li><strong>Zwei Push-Buttons</strong> für die Steuerung (links/rechts)</li>



<li>Optionaler <strong>Buzzer</strong> für Soundeffekte</li>



<li><strong>Ein paar Kabel</strong> zur Verbindung der Komponenten</li>
</ul>



<h2 class="wp-block-heading"><strong>Verkabelung:</strong></h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="756" src="https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-1024x756.png" alt="" class="wp-image-1841" srcset="https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-1024x756.png 1024w, https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-300x222.png 300w, https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-768x567.png 768w, https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine.png 1351w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Der Buzzer an D6 kann auch einfach weggelassen werden, im Programmcode sind dazu keine Änderungen notwendig.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Komponente</th><th>Arduino Pin</th></tr><tr><td>OLED SDA</td><td>A4</td></tr><tr><td>OLED SCL</td><td>A5</td></tr><tr><td>OLED VCC</td><td>5V</td></tr><tr><td>OLED GND</td><td>GND</td></tr><tr><td>Button Links</td><td>D2 und GND</td></tr><tr><td>Button Rechts</td><td>D3 und GND</td></tr><tr><td>Buzzer</td><td>D6 und GND</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><strong>Arduino Programmcode und technische Besonderheiten</strong></h2>



<p class="wp-block-paragraph">Der komplette Quellcode ist gut dokumentiert auf&nbsp;<a href="https://github.com/adidax/oled-retro-pixel-racer" target="_blank" rel="noreferrer noopener"><strong>GitHub</strong>&nbsp;(oled_racer_de.ino)</a> verfügbar. Am einfachsten beim grünen Button rechts oben &#8222;Download ZIP&#8220; wählen und entpacken &#8211; oder den Sketch einfach über die Zwischenablage in ein neues Arduino Programmfenster kopieren.</p>



<h3 class="wp-block-heading">Einige wichtige Aspekte zum Verständnis des Codes:</h3>



<h4 class="wp-block-heading"><strong>Optimierung durch Integer-Skalierung:&nbsp;</strong></h4>



<p class="wp-block-paragraph">Rechenoperationen mit Gleitkommazahlen sind aufwändig und das wollte ich vermeiden. An manchen Stellen, zum Beispiel bei der Geschwindigkeit des Spielerautos, braucht man aber die Möglichkeit, diese in feineren Schritten zu erhöhen. Deswegen habe ich Koordinaten von Objekten am Display und Geschwindigkeiten um den Faktor 10 hochskaliert und als&nbsp;int&nbsp;gespeichert. Das Display hat also im Programmcode nicht 128&#215;64, sondern 1280&#215;640 Pixel. So sind präzisere Berechnungen ohne Performance-Einbußen durch Float-Operationen möglich. Vor der Darstellung auf dem Display werden die Werte dann durch 10 geteilt.<br><strong>Beispiel:<br></strong><code>playerSpeed = 25</code>&nbsp;bedeutet eine Bewegung von 2.5 Pixeln pro Frame.<br>Ein Hindernis mit&nbsp;<code>x = 150</code>&nbsp;befindet sich an Position x = 15.0 auf dem Display.</p>



<h4 class="wp-block-heading">Spielzustände verwalten:&nbsp;</h4>



<p class="wp-block-paragraph">Der Code nutzt eine&nbsp;<code>enum GameState</code>, um zwischen den verschiedenen Zuständen zu wechseln:<br><code>STARTSCREEN</code>: Intro-Animation mit Titel.<br><code>PLAYING</code>: Das eigentliche Spiel läuft (oder zeigt &#8222;Game over an&#8220;)<br><code>HIGHSCORE</code>: Nach Game Over wird eine Highscore-Liste angezeigt.<br>Dadurch bleibt der Code sauber strukturiert und einfach erweiterbar.</p>



<h4 class="wp-block-heading">Flüssige Animationen mit Timer-Steuerung:&nbsp;</h4>



<p class="wp-block-paragraph">Das Spiel nutzt&nbsp;millis(), um eine konstante Framerate von 25 FPS zu halten. Statt&nbsp;delay()&nbsp;wird der Zeitunterschied zum letzten Frame berechnet, sodass die Spiellogik immer genau zur richtigen Zeit aktualisiert wird.</p>



<h4 class="wp-block-heading">Adaptive Gegner-Spawns:&nbsp;</h4>



<p class="wp-block-paragraph">Die Gegner (Hindernisse) erscheinen mit steigender Spielzeit immer häufiger. Zu Beginn gibt es nur einen Gegner gleichzeitig, später bis zu zehn, je nach zurückgelegter Distanz.</p>



<h4 class="wp-block-heading">Blinkende Highscore-Anzeige:&nbsp;</h4>



<p class="wp-block-paragraph">Falls der aktuelle Score in die Top-10 kommt, wird dieser blinkend hervorgehoben.</p>



<h2 class="wp-block-heading">Vorbereitung der Spielgrafik</h2>



<p class="wp-block-paragraph">Da das OLED-Display nur <strong>Schwarz-Weiß-Grafiken</strong> unterstützt, müssen Bilder in ein passendes <strong>Bitmap-Format</strong> umgewandelt und im Programmcode eingebunden werden. Dafür habe ich das kostenlose Online-Tool <a href="https://javl.github.io/image2cpp/" target="_blank" rel="noreferrer noopener"><strong>Image2CPP</strong></a> verwendet.</p>



<p class="wp-block-paragraph"><strong>Schritt-für-Schritt-Anleitung für eigene Grafiken: </strong></p>



<ol class="wp-block-list">
<li>Lade das gewünschte <strong>PNG-Bild</strong> hoch.</li>



<li>Stelle die <strong>Bildgröße</strong> passend zur benötigten Pixelgröße ein (z. B. 10&#215;8 Pixel für ein Auto).</li>



<li>Wähle als <strong>Ausgabeformat</strong> → <strong>Arduino Code</strong>.</li>



<li>Kopiere den generierten <strong>PROGMEM-Code</strong> in das Arduino-Projekt.</li>



<li>Nutze display.drawBitmap(x, y, bitmap, width, height, SSD1306_WHITE); zur Anzeige des Bildes.</li>
</ol>



<p class="wp-block-paragraph">Diese Methode ermöglicht es, eigene Icons oder Sprites für das Spiel zu erstellen und ins <strong>Flash-Speicher</strong> (PROGMEM) des Arduino zu laden. Dabei muss man aber immer beachten, dass der Speicherplatz des Arduino sehr begrenzt ist :) </p>



<h2 class="wp-block-heading"><strong>Spielprinzip und Steuerung</strong></h2>



<ul class="wp-block-list">
<li>Der Spieler kann sich mit den beiden Buttons&nbsp;<strong>nach links und rechts</strong>&nbsp;bewegen.</li>



<li>Gegner erscheinen zufällig auf den Spuren und bewegen sich auf den Spieler zu.</li>



<li>Kollidiert der Spieler mit einem Hindernis, ist das Spiel vorbei.</li>



<li>3 Sekunden nach Game over wird die Highscore-Liste angezeigt.</li>



<li>Ein Druck auf eine beliebige Taste startet das Spiel neu.</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-1024x683.jpg" alt="" class="wp-image-1846" srcset="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-1024x683.jpg 1024w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-300x200.jpg 300w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-768x512.jpg 768w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-1536x1024.jpg 1536w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><strong>Was mir am Projekt gefällt</strong></h2>



<p class="wp-block-paragraph">Dieses kleine Projekt zeigt, dass auch mit begrenzten Ressourcen spannende Retro-Spiele auf dem Arduino möglich sind. Der Code ist modular und halbwegs verständlich &#8211; auf Objektklassen oder komplexere Konstrukte habe ich bewusst verzichtet &#8211; und kann leicht verändert oder erweitert werden – beispielsweise mit mehr Soundeffekten oder zusätzlichen Hindernissen.</p>



<p class="wp-block-paragraph"><a href="https://github.com/adidax/oled-retro-pixel-racer" target="_blank" rel="noreferrer noopener">Der&nbsp;<strong>komplette Quellcode</strong>&nbsp;ist auf&nbsp;<strong>GitHub</strong>&nbsp;verfügbar.</a> Viel Spaß beim Nachbauen!</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
