Timemill

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Timemill

Beitrag von bruZard » 4. Jun 2006, 17:00

Aus Gründen die jeder verstehen wird der das Projekt seit den Jahren seit seiner Initiierung verfolgt hat, setze ich das Label "digitaldecoy" (welches nun eh nicht mehr aktuell ist) nicht ein und verzichte auch darauf das Projekt an die "digitalartforum-community" zu hängen.
Wenn ich soweit bin dass es etwas für Grafiker zu tun gibt kann man ja nochmal darüber reden ob im Jahre 2075 soetwas noch interessant ist, aber atm ist der Stand einfach noch nicht so, als das es etwas wirklich spannendes zu tun oder berichten gäbe.

In den letzten Monaten habe ich stark den Rotstift beansprucht und viele Zeitfresser aus dem Programm gestrichen:
  • LUA wurde auf die rote Liste gesetzt, wenn es mal etwas zu scripten gibt kann es ja problemlos wieder eingesetzt werden
  • grenzenlose "Modability" wurde gestrichen, ich wollte eigentlich ein Game machen und keinen "Gamemaker"
  • DAU-Kompatiblität wurde gestrichen. Wer sich mit den gelieferten Tools nicht auseinandersetzen will, der braucht wohl doch eher ein Brettspiel und sollte keine Maps entwerfen.
  • 100%ige Kompatiblität zum AMIGA wurde gestrichen da es derzeit eh in den Sternen steht wann ich mit dieser (kompletten) Neueintwicklung anfangen kann. Es ist geplant einen Konverter einzurichten der bestehende MacOS/Linux/Windows Maps in ein Amiga-Format bringt.
  • Das Game bleibt zwar Open Source, ich werde aber nicht mehr jede Zeile mit drei Zeilen Comments bedenken.
  • Haarige Situationen werde ich nicht mehr möglichst offen halten sondern ggf. an restriktive Regeln binden. Beispiel: Früher gab es die Möglichkeit für jedes Tileset unterschiedliche Tilegrößen zu bestimmen, das wird es nicht mehr geben. Entweder passt das Tileset in ein 32x32 Raster oder es ist inkompatibel.
  • Die Auswahl der Grafikformate wurde auf BMP und PNG beschränkt. Beide Formate müssen mit einer Farbtiefe von 24Bit aufwarten, wer das nicht beherzigt wird von der Engine nicht unterstützt und muss sich Grafikfehler anschauen.
  • Der Verzeichnisbaum ist streng vorgegeben. Findet die Engine eine Datei nicht im dafür vorgesehenen Ordner gibt es Fehlermeldungen.
  • Akrons damalige Entwürfe sind teilweise inkompatibel zum Ziel des Games, eine überarbeitete Story nebst Gameplay-Design erscheint bald.
All diese "Rotstift-Attacken" haben bewirkt das ich bereits sehr weit bin und in nicht mehr allzu langer Zeit etwas zum Zeigen habe.

Stay tuned Folks, "The Timemill - Minority Will" wurde nicht aufgegeben.

Benutzeravatar
buki
Artguy
Beiträge: 1237
Registriert: 29. Mai 2006, 00:17
Wohnort: Hamburg
Kontaktdaten:

Beitrag von buki » 4. Jun 2006, 21:41

Schön, dass du noch dabei bist.
Ich warte mit freude
Alle Farben für alle!

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 28. Jul 2006, 17:43

  • Neues...
  • Das Pathfinding, welches auf dem A* Algorithmus basiert, ist beinahe komplett implementiert. Da ich noch einige Feinheiten benötige die das Original nicht vorsieht, muss ich noch ein paar Zeilen Code dazu basteln.
    So soll es möglich sein bestimmte Bereiche der Map als "gefährlich" einzustufen damit der NPC lieber einen anderen Weg nimmt und nur im Notfall diese gefährliche Region durchquert. Beliebtes Beispiel dazu: Es gibt zwei Möglichkeiten eine Mauer zu durchqueren. Ein Durchgang wird von Gegnern massiv beschossen. Das Feld welches unter Beschuss liegt erhält einen Wegkosten-Malus und ist für die Pfadfindung somit unaktraktiver als der längere Weg.
  • Tile-Gruppen funktionieren jetzt. Oftmals möchte man eine grössere Grafik einsetzen als die Engine dies gestattet. Wenn diese Grafik in Höhe und Breite durch die fixe Til-Größe teilbar ist (derzeit 32x32) dann trennt die Engine dieses Bild automatisch in Tiles auf, man kann es aber als Ganzes in die Map setzen.
