<?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>Zeitalter3 - Browsergames Entwicklerblog</title>
	<atom:link href="http://blog.zeitalter3.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zeitalter3.de</link>
	<description>Ein Blog über persistente Browsergames und deren Entstehung</description>
	<lastBuildDate>Thu, 01 Jul 2010 04:30:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Eine IDE für PHP (3)</title>
		<link>http://blog.zeitalter3.de/2010/06/29/eine-ide-fur-php-3/</link>
		<comments>http://blog.zeitalter3.de/2010/06/29/eine-ide-fur-php-3/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 22:33:53 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=829</guid>
		<description><![CDATA[Wie bereits angekündigt ist für mich wieder einmal die Zeit der Suche angebrochen. Die Suche nach einer geeigneten IDE ist nie einfach. Eine IDE ist weniger abhängig von ihrem Funktionsumfang, als vielmehr von dem Gefühl des Programmierers. Insbesondere für PHP bin ich seit rund 5 Jahren auf der Suche nach einer IDE, die mich wirklich [...]]]></description>
			<content:encoded><![CDATA[<p>Wie bereits <a href="http://blog.zeitalter3.de/2010/04/10/kurzes-status-update/" target="_blank">angekündigt</a> ist für mich wieder einmal die Zeit der Suche angebrochen. Die Suche nach einer geeigneten IDE ist nie einfach. Eine IDE ist weniger abhängig von ihrem Funktionsumfang, als vielmehr von dem Gefühl des Programmierers. Insbesondere für PHP bin ich seit rund 5 Jahren auf der Suche nach einer IDE, die mich wirklich rundum zufrieden stellt. Oder mir zumindest nicht in regelmäßigen Abständen auf die Nerven geht.</p>
<p>Es gibt durchaus einige IDEs für PHP. Jedoch gibt es kaum aktuelle Tests und Vergleiche dieser IDEs von Leuten, die Ihre IDE als No-Nonsense Arbeitstier sehen und nicht als hübsches Gadget. Der letzte <a href="http://www.smashingmagazine.com/2009/02/11/the-big-php-ides-test-why-use-oneand-which-to-choose/" target="_blank">große Test von Smashing Magazine</a> ist inzwischen auch über ein Jahr alt. Also machte ich mich wieder auf die Suche. Dieser Post stellt meine persönlichen Erfahrungen mit den aufgelisteten IDEs dar.</p>
<p>Dies ist nicht meine erste Suche. Hier sind Links zu <a href="http://blog.zeitalter3.de/2008/04/23/eine-ide-fur-php/" target="_self">Teil 1</a> und <a href="http://blog.zeitalter3.de/2008/10/06/eine-ide-fur-php-2/" target="_self">Teil 2</a> (beide von 2008) zu finden. Insgesamt ist mir aufgefallen, dass die Qualität der IDEs seitdem stark zugenommen hat, insbesondere im Bereich OOP. Inzwischen haben die meisten IDEs zum Beispiel keine Probleme mehr mit Singletons, abstrakten Klassen oder Interfaces.</p>
<p>Der Test der IDEs entstand über einen längeren Zeitraum: jede IDE wurde mindestens zwei Wochen produktiv auf Live-Projekten getestet. Von kommerziellen IDEs wurde jeweils die Trial-Version getestet. Die Wahl einer IDE ist natürlich sehr subjektiv und eine Frage des persönlichen Stils. Folglich sind die Vorstellungen und gezogenen Schlüsse ebenfalls subjektiv und mit Vorsicht zu genießen.</p>
<p><span id="more-829"></span></p>
<p><strong><a href="http://www.zend.com/de/products/studio/" target="_blank">Zend Studio</a> (2.7, 399€, Eclipse-basiert)</strong></p>
<p>Nachdem Zend Studio in Teil eins nicht besonders gut wegkam, war ich von der neuen Version angenehm überrascht. Im Gegensatz zu früher lief es stabil und kam (nach einigen Code-Anpassungen) auch mit Singletons klar. Die Code-Features wie Refactoring, Debugging und so weiter funktionierten anstandslos und direkt &#8220;out of the box&#8221;. Besonders das Code Formatting hat es mir angetan und ist gegenüber dem alten Aptana Studio und dem aktuellen PDT vorbildlich umfangreich.</p>
<p>Im Zusammenspiel mit dem hauseigenen Zend Server dreht Zend Studio richtig auf. Die bereits guten Debugging-Möglichkeiten werden nochmals erweitert und man vergisst fast, dass man es mit PHP zu tun hat.</p>
<p>Wenn der Text-Zeitraum abgelaufen ist, bleibt eine IDE auf dem Niveau von PDT zurück. Essentielle Funktionen und Tools sind noch aktiv, aber andere (wie zum Beispiel das Code Formatting oder Debugging) werden deaktiviert.</p>
<p><strong>Fazit</strong>: Zend Studio hat seit seinem Erscheinen als Eclipse-Erweiterung große Fortschritte gemacht. Die Integration von Tools und Features ist logisch und stabil, die Features funktionieren ohne weiteren Aufwand. Seine Stärken spielt Zend Studio erst aus, wenn man es gemeinsam mit dem Zend Server nutzt. Nutzt man diesen nicht, lassen sich die meisten Funktionalitäten (wie z.B. Debugging, SVN, etc.) auch mit freien Eclipse-Plugins nachrüsten. Allerdings muss man dann selbst fummeln und jeder muss für sich entscheiden, ob ihm die Zeitersparnis dann 399€ wert ist. Kurz: mit Zend Server: hui! Ohne Zend Server: meh.</p>
<p><em>Plus</em></p>
<ul>
<li>Integration von Code Quality Tools (Unit Testing, Refactoring und Code Formatting) vorbildlich</li>
<li>Sehr stabil, robuste Features</li>
<li>Großartiges Zusammenspiel mit dem Zend Server</li>
</ul>
<p><em>Minus</em></p>
<ul>
<li>399€</li>
</ul>
<p><strong><a href="http://www.jetbrains.com/phpstorm/" target="_blank">JetBrains PhpStorm</a> (1.0, 47€ &#8211; 191€, Java-basiert) </strong></p>
<p>PhpStorm ist eine neue IDE, auf die mich <a href="http://twitter.com/dfox288/" target="_blank">DFox</a> <a href="http://twitter.com/dfox288/status/14758569433" target="_blank">aufmerksam</a> gemacht hat. Der schnelle <a href="http://www.jetbrains.com/phpstorm/index.html" target="_blank">Überblick über die Features</a> sah gut aus, die <a href="http://www.jetbrains.net/devnet/community/wi?view=discussions" target="_blank">Community</a> ist recht aktiv, also warf ich gerne einen Blick darauf. Was ich sah gefiel mir auf den ersten Blick. Zudem ist es mal wieder schön mit einem ganz anderen Look &amp; Feel zu arbeiten.</p>
<p>PhpStorm bringt alle Features mit, die man inzwischen von einer PHP-IDE erwarten darf: Debugging, Refactoring, Unit Tests und Code Inspection. Die Features sind allerdings abhängig vom Projekt-Typ: Eigene Klassen werden erst erkannt, wenn man das Projekt als &#8220;Neues Projekt auf lokalem Server&#8221; definiert, nicht aber, wenn man es als &#8220;Neues Projekt, lokal, ohne Server&#8221; anlegt. Nachdem man aber durch die verschiedenen Arten von Projekten durchgestiegen ist, funktioniert alles ganz gut.</p>
<p>Wenn man will kann man sich in stundenlangen Konfigurationsorgien austoben. So ziemlich jedes Feature kann in Tiefe und Breite angepasst werden. Besonders positiv fand ich die Möglichkeit Keymaps zu konfigurieren und so Tastaturlayouts verschiedener bekannter IDEs zu nutzen. Das machte für mich den Umstieg von Eclipse wesentlich leichter.</p>
<p>Etwas verwunderlich mutet hingegen die Projektverwaltung an. PhpStorm kann jeweils nur ein geöffnetes Projekt bearbeiten. Das wirkt 2010 einfach komisch. Natürlich lassen sich übergeordnete Verzeichnisse einhängen, aber Abhängigkeiten etc. sind damit nicht abbildbar. Will man gleichzeitig Framework und Anwendung bearbeiten müssen zwei Fenster genutzt werden.</p>
<p>Ebenso bedauerlich: die phpDoc-Beschreibung zu einer Methode ist in der Code Completion nicht zu sehen. Variablenbeschreibungen funktionieren jedoch einwandfrei.</p>
<p>Ein charmantes Feature fand ich die Navigation Bar, die eine Art Breadcrumb-Funktionalität darstellt. Sie zeigt immer den jeweiligen Aufenthaltsort der ausgewählte Datei an. Per Klick auf die Verzeichnisse sieht man direkt deren Inhalt und kann schnell zu benachbarten Dateien springen.</p>
<p>Woran ich mich immer noch nicht ganz gewöhnt habe ist der lokale Cache für Dateien. Im Grunde arbeitet PhpStorm nicht auf den &#8220;echten&#8221; Dateien des Dateisystems, sondern legt einen eigenen Cache darüber. Jede Änderung wird sofort in diesen Cache übernommen. Diese lokalen Änderungen existieren ab da als Änderungen zu den Originaldateien. Entsprechend warnt PhpStorm auch nicht, wenn man Dateien einfach schließt &#8211; beim nächsten Öffnen bedient er sich aus dem eigenen Cache und eventuell noch nicht gespeicherte Änderungen sind nach wie vor vorhanden. Das klingt charmant (und ist es auch), nur sollte man sich tunlichst abgewöhnen manuelle Updates aus dem SVN zu machen, da sonst das Dateisystem und der lokale Cache auseinander laufen. Lösung: SVN über PhpStorm verwalten klappt ganz wunderbar.</p>
<p>Geradezu unglaubwürdig schnell ist die projektweite Suchfunktion. Nachdem Eclipse mal gerne für eine Kaffeepause gut ist, wenn man größere Projekte durchsucht, hat man bei PhpStorm kaum Zeit die Hand nach einer Tasse auszustrecken. Schade, dass bei der Suchausgabe nur Verzeichnisse und Treffer angezeigt werden, aber nicht die dazugehörige Datei.</p>
<p>Ebenfalls positiv ist die gute Unterstützung für weitere Webtechnologien wie HTML, CSS, XML, JavaScript und so weiter. Wenig verwunderlich, da PhpStorm auf der WebIDE <a href="http://www.jetbrains.com/webstorm/features/" target="_blank">WebStorm</a> basiert.</p>
<p>Obwohl die IDE erst wenige Wochen aus der Beta entwachsen ist, läuft sie stabil. Gelegentlich traten im Hintergrund Fehler auf (erkennbar durch das rote Ausrufezeichen in der unteren Bildschirmleiste), jedoch stürzte das Programm nie ab, verlor keine Daten und verhielt sich immer vorhersehbar.</p>
<p><strong>Fazit</strong>: Absolut beeindruckend. Für einen Newcomer ist PhpStorm ein ganz großer Wurf. Innerhalb kurzer Zeit ist es meine Standard-IDE für Webentwicklung geworden: solide implementierte Standard-Features, ein Set von schönen Neuerungen und eine brachial schnelle Suchfunktion sorgen für bequemes entwickeln. That&#8217;s it, meine Suche ist erst einmal gelaufen. Ich kann aber verstehen, wenn sich nicht jeder auf eine völlig neue IDE einlassen will.</p>
<p><em>Plus</em></p>
<ul>
<li>Breadcrumb-Funktion für Verzeichnisse</li>
<li>Konfigurierbarkeit Deluxe</li>
<li>Brachial schnelle Suche</li>
<li>Solide Standard-Features</li>
</ul>
<p><em>Minus</em></p>
<ul>
<li>Nur ein Projekt gleichzeitig geöffnet</li>
<li><del datetime="2010-07-01T04:29:15+00:00">Keine PHPDoc-Beschreibungen in der Code Completion</del> (Siehe Kommentare)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/06/29/eine-ide-fur-php-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spieler-Taxonomien: Touristen und Skill Player</title>
		<link>http://blog.zeitalter3.de/2010/05/22/spieler-taxonomien-touristen-und-skill-player/</link>
		<comments>http://blog.zeitalter3.de/2010/05/22/spieler-taxonomien-touristen-und-skill-player/#comments</comments>
		<pubDate>Sat, 22 May 2010 20:45:22 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Spieldesign]]></category>
		<category><![CDATA[Gamer]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[Spielmechanik]]></category>
		<category><![CDATA[Taxonomie]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=815</guid>
		<description><![CDATA[Dieser Artikel ist Teil einer Serie, die verschiedene Taxonomien von Computerspielern vorstellt. In dieser sollen verschiedene Modelle vorgestellt werden, wie man die Gruppe der Personen die Computerspiele spielen weiter unterteilen kann.
Anfang 2008 beschrieb Mitch Krpata in seinem Blog eine Taxonomie für Spieler, die einerseits aufgrund ihrer Einfachheit, aber auch wegen ihres Ansatzes sehr interessant ist.
Krpata teilt Spieler in [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #888888;"><em>Dieser Artikel ist Teil einer </em></span><a href="http://blog.zeitalter3.de/tag/taxonomie/" target="_self"><span style="color: #888888;"><em>Serie</em></span></a><span style="color: #888888;"><em>, die verschiedene Taxonomien von Computerspielern vorstellt. In dieser sollen verschiedene Modelle vorgestellt werden, wie man die Gruppe der Personen die Computerspiele spielen weiter unterteilen kann.</em></span></p>
<p>Anfang 2008 beschrieb <a href="http://twitter.com/mkrpata" target="_blank">Mitch Krpata</a> in seinem Blog <a href="http://insultswordfighting.blogspot.com/2008/01/new-taxonomy-of-gamers-skill-players-vs.html" target="_blank">eine Taxonomie</a> für Spieler, die einerseits aufgrund ihrer Einfachheit, aber auch wegen ihres Ansatzes sehr interessant ist.</p>
<p>Krpata teilt Spieler in 2 Gruppen ein, <em>auf Basis ihrer Motivation</em>:</p>
<ul>
<li><strong>Touristen </strong>wollen ein Spiel erleben, konsumieren und dadurch unterhalten werden. Das Spiel ist für sie ein Zeitvertreib, den sie größtenteils passiv bestreiten &#8211; die Tätigkeit &#8220;spielen&#8221; ist für sie dabei nur ein Mittel, um den Verlauf voranzutreiben. Der Spieler wird geführt von dem Spiel.</li>
<li><strong>Skill Player</strong> wollen ein Spiel spielen, ausreizen, sich dabei verbessern und lernen. Das Spiel ist für sie eine Aufgabe, die sie aktiv lösen wollen. Das eigentliche Spiel (bzw. die Spielmechanik) ist für sie dabei das entscheidende. Der Spieler führt das Spiel.</li>
</ul>
<p>Während es dem Touristen im Extremfall genügt das Spiel unabhängig von Punktestand zu beenden, bemüht sich der Skill Player im Extremfall das Spiel mit allen Sidequests und Zusatzpunkten zu meistern. Diese beiden Gruppen schließen sich nicht aus &#8211; es ist denkbar, dass ein Spieler zum Beispiel bei unterschiedlichen Genres oder wechselnden Stimmungen zwischen Tourist und Skill Player wechselt.</p>
<p>Ebenso ist eine Verschiebung des Trends über einen Zeitraum hinweg denkbar. Beispielsweise ein WoW-Spieler, der zunächst regelmäßig an Endgame-Raids teilnimmt und mit der Zeit mehr Interesse an weniger aktiven Tätigkeiten entwickelt (oder umgekehrt). Untersucht man diesen zeitlichen Ablauf genauer, so erhält man weitere Merkmale zwischen den beiden Positionen.</p>
<p>Besonders interessant ist diese Taxonomie, da man die Motivation eines Spielers in Bezug auf andere Merkmale betrachten kann und so einfache, aber wirkungsvolle Matrizen erhält.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/05/22/spieler-taxonomien-touristen-und-skill-player/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mehr Entitysysteme</title>
		<link>http://blog.zeitalter3.de/2010/05/10/mehr-entitysysteme/</link>
		<comments>http://blog.zeitalter3.de/2010/05/10/mehr-entitysysteme/#comments</comments>
		<pubDate>Mon, 10 May 2010 05:08:32 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Entity Systeme]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=816</guid>
		<description><![CDATA[Adam hat in seinem Blog eine Implementation eines kompletten Entitysystems in Java vorgestellt. Genug gesagt.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://t-machine.org" target="_blank">Adam</a> hat in seinem Blog eine Implementation eines <a href="http://t-machine.org/index.php/2010/05/09/entity-system-1-javaandroid/" target="_blank">kompletten Entitysystems</a> in Java vorgestellt. Genug gesagt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/05/10/mehr-entitysysteme/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Mehr komponentenbasierte Systeme</title>
		<link>http://blog.zeitalter3.de/2010/04/26/mehr-komponentenbasierte-systeme/</link>
		<comments>http://blog.zeitalter3.de/2010/04/26/mehr-komponentenbasierte-systeme/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 21:42:06 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Entity Systeme]]></category>
		<category><![CDATA[Literatur]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=808</guid>
		<description><![CDATA[In der aktuellen Printausgabe des Making Games Magazin ist ein Artikel von Thorsten Lange (seinerseits Technischer Leiter bei Deck13) über komponentenbasierte Systeme (bzw. Entity-Systeme). Da meine Artikel zu dem Thema bei euch gut ankamen könnte dieser für euch ebenfalls interessant sein.
Der Artikel geht über vier Seiten und beginnt mit den Problemen einer klassenbasierten Hierarchie bei Objekten [...]]]></description>
			<content:encoded><![CDATA[<p>In der aktuellen Printausgabe des <a href="http://www.makinggames.de/index.php/magazin" target="_blank">Making Games Magazin</a> ist ein Artikel von <a href="https://www.xing.com/profile/Thorsten_Lange11" target="_blank">Thorsten Lange</a> (seinerseits Technischer Leiter bei <a href="http://deck13.com/" target="_blank">Deck13</a>) über komponentenbasierte Systeme (bzw. Entity-Systeme). Da <a href="http://blog.zeitalter3.de/2010/02/13/das-gamesystem-modul/" target="_self">meine</a> <a href="http://blog.zeitalter3.de/2010/02/16/datenhaltung-mit-gamedata-class-php/" target="_self">Artikel</a> zu dem Thema bei euch gut ankamen könnte dieser für euch ebenfalls interessant sein.</p>
<p>Der Artikel geht über vier Seiten und beginnt mit den Problemen einer klassenbasierten Hierarchie bei Objekten mit komplexen Eigenschaften. Als Lösung beschreibt er ein Komponentensystem, welches die Eigenschaften eines Objekts definiert. Das System setzt die Objekte aus den Komponenten zusammen, die Logik steckt dabei allerdings, im Gegensatz zu meiner Implementation, in den Komponenten selbst. Es gibt einige Beispiele in Pseudo-Code (welche die Objekt-Initialisierung zeigen) und er spricht kurz über einen Property-Editor und dessen Anbindung.</p>
<p>Alles in allem kein sehr tiefgehender Artikel, aber mehr über andere Ansätze und Implementationen zu lesen ist immer gut. Kurz: Lese-Empfehlung.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/04/26/mehr-komponentenbasierte-systeme/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Spieler-Taxonomien: Was seid ihr?</title>
		<link>http://blog.zeitalter3.de/2010/04/26/spieler-taxonomien-was-seid-ihr/</link>
		<comments>http://blog.zeitalter3.de/2010/04/26/spieler-taxonomien-was-seid-ihr/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 05:25:46 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Spieldesign]]></category>
		<category><![CDATA[Gamer]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[Taxonomie]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=799</guid>
		<description><![CDATA[Dieser Artikel ist Teil einer Serie, die verschiedene Taxonomien von Computerspielern vorstellt. In dieser sollen verschiedene Modelle vorgestellt werden, wie man die Gruppe der Personen die Computerspiele spielen weiter unterteilen kann.
Frage:
Siehst du dich als Gamer?
Falls ja, beschreibe bitte mit einem Wort was für eine Art Gamer du bist.
Falls nein: beschreibe bitte mit einem Wort warum nicht.
]]></description>
			<content:encoded><![CDATA[<p><em><span style="color: #888888;">Dieser Artikel ist Teil einer </span></em><a href="http://blog.zeitalter3.de/tag/taxonomie/" target="_self"><em><span style="color: #888888;">Serie</span></em></a><em><span style="color: #888888;">, die verschiedene Taxonomien von Computerspielern vorstellt. In dieser sollen verschiedene Modelle vorgestellt werden, wie man die Gruppe der Personen die Computerspiele spielen weiter unterteilen kann.</span></em></p>
<p>Frage:</p>
<p><strong>Siehst du dich als Gamer?</strong></p>
<p>Falls ja, beschreibe bitte mit einem Wort was für eine Art Gamer du bist.</p>
<p>Falls nein: beschreibe bitte mit einem Wort warum nicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/04/26/spieler-taxonomien-was-seid-ihr/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Spieler-Taxonomien: Die Bartle-Typen</title>
		<link>http://blog.zeitalter3.de/2010/04/20/spieler-taxonomien-die-bartle-typen/</link>
		<comments>http://blog.zeitalter3.de/2010/04/20/spieler-taxonomien-die-bartle-typen/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 17:47:42 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Spieldesign]]></category>
		<category><![CDATA[Gamer]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[Spielmechanik]]></category>
		<category><![CDATA[Taxonomie]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=777</guid>
		<description><![CDATA[Dieser Artikel ist Teil einer Serie, die verschiedene Taxonomien von Computerspielern vorstellt. In dieser sollen verschiedene Modelle vorgestellt werden, wie man die Gruppe der Personen die Computerspiele spielen weiter unterteilen kann.
Die Bartle-Typen basieren auf dem Paper &#8220;Hearts, Clubs, Diamonds, Spades: Players Who Suit MUDs&#8221; von Richard Bartle. Das Paper entstand aus einer Diskussion zwischen langjährigen Spielern [...]]]></description>
			<content:encoded><![CDATA[<p><em><span style="color: #888888;">Dieser Artikel ist Teil einer </span></em><a href="http://blog.zeitalter3.de/tag/taxonomie/" target="_self"><em><span style="color: #888888;">Serie</span></em></a><em><span style="color: #888888;">, die verschiedene Taxonomien von Computerspielern vorstellt. In dieser sollen verschiedene Modelle vorgestellt werden, wie man die Gruppe der Personen die Computerspiele spielen weiter unterteilen kann.</span></em></p>
<p>Die Bartle-Typen basieren auf dem Paper &#8220;<a href="http://www.mud.co.uk/richard/hcds.htm" target="_blank">Hearts, Clubs, Diamonds, Spades: Players Who Suit MUDs</a>&#8221; von <a href="http://mud.co.uk/richard/" target="_blank">Richard Bartle</a>. Das Paper entstand aus einer Diskussion zwischen langjährigen Spielern eines <a href="http://de.wikipedia.org/wiki/Multi_User_Dungeon" target="_blank">MUDs</a> im Zeitraum von November 1989 bis Mai 1990. Darin diskutierten die Teilnehmer ihre Motivation, sowie ihre Ansprüche und Wünsche an ein MUD. Aus diesen Erkenntnissen leitete Bartle vier verschiedene Typen von Multiplayer-Spielern ab, die sich jeweils in ihrer Motivation (warum sie ein Spiel spielen) und in ihren Zielen (was sie erreichen wollen) unterscheiden:</p>
<ul>
<li><strong>Achiever</strong>: spielen, &#8220;um zu gewinnen&#8221; und die vom Spiel vorgegebenen Ziele (möglichst gut) zu erfüllen</li>
<li><strong>Explorer</strong>: versuchen möglichst viel über das Spiel selbst, seine Welt, Mechaniken, etc. herauszufinden</li>
<li><strong>Socializer</strong>: spielen, um mit anderen zu kommunizieren, sich auszutauschen und zu vernetzen</li>
<li><strong>Killer</strong>: versuchen andere zu stören und stellen ihre eigenen Ziele über die des Spiels oder andere Spieler</li>
</ul>
<p>Dabei sind die Bartle-Typen nicht eindeutig. Ein Spieler gehört wahrscheinlich mehreren Gruppen an &#8211; je nach Spiel, Stimmung oder Situation. Mit dem <a href="http://www.gamerdna.com/quizzes/bartle-test-of-gamer-psychology" target="_blank">Bartle-Test</a> können Spieler durch ein Frage-Antwort-Quiz ihren Bartle-Quotient bestimmen.</p>
<p>In seinem Paper werden die Typen mit ihren Eigenschaften sehr deutlich beschrieben und in Beziehung zur Spielwelt und deren Handlungen gesetzt. Dabei sagt Bartle, dass Achiever und Explorer vornehmlich mit der Spielwelt / dem System an sich interagieren, Socializer und Killer hingegen mit anderen Spielern. Auch schön ist die Betrachtung der Dynamiken der einzelnen Typen untereinander (&#8220;<em>Was passiert, wenn Typ X in einer Gruppe vorherrscht?</em>&#8220;).</p>
<p>In seinem Buch &#8220;<a href="http://mud.co.uk/dvw/" target="_blank">Designing Virtual Worlds</a>&#8221; erweitert Richard Bartle das Paper noch um eine soziale Betrachtung und um eine Zeitachse, wie sich die Typen mit der Zeit entwickeln.</p>
<p>Die Bartle-Typen sind weit verbreitet und stellen eine Art Standard im Bereich Massive Multiplayer Games (und damit auch PBBGs) dar. Der ursprüngliche Artikel ist definitiv empfehlenswert. Sein Buch sollte als Standardwerk über die Entwicklung virtueller Welten so wie so in jedem Regal von PBBG Designern / Entwicklern stehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/04/20/spieler-taxonomien-die-bartle-typen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kurzes Status-Update</title>
		<link>http://blog.zeitalter3.de/2010/04/10/kurzes-status-update/</link>
		<comments>http://blog.zeitalter3.de/2010/04/10/kurzes-status-update/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 22:07:03 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Zeitgeist-Framework]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[projekte]]></category>
		<category><![CDATA[Status]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=771</guid>
		<description><![CDATA[Ich habe lange nichts mehr geschrieben, also dachte ich, es wird Zeit für ein kurzes Status-Update.
Ein anderes Side-Project hat einen großen Teil meiner Zeit in Anspruch genommen. Es ist allerdings kurz vor der Veröffentlichung und ich habe es in 1-2 Wochen aus meinem Kopf
Ich bin von Aptana Studio auf Zend Studio umgestiegen. Aptana selbst entwickelt [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe lange nichts mehr geschrieben, also dachte ich, es wird Zeit für ein kurzes Status-Update.</p>
<p>Ein <a href="http://www.menschenwerk.net" target="_blank">anderes Side-Project</a> hat einen großen Teil meiner Zeit in Anspruch genommen. Es ist allerdings kurz vor der Veröffentlichung und ich habe es in 1-2 Wochen aus meinem Kopf</p>
<p>Ich bin von <a href="http://www.aptana.org/" target="_blank">Aptana Studio</a> auf <a href="http://www.zend.com/de/products/studio/" target="_blank">Zend Studio</a> umgestiegen. Aptana selbst entwickelt ihr PHP Plugin für Eclipse nicht weiter, sondern <a href="http://www.aptana.org/php" target="_blank">empfiehlt von nun an PDT</a>. In so fern dachte ich mir, kann ich auch gleich Zend verwenden. Aktuell nutze ich die 30 Tage Testversion und ich hoffe, ich kann mich damit anfreunden. Im Moment ist mein Eindruck <a href="http://twitter.com/DirkSonguer/status/11702181790" target="_blank">sehr</a> <a href="http://twitter.com/DirkSonguer/status/11703374201" target="_blank">gemischt</a> und ich befürchte ja schon, dass es wieder auf eine <a href="http://blog.zeitalter3.de/2008/04/23/eine-ide-fur-php/" target="_self">längere</a> <a href="http://blog.zeitalter3.de/2008/10/06/eine-ide-fur-php-2/" target="_self">Suche</a> hinauslaufen wird.</p>
<p>Für unser erstes Spiel auf Basis von <a href="http://code.google.com/p/zeitgeist-framework/" target="_blank">Zeitgeist</a> habe ich einen <a href="http://hudson-ci.org/" target="_blank">Hudson</a> aufgesetzt. Ein Deployment auf die Preview-Umgebung kostet also nicht mehr 2 Klicks (auf Batch-Skripte), sondern gar keinen mehr (der Hudson baut die Versionen, sobald sie ins SVN eingecheckt werden und rollt sie auf die Preview-Umgebung aus). Da ich mir das Gefummel mit <a href="https://techknowhow.library.emory.edu/blogs/rsutton/2009/07/24/using-hudson-php-simpletest" target="_blank">Hudson und SimpleTest</a> sparen will, bin ich gerade dabei die Unit Tests von <a href="http://code.google.com/p/zeitgeist-framework/source/browse/#svn/framework/branches/PHPUnit" target="_blank">Zeitgeist auf PHPUnit3</a> zu konvertieren. Zumindest dabei hilft Zend Studio ungemein.</p>
<p>Das Spiel-Projekt geht gut voran. Letzte Woche habe ich das Achievement-System und die Grundlagen der Statistik-Elemente hinzugefügt. Tut gut, wenn nach langer Pipeline-Arbeit alles ineinander passt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/04/10/kurzes-status-update/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Datenhaltung mit gamedata.class.php</title>
		<link>http://blog.zeitalter3.de/2010/02/16/datenhaltung-mit-gamedata-class-php/</link>
		<comments>http://blog.zeitalter3.de/2010/02/16/datenhaltung-mit-gamedata-class-php/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 17:49:34 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Zeitgeist-Framework]]></category>
		<category><![CDATA[Entity Systeme]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zeitgeist]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=740</guid>
		<description><![CDATA[In meinem Artikel über das Zeitgeist Gamesystem-Modul habe ich etwas mehr über die Klasse zur Datenhaltung (gamedata.class.php) geschrieben. Diese ist in Zeitgeist angelehnt an die Datenhaltung eines Entity-Systems. In den Kommentaren wurde mir von Gameplorer folgende Frage zu dem Prinzip gestellt:
Wie gut eignet sich das tatsächlich für Browsergames? Durch die component_data_N – Tabellen ist es ja nicht [...]]]></description>
			<content:encoded><![CDATA[<p>In meinem Artikel über das <a href="http://blog.zeitalter3.de/2010/02/13/das-gamesystem-modul" target="_blank">Zeitgeist Gamesystem-Modul</a> habe ich etwas mehr über die Klasse zur Datenhaltung (<a href="http://code.google.com/p/zeitgeist-framework/source/browse/framework/trunk/modules/gamesystem/gamedata.class.php" target="_blank">gamedata.class.php</a>) geschrieben. Diese ist in Zeitgeist angelehnt an die <a href="http://t-machine.org/index.php/2009/10/26/entity-systems-are-the-future-of-mmos-part-5/" target="_blank">Datenhaltung eines Entity-Systems</a>. In den Kommentaren wurde mir von <a href="http://www.gameplorer.de/" target="_blank">Gameplorer</a> folgende Frage zu dem Prinzip gestellt:</p>
<blockquote><p><em>Wie gut eignet sich das tatsächlich für Browsergames? Durch die component_data_N – Tabellen ist es ja nicht mehr möglich, effektiv mit Joins zu arbeiten. Dadurch muss ich aber pro Entity zig Queries absetzen (jede component_data – Tabelle) was auf die Performance schlägt. Für z.B. einen Kampf müssten dann auch noch mehrere Entities geladen werden. Das klingt für mich nach einem absoluten NoGo in einem Browsergame.<br />
Mir kam die Artikelreihe daher eher vor, als wäre ES für Clientbasierte-Spiele ausgelegt.</em></p></blockquote>
<p>Das ist eine gute Frage, da sie auf einem vebreiten Mißverständnis beruht wie Entity Systeme funktionieren. Es werden (wenn richtig implementiert) kaum Joins benötigt, da keine Notwendigkeit besteht die kompletten Entites zu laden (geschweige denn mehrere). Das Missverständnis beruht wohl auf dem Versuch sich Entity Systeme wie klassisch objektorientierte Systeme vorzustellen, in denen das System über die Objektklassen immer (mehr oder weniger direkten) Zugriff auf alle Daten des Objekts hat. Mir ging es nicht anders und ich brauchte einige Anläufe, um mich davon zu lösen.</p>
<p>Hier also mein Versuch zu erklären, wie ich Entity Systeme verstehe und wie sie in Zeitgeist implementiert wurden.</p>
<p><span id="more-740"></span></p>
<p><strong>Ein simples Weltraum-Spiel</strong></p>
<p>Da man anhand von Beispielen immer besser erklären kann, nehmen wir einmal ein einfaches Weltraum-Spiel mit folgenden Eigenschaften:</p>
<ul>
<li>Ein Spieler hat ein oder mehrere Raumschiffe</li>
<li>Es gibt 3 Raumschifftypen: leicht, mittel, schwer</li>
<li>Ein Raumschiff hat eine gewisse Panzerung, entsprechend den Typen: leicht, mittel und schwer (vergleichbar mit Lebenspunkten: wenig, mittel und viel)</li>
<li>Ein Raumschiff hat eine festgelegte Waffe, entsprechend den Typen: leicht, mittel und schwer (vergleichbar Angriffskraft: wenig, mittel und viel)</li>
<li>Ein Raumschiff fliegt durch das Universum</li>
<li>Ein Raumschiff kann gegen ein anderes Raumschiff kämpfen</li>
<li>Ein Raumschiff in Raumstationen fliegen, in denen es sich reparieren lassen kann</li>
<li>Angedockte Raumschiffe können nicht angegriffen werden</li>
</ul>
<p>Was würde für so ein Spiel also an Daten benötigt? Zunächst einmal die Raumschiff-Daten: Welcher Spieler besitzt welches Raumschiff? An welcher Position befindet sich das Raumschiff? Wie viel Waffenschaden und Panzerung hat es noch und so weiter. Dazu kommen noch die Daten für die Objekte im Raum: Raumstationen und deren Position.</p>
<p>Um die Unterschiede klar zu machen folgt nun eine beispielhafte objektorientierte und komponentenbasierte Umsetzung. Beide Varianten kann (und sollte) man sicherlich auch anders implementieren, aber dies soll nur als Veranschaulichung dienen.</p>
<p><strong>Objektorientierter Ansatz</strong></p>
<p>Der objektorientierte Ansatz sieht die Welt durch eine Ansammlung von Objektklassen, welche jeweils einen Typ von Gegenstand in der Welt repräsentieren. Deren Methoden sind die Aktionen, welche dieser Typ Gegenstand durchführen kann.</p>
<p>In unserem Beispiel gäbe es üblicherweise eine Objektklasse für Raumschiffe. Wie definiert hat ein Raumschiff einen Besitzer, eine Panzerung und Waffe, sowie eine Position im Raum. Außerdem kann es gerade fliegen oder an einer Raumstation angedockt sein. Daneben gäbe es wahrscheinlich eine Klasse für Raumstationen, die jedoch nichts weiter tun, als auf einer Position zu verharren.</p>
<p>Die Daten werden in Tabellen gespeichert, welche mehr oder minder den Objektstrukturen ähneln. In der Realität mag es mehr Streuung durch <a href="http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)" target="_blank">Normalisierung</a> geben, aber im Großen und Ganzen sähen die Tabellen für unser Beispiel so aus:</p>
<ul>
<li>Tabelle 1: Raumschiff (Besitzer, Panzerung, Waffenschaden, Position, Angedockt)</li>
<li>Tabelle 2: Raumstationen (Position)</li>
</ul>
<p>Spieler sind im Besitz eines Raumschiffs, sobald dieses in der Tabelle Raumschiff eingetragen ist.</p>
<p>Die eigentlichen Raumschiffe der Spieler und Raumstationen in der Spielwelt wären Instanzen ihrer entsprechenden Objektklassen. Das System initialisiert die Instanz eines spezifischen Raumschiffs mit den entsprechenden Daten aus der Tabelle.</p>
<p>Neben den Daten verfügt eine Objektklasse über Methoden, welche die Daten der jeweiligen Instanz (und damit des Raumschiffs bzw. der Raumstation) verändern. Als Beispiel für die Raumschiffklasse:</p>
<ul>
<li>Raumschiff.bewegen(x,y,z): verändert die Position des Raumschiffs</li>
<li>Raumschiff.angreifen(RaumschiffID): greift das Raumschiff mit der gegebenen ID an</li>
<li>Raumschiff.andocken(RaumstationID): dockt das Raumschiff an die Raumstation mit der gegebenen ID an</li>
<li>..</li>
</ul>
<p>So weit die kleine Wiederholung von <a href="http://de.wikipedia.org/wiki/Objektorientierte_Programmierung" target="_blank">objektorientierter Programmierung</a>.</p>
<p><strong>Komponentenbasierte Datenhaltung</strong></p>
<p>Der komponentenbasierte Ansatz sieht die Welt durch eine Sammlung von <em>Komponenten</em> und <em>Entitäten</em>. Zunächst einmal die Erklärung, was diese eigentlich sind:</p>
<ul>
<li>Eine Komponente beschreibt eine Eigenschaft, die ein Gegenstand haben kann</li>
<li>Eine Entität repräsentiert einen dedizierten Gegenstand in der Welt</li>
<li>Eine Entität besteht aus einer oder mehreren Komponenten</li>
</ul>
<p>An dem Beispiel können diese Definitionen vielleicht besser veranschaulicht werden. Mit folgenden Komponenten (Eigenschaften) können alle Gegenstände unserer fiktiven Spielwelt abgebildet werden (in Klammern steht jeweils der Wert, mit dem eine Eigenschaft bemessen werden kann):</p>
<ul>
<li>Komponente 1: Ein Gegenstand kann eine Waffe haben (Angriffsschaden)</li>
<li>Komponente 2: Ein Gegenstand kann gepanzert sein (Panzerungswert)</li>
<li>Komponente 3: Ein Gegenstand kann eine Position haben (x/y/z)</li>
<li>Komponente 4: Ein Gegenstand kann einen Besitzer haben (SpielerID)</li>
<li>Komponente 5: Ein Gegenstand kann beweglich sein (j/n)</li>
<li>Komponente 6: Ein Gegenstand kann angreifbar sein (j/n)</li>
<li>Komponente 7: Ein Gegenstand kann andere Gegenstände reparieren (j/n)</li>
</ul>
<p>Nehmen wir nun einmal irgendein Raumschiff. Dieses hätte folgende Komponenten: Waffe, Panzerung, Position, Besitzer, istBeweglich, istAngreifbar. Eine Raumstation hingegen hätte nur folgende Komponenten: Position, kannReparieren. Diese Typen von Entities sind <em>Assemblages </em>- eigentlich nur Sammlungen von Komponenten, die einen bestimmten Typ von Gegenstand ausmachen.</p>
<p>Der nächste Schritt ist leicht &#8211; jede Komponente bekommt eine Tabelle in der Datenbank. Dazu noch eine für die Entities, sowie eine Tabelle, um die Verbindung zwischen einer Entity und ihren Komponenten herzustellen:</p>
<ul>
<li>Tabelle 1: Entities(ID)</li>
<li>Tabelle 2: Entities_zu_Komponenten(Entity, Komponente)</li>
<li>Tabelle 3: Komponente 1 &#8211; Waffe (Angriffsschaden)</li>
<li>Tabelle 4: Komponente 2 &#8211; Panzerung (Panzerungswert)</li>
<li>Tabelle 5: Komponente 3 &#8211; Position (x/y/z)</li>
<li>Tabelle 6: Komponente 4 &#8211; Besitzer (Spieler_ID)</li>
<li>Tabelle 7: Komponente 5 &#8211; istBeweglich (j/n)</li>
<li>Tabelle 8: Komponente 6 &#8211; istAngreifbar (j/n)</li>
<li>Tabelle 8: Komponente 7 &#8211; kannReparieren (j/n)</li>
</ul>
<p>Die Assemblages würden so aussehen:</p>
<ul>
<li>Assemblage 1: Raumschiff (Waffe, Panzerung, Position, Besitzer, istBeweglich, istAngreifbar)</li>
<li>Assemblage 2: Raumstation (Position, kannReparieren)</li>
</ul>
<p>Damit wurden nur Daten beschrieben &#8211; nirgendwo steckt ein Stück Interaktion. Im Gegensatz zum objektorientierten Ansatz, bei dem die Interaktion in den Methoden der Gegenstände selbst steckt, ist eine Entität oder eine Komponente völlig losgelöst von Methoden oder überhaupt Code. Wo also kommt die Interaktivität her?</p>
<p><strong>Entity Systeme</strong></p>
<p>Die Interaktivität kommt von den sogenannten Systemen. Objektorientierung geht davon aus, dass eine Methode für eine Objektklasse sich von den Methoden anderer Objektklassen unterscheidet. Das Komponentenmodell geht im Gegensatz dazu davon aus, dass die Interaktion die auf eine Komponente einwirkt unabhängig vom Gegenstands immer gleich ist. Ein Beispiel wäre die Komponente &#8220;Position&#8221;. Es ist unerheblich welcher Gegenstand eine Position hat, das Prinzip &#8220;Bewegung&#8221; ist für alle Gegenstände gleich: die Position ändert sich. Damit hat sich der Gegenstand bewegt. Dies gilt für Raumschiffe ebenso wie für Rennautos, Flugzeuge oder Fußbälle.</p>
<p>Die Interaktion für Komponenten wird also in einzelnen, in sich abgeschlossenen Systemen gekapselt, die nur ihre jeweils relevante Komponente(n) bearbeiten. Alles andere interessiert sie nicht. Um einen Gegenstand zu bewegen ist es unerheblich wem er gehört oder wie er bewaffnet oder gepanzert ist. Das heißt nicht, dass diese Informationen in diesem Moment gänzlich unwichtig sind, aber dafür ist ein anderes System zuständig. Und deshalb laufen alle Systeme möglichst parallel.</p>
<p><strong>Auswirkung 1: Komponentensicht = Flexibilität</strong></p>
<p>In jedem Browsergame findet der Großteil der Entwicklung nach dem Launch statt. Bugfixing macht davon nur einen kleinen Teil aus. Früher oder später muss man am Balancing nachdrehen und in mehr oder weniger regelmäßigen Abständen wird es Erweiterungen geben: neue Einheiten, neue Regeln, neue Features, neue Dinge zu entdecken.</p>
<p>Nehmen wir unser Beispiel. Angenommen Spieler sollen auch Raumstationen besitzen können. Andere Spieler können diese natürlich zerstören. In einem objektorientierten Umfeld würde ich jetzt anfangen die Klasse der Raumstation zu erweitern. Bei einem Komponentensystem würde ich die Komponente &#8220;Besitzer&#8221; und &#8220;istAngreifbar&#8221; der Assemblage der Raumstation hinzufügen. Done. Keine Codeänderung nötig.</p>
<p>Oder fügen wir die Raumschiffklasse &#8220;Trägerschiff&#8221; hinzu. Es soll eine Art großes Raumschiff sein, das wie eine bewegliche Raumstation agiert und andere Raumschiffe daran andocken können. Also, ich erstelle eine neue Klasse dafür und fange an zu programmieren. Oder aber ich erstelle eine neue Assemblage und füge die entsprechenden Komponenten hinzu (was Datenbankeinträge sind!).</p>
<p>Und jetzt stellen wir uns einen einfachen Einheiten-Editor vor, der einfach nur Assemblages erstellen und mit Komponenten verknüpfen kann.</p>
<p>Wenn ich denn tatsächlich mal eine neue Eigenschaft brauche, muss ich natürlich das entsprechende System entwickeln. Allerdings steht die Eigenschaft damit automatisch auch allen anderen Assemblages zur Verfügung.</p>
<p>Zugegeben, mit Mehrfachvererbung oder Interfaces kann man auch in klassisch objektorientierten Umgebungen so eine Flexibilität versuchen, aber ich würde es nicht empfehlen. Früher oder später läuft alles auf massive Superklassen hinaus, die nicht mehr pflegbar sind.</p>
<p><strong>Auswirkung 2: Kleine Systeme = Wartbarkeit</strong></p>
<p>Wenn jedes System nur eine (oder wenige) Komponente(n) bearbeitet, sind diese per Definition relativ überschaubar. Anstatt über die Klassen verteilt habe ich auch nur an einem dedizierten Punkt meine Logik: in den Systeme selbst. Ich muss auch nicht in jeder Klasse immer wieder die gleiche oder ähnliche Logik unterbringen oder mich mit Vererbung und Interfaces herumschlagen, um den Code aus den Klassen herauszuhalten. Ich habe einen zentralen Punkt, an dem ein abgegrenztes Set von Daten geändert wird.</p>
<p>Durch diese Abgrenzung sind die Systeme außerdem großartig testbar.</p>
<p><strong>Auswirkung 3: Spezialisierte Systeme = Performance</strong></p>
<p>Nehmen wir als Beispiel an in der Queue des Eventhandlers liegen Events zur Bewegung von Schiffen. Es existiert ein System für &#8220;Bewegung&#8221;, dessen Aufgabe die Bearbeitung dieser Events ist. Es schaut also in der Event-Tabelle nach: was muss bewegt werden und wohin?</p>
<p>Klassisch objektorientiert wäre das &#8220;was&#8221; die ID eines Raumschiffs, aus dem dann die Raumschiff-Instanz erzeugt wird. Instinktiv mag man dem &#8220;was&#8221; in einem Entity System die ID der Entity zuweisen. In diesem Fall müsste das System jedoch erst einmal die Entity-ID finden, dann die Zwischentabelle befragen wo in der Komponententabelle &#8220;Position&#8221; denn der dazugehörige Eintrag liegt. Und da sind wir wieder bei der eigentlichen Frage von Gameplorer: &#8220;Sind diese Joins nicht unperformant?&#8221; Antwort: ja, aber warum sollte ich sie überhaupt machen? Wieso wird nicht einfach die ID des Komponenteneintrags als &#8220;was&#8221; genutzt? Sobald das passiert ist reduziert sich die Aufgabe des Systems auf einfache Updates.</p>
<p>Und noch besser: wer sagt, dass ein System in meiner Applikation leben muss? Letztendlich fragt es die Datenbank ab (Event-Tabelle), um mit den Ergebnissen eine andere Tabelle zu aktualisieren (Conponent_Data_Position). Das alles kann man bequem in einer Stored Procedure erledigen.</p>
<p><strong>Auswirkung 4: Parallele Systeme = Skalierung</strong></p>
<p>Angenommen ich habe alle Systeme ausgelagert. Weiter angenommen ich merke, dass ein System viele Ressourcen frisst, wohingegen andere recht genügsam sind. Was hintert mich daran das anspruchsvolle System einfach auf einen eigenen Server zu verlegen? Solange es Zugang zur Datenbank hat ist alles fein.</p>
<p><strong>Was jetzt noch bleibt</strong></p>
<p>Neben den Systemen bleibt noch der Logik-Server. Dies ist der Haupt-Gameserver, den die Clients ansprechen. Etwas muss ja auch dafür sorgen, dass sich Nutzer anmelden können, die Spielregeln implementiert sind und der Eventhandler befüllt wird. Dadurch dass aber alle Vorgänge innerhalb der Spielwelt nun losgelöst sind beschränkt sich dieser aber auch auf diese Aufgaben, wird deutlich schlanker und dadurch auch performanter.</p>
<p>So, der Artikel is jetzt lang genug. Ich hoffe ich habe euch meine Vorstellung von Entity Systemen etwas näher erklären können. Wie <a href="http://t-machine.org/index.php/2009/10/26/entity-systems-are-the-future-of-mmos-part-5/" target="_blank">schon erwähnt</a> gibt es viele Arten von Entity Systemen. Es würde mich freuen von euch zu hören, falls ihr eine Meinung zu dem Modell habt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/02/16/datenhaltung-mit-gamedata-class-php/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Das Gamesystem-Modul</title>
		<link>http://blog.zeitalter3.de/2010/02/13/das-gamesystem-modul/</link>
		<comments>http://blog.zeitalter3.de/2010/02/13/das-gamesystem-modul/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 10:22:46 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Zeitgeist-Framework]]></category>
		<category><![CDATA[Entity Systeme]]></category>
		<category><![CDATA[Gamestates]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zeitgeist]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=712</guid>
		<description><![CDATA[Zeitgeist hatte, obwohl als Framework für Spiele konzipiert, lange Zeit keine eigenen Funktionalitäten die speziell für Spiele ausgelegt sind. Wenn man genauer nachdenkt sind viele Anforderungen an ein PBBG genau die Selben wie für alle anderen Webanwendungen:

Verwaltung der Nutzer und deren Daten
Ein Eventhandler zur Ablaufsteuerung
Konfigurationsmanagement für die Applikation, Sprachen usw.
Sicherheit und Fehlerbehandlung

Doch welche Eigenschaften und [...]]]></description>
			<content:encoded><![CDATA[<p>Zeitgeist hatte, obwohl als Framework für Spiele konzipiert, lange Zeit keine eigenen Funktionalitäten die speziell für Spiele ausgelegt sind. Wenn man genauer nachdenkt sind viele Anforderungen an ein PBBG genau die Selben wie für alle anderen Webanwendungen:</p>
<ul>
<li>Verwaltung der Nutzer und deren Daten</li>
<li>Ein Eventhandler zur Ablaufsteuerung</li>
<li>Konfigurationsmanagement für die Applikation, Sprachen usw.</li>
<li>Sicherheit und Fehlerbehandlung</li>
</ul>
<p>Doch welche Eigenschaften und Funktionalitäten brauchen Spiele, die sich nicht aus einem allgemeinen Framework für Webapplikationen ergeben?</p>
<p><span id="more-712"></span></p>
<p><strong>Auf der Suche</strong></p>
<p>Am Anfang stand die Idee, dass Zeitgeist ein Framework speziell für Spiele sein sollte. Mit der Zeit wandelte es sich zu einem allgemeinen Framework für Webanwendungen und alle Abläufe für Spiele musste das Spiel selbst liefern. Nach 3 Spiele-Prototypen stellte ich jedoch fest, dass es Elemente gab, die in jedem Spiel vorkommen und somit genauso gut in ein generisches Modul für Spiele ausgelagert werden könnten.</p>
<p>Um zu bestimmen, was ein solches Spielsystem eigentlich können soll, muss man sich darüber im Klaren sein, was ein Spiel aus Sicht einer Applikation eigentlich ist. Ich habe lange hin und her gestrichen und kam schließlich auf folgende Definitionen:</p>
<ul>
<li>Jeder Benutzer mit einer Session ist ein potentieller Spieler</li>
<li>Jede Instanz der Applikation ist ein potentielles Spiel (<a href="http://www.raphkoster.com/2009/01/08/database-sharding-came-from-uo/" target="_blank">Sharding</a>)</li>
<li>Jedes Spiel hat Spieler</li>
<li>Jeder Spieler hat Metadaten, die seinen Zustand im Spiel beschreiben</li>
<li>Das Spiel an sich hat ebenfalls Metadaten, welche die Spielwelt definieren</li>
<li>Spieler agieren mit anderen Spielern und der Spielwelt durch das Spiel</li>
<li>Jede Interaktion mit dem Spiel wird durch eine Aktion abgebildet</li>
<li>Aktionen verändern die Metadaten der Spieler und der Spielwelt</li>
<li>Aktionen können sich unmittelbar oder zukünftig auswirken</li>
</ul>
<p>Das ergibt folgende Komponenten:</p>
<ul>
<li><strong>Aktionsverwaltung</strong>: Ein Eventhandler, der alle Aktionen verwaltet, die ein Spieler (oder Spiel) ausführen kann</li>
<li><strong>Datenhaltung</strong>: Ein System, welches alle Daten verwaltet, die einen Spieler oder die Spielwelt betreffen können</li>
</ul>
<p>Nun, auf den ersten Blick deckt sich die Aktionsverwaltung des Spiels mit der Ablaufsteuerung einer Webapplikation und die Datenhaltung ebenfalls. Brauchen wir wirklich alles nochmal, obwohl das Framework alles schon mitbringt?</p>
<p>Kurze Antwort: ja.</p>
<p><strong>Der Gamehandler</strong></p>
<p>Der Gamehandler besteht im Wesentlichen aus 2 Komponenten: einem Eventhandler, der hereinlaufende Aktionen verwaltet und einem Gamehandler, der die Aktionen auf die Logik mappt.</p>
<p>Eine Aktion des Eventhandlers hat folgende Parameter:</p>
<ul>
<li>Aktion: Eine ID für eine Aktion, die auf ein Stück Code gemapped werden kann</li>
<li>Parameter: Ein Parameter-Objekt, welches dem Aktionscode mitgegeben wird</li>
<li>Ausführungszeit: Der Zeitpunkt im Spiel, an dem die Aktion relevant wird</li>
<li>Spieler: Der Spieler, der die Aktion ausgeführt hat</li>
<li>Shard: Die ID des Shards, auf dem die Aktion ausgeführt wird</li>
<li>Zeitpunkt: Der Zeitpunkt, an dem die Aktion ausgeführt wurde</li>
</ul>
<p>Durch die Angabe des Shards wird ermöglicht, dass mehrere Spiele in einer Datenbank abgelegt werden können. Dies ist unabhängig davon, ob die Spiele selbst auf einem oder mehreren Servern laufen. In einem typischen Aufbau-Strategie-PBBG ist es meistens so, dass viele Mitspieler in einem Spiel (bzw. einer Spielwelt) agieren. Bei Spielen mit einer kleinen, abgegrenzten Anzahl von Spielern pro Spiel (Bsp. Tic Tac Toe) laufen viele Spiele gleichzeitig nebeneinander. Solange für jeden Spieler die ID seines eigenen Spiels mitgegeben wird, lassen sich die Daten sauber trennen.</p>
<p>Der Gamehandler mappt die vom Eventhandler aufgenommenen Aktionen auf Klassenobjekte. Jede Aktion steht also für eine externe Klasse, welche für die eigentliche Logik hinter der Aktion sorgt. Was dort dann genau passiert ist nicht mehr Sache des Gamehandlers. Er reicht nur alle relevanten Aktionen für einen gegebenen Zeitpunkt, einen gegebenen Spieler und ein gegebenen Shard weiter.</p>
<p>Alternativ zu dem Gamehandler kann natürlich auch ein permanent laufender Application Server eingesetzt werden, der andauernd die Eventliste abarbeitet.</p>
<p><strong>Datenhaltung</strong></p>
<p>Die Datenhaltung muss für alle Spiele und alle Spieltypen passen. In der Theorie müsste sie also die Daten eines typischen Aufbau-Strategie-PBBG genauso gut verwalten können, wie die einer Tic Tac Toe Plattform.</p>
<p>Das ist natürlich Unsinn. Eine spezialisierte Datenhaltung, die genau auf das Projekt zugeschnitten ist wird immer performanter, aber vor allem auch lesbarer sein, als eine generische. Aber: eine solche spezialisierte Datenhaltung zu entwickeln kostet Zeit. Bei einem Tic Tac Toe mag der Zeitaufwand sehr gering sein, aber man wird schnell an die Grenze stoßen, wo man überlegen muss, ob es sich tatsächlich lohnt sofort auf eine performante Datenhaltung zu optimieren, oder ob nicht erst einmal eine generische genügt.</p>
<p>Aber gibt es Datenstrukturen bzw. Ansätze, mit denen man so unterschiedliche Anforderungen abdecken kann? Antwort: ja, gibt es. Es ist nicht so, als hätte die Spieleindustrie nicht schon lange an dem Problem zu knabbern. Deren Antwort lautet: <a href="http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/" target="_blank">Entity Systeme</a>.</p>
<p>Die Gamedata-Klasse nimmt sich die <a href="http://t-machine.org/index.php/2009/10/26/entity-systems-are-the-future-of-mmos-part-5/" target="_blank">Datenhaltung eines Entity Systems</a> zum Vorbild und implementiert diese in PHP. Für Details und Erklärungen der Funktionsweise verweise ich auf den <a href="http://t-machine.org/index.php/2009/10/26/entity-systems-are-the-future-of-mmos-part-5/" target="_blank">Artikel</a>, der das so wie so viel besser erklärt, als ich hier in Kürze könnte.</p>
<p>Im Einzelfall muss aber jeder selbst entscheiden, ob er diese nutzt, oder ob es sinnvoller ist die Datenhaltung speziell für das Spiel zu entwickeln.</p>
<p><strong>In Aktion</strong></p>
<p>Die letzten beiden Versionen der Spiele-Prototypen wurden mit dem <a href="http://code.google.com/p/zeitgeist-framework/source/browse/#svn/framework/trunk/modules/gamesystem" target="_blank">neuen System</a> umgesetzt und ich bin ziemlich zufrieden. Ich werde mich bemühen in den kommenden Wochen ein kleines Spielchen damit (möglichst sauber) zu entwickeln und als Beispiel ins SVN aufzunehmen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/02/13/das-gamesystem-modul/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Zeitgeist-Update</title>
		<link>http://blog.zeitalter3.de/2010/02/09/zeitgeist-update/</link>
		<comments>http://blog.zeitalter3.de/2010/02/09/zeitgeist-update/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 15:56:05 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Zeitgeist-Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[projekte]]></category>
		<category><![CDATA[Zeitgeist]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=731</guid>
		<description><![CDATA[Die Arbeiten an der Dokumentation von Zeitgeist gehen weiter. Wichtiger jedoch: inzwischen gibt es einfache Downloads von den Beispielen inklusive des Frameworks, so dass ein Hin- und Herkopieren von Dateien (das auch nicht besonders gut beschrieben wurde bisher) entfällt.
Kurz: die Downloads runterladen, der Readme folgen, schon hat man funktionierende Zeitgeist-Beispiele.
]]></description>
			<content:encoded><![CDATA[<p>Die Arbeiten an der Dokumentation von Zeitgeist gehen weiter. Wichtiger jedoch: inzwischen gibt es einfache Downloads von den Beispielen inklusive des Frameworks, so dass ein Hin- und Herkopieren von Dateien (das auch nicht besonders gut beschrieben wurde bisher) entfällt.</p>
<p>Kurz: die <a href="http://code.google.com/p/zeitgeist-framework/downloads/list">Downloads</a> runterladen, der Readme folgen, schon hat man funktionierende Zeitgeist-Beispiele.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2010/02/09/zeitgeist-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
