<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - Hexaverse</title>
		<link>https://www.blitzforum.de/worklogs/411/</link>
		<description>Worklog von Xeres</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Sat, 27 Oct 2012 16:26:35 +0200</pubDate>
		<lastBuildDate>Sat, 27 Oct 2012 16:26:35 +0200</lastBuildDate>

		<item>
			<title>Schwierigkeitsgrade</title>
			<link>https://www.blitzforum.de/worklogs/411/#3606</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3606</guid>
			<author>Xeres</author>
			<description>Ein Thema, dass ich bei meinen Designideen noch nicht ausf&amp;uuml;hrlich erw&amp;auml;hnt habe, betrifft das Thema Schwierigkeit.&lt;br /&gt;Spiele, die eine Geschichte erz&amp;auml;hlen, brauchen Speicherst&amp;auml;nde – wenn man schon nicht &amp;uuml;berall speichern kann, dann in regelm&amp;auml;&amp;szlig;igen Abst&amp;auml;nden. Niemand w&amp;uuml;rde gerne Half Live wieder ganz von vorne Anfangen, weil man einen Sprung nicht geschafft hat.&lt;br /&gt;In Jump &amp;amp; Runs ist es okay einmal zu sterben – z.B. wenn man eine Plattform verfehlt – und dann wieder vom Anfang des Levels zu starten. Das ist genug Bestrafung f&amp;uuml;r den Spieler, damit er aufpasst, aber nicht so abschreckend, dass er es nicht noch mal versuchen w&amp;uuml;rde (nachdem er seine Fassung wiedergefunden hat).&lt;br /&gt;&lt;br /&gt;Das sind alles Spiele, die feste Level haben – sie wurden von Leveldesignern zusammen gebaut und sind f&amp;uuml;r jeden Spieler gleich. Wenn die Geschichte alternative Pfade hat, gibt es mehr Level oder Content f&amp;uuml;r jede Entscheidungsm&amp;ouml;glichkeit, die der Spieler treffen kann. Aber: Im Prinzip kann der Spieler mit genug Zeit das Spiel in jeder Variation durchspielen. Nat&amp;uuml;rlich soll der Spieler auch in den Genuss der Arbeitsleistung der Designer kommen und sollte sich nicht betrogen f&amp;uuml;hlen, weil er nicht alles im Spiel erreichen kann.&lt;br /&gt;&lt;br /&gt;Allerdings kommt die Freiheit zu speichern und laden zu einem Preis: Entscheidungen verlieren schnell an Gewicht. In Fallout 3 basiert der Erfolg von Hacking oder Gespr&amp;auml;chsoptionen auf Gl&amp;uuml;ck - und euren F&amp;auml;higkeiten. Wenn man aber so lange laden und nochmal versuchen kann wie man m&amp;ouml;chte – wo ist der Zwang, seine F&amp;auml;higkeiten hoch zu trainieren?&lt;br /&gt;Nat&amp;uuml;rlich braucht man sich nur daran zu halten, nur neu zu laden, wenn man gestorben ist… aber warum erlaubt das Spiel dann &amp;uuml;berhaupt etwas anderes? Das Spiel sollte die Regeln vorgeben, und dabei so restriktiv sein, keine einfachen Abk&amp;uuml;rzungen zu erlauben.&lt;br /&gt;&lt;br /&gt;In Prozedural generierten Spielen, gibt es kein Problem damit, wenn Spieler nie das letzte Level zu sehen bekommen. Es ist in jedem Fall ein anderes in jedem Spiel. Ziel ist es nicht mehr einfach nach einer beliebigen Zeit zum Ende zu kommen, sondern tats&amp;auml;chlich das Spiel zu meistern. &lt;br /&gt;Die Schwierigkeitsgrade f&amp;uuml;r Hexaverse werden vielleicht einmal so aussehen:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Normal&lt;/b&gt;&lt;br /&gt;- Permadeath&lt;br /&gt;- Das Spiel wird nur gespeichert, wenn man es beendet.&lt;br /&gt;- Wenn man stirbt, wird der Spieler mit erreichten Errungenschaften in einen Highscore eingetragen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Simple&lt;/b&gt;&lt;br /&gt;- Laden und Speichern von ~3 Spielst&amp;auml;nden wenn man sicher in einem Bewohnten System angedockt ist.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom&lt;/b&gt;&lt;br /&gt;- Laden und Speichern &amp;uuml;berall nach Belieben.&lt;br /&gt;- Man kann Dinge wie z.B. die St&amp;auml;rke von Gegnern in 5% Schritten nach eigenem ermessen einstellen.&lt;br /&gt;&lt;br /&gt;Das sollte Anf&amp;auml;ngern und Fortgeschrittenen Spielern die Chance geben, am Spiel gleicherma&amp;szlig;en Spa&amp;szlig; zu haben, wobei die Anf&amp;auml;nger encouragiert werden, das „richtige“ Spiel zu versuchen, indem es dort mehr Belohnungen f&amp;uuml;r ein beendetes Spiel gibt.</description>
			<pubDate>Sat, 27 Oct 2012 16:26:35 +0200</pubDate>
		</item>

		<item>
			<title>Alpha 0.4 - „Full Power“</title>
			<link>https://www.blitzforum.de/worklogs/411/#3548</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3548</guid>
			<author>Xeres</author>
			<description>Willkommen zur&amp;uuml;ck!&lt;br /&gt;Viele, kleine &amp;Auml;nderungen summieren sich irgendwann zu einem vorzeigbarem ganzen! Hoffe ich jedenfalls. Man sieht relativ wenig von den gro&amp;szlig;artigen Neuerungen. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Multiple Eigenschaften&lt;/b&gt;&lt;br /&gt;Planeten aus der Restmasse der Sonnen zu formen hat sich als nicht besonders schlau erwiesen – selbst ein tausendstell eines Prozents bildet mehr Gasriesen, als einem lieb sein kann. Erst den Abstand und daraus Strahlungsintensit&amp;auml;t der Sonne (= Temperatur) zu ermitteln und dar&amp;uuml;ber die Klasse zu bestimmen – auch keine tollen Ergebnisse. Immer gibt es zu viel oder zu wenig. Zudem fehlten Planeten noch wichtige Eigenschaften wie Atmosph&amp;auml;re und Ressourcen.&lt;br /&gt;Alles l&amp;auml;sst sich viel einfacher und geschickter l&amp;ouml;sen, wenn man alles in kleine Teilbereiche unterteilt und - genau wie bei der Sternenverteilung - dem Zufall die Arbeit &amp;uuml;berl&amp;auml;sst.&lt;br /&gt;Planetenklassen setzen sich nun also aus verschiedenen Wahrscheinlichkeiten f&amp;uuml;r Masse, Temperatur, Atmosph&amp;auml;re und Ressourcen zusammen. Davon abgeleitet wird das Leben auf dem Planeten bestimmt: Pluspunkte gibt es f&amp;uuml;r mittlere, Minuspunkte f&amp;uuml;r Extremwerte. &lt;br /&gt;Die gewichteten Wahrscheinlichkeiten (TProbability) werden in einem TDictionary nachgeschlagen und erhalten ihre festen Werte, die in einem TProperty Objekt festgehalten werden. Simpel, nicht? &lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img826.imageshack.us/img826/8183/hex04a.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Zivilisationen werden nun nicht mehr irgendwo gegr&amp;uuml;ndet, sondern da, wo intelligentes Leben entstanden ist!&lt;br /&gt;Die Population auf einem Planeten besitzt Eigenschaften wie Besiedlungsdichte und wirtschaftliche Ausrichtung um in Zukunft die Preise der richtigen Handelswaren zu ver&amp;auml;ndern.&lt;br /&gt;Die Zivilisation (das Volk) wird durch Bev&amp;ouml;lkerungswachstum und Regierungstyp genauer definiert. In Zukunft werden Zivilisationen w&amp;auml;hrend ihrer Entstehung - je nach gewaltbereitschaft - Kriege miteinander f&amp;uuml;hren, und ihre besiedlungsvorlieben variieren.&lt;br /&gt;&lt;br /&gt;Bis dahin kann man etwas Handel treiben, Planeten scannen und … ja, ich glaube das war’s.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img100.imageshack.us/img100/5519/hex04b.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Full Power!&lt;/b&gt;&lt;br /&gt;Aber dem Spieler stehen nun ein paar verschiedene Raumschiffe zur Verf&amp;uuml;gung, komplett mit brandneuen Ger&amp;auml;ten! Der Hyperantrieb muss mit einem Generator aufgeladen werden, welcher wiederrum Treibstoff verbraucht. Energie kann man auch in Speicherb&amp;auml;nken einspeisen (sp&amp;auml;ter mal auch f&amp;uuml;r Credits auf einem Planeten erwerben) bis man sie braucht.&lt;br /&gt;Der Unterlichtantrieb verbrennt ebenso Treibstoff, ben&amp;ouml;tigt oder verbraucht aber keine Energie – Elektro-Antriebe behalte ich aber im Hinterkopf.&lt;br /&gt;Ger&amp;auml;te ben&amp;ouml;tigen kein Klassen-Objekt mehr, ich erstelle einfach ein Objekt aus den XML-Daten und benutzte das als Template, die ich f&amp;uuml;r richtige Objekte kopiere. Die n&amp;ouml;tigen copy Methoden sind nicht all zu gro&amp;szlig; und es gibt weniger casting Gewusel.&lt;br /&gt;&lt;br /&gt;Die erzeugte und verbrauchte Energie wird schon relativ gut miteinander verrechnet, zur Not werden Ger&amp;auml;te abgeschaltet.&lt;br /&gt;Auch der Schritt zu Waffen und Schutzschilden ist nicht mehr zu weit – pew, pew in Space undsoweiter.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img841.imageshack.us/img841/604/hex04c.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Readme liegt nun in html Form vor und enth&amp;auml;lt ein paar Informationen zu den m&amp;ouml;glichen Eigenschaften von Objekten.&lt;br /&gt;Fliegt ein bisschen herum und entdeckt fremde Lebensformen und handelt, bis die Ressourcen eines Planten ersch&amp;ouml;pft sind.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;i&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2075178/HexaverseA0.4.zip&quot; target=&quot;_blank&quot;&gt;Download Hexaverse Alpha0.4 (~2 MB, Zip)&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;</description>
			<pubDate>Wed, 23 May 2012 18:42:19 +0200</pubDate>
		</item>

		<item>
			<title>Alpha 0.3 - „The Age of Empires“</title>
			<link>https://www.blitzforum.de/worklogs/411/#3482</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3482</guid>
			<author>Xeres</author>
			<description>&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img140.imageshack.us/img140/4889/logobm.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Git ist nicht nur toll, um verschiedene Versionen eines Projekts zu archivieren, auch beim Worklog schreiben kann ich einfach auf das Log zur&amp;uuml;ckgreifen. Ein paar Kleinigkeiten haben sich summiert:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Viele viele Objekte&lt;/span&gt;&lt;br /&gt;Positionen sind nun Objekte! Im Prinzip ist es eine Vektorklasse, die X und Y Koordinaten verwaltet. Es ist sauberer, als mit einzelnen Variablen zu hantieren insgesamt k&amp;uuml;rzer (auch wenn ab und an ein tempor&amp;auml;res Objekt gebraucht wird) und – ich m&amp;ouml;chte es nicht verschweigen – h&amp;uuml;bscher.&lt;br /&gt;Auch f&amp;uuml;r Farben gibt es einen TColor-Type, mit dem RGB und Alpha verwaltet werden – color.Use() anstatt hard gecodetes SetColor/SetAlpha. &lt;br /&gt;Die ganze Objektorientiertheit hat noch einen tieferen Sinn: Jedes Objekt besitzt eine Save/Load Methode, der man nur einen Stream zu reichen braucht, in den sie sich dann brav einspeichern bzw. auslesen. Galaxie und Spieler werden einfach hintereinander in eine Datei gegossen – falls der hintere Teil mit dem Spieler fehlt, wird ein neues Spiel gestartet ( =&amp;gt; neues Schiff an zuf&amp;auml;lliger Position).&lt;br /&gt;Die Rudiment&amp;auml;ren GUI-Objekte haben Zuwachs bekommen; nur damit mein sein Kreuzchen setzen kann, um der Galaxie beim entstehen zusehen zu k&amp;ouml;nnen. Was gibt es da zu sehen? Nun…&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;The Age of Empires&lt;/span&gt;&lt;br /&gt;Interne Umbauten sind sch&amp;ouml;n und gut, aber womit hat sich die Version ihren Titel verdient?&lt;br /&gt;Nachdem die Galaxie generiert wurde, werden ein paar Zivilisationskeime gestreut. &lt;br /&gt;Ein zuf&amp;auml;lliges System wird gew&amp;auml;hlt und daraus ein zuf&amp;auml;lliger Planet. Die Nachbarsysteme werden auf Planeten der Klasse des ersten Planeten abgesucht (wir Menschen halten ja auch nach m&amp;ouml;glichst erd&amp;auml;hnlichen Trabanten Ausschau) und die Zivilisation expandiert. Das wiederholt sich so lange, bis alle Zivilisationen genug Systeme besiedelt haben – und tadaa:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img826.imageshack.us/img826/2048/theageofempires.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 9px;&quot;&gt;Wessen Idee war es, ein System mit einem Schwarzen Loch zu besiedeln?!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sternenreiche!&lt;br /&gt;&lt;br /&gt;Die Planeten brauchen offensichtlich noch einen besseren Bildungsprozess, zuf&amp;auml;llige Wahl ist hier nicht angesagt. Ich stelle mir das so vor: Die Strahlungsintensit&amp;auml;t der Sonne nimmt mit 1/Abstand&amp;sup2; ab, die Masse der Planeten nimmt erst zu (die Sonne hat das meiste angezogen) und dann wieder ab - eine sch&amp;ouml;ne Glockenform. Mit dem Abstand der Sonne lie&amp;szlig;e sich also Temperatur &amp;amp; Masse bestimmen und die passende Planetenklasse setzten.&lt;br /&gt;Erd&amp;auml;hnliche Planeten, die um Schwarze L&amp;ouml;cher kreisen, wird es dann nicht mehr geben.&lt;br /&gt;&lt;br /&gt;Mit n-Halbleiters Tipp von letztem Mal l&amp;auml;uft auch die Verwaltung der Ausr&amp;uuml;stung ganz gut; jedes Device Objekt bekommt eine eindeutige ID zugewiesen, womit nur ein Cast durchgef&amp;uuml;hrt werden muss, um das richtige zu erhalten. Etwas Code zur Veranschaulichung (oder Verwirrung, je nach dem):&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Function Generate:TDevice(_DeviceName:String)&lt;br /&gt;	&lt;br /&gt;	Local ThisClass:TDevice_Class = TDevice_Class.GetDeviceClass(_DeviceName)&lt;br /&gt;	&lt;br /&gt;	Select ThisClass.TemplateID&lt;br /&gt;		Case HyperDriveTemplateID&lt;br /&gt;			Return TDevice_HyperDrive.Create(TDevice_HyperDrive_Class(ThisClass))&lt;br /&gt;		Case SubLightDriveTemplateID&lt;br /&gt;			Return TDevice_SubLightDrive.Create(TDevice_SubLightDrive_Class(ThisClass))&lt;br /&gt;	End Select&lt;br /&gt;	&lt;br /&gt;End Function[/syntax]&lt;br /&gt;&lt;br /&gt;Da die Ausr&amp;uuml;stungen zu verschieden sind, m&amp;uuml;ssen sie ansonsten sowieso als Spezialf&amp;auml;lle abgefragt werden, aber zum Speichern ist es so sehr h&amp;uuml;bsch.&lt;br /&gt;Anstatt &amp;uuml;berhaupt Device-Klassen zu verwenden, k&amp;ouml;nnte man Template-Objekte benutzen, die man Kopiert, um sie dann zu  benutzen – ich werde in dieser Richtung mal etwas herum probieren.&lt;br /&gt;&lt;br /&gt;In Zukunft gibt es noch viel zu tun:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Zivilisationen br&amp;auml;uchten etwas mehr Pers&amp;ouml;nlichkeit.&lt;br /&gt;&lt;li&gt;Populationen der Planeten/Systeme sollten dann auch etwas mehr k&amp;ouml;nnen, als nur da zu sein.&lt;br /&gt;&lt;li&gt;Unstrukturierte Organisationen wie z.B. Piraten sollten vll. auch bedacht werden.&lt;br /&gt;&lt;li&gt;Der Spieler k&amp;ouml;nnte so langsam ein Men&amp;uuml; vertragen, in welchem er sich Schiff / Ausr&amp;uuml;stung / Startposition aussuchen kann.&lt;br /&gt;&lt;li&gt;...aaaber daf&amp;uuml;r sollte es vielleicht mehr als ein Schiff und einen Ausr&amp;uuml;stungsgegenstand geben.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Bis dahin seid ihr mal wieder eingeladen, mit der aktuellen Version herum zu spielen:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;i&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2075178/HexaverseA0.3.zip&quot; target=&quot;_blank&quot;&gt;Download Hexaverse Alpha0.3 (~2 MB, Zip)&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es ist immer noch eine Alphaversion – man kann weder gewinnen, noch verlieren – h&amp;ouml;chstens der Treibstoff kann euch ausgehen...&lt;br /&gt;Wer interessiert ist oder einen Bug vermutet, m&amp;ouml;ge die debug.exe verwenden, sie schreibt euch ein paar kryptische Informationen auf. &lt;br /&gt;Und benutzt keinen Hexeditor um in ein Savefile zu gucken – es lohnt sich nicht.</description>
			<pubDate>Tue, 21 Feb 2012 16:50:40 +0100</pubDate>
		</item>

		<item>
			<title>Alpha 0.1 „Spielbar“</title>
			<link>https://www.blitzforum.de/worklogs/411/#3346</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3346</guid>
			<author>Xeres</author>
			<description>&lt;span style=&quot;font-size: 18px;&quot;&gt;Galaxien&lt;/span&gt;&lt;br /&gt;Es k&amp;ouml;nnen nun beliebige Galaxien erzeugt werden. Neben Name und Gr&amp;ouml;&amp;szlig;e l&amp;auml;sst sich auch der Zufallssamen angeben, mit dem zuk&amp;uuml;nftig eine Galaxie 1:1 dupliziert werden kann – eine Mechanik, die simpel genug um zu setzen ist, aber f&amp;uuml;r die Bug-Jagd und zum Sammeln &amp;amp; Tauschen wie gemacht ist. Eine simple Hash-Funktion bildet aus einem String den Samen, da sich W&amp;ouml;rter einfach besser merken lassen – Benutzerfreundlichkeit ist auch wichtig.&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Function HashSeed:Int(_str:String)&lt;br /&gt;	If Int(_str) = _str Then Return Int(_str) '* Reine Zahlen nicht als String verarbeiten!&lt;br /&gt;	Local h:Int&lt;br /&gt;	For Local j:Int = 0 Until _str.Length&lt;br /&gt;		h = 31 * h + _str[j]&lt;br /&gt;	Next&lt;br /&gt;	Return h&lt;br /&gt;End Function[/syntax]Nat&amp;uuml;rlich ist diese Funktion weit von Perfektion entfernt und es wird ein paar Kollisionen geben (sprich: mit zwei verschiedenen Strings kommt man auf den gleichen Zahlenwert), aber ein wirkliches Problem entsteht daraus ja nicht.&lt;br /&gt;&lt;br /&gt;Alles nur geklaut:&lt;br /&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Java_hashCode%28%29&quot; target=&quot;_blank&quot;&gt;WP: Java hashCode()&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://mojang.com/2011/02/23/a-short-demystification-of-the-map-seed/&quot; target=&quot;_blank&quot;&gt;MineCraft-Seed&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Handel&lt;/span&gt;&lt;br /&gt;Es gibt drei Handelswaren, mit denen man momentan mehr oder weniger etwas anfangen kann:&lt;br /&gt;Treibstoff, Mineralien und Abfall. Die Handelspreise werden mit dem Techlevel variiert. Planeten die nur eine kleine Bergbaukolonie beheimaten, haben ein geringes Techlevel – Mineralien sind billig zu kaufen &amp;amp; Abfall billig los zu werden. Ein technisch fortgeschrittener Planet wird Rohstoffe gerne ankaufen um sie weiter zu verarbeiten, und eine Welt die vom Tourismus lebt, wird den Abfall zu besten Konditionen abgeben.&lt;br /&gt;&lt;br /&gt;Diese Mechanik braucht noch etwas Ausarbeitung; Die Population eines Planeten geh&amp;ouml;rt noch keiner Zivilisationen an, und Zivilisationen (Sternenreiche) werden nicht generiert, aber dahin werden wir mal kommen. &lt;br /&gt;Momentan gibt es eine gewisse Chance, dass ein Planet Bev&amp;ouml;lkert ist, und Handel treibt. Mit M&amp;uuml;ll &amp;amp; Mineralien l&amp;auml;sst sich Geld f&amp;uuml;r Treibstoff verdienen… um mit mehr M&amp;uuml;ll &amp;amp; Mineralien zu handeln!&lt;br /&gt;Gespeichert wird das allerdings auch noch nicht, also steckt nicht zu viel Zeit da rein. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Ausr&amp;uuml;stung&lt;/span&gt;&lt;br /&gt;Da nun Treibstoff existiert, gibt es auch Antriebe, die welchen verbrauchen. Mit dem normalen Antrieb kann man von Planet zu Planet reisen, der Hyperantrieb bring einen zum n&amp;auml;chsten Stern. Die Lichtgeschwindigkeit liegt bei 20Feldern per Tick (oder Runde), und kann nicht mehr &amp;uuml;berschritten werden. Um einen Hypersprung aus zu f&amp;uuml;hren braucht man mindestens eine Geschwindigkeit von &amp;frac34; c (also 15 F/t).&lt;br /&gt;Das Funktioniert alles so weit, aber von der Codeseite her bin ich noch nicht sicher, ob das System so sinnig ist:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Obacht! Objektorientiertes Kauderwelsch!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ich benutze ein TDevice_Class von der ich z.B. ein TDevice_HyperDrive _Class ableite (Ist das &amp;uuml;berhaupt der richtige Sprachgebrauch? Ich hoffe doch.) und ein TDevice von der ich ein TDevice_HyperDrive ableite. Die _Class Objekte, speichern mir die in XML definierten Ger&amp;auml;te-Typen (z.B. die Maximale Reichweite), die anderen sind die „tats&amp;auml;chlichen“ Ger&amp;auml;te und enthalten ihre Klasse, sowie n&amp;ouml;tige Zusatzinfos (F&amp;uuml;llung des Tank und dergleichen).&lt;br /&gt;&lt;br /&gt;Einerseits ist das ziemlich logisch und praktisch, da sich alle Ger&amp;auml;te dieselben Grundlagen teilen, und das Ein- und Ausbauen einfach machen, andererseits komme ich an die zus&amp;auml;tzlichen Fields nur &amp;uuml;ber Getter-Methoden heran – und bei denen besteht BlitzMax darauf, dass sie auch f&amp;uuml;r die Basisklasse definiert sind. Also besitzt TDevice eine Methode &lt;i&gt;GetRange:Int()&lt;/i&gt; mit dem Inhalt &lt;i&gt;Return 0&lt;/i&gt; – und das soll ich f&amp;uuml;r jedes neue Feld machen?&lt;br /&gt;Au&amp;szlig;erdem brauche ich an irgendeiner Stelle sowieso extra-Abfragen, um dem Schiff den richtigen Antrieb in den Richtigen Slot zu schieben...&lt;br /&gt;&lt;br /&gt;Irgendwas mache ich hier bestimmt falsch – Objekt orientiert programmiere ich mehr oder minder so sporadisch wie ich es n&amp;uuml;tzlich finde. Hinweise &amp;amp; Ideen wie ihr (eure) Klassen &amp;amp; Objekte handhabt sind gern gesehen.&lt;br /&gt; &lt;br /&gt;&lt;i&gt;&lt;b&gt;Nachtrag:&lt;/b&gt;&lt;br /&gt;n-Halbleiter konnte mir einen guten Rat geben und ich sch&amp;auml;tze, das Problem ist gel&amp;ouml;st. Erkl&amp;auml;rungen folgen.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Download&lt;/span&gt;&lt;br /&gt;Genug f&amp;uuml;r dieses mal. Wie immer gibt es die neueste Version zum herum Testen:&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=10907&quot; target=&quot;_blank&quot;&gt;Download Hexaverse Alpha 0.1 Zip (~1,96 MB)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;</description>
			<pubDate>Fri, 09 Sep 2011 17:48:35 +0200</pubDate>
		</item>

		<item>
			<title>Zwischenziel erreicht</title>
			<link>https://www.blitzforum.de/worklogs/411/#3334</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3334</guid>
			<author>Xeres</author>
			<description>&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img140.imageshack.us/img140/4889/logobm.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sterne haben Planeten, man kann Fahrt aufnehmen und durch unbekannte Dimensionen in das n&amp;auml;chste System springen. Momentan alles noch ohne Geschwindigkeits- oder Reichweitenbegrenzung, da das Schiff weder auf Maschinen noch Treibstoff, sondern allein auf gutem Willen basiert.&lt;br /&gt;&lt;br /&gt;Testflug? Bittesehr:&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=10826&quot; target=&quot;_blank&quot;&gt;Download Hexaverse WIP Test 03 Zip (~1,3 MB)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tab&lt;/b&gt; wechselt von Galaxie- zu Systemansicht. Die Gr&amp;uuml;ne Markierung in der Galaxie ist das derzeitige System. Wenn ihr ein System anklickt, wird es dunkellila umrandet und ein Druck auf &lt;b&gt;J&lt;/b&gt;ump bringt euch direkt dorthin.&lt;br /&gt;Um in den Weiten des Alls nicht ganz verloren zu gehen, gibt es links unten eine Minimap die euch Sonnen &amp;amp; Planeten anzeigt.&lt;br /&gt;&lt;br /&gt;Der n&amp;auml;chste Schritt wird vermutlich Laderaum, Treibstoff &amp;amp; Handelswaren involvieren, um etwas mehr Spiel zu bieten und Grundstein f&amp;uuml;r Ausr&amp;uuml;stung und Ger&amp;auml;te zu legen.&lt;br /&gt;Au&amp;szlig;erdem h&amp;auml;tte ich gerne Asteroiden.&lt;br /&gt;&lt;br /&gt;Spieletipp des Tages: &lt;a href=&quot;http://www.neurohack.com/transcendence/&quot; target=&quot;_blank&quot;&gt;Transcendence&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Thu, 21 Jul 2011 19:59:47 +0200</pubDate>
		</item>

		<item>
			<title>Endlose Weiten</title>
			<link>https://www.blitzforum.de/worklogs/411/#3256</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3256</guid>
			<author>Xeres</author>
			<description>&lt;i&gt;Kleiner Nachtrag zur letzten Ausgabe: &lt;/i&gt;&lt;br /&gt;Ob ein Punkt (z.B. der Mauszeiger) innerhalb eines Sechsecks liegt, l&amp;auml;sst sich schon recht schnell mit der angegeben Methode herausfinden, aber es geht viel Simpler. Da ich ja ein ganzes Netz aus aneinander liegenden Sechsecken verwende, schlie&amp;szlig;e ich zuerst alle Tiles aus, die eine schnelle In-Rechteck-Pr&amp;uuml;fung nicht bestehen. Da bleiben nur maximal 3 M&amp;ouml;glichkeiten &amp;uuml;ber. Von diesen drei wird die Entfernung zum Tile-Mittelpunkt berechnet – und der kleinste Abstand ist das Sechseck, &amp;uuml;ber dem der Mauszeiger schwebt. Dank an BladeRunner f&amp;uuml;r den Hinweis &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Endlose Weiten&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tilemaps sind sch&amp;ouml;n und gut, aber wozu wurden und werden sie verwendet? Um mit wenigen Bildern m&amp;ouml;glichst schnell den Bildschirm voll zu zeichnen. Anders gesagt: man geht davon aus, es m&amp;uuml;sse etwas gezeichnet werden.&lt;br /&gt;Der Weltraum aber, ist gr&amp;ouml;&amp;szlig;tenteils leer.&lt;br /&gt;&lt;span style=&quot;font-size: 9px;&quot;&gt;Eigentlich ist auch Materie selbst zum gr&amp;ouml;&amp;szlig;ten Teil leer, aber diese Tatsache tritt schnell in den Hintergrund, wenn man sich den Zeh anst&amp;ouml;&amp;szlig;t.&lt;/span&gt;&lt;br /&gt;Bei der ersten WIP Demo habe ich also ein riesiges, leeres Array verwendet, was definitive Grenzen hatte. Um in den n&amp;auml;chsten Sektor zu schauen, m&amp;uuml;sste man die angrenzenden Arrays ebenfalls im Speicher halten. Das ist alles wenig Optimal und darum habe ich einen neuen Ansatz gewagt.&lt;br /&gt;Ich generiere kein Array, sondern unterteile den Bildschirm - rein mathematisch - in Hextiles. Der schwierige Part dabei ist, das Koordinatensystem so um zu formen, dass wir wieder eine verstauchte Tilemap erhalten. So gibt es Sechs eindeutig definierte Richtungen und man kann sich - egal ob gerade oder ungerade Zeile - h&amp;uuml;bsch linear in beliebige Entfernung bewegen. Die Array-zu-Pixel Umrechnung hat mich daf&amp;uuml;r eine schlaflose Nacht gekostet, aber hey, es sieht jetzt alles schon ganz h&amp;uuml;bsch aus.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img600.imageshack.us/img600/1935/wip02screen01.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 9px;&quot;&gt;Eigentlich sieht es fast genau so, wie bei der 1. WIP Demo aus – ich hoffe, man erkennt die innere Sch&amp;ouml;nheit?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Auch bei der Galaxie hat sich etwas getan: Es gibt eine. Noch fehlen den Sternen Planeten und noch befindet sich der Spieler nicht tats&amp;auml;chlich an einem definierten Ort in der Galaxie – aber das wird schon noch. &lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img218.imageshack.us/img218/5199/wip02screen02.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Und wer Lust und Zeit hat, darf sich das alles pers&amp;ouml;nlich anschauen:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=10559&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Download Hexaverse WIP Test 02 Zip (~2 MB)&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Zugegeben, wirklich neues Gameplay gibt es noch nicht ganz, aber man kann das Raumschiff nun mit der Maus steuern.&lt;br /&gt;Eine Galaxie wird automatisch beim ersten Start generiert – wenn ihr mit den Lua Skripten experimentieren wollt, die die Sternenverteilung und Benennung definieren, denk daran, das GALAXY File zu l&amp;ouml;schen, sonst seht ihr keine &amp;Auml;nderung.&lt;br /&gt;Die statistische Verteilung der Sterne findet ihr in dem XML File – denkt daran, dass es gekoppelte Werte sind, keine Prozentangaben. Massen und Temperaturen haben noch keinen Effekt.&lt;br /&gt;&lt;br /&gt;N&amp;auml;chste Stationen:&lt;br /&gt;-	Sterne mit Planeten best&amp;uuml;cken.&lt;br /&gt;-	Spieler  tats&amp;auml;chlich in der Galaxie platzieren.&lt;br /&gt;-	…was auch immer mir interessant erscheint.&lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Thu, 28 Apr 2011 00:23:57 +0200</pubDate>
		</item>

		<item>
			<title>Drinnen oder Draußen</title>
			<link>https://www.blitzforum.de/worklogs/411/#3242</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3242</guid>
			<author>Xeres</author>
			<description>Wie findet man heraus, ob der Mauscursor (oder ein beliebiger Punkt) in einem Sechseck ist, oder nicht?&lt;br /&gt;Wir kennen:&lt;br /&gt;- Den Mittelpunkt des Sechsecks&lt;br /&gt;- Die Gr&amp;ouml;&amp;szlig;e (L&amp;auml;nge, Breite) des Sechsecks&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Ist die Maus irgendwo in der N&amp;auml;he des Sechsecks?&lt;/b&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://imageshack.com/a/img810/7035/ms01a.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Ein Punkt in einem Rechteckigen Bereich zu finden, ist wirklich simpel und geht schnell; man spare sich die Aufw&amp;auml;ndigeren Schritte f&amp;uuml;r sp&amp;auml;ter auf.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;2) Ist die Maus in dem gro&amp;szlig;en Teil in der Mitte?&lt;/b&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img853.imageshack.us/img853/3511/ms02.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Noch ein gro&amp;szlig;er, eindeutiger Bereich...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3) Steckt sie in einem Dreieck?&lt;/b&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img94.imageshack.us/img94/5/ms03.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ah, der Interessante Teil: Wie gehen wir hier vor? Wenn man den Ansatz kennt, klingt es schon mal ganz einfach: Man &amp;uuml;berpr&amp;uuml;fe, ob die Fl&amp;auml;che des Dreiecks der urspr&amp;uuml;nglichen Punkte gleich der Fl&amp;auml;che der Dreiecke mit dem zu &amp;uuml;berpr&amp;uuml;fendem Punkt ist.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://imageshack.com/a/img820/338/ms04.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wir berechnen die Fl&amp;auml;che von 4 Dreiecken: Einmal das Dreieck, von dem wir wissen wollen, ob der Punkt darin ist (Gelb) und dann tauschen wir je ein Punkt von diesem Dreieck mit dem gesuchten Punkt aus, und addieren die Fl&amp;auml;chen zusammen. Liegt der Punkt nun au&amp;szlig;erhalb des Dreiecks…&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img854.imageshack.us/img854/6130/ms05.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;…sind die Fl&amp;auml;chen gr&amp;ouml;&amp;szlig;er, als sie sein d&amp;uuml;rften. &lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img94.imageshack.us/img94/6760/ms06.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die &amp;auml;u&amp;szlig;eren beiden Punkte der Dreiecke verschiebe ich um den Sicherheitsabstand von 1px nach innen – so wird verhindert, dass mehr als ein Feld markiert wird, wenn mehrere nebeneinander liegen.&lt;br /&gt;&lt;br /&gt;Das ergibt diesen Code (ja, ohne weiteres lauff&amp;auml;hig):&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;&lt;br /&gt;AppTitle = &amp;quot;Maus im Sechseck?&amp;quot;&lt;br /&gt; &lt;br /&gt;Global gfx_w:Int = 512, gfx_h:Int = 512&lt;br /&gt;Graphics(gfx_w, gfx_h)&lt;br /&gt;AutoMidHandle(True)&lt;br /&gt;SeedRnd(MilliSecs())&lt;br /&gt;Local FrameTimer:TTimer = TTimer.Create(60)&lt;br /&gt;&lt;br /&gt;Global mx:Int, my:Int&lt;br /&gt;&lt;br /&gt;SetClsColor(255, 255, 255)&lt;br /&gt;&lt;br /&gt;Repeat&lt;br /&gt;	Cls&lt;br /&gt;	&lt;br /&gt;	mx = MouseX()&lt;br /&gt;	my = MouseY()&lt;br /&gt;	&lt;br /&gt;	If PointInHex(gfx_w *.5, gfx_h *.5, mx, my, 196) Then&lt;br /&gt;		SetColor(0, 0, 200)&lt;br /&gt;	Else&lt;br /&gt;		SetColor(0, 200, 0)&lt;br /&gt;	EndIf&lt;br /&gt;	&lt;br /&gt;	DrawHex(gfx_w *.5, gfx_h *.5, 196)&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	Flip(0)&lt;br /&gt;	FrameTimer.Wait()&lt;br /&gt;Until KeyHit(KEY_ESCAPE) Or AppTerminate()&lt;br /&gt;End&lt;br /&gt;&lt;br /&gt;Function DrawHex(_x:Float, _y:Float, _size:Float)&lt;br /&gt;	DrawPoly([_x, _y - _size / 2,  ..&lt;br /&gt;			_x + _size / 2, _y - _size / 4,  ..&lt;br /&gt;			_x + _size / 2, _y + _size / 4,  ..&lt;br /&gt;			_x, _y + _size / 2,  ..&lt;br /&gt;			_x - _size / 2, _y + _size / 4,  ..&lt;br /&gt;			_x - _size / 2, _y - _size / 4])&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Function PointInHex:Int(X:Int, Y:Int, px:Int, py:Int, Size:Int)&lt;br /&gt;	Rem&lt;br /&gt;		X und Y sind Mittelpunkt des Hexfelds&lt;br /&gt;		Das Hexfeld ist Size breit und Size hoch&lt;br /&gt;	endrem&lt;br /&gt;	&lt;br /&gt;	Local Size2:Int = Size / 2&lt;br /&gt;	Local Size4:Int = Size / 4&lt;br /&gt;	&lt;br /&gt;	'* 1px Sicherheitsabstand, damit nicht mehr als 1 Feld markiert wird:&lt;br /&gt;	Local SD:Int = 1&lt;br /&gt;	&lt;br /&gt;	'* Schneller Check: Im Gebiet?&lt;br /&gt;	If px &amp;lt;= (X - Size2) And px &amp;gt;= (X + Size2) Then&lt;br /&gt;		If py &amp;lt;= (Y - Size2) And py &amp;gt;= (Y + Size2) Then&lt;br /&gt;			'* Au&amp;szlig;erhalb des Size x Size Quadrates&lt;br /&gt;			Return False&lt;br /&gt;		EndIf&lt;br /&gt;	EndIf&lt;br /&gt;	&lt;br /&gt;	'* Mittelquader:&lt;br /&gt;	If px &amp;gt;= (X - Size2 + SD) And px &amp;lt;= (X + Size2 - SD) Then&lt;br /&gt;		If py &amp;gt;= (Y - Size4 + SD) And py &amp;lt;= (Y + Size4 - SD) Then&lt;br /&gt;			Return True&lt;br /&gt;		EndIf&lt;br /&gt;	EndIf&lt;br /&gt;&lt;br /&gt;	'* Oben Rechts:	&lt;br /&gt;	If PointInTriangle(X, Y - Size4 + SD, X, Y - Size2 + SD, X + Size2 - SD, Y - Size4 + SD, px, py) Then Return True&lt;br /&gt;	'* Oben Links:	&lt;br /&gt;	If PointInTriangle(X, Y - Size4 + SD, X, Y - Size2 + SD, X - Size2 + SD, Y - Size4 + SD, px, py) Then Return True&lt;br /&gt;	'* Unten Rechts:	&lt;br /&gt;	If PointInTriangle(X, Y + Size4 - SD, X, Y + Size2 - SD, X + Size2 - SD, Y + Size4 - SD, px, py) Then Return True&lt;br /&gt;	'* Unten Links:	&lt;br /&gt;	If PointInTriangle(X, Y + Size4 - SD, X, Y + Size2 - SD, X - Size2 + SD, Y + Size4 - SD, px, py) Then Return True&lt;br /&gt;	&lt;br /&gt;	Function PointInTriangle:Int(x1:Float, y1:Float, x2:Float, y2:Float, x3:Float, y3:Float, px:Float, py:Float)&lt;br /&gt;		Local A1:Float = TriangleArea(px, py, x2, y2, x3, y3)&lt;br /&gt;		Local A2:Float = TriangleArea(px, py, x1, y1, x3, y3)&lt;br /&gt;		Local A3:Float = TriangleArea(px, py, x1, y1, x2, y2)&lt;br /&gt;		Local AT:Float = TriangleArea(x1, y1, x2, y2, x3, y3)&lt;br /&gt;		If ((A1 + A2 + A3) &amp;gt; AT) Then&lt;br /&gt;			Return False&lt;br /&gt;		else&lt;br /&gt;			Return True&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		Function TriangleArea:Float(x1:Float, y1:Float, x2:Float, y2:Float, x3:Float, y3:Float)&lt;br /&gt;			Local a:Float = (x1 - x3)&lt;br /&gt;			Local b:Float = (y1 - y3)&lt;br /&gt;			Local c:Float = (x2 - x3)&lt;br /&gt;			Local d:Float = (y2 - y3)&lt;br /&gt;			Return (0.5 * Abs ((a * d) - (b * c)))&lt;br /&gt;		End Function&lt;br /&gt;&lt;br /&gt;	End Function&lt;br /&gt;	&lt;br /&gt;End Function[/syntax]&lt;br /&gt;&lt;br /&gt;Schlimmstenfalls berechnet man mit dieser Methode 4x4=16 Dreiecksfl&amp;auml;chen. Das lie&amp;szlig;e sich optimieren, indem man das Vergleichsdreieck zuerst berechnet und schon jede weitere Fl&amp;auml;che damit vergleicht. Wenn der Punkt weit entfernt liegt, &amp;uuml;bersteigt schon eine Fl&amp;auml;che das Soll und weitere Fl&amp;auml;chen m&amp;uuml;ssen nicht mehr berechnet werden.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.director-online.com/buildArticle.php?id=1088&quot; target=&quot;_blank&quot;&gt;Quelle&lt;/a&gt; - Danke Will Turnage!&lt;br /&gt;</description>
			<pubDate>Wed, 13 Apr 2011 18:41:55 +0200</pubDate>
		</item>

		<item>
			<title>Outsourcing zum Mond</title>
			<link>https://www.blitzforum.de/worklogs/411/#3061</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3061</guid>
			<author>Xeres</author>
			<description>BlitzMax hat so viele schicke Dinge eingebaut, man wird relativ schnell mal abgelenkt. Mit BRL.MaxLua lassen sich leicht Lua Skripte einbinden. Damit kann man Funktionen auslagern um z.B. Berechnungen variabel zu halten.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lua – ein paar interessante Punkte:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Basiert auf C&lt;br /&gt;&lt;li&gt;Case Sensitiv&lt;br /&gt;&lt;li&gt;Variablen haben keinen direkten Typ – nur deren Werte&lt;br /&gt;&lt;li&gt;Zahlen und Zeichenketten werden automatisch ineinander umgewandelt wenn n&amp;ouml;tig&lt;br /&gt;&lt;li&gt;Multiple Zuweisungen sind m&amp;ouml;glich:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox0&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('0')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox0&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('0')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox0&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('0');&quot;&gt;x, y, z = 5, 10, 15&lt;/div&gt;&lt;br /&gt;&lt;li&gt;Multiple R&amp;uuml;ckgabewerte sind m&amp;ouml;glich:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox1&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('1')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox1&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('1')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox1&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('1');&quot;&gt;x, y, z = EineFunktion&amp;#40;&amp;#41;&lt;/div&gt;&lt;br /&gt;&lt;li&gt;Gerechnet wird mit Flie&amp;szlig;kommazahlen (Doubles)&lt;br /&gt;&lt;li&gt;Lua hat seinen eigenen Garbage Collector&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Also so wirklich beeindruckt bin jetzt ja noch nicht…&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Okay, kleines Beispiel: Lagern wir eine Rechnung aus. &lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img602.imageshack.us/img602/2205/vscreen.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;AppTitle = &amp;quot;Punktverteilung&amp;quot;&lt;br /&gt;Rem&lt;br /&gt;    Dieses Beispiel lagert eine Rechnung f&amp;uuml;r eine Punktverteilung aus.&lt;br /&gt;Endrem&lt;br /&gt;&lt;br /&gt;Local Lua_class:TLuaClass = TLuaClass.Create(LoadString(&amp;quot;Verteilung.lua&amp;quot;))&lt;br /&gt;Local Lua_instance:TLuaObject = TLuaObject.Create(Lua_class, Null)&lt;br /&gt;&lt;br /&gt;Local Size:Int = 512, Methode:String = &amp;quot;A&amp;quot;&lt;br /&gt;Local time:Int = MilliSecs()&lt;br /&gt;&lt;br /&gt;Print(&amp;quot;Lua Start~n&amp;quot;)&lt;br /&gt;Local LuaPoints:String = String(Lua_instance.Invoke(&amp;quot;Verteilung&amp;quot;, [String(Size), Methode]))&lt;br /&gt;Print(&amp;quot;~n&amp;quot;)&lt;br /&gt;Print(&amp;quot;Lua End (&amp;quot; + (MilliSecs() - time) + &amp;quot; ms)&amp;quot;)&lt;br /&gt;'Print(&amp;quot;D: &amp;quot; + LuaPoints)&lt;br /&gt;Local Koords:String[] = LuaPoints.Split(&amp;quot;;&amp;quot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Graphics(Size, Size)&lt;br /&gt;&lt;br /&gt;    For Local i:Int = 0 Until Koords.Length&lt;br /&gt;        Local Points:String[] = Koords&lt;i&gt;.Split(&amp;quot;,&amp;quot;)&lt;br /&gt;        DrawOval((Size / 2) + Int(Points[0]), (Size / 2) + Int(Points[1]), 4, 4)&lt;br /&gt;    Next&lt;br /&gt;&lt;br /&gt;Flip&lt;br /&gt;WaitKey()&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;b&gt;Lua &lt;/b&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox2&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('2')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox2&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('2')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox2&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('2');&quot;&gt;--&amp;#91;&amp;#91;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dieses Beispiel lagert eine Rechnung f&amp;uuml;r eine Punktverteilung aus.&lt;br /&gt;&amp;#93;&amp;#93;&lt;br /&gt;&lt;br /&gt;function Verteilung&amp;#40;size, m&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Zufallssamen aus aktueller Zeit&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; math.randomseed&amp;#40; os.time&amp;#40;&amp;#41; &amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Neuer Table mit 2 Dimensionen &amp;#40;f&amp;uuml;r x und y&amp;#41;.&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- in der Form &amp;#123;&amp;lt;nr&amp;gt;, &amp;lt;x/y&amp;gt;&amp;#125;&lt;br /&gt;&amp;nbsp; &amp;nbsp; local t = &amp;#123;&amp;#125;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --&amp;#91;&amp;#91;&lt;br /&gt;&amp;nbsp; &amp;nbsp; t&amp;#91;0&amp;#93; = &amp;#123;&amp;#125;&lt;br /&gt;&amp;nbsp; &amp;nbsp; table.insert&amp;#40;t&amp;#91;0&amp;#93;, 1, &amp;quot;X&amp;quot;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; table.insert&amp;#40;t&amp;#91;0&amp;#93;, 2, &amp;quot;Y&amp;quot;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;#93;&amp;#93;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; for i=0, 512 do&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- Zuf&amp;auml;lliger Winkel, gleich in Rad umrechnen&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; local w = math.random&amp;#40;0, 359&amp;#41; * &amp;#40;math.pi/180&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- Zuf&amp;auml;lliger Radius&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; local r = math.random&amp;#40;0, &amp;#40;size/2&amp;#41;&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t&amp;#91;i&amp;#93; = &amp;#123;&amp;#125; -- Table-Eintrag i selbst zu einem Table machen.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- M&amp;ouml;glichkeit A&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if string.upper&amp;#40;m&amp;#41; == &amp;quot;A&amp;quot; then&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table.insert&amp;#40;t&amp;#91;i&amp;#93;, 1, math.cos&amp;#40;w&amp;#41;*r&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table.insert&amp;#40;t&amp;#91;i&amp;#93;, 2, math.sin&amp;#40;w&amp;#41;*r&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- M&amp;ouml;glichkeit B&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elseif string.upper&amp;#40;m&amp;#41; == &amp;quot;B&amp;quot; then&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table.insert&amp;#40;t&amp;#91;i&amp;#93;, 1, math.random&amp;#40;-&amp;#40;size/2&amp;#41;, &amp;#40;size/2&amp;#41;&amp;#41;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table.insert&amp;#40;t&amp;#91;i&amp;#93;, 2, math.random&amp;#40;-&amp;#40;size/2&amp;#41;, &amp;#40;size/2&amp;#41;&amp;#41;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; end&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; end&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- &amp;quot;2D Array&amp;quot; zur&amp;uuml;ckgeben&lt;br /&gt;&amp;nbsp; &amp;nbsp; local re=&amp;quot;&amp;quot; -- Als String festlegen f&amp;uuml;r '..' Operator&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; for i in pairs&amp;#40;t&amp;#41; do&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; re = re..table.concat&amp;#40;t&amp;#91;i&amp;#93;, &amp;quot;,&amp;quot;&amp;#41;..&amp;quot;;&amp;quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; end&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Letztes &amp;quot;;&amp;quot; wieder abschneiden.&lt;br /&gt;&amp;nbsp; &amp;nbsp; re = string.sub&amp;#40;re, 0, string.len&amp;#40;re&amp;#41;-1&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return re&lt;br /&gt;end&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;[i]Mh, nicht ganz unpraktisch – zugegeben – aber wenn Lua nichts mit meinen Objekten anfangen kann…&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Oh, Lua &lt;b&gt;kann&lt;/b&gt; – man muss sie nur miteinander vertraut machen.&lt;br /&gt;Hier kann man das gr&amp;uuml;ne Quadrat mit der Maus bewegen und wird von drei roten Punkten verfolgt – die Bewegung wird per Lua gesteuert.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img502.imageshack.us/img502/9822/oscreen.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;AppTitle = &amp;quot;Lua AI&amp;quot;&lt;br /&gt;Rem&lt;br /&gt;    Anstatt einen Interpreter zu bauen, wird Lua Benutzt&lt;br /&gt;Endrem&lt;br /&gt;&lt;br /&gt;Global Lua_class:TLuaClass = TLuaClass.Create(LoadString(&amp;quot;LuaAI.lua&amp;quot;))&lt;br /&gt;&lt;br /&gt;Global gfx_w:Int = 512, gfx_h:Int = 512&lt;br /&gt;Local FrameTimer:TTimer = TTimer.Create(60)&lt;br /&gt;Graphics(gfx_w, gfx_h)&lt;br /&gt;&lt;br /&gt;Type TGameObjekt Abstract&lt;br /&gt;    Field X:Float, Y:Float&lt;br /&gt;    Global list:TList = New TList&lt;br /&gt;    &lt;br /&gt;    Method New()&lt;br /&gt;        list.AddLast(Self)&lt;br /&gt;    End Method&lt;br /&gt;    &lt;br /&gt;    Method Update() Abstract&lt;br /&gt;    &lt;br /&gt;    Function UpdateAll()&lt;br /&gt;        For Local o:TGameObjekt = EachIn list&lt;br /&gt;            o.Update()&lt;br /&gt;        Next&lt;br /&gt;    End Function&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;Type TPlayer Extends TGameObjekt&lt;br /&gt;&lt;br /&gt;    Function Create()&lt;br /&gt;        Local p:TPlayer = New TPlayer&lt;br /&gt;        p.X = gfx_w / 2&lt;br /&gt;        p.Y = gfx_h / 2&lt;br /&gt;        LuaRegisterObject(p, &amp;quot;Player&amp;quot;)&lt;br /&gt;    End Function&lt;br /&gt;    &lt;br /&gt;    Method Update()&lt;br /&gt;        Local mx:Int = MouseX(), my:Int = MouseY()&lt;br /&gt;        &lt;br /&gt;        Local vx:Float = mx - Self.X&lt;br /&gt;        Local vy:Float = my - Self.Y&lt;br /&gt;        Local vz:Float = Sqr(vx * vx + vy * vy)&lt;br /&gt;&lt;br /&gt;        vx = (vx / Abs(vz))&lt;br /&gt;        vy = (vy / Abs(vz))&lt;br /&gt;&lt;br /&gt;        If vz &amp;gt;.1 Then&lt;br /&gt;            Self.X:+vx * vz / 64&lt;br /&gt;            Self.Y:+vy * vz / 64&lt;br /&gt;        EndIf&lt;br /&gt;        &lt;br /&gt;        SetColor(0, 255, 0)&lt;br /&gt;        DrawRect(Self.X - 4, Self.Y - 4, 8, 8)&lt;br /&gt;        &lt;br /&gt;    End Method&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;Type TEnemy Extends TGameObjekt&lt;br /&gt;    Field x:Int, y:Int&lt;br /&gt;    Field Lua_ins:TLuaObject&lt;br /&gt;    &lt;br /&gt;    Function Create()&lt;br /&gt;        Local e:TEnemy = New TEnemy&lt;br /&gt;        e.X = Rand(0, gfx_w)&lt;br /&gt;        e.Y = Rand(0, gfx_h)&lt;br /&gt;        e.Lua_ins = TLuaObject.Create(Lua_class, Null)&lt;br /&gt;    End Function&lt;br /&gt;    &lt;br /&gt;    Method Update()&lt;br /&gt;        LuaRegisterObject(Self, &amp;quot;Enemy&amp;quot;)&lt;br /&gt;        Self.Lua_ins.Invoke(&amp;quot;DoAI&amp;quot;, Null)&lt;br /&gt;        &lt;br /&gt;        SetColor(255, 0, 0)&lt;br /&gt;        DrawOval(Self.X - 4, Self.Y - 4, 8, 8)&lt;br /&gt;    End Method&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;TPlayer.Create()&lt;br /&gt;TEnemy.Create()&lt;br /&gt;TEnemy.Create()&lt;br /&gt;TEnemy.Create()&lt;br /&gt;&lt;br /&gt;Repeat&lt;br /&gt;    Cls&lt;br /&gt;    &lt;br /&gt;    TGameObjekt.UpdateAll()&lt;br /&gt;    &lt;br /&gt;    Flip(0)&lt;br /&gt;    FrameTimer.Wait()&lt;br /&gt;Until KeyHit(KEY_ESCAPE) Or AppTerminate()&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;b&gt;Lua &lt;/b&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox3&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('3')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox3&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('3')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox3&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('3');&quot;&gt;--&amp;#91;&amp;#91;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Lua AI&lt;br /&gt;&amp;#93;&amp;#93;&lt;br /&gt;&lt;br /&gt;function DoAI&amp;#40;&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Vektor generieren&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; local vx = Player.x - Enemy.x&lt;br /&gt;&amp;nbsp; &amp;nbsp; local vy = Player.y - Enemy.y&lt;br /&gt;&amp;nbsp; &amp;nbsp; local vz = math.sqrt&amp;#40;vx^2 + vy^2&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Bewegen&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Enemy.x = Enemy.x + &amp;#40;vx / vz&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Enemy.y = Enemy.y + &amp;#40;vy / vz&amp;#41;&lt;br /&gt;&lt;br /&gt;end&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Auch sch&amp;ouml;n, aber vollkommen &amp;uuml;berzeugt bin ich nicht. Sieht nicht so aus, als h&amp;auml;tte Lua BlitzMax wirklich was voraus.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Wie w&amp;auml;re es denn hiermit:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Local funktion:String = &amp;quot;1/4 * x^3 + 1/2 * x^2 + x + cos(pi)&amp;quot;[/syntax]&lt;br /&gt;Wie k&amp;ouml;nnte man den die Funktionswerte f&amp;uuml;r beliebige X in BMax Berechnen?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Uhm… Um den Ausdruck zu Parsen k&amp;ouml;nnte man ihn in Token zerlegen. Rechenregeln f&amp;uuml;r Potenz vor Punkt vor Strich, Funktionen… nicht ganz simpel, aber nicht unm&amp;ouml;glich.&lt;/i&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10px;&quot;&gt;&lt;b&gt;Siehe auch:&lt;/b&gt;&lt;/span&gt; Noobodys Matheparser &lt;a href=&quot;https://www.blitzforum.de/forum/viewtopic.php?t=32053&quot; target=&quot;_blank&quot;&gt;BMax Archiv&lt;/a&gt;, &lt;a href=&quot;https://www.blitzforum.de/forum/viewtopic.php?t=29867&quot; target=&quot;_blank&quot;&gt;BB Archiv&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In Lua l&amp;auml;sst man den String als Lua Code ausf&amp;uuml;hren. Yeah, nimm &lt;b&gt;das&lt;/b&gt;, Logik!&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;AppTitle = &amp;quot;Lua Rechnet&amp;quot;&lt;br /&gt;Rem&lt;br /&gt;    Anstatt einen Interpreter zu bauen, wird Lua Benutzt&lt;br /&gt;Endrem&lt;br /&gt;&lt;br /&gt;Local Lua_class:TLuaClass = TLuaClass.Create(LoadString(&amp;quot;Rechnung.lua&amp;quot;))&lt;br /&gt;Local Lua_instance:TLuaObject = TLuaObject.Create(Lua_class, Null)&lt;br /&gt;&lt;br /&gt;Local funktion:String = &amp;quot;1/4 * x^3 + 1/2 * x^2 + x + cos(pi)&amp;quot;&lt;br /&gt;Local X:Int = 2&lt;br /&gt;Local time:Int = MilliSecs()&lt;br /&gt;&lt;br /&gt;Print(&amp;quot;Lua Start&amp;quot;)&lt;br /&gt;Local LuaErgebnis:String = String(Lua_instance.Invoke(&amp;quot;Rechnung&amp;quot;, [String(funktion), String(X)]))&lt;br /&gt;Print(&amp;quot;Lua End (&amp;quot; + (MilliSecs() - time) + &amp;quot; ms)&amp;quot;)&lt;br /&gt;Print(&amp;quot;Funktion: &amp;quot; + funktion)&lt;br /&gt;Print(&amp;quot;mit x=&amp;quot; + X)&lt;br /&gt;Print(&amp;quot;= &amp;quot; + LuaErgebnis)&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;b&gt;Lua &lt;/b&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox4&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('4')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox4&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('4')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox4&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('4');&quot;&gt;--&amp;#91;&amp;#91;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Luaskript um einen Funktion zu berechnen.&lt;br /&gt;&amp;#93;&amp;#93;&lt;br /&gt;&lt;br /&gt;function Rechnung&amp;#40;funk, v&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; io.write&amp;#40;&amp;quot;Lua hier &amp;#58;-&amp;#41; \n&amp;quot;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- X Einsetzen &amp;#40;ja, das bekommt BM auch hin - wartet ab!&amp;#41;&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; funk = string.gsub&amp;#40;funk, &amp;quot;x&amp;quot;, v&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Funktionen ggf. f&amp;uuml;r Lua ersetzen&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Obacht&amp;#58; BM Grad &amp;lt;-&amp;gt; Lua Rad&lt;br /&gt;&amp;nbsp; &amp;nbsp; funk = string.gsub&amp;#40;funk, &amp;quot;cos&amp;quot;, &amp;quot;math.cos&amp;quot;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; funk = string.gsub&amp;#40;funk, &amp;quot;sin&amp;quot;, &amp;quot;math.sin&amp;quot;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; funk = string.gsub&amp;#40;funk, &amp;quot;tan&amp;quot;, &amp;quot;math.tan&amp;quot;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp; funk = string.gsub&amp;#40;funk, &amp;quot;pi&amp;quot;, &amp;quot;math.pi&amp;quot;&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --&amp;#91;&amp;#91; Ausdruck berechnen&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Die Funktion &amp;quot;loadstring&amp;quot; l&amp;auml;sst uns Lua Code laden,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jetzt nur noch ein &amp;quot;return&amp;quot; anf&amp;uuml;gen, damit auch was zur&amp;uuml;ck gegeben wird...&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;#93;&amp;#93;&lt;br /&gt;&amp;nbsp; &amp;nbsp; funk = &amp;quot;return &amp;quot;..funk&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -- Und den geladenen 'Code' als Funktion ausf&amp;uuml;hren...&lt;br /&gt;&amp;nbsp; &amp;nbsp; return loadstring&amp;#40;funk&amp;#41;&amp;#40;&amp;#41;&lt;br /&gt;&lt;br /&gt;end&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Output:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox5&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('5')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox5&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('5')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox5&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('5');&quot;&gt;Lua Start&lt;br /&gt;Lua hier &amp;#58;-&amp;#41; &lt;br /&gt;Lua End &amp;#40;5 ms&amp;#41;&lt;br /&gt;Funktion&amp;#58; 1/4 * x^3 + 1/2 * x^2 + x + cos&amp;#40;pi&amp;#41;&lt;br /&gt;mit x=2&lt;br /&gt;= 5&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Wenn das mal nicht cool ist! Hat ein bisschen was davon, sich an den eigenen Haaren aus dem Sumpf zu ziehen. Wenn man kein Externes Skript benutzen m&amp;ouml;chte, kann man das Lua Progr&amp;auml;mmchen auch im BMax Quellcode in einen String packen (siehe Doku).&lt;br /&gt;&lt;br /&gt;Wo war ich doch gleich…? Uh, eine Galaxie mit Sternen bef&amp;uuml;llen genau! &lt;br /&gt;&lt;br /&gt;Dum-di-dum-di-dum…&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10px;&quot;&gt;&lt;b&gt;Siehe auch:&lt;/b&gt;&lt;/span&gt; &lt;a href=&quot;http://www.lua.org/home.html&quot; target=&quot;_blank&quot;&gt;Lua.org&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Fri, 10 Dec 2010 08:30:02 +0100</pubDate>
		</item>

		<item>
			<title>Unwahrscheinlicher Zufall</title>
			<link>https://www.blitzforum.de/worklogs/411/#3028</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3028</guid>
			<author>Xeres</author>
			<description>Zufall ist eine feine Sache, um den Spielablauf etwas unvorhersehbar zu machen. Das Problem dabei: Was Standardm&amp;auml;&amp;szlig;ig geboten wird, ist kaum mehr als ein beliebig gro&amp;szlig;er Eimer mit fairen W&amp;uuml;rfeln beliebiger Seitenzahl. Alle Zahlen werden in etwa gleich oft gezogen.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img507.imageshack.us/img507/9206/random1.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;&lt;br /&gt;AppTitle = &amp;quot;Ein Eimer W&amp;uuml;rfel&amp;quot;&lt;br /&gt;&lt;br /&gt;Global gfx_w:Int = 256, gfx_h:Int = 256&lt;br /&gt;Graphics(gfx_w, gfx_h)&lt;br /&gt;SeedRnd(MilliSecs())&lt;br /&gt;SetClsColor(255, 255, 255)&lt;br /&gt;&lt;br /&gt;Local DiceCount:Int = 100 '* Anzahl der W&amp;uuml;rfel&lt;br /&gt;Local DiceResult:Int[6]     '* Wie oft kam die Augenzahl?&lt;br /&gt;&lt;br /&gt;'* Den W&amp;uuml;rfeleimer Auskippen und ausz&amp;auml;hlen:&lt;br /&gt;For Local i:Int = 0 Until DiceCount&lt;br /&gt;    DiceResult[Rand(0, 5)]:+1&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;'* Diagramm auftragen:&lt;br /&gt;Cls&lt;br /&gt;For Local i:Int = 0 Until DiceResult.length&lt;br /&gt;    If i Mod 2 = 0 Then&lt;br /&gt;        SetColor(128, 64, 64)&lt;br /&gt;    Else&lt;br /&gt;        SetColor(64, 128, 64)&lt;br /&gt;    EndIf&lt;br /&gt;    DrawRect(i * 32, gfx_h, 32, -DiceResult[i] * 8)&lt;br /&gt;    &lt;br /&gt;    SetColor(0, 0, 0)&lt;br /&gt;    DrawText(i + 1, 12 + i * 32, 8)    '* Augenzahl&lt;br /&gt;    DrawText(DiceResult[i], 12 + i * 32, gfx_h - 16) '* H&amp;auml;ufigkeit&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;Flip()&lt;br /&gt;WaitKey()&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;F&amp;uuml;r die F&amp;auml;lle, in denen man einen einzelnen Wert ben&amp;ouml;tigt ist das gut und sch&amp;ouml;n – aber was, wenn ich nicht einzelne, sondern verkn&amp;uuml;pfte Werte haben m&amp;ouml;chte? Beispielsweise „6 aus 49“: Man darf hier keine Zahl doppelt ziehen d&amp;uuml;rfen. Man k&amp;ouml;nnte nun W&amp;uuml;rfeln, die Zahl aufschreiben und wenn die n&amp;auml;chste Zahl schon gezogen wurde, nochmal w&amp;uuml;rfeln.&lt;br /&gt;Wenn man tats&amp;auml;chlich nur ein paar wenige Zahlen aus einer ganzen Menge braucht, kann das gut gehen. F&amp;uuml;r den Fall, dass man eine Liste an Zahlen un-sortieren m&amp;ouml;chte (also so lange weitermacht, bis alle Zahlen einmal gezogen wurden), k&amp;ouml;nnte das aber eine (unvorhersehbar lange) Weile dauern. Wir kehren den Ansatz etwas um:&lt;br /&gt;Wir haben eine Liste an Zahlen und nehmen zuf&amp;auml;llig eine heraus – bei jeder weiteren Ziehung ist die Zahl schon nicht mehr da und man muss sich keine weiteren Gedanken machen.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img686.imageshack.us/img686/2216/random2v.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;&lt;br /&gt;AppTitle = &amp;quot;6 aus 49&amp;quot;&lt;br /&gt;&lt;br /&gt;Global gfx_w:Int = 256, gfx_h:Int = 256&lt;br /&gt;Graphics(gfx_w, gfx_h)&lt;br /&gt;SeedRnd(MilliSecs())&lt;br /&gt;SetClsColor(255, 255, 255)&lt;br /&gt;&lt;br /&gt;Local AllNumbers:Int[49] '* Platz f&amp;uuml;r alle Verf&amp;uuml;gbaren Zahlen&lt;br /&gt;'* Zahlen eintragen:&lt;br /&gt;For Local i:Int = 0 Until AllNumbers.length&lt;br /&gt;    AllNumbers[i] = i + 1&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;Local Numbers:String[6] '* Platz f&amp;uuml;r die Sechs Zahlen, die herausgezogen werden&lt;br /&gt;&lt;br /&gt;'* Zahlen ziehen:&lt;br /&gt;For Local i:Int = 0 Until Numbers.length&lt;br /&gt;    Numbers[i] = GetRandomFromArray(AllNumbers)&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;'* Zahlen ausgeben:&lt;br /&gt;Cls&lt;br /&gt;SetColor(0, 0, 0)&lt;br /&gt;DrawText(&amp;quot;Ziehung: &amp;quot;, 8, 16)&lt;br /&gt;DrawText(&amp;quot; - &amp;quot;.join(Numbers), 8, 32)&lt;br /&gt;DrawText(&amp;quot;Restliche Zahlen (49-6): &amp;quot; + AllNumbers.length, 8, 64)&lt;br /&gt;&lt;br /&gt;Flip()&lt;br /&gt;WaitKey()&lt;br /&gt;End&lt;br /&gt;&lt;br /&gt;Function GetRandomFromArray:Int(_N:Int[] Var)&lt;br /&gt;    Local rp:Int = Rand(0, _N.length - 1) '* Eine Zuf&amp;auml;llige Position des Arrays w&amp;auml;hlen&lt;br /&gt;    Local rn:Int = _N[rp] '* Die Zahl an dieser Position ermitteln&lt;br /&gt;    _N = _N[..rp] + _N[(rp + 1)..] '* Die Zahl aus dem Array &amp;quot;ausschneiden&amp;quot;    (Slices)&lt;br /&gt;    Return rn&lt;br /&gt;End Function[/syntax]&lt;br /&gt;&lt;br /&gt;Ganz toll, aber: Wer sagt eigentlich, dass ich einen &lt;b&gt;fairen&lt;/b&gt; W&amp;uuml;rfel will? Ob ich zwei gleiche Sternentypen hintereinander generiere ist mir eigentlich schnurz – viel wichtiger w&amp;auml;re mir, zu steuern, wie die Prozentuale Wahrscheinlichkeit ist. &lt;br /&gt;Denkt an PowerUps oder auch Gegenst&amp;auml;nde: Man m&amp;ouml;chte doch haupts&amp;auml;chlich die schw&amp;auml;cheren PowerUps / Wertlosen Schund f&amp;uuml;r den Spieler generieren. Wenn man von den ersten Monstern 3 mal das „Schwert der ultimativen Vernichtung“ bekommt, weil es dieselbe Dropchance hat, wie die „Looserkappe die dich gar nicht sch&amp;uuml;tzt“...&lt;br /&gt;Hier benutzen wir zur Hilfe 2 Arrays: Einmal eine Liste mit den zur Auswahl stehenden Objekten und eine Liste, die die Gewichtung enth&amp;auml;lt.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img703.imageshack.us/img703/2365/random3.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;&lt;br /&gt;AppTitle = &amp;quot;Gewichtete Wahrscheinlichkeit&amp;quot;&lt;br /&gt; &lt;br /&gt;Global gfx_w:Int = 256, gfx_h:Int = 256&lt;br /&gt;Graphics(gfx_w, gfx_h)&lt;br /&gt;SeedRnd(MilliSecs())&lt;br /&gt;SetClsColor(255, 255, 255)&lt;br /&gt;&lt;br /&gt;Local Item:String[] = [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;Local ItemWeight:Int[] = [15, 10, 5]&lt;br /&gt;Local weightMax:Int&lt;br /&gt;For Local i:Int = EachIn ItemWeight&lt;br /&gt;    weightMax:+i&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;'* Statistische Verteilung:&lt;br /&gt;Local Zufall:Int[3], Maxcount:Int = 1000&lt;br /&gt;For Local i:Int = 0 Until Maxcount&lt;br /&gt;    Select String(GetWeightedRandom(Item, ItemWeight))&lt;br /&gt;        Case &amp;quot;A&amp;quot;; Zufall[0]:+1&lt;br /&gt;        Case &amp;quot;B&amp;quot;; Zufall[1]:+1&lt;br /&gt;        Case &amp;quot;C&amp;quot;; Zufall[2]:+1&lt;br /&gt;    End Select&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;'* Darstellen:&lt;br /&gt;Cls&lt;br /&gt;SetColor(0, 0, 0)&lt;br /&gt;DrawText(&amp;quot;Ein Objekt: &amp;quot; + String(GetWeightedRandom(Item, ItemWeight)), 8, 16)&lt;br /&gt;DrawText(&amp;quot;Statistische Verteilung:&amp;quot;, 8, 32)&lt;br /&gt;&lt;br /&gt;For Local i:Int = 0 Until 3&lt;br /&gt;    DrawText(Item[i] + &amp;quot;: &amp;quot; + Zufall[i] + &amp;quot; - &amp;quot; + Int(Zufall[i] * 100.0 / Maxcount) + &amp;quot;% (&amp;quot; + Int((ItemWeight[i] * 100.0) / weightMax) + &amp;quot;%)&amp;quot;, 8, 64 + i * 12)&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;Flip()&lt;br /&gt;WaitKey()&lt;br /&gt;End&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Function GetWeightedRandom:Object(_obj:Object[], _weight:Int[])&lt;br /&gt;    Local weightMax:Int, r:Int, Z:Int&lt;br /&gt;    '* Gesammt Gewicht bestimmen:&lt;br /&gt;    For Local i:Int = EachIn _weight&lt;br /&gt;        weightMax:+i&lt;br /&gt;    Next&lt;br /&gt;&lt;br /&gt;    '* Einen zuf&amp;auml;lligen Wert erzeugen&lt;br /&gt;    r = Rand(0, weightMax)&lt;br /&gt;    For Z = 0 Until _weight.length - 1&lt;br /&gt;        '* Ein Objekt mit einer H&amp;ouml;heren Gewichtung wird &amp;ouml;fters ausgegeben&lt;br /&gt;        If _weight[Z] &amp;gt; r Then Return _obj[Z]&lt;br /&gt;        r = r - _weight[Z]&lt;br /&gt;    Next &lt;br /&gt;    Return _obj[Z]&lt;br /&gt;End Function[/syntax]&lt;br /&gt;&lt;br /&gt;Es gibt nat&amp;uuml;rlich wieder kleinere Abweichungen von den Idealwerten, aber das Prinzip funktioniert. &lt;br /&gt;Jetzt kann ich eine Galaxie statistisch korrekt - n&amp;auml;herungsweise - bev&amp;ouml;lkern. Da die gro&amp;szlig;en, hellen O-Klasse Sterne sehr schnell ihren Wasserstoff verbrennen, gibt es sie sehr viel seltener (1 von 10 Millionen) als z.B. die M-Klassen Sterne am anderen Ende der Hauptreihe (1 von 8 Sternen). &lt;br /&gt;F&amp;uuml;r Hexaverse werde ich vielleicht nochmal etwas an der Verteilung drehen – zumal die Statistik mit Vorsicht zu genie&amp;szlig;en ist. Unsere n&amp;auml;here Umgebung ist (nat&amp;uuml;rlicher Weise) besser erforscht und muss nicht zwangsl&amp;auml;ufig Beispielhaft f&amp;uuml;r die gesamte Galaxie (oder gar andere Galaxien) sein.&lt;br /&gt;</description>
			<pubDate>Fri, 19 Nov 2010 21:01:10 +0100</pubDate>
		</item>

		<item>
			<title>Von den Gesetzen der Natur</title>
			<link>https://www.blitzforum.de/worklogs/411/#3019</link>
			<guid>https://www.blitzforum.de/worklogs/411/#3019</guid>
			<author>Xeres</author>
			<description>Mittlerweile gibt es einen h&amp;uuml;bschen Sektor, den man mit einem Raumschiff abfliegen kann. Noch gibt es keine Maussteuerung, dass sollte noch Zeit haben – Tastatursteuerung reicht vorerst aus. Wer ein bisschen herumspielen will ist herzlich eingeladen.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img687.imageshack.us/img687/5727/screenowb.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Steuerung:&lt;/b&gt;&lt;br /&gt;In Richtung Beschleunigen: &lt;b&gt;U, I, H, K, N, M&lt;/b&gt; (&lt;i&gt;F1 ingame sollte das klarer machen&lt;/i&gt;)&lt;br /&gt;Nicht beschleunigen: &lt;b&gt;J&lt;/b&gt;&lt;br /&gt;Zuf&amp;auml;lliger Sprung in der n&amp;auml;heren Umgebung: &lt;b&gt;R&lt;/b&gt;&lt;br /&gt;Auf der Karte herumscrollen: &lt;b&gt;Pfeiltasten&lt;/b&gt; (+&lt;b&gt;Shift&lt;/b&gt;)&lt;br /&gt;Kamera auf den Planeten zentrieren: &lt;b&gt;Enter&lt;/b&gt;&lt;br /&gt;Kamera auf das Schiff zentrieren: &lt;b&gt;Backspace&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=9801&quot; target=&quot;_blank&quot;&gt;Download Hexaverse WIP Test 01 (675,5 KB)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;F&amp;uuml;r die Steuerung hatte ich eine „reale“ Variante geplant – Ein Raumschiff kann bis zu einer Maximalgeschwindigkeit (Lichtgeschwindigkeit) beschleunigt werden (momentan kein Tempolimit – daf&amp;uuml;r kann man den Sektor auch nicht verlassen…), und beh&amp;auml;lt seine Geschwindigkeit bis man abbremst – das Beste von Newton &amp;amp; Einstein (nein, Zeitdilatation wird es nicht geben)!&lt;br /&gt;Die Trennung von „Beschleunigung“ und „Gravitation“ sorgt vielleicht f&amp;uuml;r eine gewisse Irritation, hat aber folgende Bewandtnis: Gravitation ist nicht zwangsl&amp;auml;ufig eine notwendige Kraft (spieltechnisch gesehen). Wenn es die meisten Spieler zu sehr aus der Bahn wirft, kann man auch darauf verzichten.&lt;br /&gt;Man k&amp;ouml;nnte das Spiel auch in Stopp-Motion spielen: Das Schiff wird – je nach Triebwerksleistung – um ein paar Felder versetzt, nimmt aber kein Momentum auf und bleibt nach dem Zug wieder komplett stehen. Das ist nat&amp;uuml;rlich unrealistisch, kann die Steuerung aber auch wesentlich vereinfachen. &lt;i&gt;Welche Variante w&amp;uuml;rde euch am meisten Spa&amp;szlig; bringen?&lt;/i&gt;&lt;br /&gt;Ihr m&amp;uuml;sst euch jetzt noch nicht endg&amp;uuml;ltig festlegen &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Um die Strecken zwischen Sonnensystemen zur&amp;uuml;ck zu legen, braucht es – wie immer im Sci-Fi-Genre – einen kleinen Trick. Da die Lichtgeschwindigkeit eine Fundamentale Konstante darstellt, weicht man auf Dimensionen aus, in denen es keine bzw. eine angenehmere Reisegeschwindigkeit gibt, oder man Faltet die Raumzeit in bisschen zusammen.&lt;br /&gt;Anstatt Sprungtore (X Universum / EVE Online) zu verwenden, die Station&amp;auml;r herumh&amp;auml;ngen, wird jedes Schiff - ganz nach Elite - mit einem Hypersprungantrieb ausgestattet. Schlie&amp;szlig;lich soll man die Galaxie auf eigene Faust erkunden k&amp;ouml;nnen.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img214.imageshack.us/img214/4615/misjump.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10px;&quot;&gt;Ohja: und zwischen den Sternen stranden kann man dann auch… Irgendwer wird schon einen Anhalter mitnehmen.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bevor ein anderes Sonnensystem angesteuert werden kann, brauchen wir erst einmal eines! Nachdem die Funktionen f&amp;uuml;r das Karten-handling einigerma&amp;szlig;en stehen, kann ich mich darum k&amp;uuml;mmern, eine Galaxie zu erzeugen. Ich stelle mir das so vor: Ich erstelle ein Hex-Array und f&amp;uuml;lle es Balkenf&amp;ouml;rmig auf, dann werden einzelne Ringe um das Zentrum der Galaxie gedreht – und Schwupps, eine Spirale mit mehr oder weniger gro&amp;szlig;em Balken. Nat&amp;uuml;rlich lie&amp;szlig;e sich auch eine Archimedische Spirale oder einfach eine radiale Wahrscheinlichkeitsverteilung realisieren.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img691.imageshack.us/img691/8982/verteilungen.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die wichtigsten Spektralklassen werden vertreten sein, auch wenn ich stark &amp;uuml;berlege, lieber ein eigenes (logischeres / leicht zu merkendes) Kategorisierungssystem zu verwenden (offenbar benutzen Astronomen furchtbar gerne komische Merks&amp;auml;tze). &lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://img825.imageshack.us/img825/8480/obafgkm.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10px;&quot;&gt;&lt;a href=&quot;http://de.wikipedia.org/wiki/Spektralklasse&quot; target=&quot;_blank&quot;&gt;Spektralklasse (WP)&lt;/a&gt;, &lt;a href=&quot;http://www.youtube.com/watch?v=R6_dZhE-4bk&quot; target=&quot;_blank&quot;&gt;Klassifikation von Sternen (eng. YT)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Wie wichtig ist euch die korrekte Klassifizierung von Sternen im Spiel?&lt;/i&gt; Planeten haben noch kein offizielles Kategorisierungssystem (und die offizielle Definition, was ein Planet &amp;uuml;berhaupt ist, ist etwas… &lt;a href=&quot;http://de.wikipedia.org/wiki/Planet#Die_neue_Definition&quot; target=&quot;_blank&quot;&gt;strittig&lt;/a&gt;), da m&amp;uuml;sste ich also sowieso etwas erfinderisch werden.&lt;br /&gt;Jeder Stern erh&amp;auml;lt erst einmal 0 bis 3 Planeten (Doppel-, Mehrfachsternensysteme und Monde sind f&amp;uuml;r diese Entwicklungsstufe noch ausgeschlossen) – und mehr erfordert das Zwischenziel aus dem letzten Eintrag nicht wirklich.</description>
			<pubDate>Fri, 12 Nov 2010 21:54:09 +0100</pubDate>
		</item>


	</channel>
</rss>