Das war jetzt nur ein kurzes Lebenszeichen, aber das kann auch heissen dass es weiter geht ;) Auf jeden Fall arbeite ich schon an der Game Engine. Derzeit nur für Linux, MacOS X und Windows ... AMIGA folgt sobald es was zum starten gibt.

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 1. Aug 2006, 17:31

Nachtrag: Der A* Algorithmus für die Wegfindung funktioniert doch noch nicht ... da muss ich nochmal lesen und probieren :)

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 2. Aug 2006, 18:17

Entweder bin ich zu blöd oder meine Quellen zu ungenau, zudem scheint mir in dedizierten Programmiererforen niemand helfen zu können.
Auch wenn dies hier kein Programmiererboard ist, gibt es vielleicht den Einen oder Anderen der sich damit ein wenig auskennt. Es geht um den A-Star (A*) Algorithmus mit dem man in Echtzeit den Weg zwischen einem Start- und einem Endpunkt berechnen kann.

Ich kopiere hier einfach mal mein Posting aus dem BB Forum:

Ich definiere eine Map cdata:int[width, height] in der ich nicht begehbare Felder mit einer 1 markiere. Ich lege die Start- und Zielkoordinaten in entsprechenden Variablen fest.
  • Beginnend bei start_x:Int und start_y:Int
  • Schreibe den Startpunkt in eine Liste welche die fertig behandelten Nodes beinhaltet
  • ßberprüfe alle 8 umliegenden Felder auf die geringsten Wegkosten. Horizontale Felder bekommen einen Basiskostenwert von 10, diagonale einen von 14. Ich addiere also diesen Basiskostenwert mit der heuristischen Entfernung zum Ziel (naiv mit Abs(start_x-ziel_x)+Abs(start_y-ziel_y)), trage alle Felder in eine offene Liste (ToDo) ein und ernenne das Feld mit den geringsten Kosten zum nächsten Navigationspunkt.
  • Der neue Navigationspunkt (Node) wird in die geschlossene Liste eingetragen und aus der offenen entfernt.
  • Ich wiederhole Punkt 2, ignoriere dabei alle Nodes die sich bereits in der offenen oder geschlossenen Liste befinden.
  • Ich mache den Kram solange bis ich das Ziel erreicht habe, oder die offene Liste leer ist. In letzterem Fall müssten sich sämtliche Felder der Map in der geschlossenen Liste befinden und hier vermute ich auch einen Denkfehler.
  • Nach obigem Prozedere müsste ich theoretisch in der geschlossenen Liste einen nicht optimierten Pfad haben, sollten es einen geben. Aber es funktioniert nicht ... die Kiste rödelt sich fest und kommt keine Node weiter.
Falls mein Geschreibsel verständlich ist, würde ich mich über eine Diskussion und Lösungsvorschläge sehr freuen.

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 3. Aug 2006, 12:29

Klingt für mich nicht logisch, beim nächsten Node wäre der Vorgänger ja dann der mit den geringsten Wegkosten und der Algo würde wieder zurück gehen.

MartinH.
Artguy
Beiträge: 3263
Registriert: 28. Mai 2006, 23:15
Kontaktdaten:

Beitrag von MartinH. » 3. Aug 2006, 13:12

Ich bin leider auch kein Programmierer, aber es fällt mir schwer, mir vorzustellen wie der Algorithmus einen an so einer Wand vorbeiführen sollte ohne schlangenlinien zu laufen und somit eher systematisch auszutesten als zu suchen:

