<?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>Glow &#187; Technisches</title>
	<atom:link href="http://www.black-chronos.com/glow/category/technisches/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.black-chronos.com/glow</link>
	<description>The freeware action game</description>
	<lastBuildDate>Sat, 24 Jul 2010 19:10:34 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Die Innereien des Blitzzaubers</title>
		<link>http://www.black-chronos.com/glow/2010/05/blitzzauber/</link>
		<comments>http://www.black-chronos.com/glow/2010/05/blitzzauber/#comments</comments>
		<pubDate>Thu, 20 May 2010 16:00:14 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[Technisches]]></category>

		<guid isPermaLink="false">http://www.black-chronos.com/glow/?p=595</guid>
		<description><![CDATA[Eines der Elemente, die wir in den vergangenen Monaten überdacht und dezent weiter entwickelt haben, ist der Blitzzauber (siehe auch der erste Blitz). Neben Schwertschlägen, Pistolenkugeln und Feuerbällen sind Blitze die vierte Angriffsmöglicheit für unseren Pixelhelden.
Konkret standen wir vor zwei Problemen:

Die Waffe darf nicht zu stark sein.
Es muss Spaß machen, sie zu benutzen.


Mit der Stärke [...]]]></description>
			<content:encoded><![CDATA[<p>Eines der Elemente, die wir in den vergangenen Monaten überdacht und dezent weiter entwickelt haben, ist der Blitzzauber (siehe auch <a href="http://www.black-chronos.com/glow/2009/01/der-erste-blitz/">der erste Blitz</a>). Neben Schwertschlägen, Pistolenkugeln und Feuerbällen sind Blitze die vierte Angriffsmöglicheit für unseren Pixelhelden.</p>
<p>Konkret standen wir vor zwei Problemen:</p>
<ol>
<li>Die Waffe darf nicht zu stark sein.</li>
<li>Es muss Spaß machen, sie zu benutzen.</li>
</ol>
<p><span id="more-595"></span></p>
<p>Mit der Stärke hatten wir es anfangs etwas übertrieben. Pistolenkugeln und Feuerbälle können immer nur dem Gegner schaden, den sie direkt treffen. Der Blitz dagegen radierte alles aus, was in seiner Reichweite lag, und das meist sogar bei der ersten Berührung. Die Ladezeit war sehr kurz, die Durchschlagskraft nahezu unbegrenzt und die Reichweite und der allgemeine Radius gigantisch (im Bild gelb). Als einzige Limitierung blieb die verfügbare Menge, aber auch da waren wir relativ großzügig.</p>
<p><a href="/glow/wp-content/uploads/2010/05/blitzzauber-pixelmaske.jpg"><img src="/glow/wp-content/uploads/2010/05/blitzzauber-pixelmaske.jpg" alt="Pixelmasken des Blitzzaubers" title="Falsche (gelb) und richtige (rot) Pixelmaske des Blitzzaubers" width="600" height="249" class="alignnone size-full wp-image-596" /></a></p>
<p>In der aktuellen Version haben wir zuerst <strong>Obergrenzen</strong> festgelegt: 99 Pistolenkugeln, 75 Feuerbälle und maximal 50 Blitze kann unser Held ansammeln. Das hat zwei Effekte für den Spielfluss. Zum einen kann es nun viel eher passieren, dass eine Munitionsart tatsächlich verbraucht wird und der Spieler gezwungen ist, eine andere Waffe zu verwenden. Zum anderen wird der Spieler die Obergrenze in dem Moment bemerken, in dem er eine Munitionsart nicht mehr einsammeln kann, diese Verschwendung bedauern und bewusster immer genau diejenigen Waffen verwenden, für die gerade Munition zur Verfügung steht. Ich zumindest spiele so. Alles in allem wird so das Phönomen reduziert, dass Spieler stur bei einer Waffe und Strategie bleiben, die sich einmal bewährt hat. Die Einschränkung der verfügbaren Ressourcen sorgt so für mehr Abwechslung.</p>
<p>Im nächsten Schritt haben wir uns die <strong>Reichweite</strong> des Blitzes angesehen und dabei einen Fehler bemerkt: Irgendwann im Laufe der Entwicklung wurde dem Blitz ein zusätzliches blaues Leuchten spendiert. Da die Kollisionsmaske aber direkt aus den Grafiken erzeugt wird, wurde das Leuchten Teil der tödlichen Reichweite (im Bild gelb). Das blieb meist unbemerkt, in Grenzsituationen fiel jedoch auf, dass Gegner auch dann getroffen wurden, wenn sie noch ein Stück von eigentlichen Blitzstrahl entfernt waren.</p>
<p>Die Lösung war dank der vorausschauenden Arbeit meines Vorgängers wieder einmal bemerkenswert simpel: Zu jeder Animationsphase wurde eine Maske angelegt (im Bild rot), als PNG-Datei dazu kopiert und das war&#8217;s auch schon.</p>
<p>Als nächstes störte uns, dass fast alle Gegner schon beim ersten Treffer das Zeitliche segneten &#8211; und das auch noch bei allen gleichzeitig. Die Konsequenz war also, die <strong>Stärke</strong> der Waffe zu reduzieren und mehr Gegnern zu &#8222;erlauben&#8220;, einen Blitztreffer zu überstehen.</p>
<p>Das führte sofort zum nächsten Problem: Sehr schnelle Gegner wie der Mork schafften es, so schnell an unseren Helden heran zu kommen, dass keine Zeit zum Nachladen blieb. Solche Details führen zumindest bei mir zu frustriertem aber natürlich unnützem Herumgedrücke auf der Feuertaste und letztlich dazu, die entsprechende Waffe zu meiden. Also was tun? Die Lösung: Alle normalen Gegner (nicht die Bosse) machen kehrt und <strong>flüchten</strong>, sobald sie von einem Blitz getroffen werden (zumindest diejenigen, die es überleben). Das wirkt auch optisch sehr cool. Die Waffe fühlt sich auf einen Schlag viel mächtiger an, ohne wirklich durchschlagkräftiger zu sein (wir hatten sie im Gegenteil ja sogar abgeschwächt).</p>
<p>Die Flucht ist auch logisch gut zu begründen: Viele Gegner in Glow können nur im Nahkampf angreifen &#8211; sie treten, stechen oder schlagen. Wenn sie von einer Fernwaffe getroffen werden, müssen sie wissen, dass sie keine Chance haben und es besser wäre, in Deckung zu gehen und auf einen günstigeren Moment zu warten.</p>
<p>Die anderen beiden Fernwaffen haben wesentlich kürzere Ladezeiten, sind aber auch wesentlich weniger durchschlagkräftig und erlaubt keinen Rückzug auf eine sichere Distanz. Deshalb drehen die Gegner bei diesen Treffern nicht um sondern werden nur kurz abgebremst. Auch das wirkt sehr cool &#8211; wie ein Hollywood-Effekt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.black-chronos.com/glow/2010/05/blitzzauber/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dirty Coding Tricks</title>
		<link>http://www.black-chronos.com/glow/2009/12/dirty-coding-tricks/</link>
		<comments>http://www.black-chronos.com/glow/2009/12/dirty-coding-tricks/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 09:48:19 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[Technisches]]></category>

		<guid isPermaLink="false">http://www.black-chronos.com/glow/?p=446</guid>
		<description><![CDATA[Gamasutra: Dirty Coding Tricks. (Found at Coding Horror.) Wow. This may explain why I&#8216;m so happy without a real schedule here in this little project. I&#8216;m free to spend as much time as I want to fix every little problem in the sources without using dirty tricks. OK, we have some scheduling. We need to [...]]]></description>
			<content:encoded><![CDATA[<p>Gamasutra: <a href="http://www.gamasutra.com/view/feature/4111/dirty_coding_tricks.php">Dirty Coding Tricks</a>. (Found at <a href="http://www.codinghorror.com/blog/archives/001299.html">Coding Horror</a>.) Wow. This may explain why I&#8216;m so happy without a real schedule here in this little project. I&#8216;m free to spend as much time as I want to fix every little problem in the sources without using dirty tricks. OK, we have some scheduling. We need to finish some day. We don&#8217;t want another never released game and another unused engine. There are thousands out there. Most of these dead projects make me sad. So many games nobody is able to play. That&#8217;s a shame.<br />
<span id="more-446"></span></p>
<p>I want both and I think this is my problem. I want to code, to paint and to make the project better and better. This is an infinite loop, I know. It&#8217;s always possible to make something better, to replace a sound, find a better fitting texture or a better compression algorithm, no matter how often the very same part was replaced before. From this point of view I don&#8217;t want to finish the project. In the moment it&#8217;s finished there is nothing more to do, nothing to improve, nothing to learn.</p>
<p>On the other side, it makes me happy if at least some people like what I do. In this case this implies finishing the game. An unfinished game can not be played.</p>
<p>Good news: The demo version (4 levels, 1 boss enemy) is almost finished. It will be released before christmas. This time we mean it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.black-chronos.com/glow/2009/12/dirty-coding-tricks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Glow 3D</title>
		<link>http://www.black-chronos.com/glow/2009/11/glow-3d/</link>
		<comments>http://www.black-chronos.com/glow/2009/11/glow-3d/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 16:00:58 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[Technisches]]></category>

		<guid isPermaLink="false">http://www.black-chronos.com/glow/?p=404</guid>
		<description><![CDATA[Glow is based on Direct3D or alternatively OpenGL. Both are 3D. You may ask where this 3D is hidden in Glow? There it is:


Compare this image with the image in the previous post. No, thats not part of the final game. It&#8217;s just a litte joke a coder have while discovering all these little funny [...]]]></description>
			<content:encoded><![CDATA[<p>Glow is based on Direct3D or alternatively OpenGL. Both are 3D. You may ask where this 3D is hidden in Glow? There it is:<br />
<span id="more-404"></span></p>
<p><a href="http://www.black-chronos.com/glow/wp-content/uploads/2009/11/glow-direct3d.jpg"><img class="alignnone size-full wp-image-405" title="glow-direct3d" src="http://www.black-chronos.com/glow/wp-content/uploads/2009/11/glow-direct3d.jpg" alt="" width="500" height="375" /></a></p>
<p>Compare this image with the <a href="/glow/2009/11/lehren/#more-399">image in the previous post</a>. No, thats not part of the final game. It&#8217;s just a litte joke a coder have while discovering all these little funny parameters in the Microsoft APIs. ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.black-chronos.com/glow/2009/11/glow-3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einführung ins Triggersystem</title>
		<link>http://www.black-chronos.com/glow/2009/10/einfuehrung-triggersystem/</link>
		<comments>http://www.black-chronos.com/glow/2009/10/einfuehrung-triggersystem/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 20:28:33 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[Technisches]]></category>

		<guid isPermaLink="false">http://www.black-chronos.com/glow/?p=334</guid>
		<description><![CDATA[Was unser bis 2007 federführender Programmierer Holger Meisel in etwas mehr als einem Jahr geschaffen hat, fasziniert mich immer wieder aufs Neue. Glow basiert auf einer vollständig selbst entwickelten Engine. Es kommt tatsächlich keine besondere Grafikengine zum Einsatz &#8211; kein XNA, kein Allegro, keine SDL, kein Box2D. Heutzutage würden wir diesen Punkt vermutlich anders angehen [...]]]></description>
			<content:encoded><![CDATA[<p>Was unser bis 2007 federführender Programmierer Holger Meisel in etwas mehr als einem Jahr geschaffen hat, fasziniert mich immer wieder aufs Neue. Glow basiert auf einer vollständig selbst entwickelten Engine. Es kommt tatsächlich keine besondere Grafikengine zum Einsatz &ndash; kein XNA, kein Allegro, keine SDL, kein Box2D. Heutzutage würden wir diesen Punkt vermutlich anders angehen und vielleicht keine vollständige <a href="http://www.devmaster.net/engines/">3D-Engine</a> aber zumindest eine leichtgewichtige Grafik- und Physik-Bibliotheken nutzen. Aber darum soll es hier nicht gehen. Die Glow-Engine baut auf OpenGL und Direct3D auf, wie es von den Herstellern ausgeliefert wird, und erlaubt bemerkenswerterweise das freie Umschalten zwischen beiden Ausgabearten. Die einzige Ausnahme ist die OpenAL-Bibliothek für die Ausgabe von Sounds und Musik.</p>
<p>Als Informatiker begeistert mich die unglaublich sauber implementierte Objektsstruktur am meisten. Jedes Objekt im Spiel hat im C++-Quelltext ein Äquivalent im Sinne der Objektorientierung. Stevie wird verletzt, indem seine Methode <code>Player->Hurt(2)</code> mit der Stärke der Verletzung aufgerufen wird. Ein Gegner stirbt? <code>Enemy->Die()</code>. Eine Tür ist zu öffnen? Einfach das passende <code>Door->Unlock()</code> absetzen.<br />
<span id="more-334"></span></p>
<p>Diese Methodenaufrufe schreien geradezu nach einem Event-System und tatsächlich wurde damals damit begonnen, ein solches zu implementieren. Leider war gerade das ein Punkt, der gegen Ende der geplanten Entwicklungszeit abgekürzt werden musste. Deshalb war im Spiel von 2007 nicht viel von dieser Ereignisbehandlung zu spüren. Stevie konnte Hebel umlegen und der Hebel öffnete eine Tür oder schaltete eine Blitzfalle aus. Der Tod eines Bossgegners beendete den aktuellen Level. Und das war es schon fast. Wie schade, dachte ich mir, und begann damit, an der Umsetzung weiterer Ideen zu arbeiten. Zum Beispiel:</p>
<ul>
<li>An einer bestimmten, vom Leveldesigner festgelegten Stelle tauchen hinter Stevie plötzlich neue Gegner auf und nehmen ihn überraschend in die Zange.</li>
<li>Das Einsammeln eines Schlüssels löst einen Alarm aus und ruft einen besonders hartnäckigen Gegner herbei.</li>
<li>Eine Tür schließt sich hinter dem Spieler wieder, um ihm dabei zu helfen, in größeren Labyrinthen nicht unendlich im Kreis zu laufen.</li>
<li>Vor Stevies Nase knallt plötzlich eine Kiste oder sogar eine große Statue auf den Boden.</li>
<li>Ein längerer Fahrstuhl wird erst durch die Anwesenheit des Spielers aktiviert und fährt genau im richtigen Moment los.</li>
<li>Harmlos aussehende, inaktive Fallen werden bei Annäherung plötzlich aktiv und erschrecken den Spieler.</li>
<li>In bestimmten Situationen, zum Beispiel wenn ein größerer Gegner stirbt, sterben auch alle verbliebenen kleinen Gegner im Umkreis.</li>
</ul>
<p>Und so weiter. Der Fantasie der Leveldesigner (ihr erinnert euch, wir werden den <a href="/glow/2009/01/neues-vom-editor/">Editor</a> mitliefern) sind nur wenige Grenzen gesetzt. Es ist sogar möglich, solche Ereignisse an die Spielfigur Stevie Speed zu senden, so dass er zum Beispiel von selbst ein Stück läuft oder automatisch die Waffe wechselt.</p>
<p>Ein Trigger, der einen Gegner direkt hinter Stevie erscheinen lässt, sieht im Editor beispielsweise so aus:</p>
<p><a href="http://www.black-chronos.com/glow/wp-content/uploads/2009/10/glow-event-trigger-links.jpg"><img src="http://www.black-chronos.com/glow/wp-content/uploads/2009/10/glow-event-trigger-links.jpg" alt="" title="Bildschirmfoto aus dem Editor mit einem Trigger verlinkt mit einem Event" width="500" height="375" class="alignnone size-full wp-image-336" /></a></p>
<p>Auslöser können sein:</p>
<ul>
<li><strong>Hebel</strong> werden bewusst betätigt. Der Spieler muss Stevie vor den Hebel bewegen und ihn mit der Alt-Taste umlegen. Den Hebel, nicht Stevie. Hebel können allerdings nur einmal aktiviert werden. Das ist eine Designentscheidung von uns, um die Sache für den Spieler nicht unnötig kompliziert zu machen.</li>
<li><strong>Radius-Auslöser</strong> wie der oben im Bild sind im Spiel unsichtbar und werden ausgelöst, sobald sich Stevies Mittelpunkt innerhalb des Kreises befindet. Funktioniert ansonsten wie ein Hebel.</li>
<li>Bei jedem anderen Objekt können an bestimmte Auslöser-Kommandos zusätzliche Kommando-Ketten gehangen werden. Zum Beispiel können zwei Gegner so verkettet werden, dass im Todesfall des einen Gegners sofort ein zweites <code>Die()</code>-Kommando an einen anderen Gegner gesendet wird.</li>
</ul>
<p>Mögliche Kommandos sind:</p>
<ul>
<li><strong>Die()</strong> sorgt dafür, dass das Zielobjekt, an das dieses Kommando gerichtet war, verschwindet. Die meisten Objekte verschwinden in diesem Fall ganz unspektakulär. Sie sind einfach weg. Gegner und auch unser Stevie sterben natürlich wesentlich spektakulärer und lösen sich in Feuer und Rauch auf.</li>
<li><strong>Hurt()</strong> verletzt einen Gegner. Da die Verletzungsstärke im Editor nicht als Parameter übergeben werden kann, wird dem Gegner in diesem Fall immer ein Lebenspunkt abgezogen.</li>
<li><strong>Activate()</strong> gilt nur für Objekte, die auf das Drücken der Alt-Taste reagieren, zum Beispiel Hebel. Das Kommando löst das selbe Ereignis aus wie das Drücken der Taste.</li>
<li><strong>Lock()</strong> schließt Türen und schaltet Blitzbarrieren ein.</li>
<li><strong>Unlock()</strong> öffnet dementsprechend Türen und Barrieren und entsperrt Lifte.</li>
<li><strong>ToggleInventory()</strong> und einige weitere Toggle-Kommandos öffnen das Inventar, das Menü, schalten das Spiel in den Pause-Modus und einiges mehr.</li>
<li>Außerdem gibt es noch einen ganzen Satz Kommandos, mit denen sich die Spielfigur steuern lässt: Loslaufen, stoppen, springen, zur nächstbesseren Waffe wechseln. Der Spieler hat allerdings das Recht, jederzeit einzugreifen. Es gibt bewusst kein Kommando, um dem Spieler die Kontrolle zu entziehen.</li>
</ul>
<p>Eine Art <strong>Enable()</strong>-Kommando (ich bin mir bei der Benennung noch nicht ganz sicher) fehlt aktuell noch. Es soll wie oben beschrieben dafür sorgen, dass Kisten und Gegner aus dem Nichts erscheinen können. Meine aktuellen Versuche sehen noch so aus, dass ich versucht habe, das schon existierende Unlock-Kommando für Gegner (die bisher nichts mit Unlock anfangen konnten) zu implementieren. Mit durchwachsenem Erfolg. Was passiert in einer hardwarenahen Sprache wie C++, wenn ein Objekt zerstört wurde (ein Gegner ist gestorben), aber andere Objekte verweisen noch immer auf diesen nun ungültig gewordenen Pointer (der Tod eines Bossgegners soll den Tod aller übrig gebliebenen kleinen Gegner auslösen)? Das Spiel stürzt mit Zugriffsverletzungen ab. Abfangen wie in C# oder Java kann man diese Fehler nicht, dafür ist C++ nicht konstruiert. Also was tun?</p>
<p>Mein Plan: Zuerst einmal schaffe ich ein neues Kommando für das Erscheinen von bis dahin unsichtbaren Objekten. Dann muss in einem zweiten Schritt das Eventsystem so umgebaut werden, dass es nicht mit C-Pointern arbeitet, die wie erlebt schwer zu beherrschen sind, sondern mit Objekt-IDs. Sprich: Mit den eindeutigen, in Textform vorliegenden Kennzeichnern der Objekte (z.B. <code>EnemyRinger_7</code>). Diese IDs werden zum Glück automatisch vergeben. Der Vorteil dieser Methode ist gleichzeitig der einzige Nachteil: In dem Moment, in dem ein Ereignis ausgelöst wurde, muss erst aufwendig nach dem Objekt mit der angegebenen ID gesucht werden. Das kostet im Vergleich wesentlich mehr Rechenzeit als das simple Auswerten eines Pointers, geht aber trotzdem noch so schnell, dass es der Spieler nicht merken sollte.</p>
<p>Und wozu der Aufwand? Wir wollen euch den Editor geben und ihr sollt damit so kreativ wie möglich sein können, ohne dass euch das Spiel abstürzt, nur weil ihr etwas kreativer mit den Triggern wart als wir. Deswegen der Aufwand.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.black-chronos.com/glow/2009/10/einfuehrung-triggersystem/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Kleine Statistik</title>
		<link>http://www.black-chronos.com/glow/2009/08/kleine-statistik/</link>
		<comments>http://www.black-chronos.com/glow/2009/08/kleine-statistik/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 07:55:31 +0000</pubDate>
		<dc:creator>Yamm</dc:creator>
				<category><![CDATA[Technisches]]></category>

		<guid isPermaLink="false">http://www.black-chronos.com/glow/?p=315</guid>
		<description><![CDATA[&#8230; aus meinem Glow-Ordner, also aus der aktuellen Version des Spiels:
Größe: 212 Megabyte
Inhalt: 3660 Dateien, 256 Ordner
Für ein Jump ’n’ Run ist das schon einiges und es wird sicher noch mehr.
]]></description>
			<content:encoded><![CDATA[<p>&#8230; aus meinem Glow-Ordner, also aus der aktuellen Version des Spiels:</p>
<p><strong>Größe:</strong> 212 Megabyte</p>
<p><strong>Inhalt:</strong> 3660 Dateien, 256 Ordner</p>
<p>Für ein Jump ’n’ Run ist das schon einiges und es wird sicher noch mehr.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.black-chronos.com/glow/2009/08/kleine-statistik/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