Bild

links vorbei könnte vielleicht noch gut klappen, aber angenommen das feld wär zu, würde er dann nicht zuerst sehr konfus hin und her laufen?
Poste doch mal den Quelltext, auch wenn ich wahrscheinlich nichts damit anfangen kann. Vielleicht ist ja irgendwo ein kleiner logikfehler drin.

Hast du vorgesehen, das der Algo erst einmal komplett durchgerechnet wird, bevor sich die figur in bewegung setzt, oder soll sie sich beim laufen langsam vortasten? Ich könnte mir vorstellen, das letzteres zumindest beim debuggen helfen würde, weil man dann genau sieht was passiert.

Benutzeravatar
sOph
Member
Beiträge: 85
Registriert: 29. Mai 2006, 14:18
Wohnort: Erbach
Kontaktdaten:

Beitrag von sOph » 3. Aug 2006, 19:57

Also ich habe bisher den A* algo nur einmal kurz überflogen und das ist schon Generationen her, weiss also nicht genau, wie er funktioniert, ich persönlich würde eine Wegsuche folgendermaßen ala brute force proggen:

also ich bräuchte ein Integer-Array das so groß wie das Spielfeld ist, sowie ein ebensogroßes Boolean-Array.
Das Integer-Array würde ich mit MaxInt initialisieren, das Boolean-Array mit false auf begehbaren Flächen und true auf unpassierbaren.

Nun würde ich das Startfeld als aktuell angesehenes Feld und dessen Integer-Wert auf die Heuristische Entfernung setzen.

<Loop>
ßberprüfen, ob aktuell angesehene Feld das Zielfeld ist, falls dem so ist, zu <Next>, ansonsten:
Für das aktuell angesehene Feld würde ich nun für alle der umliegenden 8 Felder, deren Boolean-Wert noch auf false steht, die Entfernung berechnen, ala 10 für direkte bzw. 14 für diagonale Wege + heuristische Entfernung zum Ziel. In den jeweiligen Interger-Werten würde ich nun das minimum zwischen der errechneten Entfernung und dem ehemaligem Wert speichern).
Nun noch für das aktuell angesehene Feld den Boolean-Wert auf true setzen.
Nun im Array das Feld finden, dessen Integer-Wert am kleinsten aber dessen Boolean-Wert noch false ist, dieses als aktuell angesehenes Feld setzen und mit diesem den <Loop> wiederholen.

<Next>
Nun für jedes Feld im Integer-Array die jeweilige heuristische Entfernung abziehen und das Zielfeld als aktuell angesehene Feld setzen.

<Loop2>
ßberprüfen, ob der Integer-Wert des aktuell angesehenen Feldes 0 ist, falls dem so ist, zu <End>, ansonsten:
Position des aktuell angesehenen Feldes auf einen Stack pushen.
Schauen, welches der 8 umliegenden Felder den kleinsten Integer-Wert hat und dieses als aktuell angesehenes Feld setzen.
wiederhole <Loop2>

<End>
Nun hast du den kürzesten Weg auf dem Stack, einfach ein Wegstück nach dem anderem vom Stack poppen, bis du am Ziel angelangt bist.

______

Da kann man bestimmt noch einiges dran rumoptimieren und bessere Datenstrukturen verwenden, habe bloß gerade keine Zeit um mir länger darüber Gedanken zu machen, bzw. um mir die Funktionsweise des A* anzusehen ... hoffe du blickst durch meinen pseudo-pseudo-code durch und er hilft dir ...
- Blog: http://blog.cyphic.net - ShowRoom: http://forum.digitalartforum.de/viewtopic.php?t=2542
- Remember, always be yourself. Unless you suck! (Joss Whedon)

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 4. Aug 2006, 07:53

Zuschauer hat geschrieben:Da der Vorgänger dann schon in der geschlossenen Liste ist nicht.
Stimmt, daran hatte ich nicht gedacht.

@MartinH: Es ist schon so dass der A* nicht immer genau ist, dafür ist er aber gut genug um ihn in Echtzeit anzuwenden. Als Beispiel wäre hier die Pfadkorrektur zu nennen die vorgenommen werden muss wenn auf einem vorberechneten Pfad plötzlich ein Hindernis auftaucht (andere Einheit, Tür ist plötzlich zu etc.)
Zwar schlägt der A* manchmal Haken, der Effekt ist aber zu vernachlässigen und lässt sich i.d.R. durch geschicktes Leveldesign minimieren.

@sOph: Im Grunde hast Du da den A* beschrieben, nur dass ich halt kein Integer-Array verwende, sondern eine Linked List ;)

Heute Nachmittag werde ich mal etwas Code posten und bebildern. Im Moment baue ich den Code so um dass ich mir bei der Pfadsuche anschauen kann was er gerade tut (grafisch).

Benutzeravatar
Triton
Artguy
Beiträge: 1482
Registriert: 31. Mai 2006, 01:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von Triton » 4. Aug 2006, 18:09

Bruz: Nimm doch mal Kontakt mit TheShadow auf - der hat sich doch mal ausführlich mit dem Thema Wegfindung beschäftigt und einen sehr effektiven Algorithmus geschaffen.

Benutzeravatar
Vulti
Member
Beiträge: 107
Registriert: 29. Mai 2006, 01:49
Wohnort: Augsburg/München
Kontaktdaten:

Beitrag von Vulti » 5. Aug 2006, 16:42

Bruzard: Kennst du folgende Seite schon: http://www.policyalmanac.org/games/aSta ... al_de.html ?

So weit ich es verstanden habe, berücksichtigst du nicht die Verbindung vom Vorgängerknoten zum aktuellen Knoten. Weiß nicht, ob das für Probleme sorgt.

ßbrigens wird der euklidische Abstand zwischen 2 Punkten nicht über der Summe der beiden Beträge ausgerechnet |x1-x2| + |y1-y2|, sondern als Quadratwurzel über die Summe des Quadrats der beiden Differenzen (also Wurzel ( (x1-x2)^2 + (y1-y2)^2) ).

Im engl. Wikipedia steht auch noch ein Verfahren, wie man es über Beträge machen kann:
http://en.wikipedia.org/wiki/Euclidean_distance

Hoffe das hilft was. :)
»Gee, I wish we had one of them doomsday machines.«

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 6. Aug 2006, 11:15

Vulti hat geschrieben:ßbrigens wird der euklidische Abstand zwischen 2 Punkten nicht über der Summe der beiden Beträge ausgerechnet |x1-x2| + |y1-y2|, sondern als Quadratwurzel über die Summe des Quadrats der beiden Differenzen (also Wurzel ( (x1-x2)^2 + (y1-y2)^2) )
Das ist mir bewusst, deshalb schrieb ich ja auch dass ich die Entfernung _naiv_ berechne. Es ist schon so dass ich mit meiner _naiven_ Formel die ungefähre Entfernung erhalte. Man nennt diese Method auch "Manhattan Methode", sie ist zwar ausgesprochen ungenau, dafür aber wesentlich schneller zu berechnen als ein Pythagoras.

Bin leider noch nicht dazu gekommen weiter zu machen, hoffe aber dass ich heute ein paar ruhige Minuten finde. Mein Sohn hält mich derzeit ziemlich auf Trab ... die Zähnchen Leute, die Zähnchen ... *aua*

Benutzeravatar
Vulti
Member
Beiträge: 107
Registriert: 29. Mai 2006, 01:49
Wohnort: Augsburg/München
Kontaktdaten:

Beitrag von Vulti » 6. Aug 2006, 13:27

Aso, dann ist ja gut. Ich wär da jetzt nicht so geizig ;)
»Gee, I wish we had one of them doomsday machines.«

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 27. Nov 2006, 19:04

*psst* ... wir arbeiten noch, ein Release rückt näher ;)

Benutzeravatar
Triton
Artguy
Beiträge: 1482
Registriert: 31. Mai 2006, 01:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von Triton » 27. Nov 2006, 19:51

Unendlich viel Zeit minus 3 Monaten sind aber immernoch Unendlich viel Zeit bis zum Release ;)

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 29. Nov 2006, 15:48

Stänkern .... wa?

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 1. Dez 2006, 19:36

"Pixel by Pixel" Scrolling (Pfeiltasten) und Zoom (Mausrad) kann nun mittels einer extrahierten Version von hier getestet werden.

Es wird ein Standardscreen von 800x600 unter OGL geöffnet und eine Random-Map aus einem Test-Tileset erzeugt, nicht wundern dass es chaotisch aussieht.

Die Begrenzung auf 800x600 und auf "Visible-Rendering" ist abhängig von der AMIGA Version. Würde ich nur für x86 und Mac-PPC programmieren könnte ich mir diese ganzen Optimierungen sparen ....
In der AMIGA Version wird es nur 800x600 geben, alle anderen Betriebssysteme dürfen oberhalb von 800x600x16 die Auflösung frei wählen. Es wird jedoch nur der Map-Bereich angezeigt der in 800x600 passen würde, dies soll verhindern dass AMIGA User im Multiplayer einen Nachteil gegenüber Usern haben die stärkere Maschinen fahren.

Die hier demonstrierte Zoom-Funktion ist nicht für das Spiel vorgesehen. Nur im Editor kann man per Mausrad zwischen 50% und 200% zoomen. Im Spiel ist die Zoomfunktion nur dafür da Spielern mit höheren Auflösungen den Vorteil zu nehmen mehr von der Karte zu sehen.
  • Zum weiteren Fortschritt:
  • Die Layer-Technik ist implementiert und als fertig anzusehen (näheres weiter unten)
  • der A* Algorithmus ist implementiert, funktioniert und muss nur noch optimiert werden
  • Ab einer gewissen Anzahl von Alpha-Transparenzen die einzeln berechnet werden müssen, erscheint eine Warnmeldung dass die Map evtl. nicht mehr optimal auf AMIGA Systemen dargestellt werden kann.
  • Der Editor geht in jedem Fall davon aus dass eine Singleplayer-Map erstellt werden soll, es gibt keine diesbezüglichen Einstellmöglichkeiten mehr im "NewMap" Dialog. Wird mehr als eine Startposition erstellt wird die Map automatisch zur Multiplayer Map. Zwar muss das Game auf jeden Fall zu zweit gespielt werden (Human - Computer oder Human - Human), aber der zweite Startplatz wird automatisch berechnet wenn nur eine Spielerposition angegeben wird. Erst nach dem Setzen einer zweiten Startposition kann man Details zum MP-Modus definieren.
  • Beliebig viele Layer sind wieder drin und funktionieren perfekt. Per Default wird beim Neuerstellen eines Layers angenommen dass ein normaler Grafik-Layer erstellt wird. Erst in den Settings zum Layer erklärt man einen Layer zum Object- oder Collision-Layer
  • Tile-Groups gibt es zwar schon seit längerer Zeit, ich habe da aber noch ein wenig gefeilt. Es ist nun möglich eine "Mini-Map" zu erstellen und diese als Brush auf eine größere Map anzuwenden. Dabei werden alle Layer Optionen angewandt die zuvor definiert wurden. Nicht vorhandene Layer werden auf Wunsch erstellt oder sie werden auf den bestehenden Layer "gemapped" ... funktioniert in etwa wie das "Merge visible Layers" in Photoshop.
  • Die Tilegröße ist noch immer nicht exakt definiert. Derzeit erwartet das Game 32x32 Tiles, das ist im Editing aber extrem winzig und ich denke darüber nach diese Grenze auf 64x64 anzugheben. Allerdings muss ich das erst auf AMIGA testen, k.A. wie die Performance dann aussieht. Auf jeden Fall wird es keine frei definierbare Tile-Größe geben, mit diesem Problem habe ich schon eine Timemill-Version an die Wand gefahren und die Anzahl der Neuanläufe summiert sich mittlerweile auf gut ein Dutzend.
Naja, wir kommen gut voran und die Gameengine läuft hier lokal schon recht spielbar. Für was ßffentliches ist es aber einfach zu buggy, hässlich und überhaupt.... Eine spielbare Demo kommt wenn ich hier einige Sachen geklärt und spielbares implementiert habe.

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 15. Mai 2007, 17:49

The never ending Story ...
Krankheit meinerseits, des Kindes, der Frau ... Explosion des bisherigen Unternehmens und Neugründung einer neuen Agentur haben extrem viel Zeit verschlungen und schon wieder ist ein halbes Jahr in das Land gegangen ohne Timemill-News.
Zum Ersten: Nein, es gibt auch heute noch nichts zum zeigen. Zum Zweiten: Ja, ich liebe dieses Projekt und habe nicht nochmal neu angefangen seit ich im Dezember des letzten Jahres den letzten Report abgegeben habe.

Da ich mit der AMIGA Version recht gut vorran komme und die Beschränkungen doch nicht so schlimm sind wie angenommen wurden einige Dinge geändert und einige andere hinzugefügt oder entfernt...
  • die Auflösung für das Spiel beträgt unveränderbare 1024x768 Pixel
  • die Tile-Größe liegt bei 64x64 Pixel
  • bei der Definition eines neuen Levels werden folgende Layer automatisch und unveränderbar generiert:
    • Hintergrund
    • Objekte
  • Alle anderen Layer können frei definiert werden
  • auch zwischen "Hintergrund" und "Objekt" dürfen neue Layer definiert werden, jedoch nicht unter der Ebene "Hintergrund"
  • Auf dem Hintergrund sind keine transparenten Tiles erlaubt. Da es zuviel Aufwand ist festzustellen ob ein Tileset Transparenz besitzt, habe ich einfach vorgegeben dass auf "Hintergrund" ausschliesslich Tilesets im Format *bmp verwendet werden dürfen
  • Alle Layer bewegen sich synchron, Paralax ist nicht vorgesehen
  • Eine Map hängt an einem Theme. Ich gestatte es nicht mehr Tilesets ausserhalb eines Themes zu verwenden. Mein vordefiniertes Theme heisst "Dr. Larssen" und entspricht Akron's Design des ersten Levels -> Minority Will befreit die Wissenschaftler aus der Schleusenzone.
  • Themes beinhalten die zu verwendenden Tilesets einer Map, ein Theme wird durch eine *.thm Datei beschrieben
  • Tilesets müssen durch eine *.tsd Datei beschrieben werden. Diese *.tsd müssen als Dateinamen in den entsprechenden *thm verwendet werden.
  • der Wert "anim_speed" wurde durch das Wort "anim_delay" ersetzt da es eindeutiger ist. Der Wert "anim_delay" beschreibt die Wartezeit in Millisekunden bei einer Animation zwischen Tiles
  • LUA wurde, wie im ersten Post erwähnt, komplett über Board geworfen. Zwar wäre LUA eine wunderbare Möglichkeit Dinge zu automatisieren und zu steuern, jedoch konnte ich keine vergleichbare Möglichkeit für AMIGA ausfindig machen. Zwar gibt es dort LUA Implementationen, diese treten jedoch immer als eigene Sprach-Versionen auf und nicht als Laufzeitbibliotheken wie ich dies bräuchte ... und "nein", ich werde LUA nicht für AMIGA portieren.
  • A* liegt mir zwar immer noch als Möglichkeit vor den Gegnern etwas Intelligenz einzuhauchen, aber ich bin derzeit davon abgekommen da es einfach zu weit entfernt vom Original ist. Die Gegner agieren derzeit wie im Original "The Chaos Engine" ... sie spawnen beim betreten eines bestimmten Bereiches, greifen den Player an und beenden den Angriff wenn der Player einen bestimmten Bereich verläßt ... soviel Arcade muss sein. A* verwende ich derzeit nur für das Pathfinding der Player da sich Timemill anders steuert als sein Vorbild. Nämlich so wie Diablo: der Spieler klickt auf einen Punkt der Karte und die Spielfigur wird diesen Punkt ansteuern, ein Klick auf einen Gegner bewirkt einen Angriff desselben.
  • Die Linux Version verwendet nun das Framework GTK anstelle von FLTK zur Darstellung des Editors
Soviel zum derzeitgen Stand ... ich denke dass ich im Jahr 2150 eine PreAlpha präsentieren kann ... sorry, Privatleben und Job sind derzeit etwas ausser Kontrolle und beanspruchen alle Zeit die ich habe ...

Noch ein Shot, am Ende des Tunnels...
Bild

MartinH.
Artguy
Beiträge: 3263
Registriert: 28. Mai 2006, 23:15
Kontaktdaten:

Beitrag von MartinH. » 15. Mai 2007, 19:01

... ich denke dass ich im Jahr 2150 eine PreAlpha präsentieren kann ...
Du glaubst nicht wie ich über diesen Satz gelacht hab :). Dein ungebrochener Wille das Projekt fortzuführen ist sowohl beeindruckend als auch vorbildlich. Ich hab zwar auch schon das ein oder andere mal versucht ein Spiel zu programmieren, hab aber immer ganz ganz schnell wieder aufgegeben, weil es einfach unglaublich viel Zeit und Durchhaltevermögen kostet.

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 16. Mai 2007, 17:02

Liebes Tagebuch...

...heute habe ich die drei Dateiformate *.thm, *.tsd und *.odf neu definiert. Während ein *thm (Theme) die komplette Grafik für ein Level definiert, beschreibt das *tsd ein einzelnes Tileset und das *.odf Objekte innerhalb des Levels. Mir ist aufgefallen das die Berechnung der Objekte eines Levels (Player, Gegner, Effekte usw.) nur 10 Millisekunden länger dauert wenn man das gesamte Level berechnet als nur den sichtbaren Bereich. Da es einfacher ist alle Objekte zu berechnen habe ich auf die 10 Msecs gesch***en. Dieses Ergebnis bekam ich mit einer unwahrscheinlichen Map-Größe von 500x500 Tiles, das entspricht bei 1024x768 etwa 31x42 Bildschirmen.
Einen Schönheitsfehler des Editors konnte ich heute leider nicht beheben: Zeichnet man die Map im Vollbild und stößt an die Grenze der Map kann man nicht weiter scrollen ... so wie es sein soll. Verkleinert man das Fenster und scrollt bis ans Ende, vergrößert dann das Fenster wird ein Bereich angezeigt in dem man nicht editieren kann, man muss zurück scrollen. Das ist zwar kein wirklich schwerer Bug weil man tatsächlich nur den Map-Bereich bearbeiten kann der zuvor per "Neues Level" oder "Level laden" eingerichtet worden ist, sieht aber suboptimal aus. Ich denke dass ich das erstmal nach hinten schiebe und mich um wichtige Sachen kümmere.

Da die Dateiformate (außer dem *.tmm Format für die Maps) aus Textdateien bestehen habe ich begonnen diese Formate zu dokumentieren. Primär um mich auch morgen noch daran zu erinnern was ich da gemacht habe, sekundär um Leveldesignern und Grafikern zu helfen eigene Themes und Objekte zu entwerfen. Eine Pipeline zu programmieren welche diese Dateien wie WYSIWYG erzeugt ist einfach zu aufwändig und kostet nochmal Zeit. Ich denke dass so einfache Textdateien jeder mit einem IQ über Zimmertemperatur selbst erstellen kann.

Das neue *.odf Format ist zwar ein wenig komplexer als ein einfaches *.thm oder *.tds, aber auch das ist zu verstehen. Hier ein Beispiel wie man dem Player eine "idle" Animation verpasst:

Code: Alles auswählen

/*
    Player - Definition
*/

image = player01.png    // Image welches die Bilder enthält

default_cell_width = 64
default_cell_height = 64
 
ANIMATION IDLE 1
{
    start_frame = 0
    end_frame = 7
    anim_delay = 20
}
Die Werte "default_cell_width" und "default_cell_height" beschreiben globale Werte für die Größe der einzelnen Animations-Frames. Dieser Wert kann innerhalb einer Definition jederzeit für ein einzelnes Objektdetail überschrieben werden.
Beispiel: Ist die IDLE Animation des Players nur 48x64 Pixel groß, kann die "WALK_TOPLEFT" Animation gerne 64x64 Pixel groß sein.

Das Image-Format darf BMP, JPEG oder PNG sein, da die Engine Objekte in %gamedir%/gfx/objects/ erwartet darf kein Pfad angegeben werden.

"ANIMATION" sagt dem Parser dass hier eine Animation definiert wird, IDLE zeigt an dass eine "Langeweile-Anim" erzeugt werden soll ... die 1 sagt dass es mehr als eine idle Anim gibt und dass diese hier die Nummer 1 trägt. Im Game wählt die Engine per Zufall eine idle Anim aus wenn es mehr als eine gibt.
Die geschweiften Klammern zeigen dem Parser wo die Definition beginnt und wo sie endet. "start_frame" definiert das Bild im Image an dem die idle Animation beginnt (die Zählung beginnt bei 0) und "end_frame" sagt wo die Animation endet. "anim_delay" gibt an wieviele Millisekunden gewartet werden soll bis das nächste Bild angezeigt werden soll.

Es gibt noch mehr Werte für das Animations-Objekt, aber ich wollte hier nur mal die Einfacheit darlegen.

Zwar habe ich die "Modability" von Timemill gegen Null gefahren ... aber das sind alles Sachen die leicht zu interpretieren sind und einer späteren Erweiterung der "Modability" zuträglich sind.

Alles was sich oberhalb der Ebene "Hintergrund" bewegt darf eine von drei Blend-Modes annehmen: ALPHA, LIGHT oder SHADOW ... ALPHA bedeutet dass der Alpha-Channel des Bildformats verwendet wird (nur bei PNG interessant), LIGHT heisst dass das Bild additiv auf die darunter liegenden Bildelemente gezeichnet wird, SHADE bedeutet eine Verdunkelung des Hintergrundes. Per Default ist ALPHA eingestellt, für jedes Tile und jedes Objekt darf die Blendmode in den entsprechenden Definitionsfiles angegeben werden.

Im Editor und im Game wird "per Pixel" gescrollt ... derzeit gibt es noch Probleme mit der Berechnung der tatsächlich anzeigbaren Levelgröße. Das erzeugt zwar keine Fehler, sieht aber kacke aus .. ich hoffe das morgen lösen zu können wenn all die anderen Väter auf Fahrrädern am saufen sind.

Neg
Newbie
Beiträge: 17
Registriert: 21. Jun 2006, 11:12
Wohnort: Berlin

Beitrag von Neg » 25. Mai 2007, 01:57

Sag mal, nur so aus Interesse, wieviele LOCs hast du eigentlich mittlerweile schon ca. geschrieben?

bruZard
Member
Beiträge: 162
Registriert: 29. Mai 2006, 16:55
Wohnort: Rathenow
Kontaktdaten:

Beitrag von bruZard » 25. Mai 2007, 16:58

"LOC's" ?!? Meinst Du Log-Einträge? Bestimmt ne Menge, schraube ja nun schon über drei Jahre an dem Teil.

Neg
Newbie
Beiträge: 17
Registriert: 21. Jun 2006, 11:12
Wohnort: Berlin

Beitrag von Neg » 25. Mai 2007, 21:41

Lines of Code. Quellcodezeilen. Sorry für die Verwirrung, ich nahm an, du würdest die Abkürzung kennen. :oops:

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder