Gestrandet Unlimited
Auftrieb und Inventar

Guten Tag, guten Abend und frohe Weihnachten!
Die letzten Tage war ich natürlich nicht auf der faulen Haut und habe fleißig an Gestrandet Unlimited gearbeitet. Doch was genau ist passiert?
Der erste Prototyp des Inventars erblickte die Welt. Dieses ist anders als das von Stranded2 in Kategorien unterteilt. Hierdurch erhoffe ich, eine verbesserte Übersicht über die Items zu erlangen.
Daraufhin brauchte ich eine kurze Pause von der Inventargestaltung, weshalb ich die Proportionen des Spielers ein wenig angepasst habe, hierdurch erkennt man nebenbei bemerkt nicht dessen Hässlichkeit, weshalb dieser vielleicht doch im Spiel bleibt
!
Außerdem wurde das Grassprite angepasst, es ist nun um einiges größer und ist auch dichter. Außerdem passt sich das Gras nun dem Winkel des Terrains an, auf welchem es steht.
Im Hintergrund hat sich das Updaten ein wenig geändert. Neben der "Update" Funktion welche jedes Frame für jedes Objekt ausgeführt wird, gibt es auch die "ControllerOn" Events, welche ausgeführt werden wenn ein bestimmtes Ereignis in Kraft tritt. Momentan gibt es "ControllerOnTouch" (Wenn das Objekt etwas Berührt) und "ControllerOnMove" (Wenn sich das Objekt bewegt [Wegen der Schwerkraft, weil eine Explosion statt fand, ...]).
Ganz nebenbei habe ich die untere Textur (das Hellbraune) stark verkleinert, hierdurch sollte das ganze dezenter wirken und kein allzu großer Tiefeneffekt entstehen.
Danach habe ich mich wieder dem Inventar zugewandt. Diesmal habe ich das Kombinationsfeld eingebaut. Anders als in Stranded wird das Objekt nicht "zusammengeklickt". Dieses konnte ich aus mehreren Gründen nicht verwenden. Durch die Kategorisierung der Items, kann dies schnell ziemlich unübersichtlich werden und außerdem ist es allgemein ziemlich umständlich (Einmal verklickt ist die ganze Kombination am Ar****). Die notwendigen Komponenten der Kombination werden allesamt via Drag'n Drop in diesen Kreis hineingeschoben und werden auf Knopfdruck miteinander kombiniert. Allerdings kommt es im Gegensatz zu Minecraft nicht auf die Position der Items an, diese ist powidl. Der restliche GUI Schnick Schnack kommt natürlich noch (Kombinationsbutton etc.)
Beim implementieren des nächsten Features wurde aus der Spielfigur schnurstracks eine auf Wasser gehende Figur! Dies war natürlich nur ein Bug und ist natürlich behoben, das eigentliche Feature:
Auftrieb! Jedes Spielobjekt hat nun die Möglichkeit entweder sinken zu können (Steine,...) oder auf der Oberfläche zu chillen (Äste,...). Der Spieler hat zusätzlich die Möglichkeit schwimmen und tauchen zu können. Dadurch hat man unter Wasser eine viel größere Bewegungsfreiheit. Der Auftrieb ist natürlich physikalisch vollkommen Absurd implementiert (Position.VY :- (Gravity + Buoyancy)*.8
) aber es wirkt einigermaßen korrekt.
Tja dies habe ich die letzten paar Tage gemacht!
MfG!
Die letzten Tage war ich natürlich nicht auf der faulen Haut und habe fleißig an Gestrandet Unlimited gearbeitet. Doch was genau ist passiert?

Der erste Prototyp des Inventars erblickte die Welt. Dieses ist anders als das von Stranded2 in Kategorien unterteilt. Hierdurch erhoffe ich, eine verbesserte Übersicht über die Items zu erlangen.

Daraufhin brauchte ich eine kurze Pause von der Inventargestaltung, weshalb ich die Proportionen des Spielers ein wenig angepasst habe, hierdurch erkennt man nebenbei bemerkt nicht dessen Hässlichkeit, weshalb dieser vielleicht doch im Spiel bleibt

Außerdem wurde das Grassprite angepasst, es ist nun um einiges größer und ist auch dichter. Außerdem passt sich das Gras nun dem Winkel des Terrains an, auf welchem es steht.
Im Hintergrund hat sich das Updaten ein wenig geändert. Neben der "Update" Funktion welche jedes Frame für jedes Objekt ausgeführt wird, gibt es auch die "ControllerOn" Events, welche ausgeführt werden wenn ein bestimmtes Ereignis in Kraft tritt. Momentan gibt es "ControllerOnTouch" (Wenn das Objekt etwas Berührt) und "ControllerOnMove" (Wenn sich das Objekt bewegt [Wegen der Schwerkraft, weil eine Explosion statt fand, ...]).
Ganz nebenbei habe ich die untere Textur (das Hellbraune) stark verkleinert, hierdurch sollte das ganze dezenter wirken und kein allzu großer Tiefeneffekt entstehen.

Danach habe ich mich wieder dem Inventar zugewandt. Diesmal habe ich das Kombinationsfeld eingebaut. Anders als in Stranded wird das Objekt nicht "zusammengeklickt". Dieses konnte ich aus mehreren Gründen nicht verwenden. Durch die Kategorisierung der Items, kann dies schnell ziemlich unübersichtlich werden und außerdem ist es allgemein ziemlich umständlich (Einmal verklickt ist die ganze Kombination am Ar****). Die notwendigen Komponenten der Kombination werden allesamt via Drag'n Drop in diesen Kreis hineingeschoben und werden auf Knopfdruck miteinander kombiniert. Allerdings kommt es im Gegensatz zu Minecraft nicht auf die Position der Items an, diese ist powidl. Der restliche GUI Schnick Schnack kommt natürlich noch (Kombinationsbutton etc.)

Beim implementieren des nächsten Features wurde aus der Spielfigur schnurstracks eine auf Wasser gehende Figur! Dies war natürlich nur ein Bug und ist natürlich behoben, das eigentliche Feature:

Auftrieb! Jedes Spielobjekt hat nun die Möglichkeit entweder sinken zu können (Steine,...) oder auf der Oberfläche zu chillen (Äste,...). Der Spieler hat zusätzlich die Möglichkeit schwimmen und tauchen zu können. Dadurch hat man unter Wasser eine viel größere Bewegungsfreiheit. Der Auftrieb ist natürlich physikalisch vollkommen Absurd implementiert (Position.VY :- (Gravity + Buoyancy)*.8

Tja dies habe ich die letzten paar Tage gemacht!
MfG!
Grafik Verbesserungen!

Servus!
Gestrandet ist wieder ziemlich weit gekommen - doch gehen wir der Reihe nach, was alles nun im Spiel ist!
Eine Untergrundtextur ist nun eingebaut!
Neue Palmensprites! Diesmal sind sie nicht gepixelt sondern mit Vektorgrafiken (Inkscape) gezeichnet.
Ein Verlauf als Hintergrund!
Erster Test einer Hintergrundebene. Dieser wird nicht ins Spiel kommen (Sieht zu beschissen aus :>) Jedoch habe ich denselben Code für das Schattensystem (nächstes Bild) verwenden können.
Das Playersprite ist nur zu Testzwecken im Spiel - das ändert sich sicher noch!
Schattensystem! Funktioniert recht gut, lediglich das Updaten der Schatten beim entfernen/hinzufügen will noch nicht so ganz. Der Schatten ist nur zu Testzwecken so lang.
Bedürfnissanzeige und Verwaltung! Bedürfnisse werden nur dann angezeigt wenn sie nicht voll sind, und nehmen immer die volle Breite des Bildschirms ein.
Weiters habe ich die Implementation von Ressourcen angefangen. Die erste Ressource (Stein) wird bereits halbwegs zuverlässig im Terrain verteilt.
Yay! Bis zum nächsten mal.
Gestrandet ist wieder ziemlich weit gekommen - doch gehen wir der Reihe nach, was alles nun im Spiel ist!

Eine Untergrundtextur ist nun eingebaut!

Neue Palmensprites! Diesmal sind sie nicht gepixelt sondern mit Vektorgrafiken (Inkscape) gezeichnet.

Ein Verlauf als Hintergrund!

Erster Test einer Hintergrundebene. Dieser wird nicht ins Spiel kommen (Sieht zu beschissen aus :>) Jedoch habe ich denselben Code für das Schattensystem (nächstes Bild) verwenden können.
Das Playersprite ist nur zu Testzwecken im Spiel - das ändert sich sicher noch!

Schattensystem! Funktioniert recht gut, lediglich das Updaten der Schatten beim entfernen/hinzufügen will noch nicht so ganz. Der Schatten ist nur zu Testzwecken so lang.

Bedürfnissanzeige und Verwaltung! Bedürfnisse werden nur dann angezeigt wenn sie nicht voll sind, und nehmen immer die volle Breite des Bildschirms ein.
Weiters habe ich die Implementation von Ressourcen angefangen. Die erste Ressource (Stein) wird bereits halbwegs zuverlässig im Terrain verteilt.
Yay! Bis zum nächsten mal.
Gestrandet unlimited - Rewrite #5

Hallo Freunde (und mDave)!
Lang ist es her, als ich das letzte Wörtchen über Gestrandet verloren habe. Dies lag hauptäschlich daran, dass ich nicht mehr an diesem wundervollen Spiel arbeitete - doch das Ziel an sich war nicht Tot!
Vor einigen Monaten kam der "Minecraft" Hype auf uns zu. Mich hat das Spiel zwar kaum faszinieren können, bis auf eine Sache: Die unbegrenzten Karten. Diese bieten so wahnsinnig viel Spielspaß, dass ich mir schon damals gewünscht habe, ich könnte ein derartiges Element in Gestrandet unterbringen. Dies war allerdings aufgrund technischer Beschränkungen kaum möglich. Darum machte ich mich erstmal um einen Rewrite in Java - dieses Fruchtete allerdings kaum (Wieso kann sich jeder zusammenreimen
).
Vor 3 Wochen schließlich habe ich in einer Nacht und Nebel Aktion den alten Gestrandetordner kopiert und ausgemistet. Hierbei habe ich alte Codedateien hinausgeworfen und alles was mit der Map zu tun hatte (Inkl. Lua Skripte) in den Papierkorb verfrachtet. Mittlerweile hat das aktuelle Gestrandet lediglich die Ordnerstruktur, Lua Anbindung, Diverse Kleinigkeiten (Particleengine, Colorstack, ...) und Grafiken aus Alt - Gestrandet geerbt.
Was ist (bisher) neu?
- Praktisch unendliche Karte und wird dynamisch nachgeneriert - Wird lediglich durch die Integer/Float Grenze und Speicher begerenzt
- Multiplayer von Anfang an implementiert - Läuft bereits jetzt mit bis zu 6 Spielern flüssig und Synchron (Gibt zwar Kleinigkeiten, aber das sollte schnell gefixt sein)
- Neuer Mapgenerator - Generiert nun bessere Höhlen und kann nun auch die Tiles seperat generieren (Multithreading theoretisch möglich)
- Neues Wassersystem - Schneller Floodfill (Erlaubt auch Luftblasen und Co). Geplant ist auch, dass Seen oberhalb des Wassers entstehen
- Komponenntenbasiertes Objektsystem - Jedes Objekt wird in einer globalen XML Datei definiert und dessen Funktion.
- Schnelleres Kollisionssystem - Alles kann mit allem kollidieren, dank eigenem Kollisionslayer in der Map.
- Tilebasiertes Updating/Rendering: Es ist egal wieviele Objekte insgesamt vorhanden sind, es werden lediglich die Sichtbaren gezeichnet und geupdatet.
Hier sind ein paar Bilder:
http://www.programming-with-de...player.png
Multiplayer mit 4 Spielern erfolgreich und flüssig (Großes Bild, deswegen Url)
Spielerstapelung dank schnellem Kollisionssystem ohne weiteres möglich
2400 Palmen ohne weiteres möglich.
Dynamisches Wassersystem
ToDo:
- Zuviel alsdass ich es hier auflisten könnte
PS: Die Bilder aus den älteren WLs sind leider offline gegangen, weil kilu meinte plötzlich meinen account sperren zu müssen...
Lang ist es her, als ich das letzte Wörtchen über Gestrandet verloren habe. Dies lag hauptäschlich daran, dass ich nicht mehr an diesem wundervollen Spiel arbeitete - doch das Ziel an sich war nicht Tot!
Vor einigen Monaten kam der "Minecraft" Hype auf uns zu. Mich hat das Spiel zwar kaum faszinieren können, bis auf eine Sache: Die unbegrenzten Karten. Diese bieten so wahnsinnig viel Spielspaß, dass ich mir schon damals gewünscht habe, ich könnte ein derartiges Element in Gestrandet unterbringen. Dies war allerdings aufgrund technischer Beschränkungen kaum möglich. Darum machte ich mich erstmal um einen Rewrite in Java - dieses Fruchtete allerdings kaum (Wieso kann sich jeder zusammenreimen

Vor 3 Wochen schließlich habe ich in einer Nacht und Nebel Aktion den alten Gestrandetordner kopiert und ausgemistet. Hierbei habe ich alte Codedateien hinausgeworfen und alles was mit der Map zu tun hatte (Inkl. Lua Skripte) in den Papierkorb verfrachtet. Mittlerweile hat das aktuelle Gestrandet lediglich die Ordnerstruktur, Lua Anbindung, Diverse Kleinigkeiten (Particleengine, Colorstack, ...) und Grafiken aus Alt - Gestrandet geerbt.
Was ist (bisher) neu?
- Praktisch unendliche Karte und wird dynamisch nachgeneriert - Wird lediglich durch die Integer/Float Grenze und Speicher begerenzt
- Multiplayer von Anfang an implementiert - Läuft bereits jetzt mit bis zu 6 Spielern flüssig und Synchron (Gibt zwar Kleinigkeiten, aber das sollte schnell gefixt sein)
- Neuer Mapgenerator - Generiert nun bessere Höhlen und kann nun auch die Tiles seperat generieren (Multithreading theoretisch möglich)
- Neues Wassersystem - Schneller Floodfill (Erlaubt auch Luftblasen und Co). Geplant ist auch, dass Seen oberhalb des Wassers entstehen
- Komponenntenbasiertes Objektsystem - Jedes Objekt wird in einer globalen XML Datei definiert und dessen Funktion.
- Schnelleres Kollisionssystem - Alles kann mit allem kollidieren, dank eigenem Kollisionslayer in der Map.
- Tilebasiertes Updating/Rendering: Es ist egal wieviele Objekte insgesamt vorhanden sind, es werden lediglich die Sichtbaren gezeichnet und geupdatet.
Hier sind ein paar Bilder:
http://www.programming-with-de...player.png
Multiplayer mit 4 Spielern erfolgreich und flüssig (Großes Bild, deswegen Url)

Spielerstapelung dank schnellem Kollisionssystem ohne weiteres möglich

2400 Palmen ohne weiteres möglich.

Dynamisches Wassersystem
ToDo:
- Zuviel alsdass ich es hier auflisten könnte
PS: Die Bilder aus den älteren WLs sind leider offline gegangen, weil kilu meinte plötzlich meinen account sperren zu müssen...
Let's play Multiplayer!

Guten Tag!
Da nun seit geraumer Zeit keine Meldung meinerseits gekommen ist, hole ich dies nun nach.
Gestrandet hat inzwischen einige Neuerungen erfahren.
*) Partikelsystem: Dies ist ein von Grund auf neu geschriebenes System. Es wird komplett via XML gesteuert, und im Lua-Code muss lediglich "StartParticleSystem("NameDesSystems")" stehen, ziemlich praktisch. Natürlich kann jeder Particle eigens mit Lua gesteuert werden (Dies sollte allerdings mit bedacht eingesetzt werden, da dies schnell zu slowdowns führen kann).
(Und ja, das Feuer ist hässlich... War lediglich ein "Funktionstest")
Hierbei sieht die particle.xml Datei folgendermaßen aus: Code: [AUSKLAPPEN]
*) Diverse Grafikeffekte: Unter anderem wurde nun der Tag/Nacht Wechsel erfolgreich eingebaut. Außerdem gibt es noch Wolken und Schatten vom Spieler (und Bäume, diese sehen aber im Moment eher weniger gut aus). Hier sind die einzelnen Tageszeiten zu sene (es wird natürlich flüssig zwischen den Farben interpoliert):
*) Einfaches Kombinationssystem: Also dies ist noch sehr in den Kinderschuhen, bis jetzt kann nur Stein+Ast=Hammer kombinieren. Bald sollte es noch Kombinationsevents geben. Das heißt, dass diverse Aktionen geschehen wenn ein bestimmtes Item kombiniert wird, oder man neue Items freischalten kann.
Neue Kombinationen fügt man im Moment mit der Funktion "game.inventar.registercombi({GetLanguage("stone"), GetLanguage("branch")},GetLanguage("hammer"))" GetLanguage() ist da, weil das ganze Spiel 100% lokalisierbar ist.
*) Multiplayer: Zuerst wollte ich mir hierfür eine eigene Netzwerklibrary schreiben. Jedoch scheiterte dies, beim Versuch auch sicher Nachrichten versenden zu können. Danach bin ich auf XNet gestoßen. Zuallererst lief alles wunderbar, der "rudimentäre" MP Modus, war nach einem Tag eingebaut (jedoch mit etlichen bugs).
Jedoch als ich die Daten sicher via SendSecureMessage versenden wollte, stürzte das Programm ohne offensichtlichen Grund ab. Diesen Fehler habe ich bis heute nicht lösen können. Mein Ziel ist es Gestrandet mit bis zu sechs Spielern flüssig gleichzeitig im Internet spielen zu können, mal schauen ob ich das Ziel erreiche.
Der Multiplayer Modus hat jedoch noch ziemlich viele Schönheitsfehler. Folgende (welche hoffentlich bald gefixt werden) Fehler gibt es:
* Spiel startet nicht gleichzeitig (wodurch alle Bewegungen, welche zuvor vom Host ausgeführt wurden, vom Client "ignoriert" werden)
* Mapveränderungen werden nicht synchronisiert (wodurch es zu argen Problemen kommen kann)
* Update/Zeichen Reihenfolge wird von synchronisierten Objekten nicht beachtet.
* Beim anhalten des programmes (Klick auf Titelleiste des Programmes) geschehen undefinierte Dinge.
* Übertragen der Scripte nicht vorhanden.
Trotz all dem, bin ich recht froh, dass der Multiplayer bereits so rudimentär funktioniert.
Da nun seit geraumer Zeit keine Meldung meinerseits gekommen ist, hole ich dies nun nach.
Gestrandet hat inzwischen einige Neuerungen erfahren.
*) Partikelsystem: Dies ist ein von Grund auf neu geschriebenes System. Es wird komplett via XML gesteuert, und im Lua-Code muss lediglich "StartParticleSystem("NameDesSystems")" stehen, ziemlich praktisch. Natürlich kann jeder Particle eigens mit Lua gesteuert werden (Dies sollte allerdings mit bedacht eingesetzt werden, da dies schnell zu slowdowns führen kann).

(Und ja, das Feuer ist hässlich... War lediglich ein "Funktionstest")
Hierbei sieht die particle.xml Datei folgendermaßen aus: Code: [AUSKLAPPEN]
<particle>
<layer count="2" />
<emitter name="fire1">
<position x="0" y="0" random="2" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<scaling x="-0.02" y="-0.02" random="0" /> <!-- Die Skalierung welche hinzugefuegt wird -->
<moving x="0" y="-4" random=".8" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startrotation value="0" random="360" /> <!-- Die start rotation -->
<rotating value="2" random=".5" /> <!-- drehung, ohne zufall -->
<startalpha value="1" random="0.2" />
<fade value="-0.025" />
<lifetime value="1000" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="3" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_fire1" />
</emitter>
<emitter name="fire2">
<position x="0" y="0" random="2" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<scaling x="-0.02" y="-0.02" random="0" /> <!-- Die Skalierung welche hinzugefuegt wird -->
<moving x="0" y="-4" random=".8" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startrotation value="0" random="360" /> <!-- Die start rotation -->
<rotating value="2" random=".5" /> <!-- drehung, ohne zufall -->
<startalpha value="1" random="0.2" />
<fade value="-0.035" />
<lifetime value="1000" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="4" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_fire2" />
</emitter>
<emitter name="fire3">
<position x="0" y="-50" random="2" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<scaling x="-0.005" y="-0.005" random="0" /> <!-- Die Skalierung welche hinzugefuegt wird -->
<moving x="0" y="-4" random=".4" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startrotation value="0" random="360" /> <!-- Die start rotation -->
<rotating value="2" random=".5" /> <!-- drehung, ohne zufall -->
<startalpha value=".5" random="0.2" />
<fade value="-0.01" />
<lifetime value="1000" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="1" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_fire3" />
</emitter>
<system name="fire">
<event duration="-1"> <!-- Ein Event, welches als erstes ausgefuehrt wird, die dauer betraegt -1 => unendlich -->
<emitter name="fire3" />
<emitter name="fire2" /> <!-- Startet den emitter "fire2" -->
<emitter name="fire1" /> <!-- Startet den emitter "fire1" -->
</event>
</system>
<emitter name="snow">
<position x="0" y="-100" random="50" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<moving x="0" y="2" random="0" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startalpha value="0.5" random="0.2" />
<wait value="1" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="1" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_snow" />
<lifetime value="2000" />
<script onupdate="0" oncreate="0" ondelete="0">
game.particle.snow = {}
function game.particle.snow.onupdate()
ParticleSetPosition(ParticleGetPositionX()+math.random(8)-4,ParticleGetPositionY())
if PointCollisionGameMap(game.map.id,ParticleGetPositionX(),ParticleGetPositionY()==1 then
ParticleSetMove(0,0)
end
end
function game.particle.snow.oncreate()
ParticleSetPosition(math.random(WidthGameMap(game.map.id)),0)
end
</script>
</emitter>
<system name="snow">
<event duration="-1">
<emitter name="snow" />
<wait value="5" />
</event>
</system>
</particle>
<layer count="2" />
<emitter name="fire1">
<position x="0" y="0" random="2" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<scaling x="-0.02" y="-0.02" random="0" /> <!-- Die Skalierung welche hinzugefuegt wird -->
<moving x="0" y="-4" random=".8" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startrotation value="0" random="360" /> <!-- Die start rotation -->
<rotating value="2" random=".5" /> <!-- drehung, ohne zufall -->
<startalpha value="1" random="0.2" />
<fade value="-0.025" />
<lifetime value="1000" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="3" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_fire1" />
</emitter>
<emitter name="fire2">
<position x="0" y="0" random="2" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<scaling x="-0.02" y="-0.02" random="0" /> <!-- Die Skalierung welche hinzugefuegt wird -->
<moving x="0" y="-4" random=".8" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startrotation value="0" random="360" /> <!-- Die start rotation -->
<rotating value="2" random=".5" /> <!-- drehung, ohne zufall -->
<startalpha value="1" random="0.2" />
<fade value="-0.035" />
<lifetime value="1000" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="4" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_fire2" />
</emitter>
<emitter name="fire3">
<position x="0" y="-50" random="2" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<scaling x="-0.005" y="-0.005" random="0" /> <!-- Die Skalierung welche hinzugefuegt wird -->
<moving x="0" y="-4" random=".4" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startrotation value="0" random="360" /> <!-- Die start rotation -->
<rotating value="2" random=".5" /> <!-- drehung, ohne zufall -->
<startalpha value=".5" random="0.2" />
<fade value="-0.01" />
<lifetime value="1000" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="1" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_fire3" />
</emitter>
<system name="fire">
<event duration="-1"> <!-- Ein Event, welches als erstes ausgefuehrt wird, die dauer betraegt -1 => unendlich -->
<emitter name="fire3" />
<emitter name="fire2" /> <!-- Startet den emitter "fire2" -->
<emitter name="fire1" /> <!-- Startet den emitter "fire1" -->
</event>
</system>
<emitter name="snow">
<position x="0" y="-100" random="50" /> <!-- Die relative Position, mit einer zufallsveraenderung von .4 -->
<startscale x="2" y="2" /> <!-- Start skalierung -->
<moving x="0" y="2" random="0" /> <!-- Bewegung in die einzelnen x/y achsen -->
<startalpha value="0.5" random="0.2" />
<wait value="1" /> <!-- wieviele ms gewartet werden, bis neue partikel erzuegt werden -->
<count value="1" /> <!-- wieviele partikel erzeugt werden -->
<image name="par_snow" />
<lifetime value="2000" />
<script onupdate="0" oncreate="0" ondelete="0">
game.particle.snow = {}
function game.particle.snow.onupdate()
ParticleSetPosition(ParticleGetPositionX()+math.random(8)-4,ParticleGetPositionY())
if PointCollisionGameMap(game.map.id,ParticleGetPositionX(),ParticleGetPositionY()==1 then
ParticleSetMove(0,0)
end
end
function game.particle.snow.oncreate()
ParticleSetPosition(math.random(WidthGameMap(game.map.id)),0)
end
</script>
</emitter>
<system name="snow">
<event duration="-1">
<emitter name="snow" />
<wait value="5" />
</event>
</system>
</particle>
*) Diverse Grafikeffekte: Unter anderem wurde nun der Tag/Nacht Wechsel erfolgreich eingebaut. Außerdem gibt es noch Wolken und Schatten vom Spieler (und Bäume, diese sehen aber im Moment eher weniger gut aus). Hier sind die einzelnen Tageszeiten zu sene (es wird natürlich flüssig zwischen den Farben interpoliert):

*) Einfaches Kombinationssystem: Also dies ist noch sehr in den Kinderschuhen, bis jetzt kann nur Stein+Ast=Hammer kombinieren. Bald sollte es noch Kombinationsevents geben. Das heißt, dass diverse Aktionen geschehen wenn ein bestimmtes Item kombiniert wird, oder man neue Items freischalten kann.
Neue Kombinationen fügt man im Moment mit der Funktion "game.inventar.registercombi({GetLanguage("stone"), GetLanguage("branch")},GetLanguage("hammer"))" GetLanguage() ist da, weil das ganze Spiel 100% lokalisierbar ist.
*) Multiplayer: Zuerst wollte ich mir hierfür eine eigene Netzwerklibrary schreiben. Jedoch scheiterte dies, beim Versuch auch sicher Nachrichten versenden zu können. Danach bin ich auf XNet gestoßen. Zuallererst lief alles wunderbar, der "rudimentäre" MP Modus, war nach einem Tag eingebaut (jedoch mit etlichen bugs).
Jedoch als ich die Daten sicher via SendSecureMessage versenden wollte, stürzte das Programm ohne offensichtlichen Grund ab. Diesen Fehler habe ich bis heute nicht lösen können. Mein Ziel ist es Gestrandet mit bis zu sechs Spielern flüssig gleichzeitig im Internet spielen zu können, mal schauen ob ich das Ziel erreiche.
Der Multiplayer Modus hat jedoch noch ziemlich viele Schönheitsfehler. Folgende (welche hoffentlich bald gefixt werden) Fehler gibt es:
* Spiel startet nicht gleichzeitig (wodurch alle Bewegungen, welche zuvor vom Host ausgeführt wurden, vom Client "ignoriert" werden)
* Mapveränderungen werden nicht synchronisiert (wodurch es zu argen Problemen kommen kann)
* Update/Zeichen Reihenfolge wird von synchronisierten Objekten nicht beachtet.
* Beim anhalten des programmes (Klick auf Titelleiste des Programmes) geschehen undefinierte Dinge.
* Übertragen der Scripte nicht vorhanden.
Trotz all dem, bin ich recht froh, dass der Multiplayer bereits so rudimentär funktioniert.
Viecher und so!


GEILE GRAFIK

Tolles Inventar!
Hallo!
In den letzten Tagen habe ich an diversen Dingen gearbeitet. Unter anderem sind die ersten Tiere drinnen.
Die Schnecke (OHA) und der Schmetterling (Supertoll!).
Beide waren recht simpel zu programmieren. Wobei hier noch etwas an Verbesserungsbedarf besteht. Die beiden Tiere starten oft an einer ungünstigen Stelle, wo sie sich nicht fortbewegen können.
Nebenbei habe ich die ersten drei Rohstoffe eingebaut: Stein, Blatt und Ast. Die drei werden (bis jetzt) beim start zufällig verteilt sein. In Zukunft sollen Steine beim Graben ins Terrain gefunden werden, Äste und Blätter beim fällen eines Baumes.
Außerdem habe ich an kleineren grafischen Gimmicks gearbeitet. Der Rote Hintergrund wurde nun durch einen blau-hellblau Verlauf ersetzt, das Terrain hat Grasbüschel und der Spieler hat ein Gesicht bekommen (inkl. hässlicher Gehanimation). Bald kommen hier natürlich andere Sachen hinzu, wie verschiedene Vegetation, div. Partikeleffekte und so der ganze Kram.
Zusätzlich habe ich ein rudimentäres Inventar eingebaut. Im Gegensatz zu Stranded2 ist dieses in Kategorien eingeteilt, sodass der Spieler einen viel besseren Überblick hat.
Das Objekt<->Spieler Kollisionssystem wurde stark optimiert. Dieses überprüft nur jene Palmen, welche auch einer Kollision in Frage kommen. Dadurch habe ich 5-6FPS gespart, da davor alle Palmen überprüft wurden.
Rewrite 3!

Guten Abend!
(Damit mir nicht gleich alle wegrennen :>, und ja das Rot kommt weg)
Ich melde mich zurück, da ich nun vom Compilerbauen erstmal genug habe. Und ich nicht untätig da sitzen will, habe ich mich gleich dazu entschlossen Gestrandet neu anzufangen. Die C# Version war leider nicht mehr praktikabel für mich, da es leider nicht auf Mac OS X lauffähig ist (wegen ZweiDe).
Naja erstmal habe ich mir den Sourcecode angesehen und musste leider feststellen dass ich doch viele Design-Fehlentscheidungen hatte. Unter anderem war die Lua Script Anbindung sehr schlampig implementiert. Das heißt es war ziemlich viel Arbeit neue Lua Scripte zu machen.
Danach habe ich einen Rewrite angefangen. Dieser ist bereits weiter (außer in einem Punkt) als die alte Version. Dieser hat einen sauber programmierten Lua Kern. Das heißt dass jedes Objekt mit jedem Objekt kommunizieren kann. Durch XML kann man auch weitere Einstellungen vornehmen. Im Moment ist ALLES veränderbar.
Naja für die die die (whoa 3 die's hintereinander) ersten Einträge nicht gelesen haben. Gestrandet ist ein Überlebensspiel auf einer einsamen Insel. Hierbei muss man überleben und schauen möglichst lange zu überleben. Das Ziel ist es von der Insel wegzukommen. Nebenbei kann man durch ein großes Arsenal an Waffen (welche man sich selber bauen kann) bestimmte Dinge tun. Einerseits kann man Tiere abschießen, Bäume um deren Früchte erleichtern oder einfach nur alles niedermetzeln, was einem in die Quere kommt
. Außerdem sollte man sich ein Lager bauen ( Eventuell in einer Höhle, am Wasser(=Hausboot) oder draußen auf einem Baum (=Baumhaus)), denn in der Nacht kommen allerlei mysteriöse Kreaturen auf. Am Tag ist es auch nicht ganz ungefährlich, da der Löwe auch hungrig ist. Wie man sieht gibt es dutzende Möglichkeiten. Eventuell wird es auch einen Mehrspielermodus geben, dies ist allerdings nicht sicher.
Das Wasser ist auch eines meiner Prachtstücke - basierend auf dem Wellensystem von Noobody (danke übrigens) -habe ich mir sowas gebaut (natürlich 100% in Lua). Der Kartengenerator generiert auch bereits sehr hübsche Maps (mit Höhlen, Himmelsinseln usw.).
Anders als dessen Vorgänger, wird es keinen Mapeditor geben. Jede Karte wird zufällig generiert. Dies hat den Vorteil, dass ich weniger Arbeit habe (hrr hrr) und dass Spieler jedes mal ein anderes Spielgefühl haben. Das heißt aber auch, dass es sehr große Spielewelten geben kann.
Bereits eingebaute Features:
-> Zerstörbare und Skinbare Landschaft
-> Spieler Beweg Dingsi
-> Objektverwaltung
-> Objekt<->Objekt/Objekt<->Terrain Kollision
-> Lokalisierung
-> Wasser inkl. Wellenberechnung
-> Hochdynamische Levelgenerierung
-> Bedürfnisse
-> GUI
-> Palmen (OHA)
-> Partikelengine
-> Speichern/Laden
ToDo:
-> Viele Objekte
-> Viele Tiere
-> Viele andere Dinge die gescriptet werden müssen (Ebbe/Flut, Tag/Nacht, ...)
-> Onlinemodus (alles ist so aufgebaut, dass es eigentlich leicht sein müsste dies einzubauen)
-> Animationssystem
-> Lua Funktionen implementieren
-> Eventuell Licht/Schatten System (um Tag/Nacht korrekt darstellen zu können)
-> Wegfindung
-> Kombinationssystem
-> Itemtasche
->
-> und (leider) vieles mehr
PS: Grafiker sind sehr gerne gesehen und gewünscht ;D.

(Damit mir nicht gleich alle wegrennen :>, und ja das Rot kommt weg)
Ich melde mich zurück, da ich nun vom Compilerbauen erstmal genug habe. Und ich nicht untätig da sitzen will, habe ich mich gleich dazu entschlossen Gestrandet neu anzufangen. Die C# Version war leider nicht mehr praktikabel für mich, da es leider nicht auf Mac OS X lauffähig ist (wegen ZweiDe).
Naja erstmal habe ich mir den Sourcecode angesehen und musste leider feststellen dass ich doch viele Design-Fehlentscheidungen hatte. Unter anderem war die Lua Script Anbindung sehr schlampig implementiert. Das heißt es war ziemlich viel Arbeit neue Lua Scripte zu machen.
Danach habe ich einen Rewrite angefangen. Dieser ist bereits weiter (außer in einem Punkt) als die alte Version. Dieser hat einen sauber programmierten Lua Kern. Das heißt dass jedes Objekt mit jedem Objekt kommunizieren kann. Durch XML kann man auch weitere Einstellungen vornehmen. Im Moment ist ALLES veränderbar.
Naja für die die die (whoa 3 die's hintereinander) ersten Einträge nicht gelesen haben. Gestrandet ist ein Überlebensspiel auf einer einsamen Insel. Hierbei muss man überleben und schauen möglichst lange zu überleben. Das Ziel ist es von der Insel wegzukommen. Nebenbei kann man durch ein großes Arsenal an Waffen (welche man sich selber bauen kann) bestimmte Dinge tun. Einerseits kann man Tiere abschießen, Bäume um deren Früchte erleichtern oder einfach nur alles niedermetzeln, was einem in die Quere kommt

Das Wasser ist auch eines meiner Prachtstücke - basierend auf dem Wellensystem von Noobody (danke übrigens) -habe ich mir sowas gebaut (natürlich 100% in Lua). Der Kartengenerator generiert auch bereits sehr hübsche Maps (mit Höhlen, Himmelsinseln usw.).
Anders als dessen Vorgänger, wird es keinen Mapeditor geben. Jede Karte wird zufällig generiert. Dies hat den Vorteil, dass ich weniger Arbeit habe (hrr hrr) und dass Spieler jedes mal ein anderes Spielgefühl haben. Das heißt aber auch, dass es sehr große Spielewelten geben kann.
Bereits eingebaute Features:
-> Zerstörbare und Skinbare Landschaft
-> Spieler Beweg Dingsi
-> Objektverwaltung
-> Objekt<->Objekt/Objekt<->Terrain Kollision
-> Lokalisierung
-> Wasser inkl. Wellenberechnung
-> Hochdynamische Levelgenerierung
-> Bedürfnisse
-> GUI
-> Palmen (OHA)
-> Partikelengine
-> Speichern/Laden
ToDo:
-> Viele Objekte
-> Viele Tiere
-> Viele andere Dinge die gescriptet werden müssen (Ebbe/Flut, Tag/Nacht, ...)
-> Onlinemodus (alles ist so aufgebaut, dass es eigentlich leicht sein müsste dies einzubauen)
-> Animationssystem
-> Lua Funktionen implementieren
-> Eventuell Licht/Schatten System (um Tag/Nacht korrekt darstellen zu können)
-> Wegfindung
-> Kombinationssystem
-> Itemtasche
->
-> und (leider) vieles mehr
PS: Grafiker sind sehr gerne gesehen und gewünscht ;D.
Lauf C#, Lauf!

Hallo, Gestrandet ist tot.
...
Nein ist es natürlich nicht. Ich werde es komplett neu schreiben. Diesmal allerdings nicht in BlitzMax sondern in C# mit der sagenhaften ZweiDe von Fetze.
Wieso dieser wechsel? Ganz einfach: Ich will neue Sachen ausprobieren, und nicht immer dasselbe. Außerdem habe ich das Gefühl dass es in C# "sauberer" ist. Also keine schmutzige Globale Variablen etc.
Tja und da diese Worklogs nur für BB/BMax Sachen ist, wird dieser natürlich nicht mehr verwendet...
...
Nein ist es natürlich nicht. Ich werde es komplett neu schreiben. Diesmal allerdings nicht in BlitzMax sondern in C# mit der sagenhaften ZweiDe von Fetze.
Wieso dieser wechsel? Ganz einfach: Ich will neue Sachen ausprobieren, und nicht immer dasselbe. Außerdem habe ich das Gefühl dass es in C# "sauberer" ist. Also keine schmutzige Globale Variablen etc.
Tja und da diese Worklogs nur für BB/BMax Sachen ist, wird dieser natürlich nicht mehr verwendet...
Wegfindung ftw!

Hallo meine treuen (oder auch nicht so treuen ...) Leser!
Nun möchte ich ein kleines Wort über ein Thema sprechen welches mir ausgesprochen Anspruchsvoll erscheint, nämlich das Wegfinden eines nicht gesteuerten Spielers.
Doch warum zur Hölle sollte ich sowas machen wollen, es geht doch nur um _einen_ Gestrandeten? Es geht eben nicht um einen Gestrandeten. Ich werde es hier mehr wie in "Die Sims" machen, dass es mehrere Charaktere auf einer Insel gibt. Doch ist nur einer dieser Charaktere wirklich spielbar das heißt dass die anderen Charaktere halbwegs sinnvoll von A nach B kommen müssen.
Außerdem wäre es nicht schlecht wenn es die Möglichkeit gäbe einem Gefährten bestimmte Aufgaben zu geben wir (sammle Holz, mache Feuer oder gehe Jagen) sowas würde eine Erleichterung für den Spieler sein. Außerdem wäre es möglich ein Eingeborenen Dorf zu erstellen welches sich autonom mit Nahrungsmittel versorgen kann, quasi eine eigene kleine Welt. Aber das ist reine Zukunftmusik, wäre allerdings sehr interessant zu implementieren.
Tja im Prinzip wäre das eine leichte Angelegenheit, wenn die Karte nur aus einer Ebene besteht. Aber leider ist sie das nicht. Es gibt viele Krater und Hindernisse. Darum muss ein Wegfindungs Algorithmus her, und diesen versuche ich euch näher zu bringen. Eines vorweg dieser Algorithmus ist noch nicht implementiert, ich werde versuchen diesen in haher Zukunft zu implementieren. Schwierig wird es vorallem dann, wenn während man zum Ziel geht sich etwas in den Weg stellt (eine Krater entsteht oder so) weil da der gesamte Algorithmus neu berechnet werden muss.
Als erstes habe ich mir die Karte angeschaut. Eine Karte besteht im Prinzip aus "fest" und "nicht fest" das heißt es ist eigentlich eine Tilemap welche aus 1*1 große Tiles besteht. Doch leider gibt es so gut wie keinen Wegfindungs Algorthmus der in solch großen Abständen halbwegs schnell den Weg findet. Das heißt die Karte muss "ungenauer" gemacht werden damit ein halbwegs schneller Wegfindungs Algorithmus möglich ist. Danach kann man einen normalen A* Wegfindungs Algorthmus verwenden, wobei jedes Tile seine eigenen Wert hat (in der Luft fliegen "kostet" mehr als an Land gehen) dadurch entsteht automatisch die Eigenschaft dass nur dann gesprungen wird, sobald es WIRKLICh notwendig ist, da ja das Springen kostet.
Ja im Prinzip ist das der Algorthmus, wie ich die Karte ungenauer mache werde ich mir noch überlegen, wahrscheinlich wird sie einfach in eine 8*8 große Matrix aufgeteilt und wenn mehr als 8 Pixel in diesem Quadrat fest sind, ist dieser Punkt auch Fest ansonsten ist er nicht fest.
Ich hoffe das war nun nicht zuviel Text
Nun möchte ich ein kleines Wort über ein Thema sprechen welches mir ausgesprochen Anspruchsvoll erscheint, nämlich das Wegfinden eines nicht gesteuerten Spielers.
Doch warum zur Hölle sollte ich sowas machen wollen, es geht doch nur um _einen_ Gestrandeten? Es geht eben nicht um einen Gestrandeten. Ich werde es hier mehr wie in "Die Sims" machen, dass es mehrere Charaktere auf einer Insel gibt. Doch ist nur einer dieser Charaktere wirklich spielbar das heißt dass die anderen Charaktere halbwegs sinnvoll von A nach B kommen müssen.
Außerdem wäre es nicht schlecht wenn es die Möglichkeit gäbe einem Gefährten bestimmte Aufgaben zu geben wir (sammle Holz, mache Feuer oder gehe Jagen) sowas würde eine Erleichterung für den Spieler sein. Außerdem wäre es möglich ein Eingeborenen Dorf zu erstellen welches sich autonom mit Nahrungsmittel versorgen kann, quasi eine eigene kleine Welt. Aber das ist reine Zukunftmusik, wäre allerdings sehr interessant zu implementieren.
Tja im Prinzip wäre das eine leichte Angelegenheit, wenn die Karte nur aus einer Ebene besteht. Aber leider ist sie das nicht. Es gibt viele Krater und Hindernisse. Darum muss ein Wegfindungs Algorithmus her, und diesen versuche ich euch näher zu bringen. Eines vorweg dieser Algorithmus ist noch nicht implementiert, ich werde versuchen diesen in haher Zukunft zu implementieren. Schwierig wird es vorallem dann, wenn während man zum Ziel geht sich etwas in den Weg stellt (eine Krater entsteht oder so) weil da der gesamte Algorithmus neu berechnet werden muss.
Als erstes habe ich mir die Karte angeschaut. Eine Karte besteht im Prinzip aus "fest" und "nicht fest" das heißt es ist eigentlich eine Tilemap welche aus 1*1 große Tiles besteht. Doch leider gibt es so gut wie keinen Wegfindungs Algorthmus der in solch großen Abständen halbwegs schnell den Weg findet. Das heißt die Karte muss "ungenauer" gemacht werden damit ein halbwegs schneller Wegfindungs Algorithmus möglich ist. Danach kann man einen normalen A* Wegfindungs Algorthmus verwenden, wobei jedes Tile seine eigenen Wert hat (in der Luft fliegen "kostet" mehr als an Land gehen) dadurch entsteht automatisch die Eigenschaft dass nur dann gesprungen wird, sobald es WIRKLICh notwendig ist, da ja das Springen kostet.
Ja im Prinzip ist das der Algorthmus, wie ich die Karte ungenauer mache werde ich mir noch überlegen, wahrscheinlich wird sie einfach in eine 8*8 große Matrix aufgeteilt und wenn mehr als 8 Pixel in diesem Quadrat fest sind, ist dieser Punkt auch Fest ansonsten ist er nicht fest.
Ich hoffe das war nun nicht zuviel Text

Es werde Licht!

Hallo,
nun habe ich mich einem Effekt gewidmet, der eigentlich recht simpel ist. Es geht um das Beleuchtungssystem, welches besonders in der Nacht zur Geltung kommt.
Das heißt als nächstes kommt das Uhrzeit System.
Im Prinzip ist es einfach, also Shadeblend setzen, Bild zeichnen fertig. War es praktisch eigentlich auch. Ich musste allerdings aufpassen dass das HUD(nicht HID ;>) nicht auch einen Schatteneffekt bekommt.
Das heißt es gibt 10 neue Befehle:
lightSetAmbient(r,g,b,Alpha) -- Setzt die Globale Beleuchtung
lightCreate(x,y,radius) -- Erzeugt ein Licht
lightRemove(id) -- Löscht ein Licht
lightPosition(id,x,y) -- Setzt die Position von einem Licht
lightSetRange(id,range) -- Setzt den Licht Radius
lightSetColor(id,r,g,b) -- Setzt die Licht Farbe
lightrender() -- Rendert alle sichtbaren Lichter
lightShow(id) -- zeigt ein Licht
lightHide(id) -- Versteckt ein Licht
isTemplate(id) -- Gibt zurück ob ein objekt ein Template ist, also quasi eine Schablone
Edit: Da habe ich fast vergessen ein Bild zu machen:
mfg
Robert
nun habe ich mich einem Effekt gewidmet, der eigentlich recht simpel ist. Es geht um das Beleuchtungssystem, welches besonders in der Nacht zur Geltung kommt.
Das heißt als nächstes kommt das Uhrzeit System.
Im Prinzip ist es einfach, also Shadeblend setzen, Bild zeichnen fertig. War es praktisch eigentlich auch. Ich musste allerdings aufpassen dass das HUD(nicht HID ;>) nicht auch einen Schatteneffekt bekommt.
Das heißt es gibt 10 neue Befehle:
lightSetAmbient(r,g,b,Alpha) -- Setzt die Globale Beleuchtung
lightCreate(x,y,radius) -- Erzeugt ein Licht
lightRemove(id) -- Löscht ein Licht
lightPosition(id,x,y) -- Setzt die Position von einem Licht
lightSetRange(id,range) -- Setzt den Licht Radius
lightSetColor(id,r,g,b) -- Setzt die Licht Farbe
lightrender() -- Rendert alle sichtbaren Lichter
lightShow(id) -- zeigt ein Licht
lightHide(id) -- Versteckt ein Licht
isTemplate(id) -- Gibt zurück ob ein objekt ein Template ist, also quasi eine Schablone
Edit: Da habe ich fast vergessen ein Bild zu machen:

mfg
Robert
Was schon wieder ein Spiel von Coolo...?


Damit mir die Benutzer nicht davonlaufen

Das HUD ist natürlich 100% geskriptet, die Zeit Anzeige Rechts ist noch Leer, wird aber bald geändert.
Der Spieler ist noch eine Ellipse weil ich keine Spieler Grafik zur Hand habe.
Hallo,
nunja hier wieder ein Worklog von mir. Diesmal ist es kein klon von einem Spiel, nein es ist ein Klon von ZWEI Spielen!
Die erste Frage welche ihr euch bestimmt als erstes stellt ist, was wurde aus Dark Jump? Nunja die Engine selber ist zu 95% fertig und es fehlt lediglich Inhalt, aber da ich im Grafiken (und vorallem Animationen) erstellen eine Null bin ist es vorerst auf Eis gelegt.
Was ist Gestrandet? Gestrandet ist eine Mischung aus Stranded (Vorallem die zweite Version) und CarnageContest. Das Spiel ansich wird also quasi eine Überlebenssimulation im Worms Style sein. Einen Multiplayer Modus wird es mit Sicherheit nicht geben, weshalb kommt später.
Außerdem ist es im Gegensatz zu Stranded mehr auf Action setzen, das heißt man wird um einiges öfter von wilden Tieren angegriffen usw (Der Löwe lässt grüßen ;>). Das kam mir in Stranded2 einwenig zu kurz.
Die Geschichte von Gestrandet Vor einem Jahr, als ich ein junger Hüpfer war *hust*, hatte ich einige Gedanken über ein Stranded2 in 2D. Also quasi ein Stranded2D

Doch nun vor 2 1/2 Monaten kam mir wieder der Gedanke- mitten in einem CarnageContest Match - das es doch Super wäre wenn es ein CarnageStranded gäbe. Gesagt getan zuerst habe ich mir einem MapLib geschrieben welche zerstörbare Terrains unterstützt (das Bild wird in kleine 96*96 große Einzelbilder zerlegt). Danach habe ich mir SimpleScriptMax hergenommen und implementiert. Doch hier der erste Rückschlag Simple Script Max war schon bei wenigen Objekten (20-30) einfach zu langsam, es war nicht erträglich was natürlich für mich als Entwickler weniger gut war. Somit habe ich mich schweren Herzens dazu entschlossen Lua zu verwenden (auch wenn ich immernoch ein wenig abgeneigt bin von dieser Sprache). Tja dann nahmen die Dinge ihren Lauf, der Mapeditor ist entstanden (noch in einer sehr frühen Phase) usw.
Nun ist es soweit, dass es bereits ans Content erstellen geht (also den Grundstock) und den Mapeditor ausbauen(kann im Moment nur Objekte plazieren).
Die Technik von Gestrandet
- Gestrandet hat eine zerstörbare Karte auf Pixel Basis. Das heißt man kann wie in Worms die gesamte Landschaft zerstören, anmalen whatever. Außerdem wird die Map automatisch texturiert.
- Gestrandet basiert zu 99.9% auf Lua Scripts, der Spieler selbst ist ein Lua Script. Verwaltet werden die Scripts allerdings von der Spiel Engine
- Einfachere Definitionen werden in der game.def festgelegt, hier werden außerdem die Scripts usw. deklariert
- Vollkommen Sprachunabhängig das Spiel selber hat Language Paks welche die Sprache beinhalten, im Moment ist eine Deutsche und Englische Version geplant.
- Dynamische Player Controller Engine, das sind die Figuren welche sich Bewegen können, es wird außerdem geplant sein dass es Physik objekte geben wird(simple Physik also)
- Eigens Programmierte GUI und Partikel System
- Schon über 150 Lua Skript Befehle (decken praktisch alles ab was man braucht)
- Mapeditor zum einfachen platzieren von Objekten usw.
- Speichern Laden Routine (sehr langweilig zu implementieren

Auf meiner ToDo Liste stehen noch über 25 Dinge aber folgende Sachen möchte ich in naher Zukunft schaffen:
- Basis Objekte implementieren (Unterschlupf, Tiere usw)
- Licht System (aber ohne Schatten)
- Physik Objekte
- Lua Funktionen fertig implementieren
- Mapeditor benutzbarer machen
- Animationssystem
Hier ist noch ein Bild aus einer älteren Version:

Hier das Skript für die Palmen:
Code: [AUSKLAPPEN]
game.palm={}
palmImage1=TImage.create()
palmImage1:loadFromIni("palm1")
palmImage1:handle(32,92)
palmImage2=TImage.create()
palmImage2:loadFromIni("palm2")
palmImage2:handle(32,116)
function game.palm.update(id)
local move=false
while checkMapCollision(getX(id),getY(id))==0 do
setY(id,getY(id)+1)
move=true
end
if move then
game.palm[id].rotation=getMapAngle(getX(id),getY(id))
end
--im Wind wiegen
if game.palm[id].winddir==0 then
game.palm[id].wind=game.palm[id].wind+.1
elseif game.palm[id].winddir==1 then
game.palm[id].wind=game.palm[id].wind-.1
end
if game.palm[id].wind>10 then
game.palm[id].winddir=1
elseif game.palm[id].wind<-10 then
game.palm[id].winddir=0
end
end
function game.palm.render(id)
local selectImage=palmImage1
local x=getObjectRelativeX(id)
local y=getObjectRelativeY(id)
info=game.palm[id].palm
if info==1 then
selectImage=palmImage1
elseif info==2 then
selectImage=palmImage2
end
selectImage:position(x,y)
selectImage:setRotation(game.palm[id].rotation+game.palm[id].wind)
selectImage:draw()
end
function game.palm.create(id)
local palmtyp
if getName(id)=="palm1" then
palmtyp=1
elseif getName(id)=="palm2" then
palmtyp=2
end
game.palm[id]={}
game.palm[id]={wind=0, winddir=0,rotation=0,palm=palmtyp}
end
function game.palm.load(id) --Wird beim laden aufgerufen
game.palm[id]={}
game.palm[id]={wind=0, winddir=0,rotation=0,palm=palmtyp}
game.palm[id].wind=loadNumber()
game.palm[id].winddir=loadNumber()
game.palm[id].rotation=loadNumber()
game.palm[id].palm=loadNumber()
end
function game.palm.save(id)
saveNumber(game.palm[id].wind)
saveNumber(game.palm[id].winddir)
saveNumber(game.palm[id].rotation)
saveNumber(game.palm[id].palm)
end
function game.palm.remove(id)
end
function game.palm.editorRender(id)
local selectimage
if getEditorSelect()=="palm1" then
selectImage=palmImage1
elseif getEditorSelect()=="palm2" then
selectImage=palmImage2
end
local x=mouseX()
local y=mouseY()
while checkMapCollision(x+getScrollX(),y+getScrollY())==0 do
y=y+1
end
rot=getMapAngle(x+getScrollX(),y+getScrollY())
selectImage:setRotation(rot)
selectImage:setAlpha(.7)
selectImage:position(x,y)
selectImage:draw()
setX(id, x+getScrollX())
if mouseHit(1)==1 then
setX(id,getScrollX()+mouseX())
setY(id,getScrollY()+mouseY())
return 1
end
return 0
end
palmImage1=TImage.create()
palmImage1:loadFromIni("palm1")
palmImage1:handle(32,92)
palmImage2=TImage.create()
palmImage2:loadFromIni("palm2")
palmImage2:handle(32,116)
function game.palm.update(id)
local move=false
while checkMapCollision(getX(id),getY(id))==0 do
setY(id,getY(id)+1)
move=true
end
if move then
game.palm[id].rotation=getMapAngle(getX(id),getY(id))
end
--im Wind wiegen
if game.palm[id].winddir==0 then
game.palm[id].wind=game.palm[id].wind+.1
elseif game.palm[id].winddir==1 then
game.palm[id].wind=game.palm[id].wind-.1
end
if game.palm[id].wind>10 then
game.palm[id].winddir=1
elseif game.palm[id].wind<-10 then
game.palm[id].winddir=0
end
end
function game.palm.render(id)
local selectImage=palmImage1
local x=getObjectRelativeX(id)
local y=getObjectRelativeY(id)
info=game.palm[id].palm
if info==1 then
selectImage=palmImage1
elseif info==2 then
selectImage=palmImage2
end
selectImage:position(x,y)
selectImage:setRotation(game.palm[id].rotation+game.palm[id].wind)
selectImage:draw()
end
function game.palm.create(id)
local palmtyp
if getName(id)=="palm1" then
palmtyp=1
elseif getName(id)=="palm2" then
palmtyp=2
end
game.palm[id]={}
game.palm[id]={wind=0, winddir=0,rotation=0,palm=palmtyp}
end
function game.palm.load(id) --Wird beim laden aufgerufen
game.palm[id]={}
game.palm[id]={wind=0, winddir=0,rotation=0,palm=palmtyp}
game.palm[id].wind=loadNumber()
game.palm[id].winddir=loadNumber()
game.palm[id].rotation=loadNumber()
game.palm[id].palm=loadNumber()
end
function game.palm.save(id)
saveNumber(game.palm[id].wind)
saveNumber(game.palm[id].winddir)
saveNumber(game.palm[id].rotation)
saveNumber(game.palm[id].palm)
end
function game.palm.remove(id)
end
function game.palm.editorRender(id)
local selectimage
if getEditorSelect()=="palm1" then
selectImage=palmImage1
elseif getEditorSelect()=="palm2" then
selectImage=palmImage2
end
local x=mouseX()
local y=mouseY()
while checkMapCollision(x+getScrollX(),y+getScrollY())==0 do
y=y+1
end
rot=getMapAngle(x+getScrollX(),y+getScrollY())
selectImage:setRotation(rot)
selectImage:setAlpha(.7)
selectImage:position(x,y)
selectImage:draw()
setX(id, x+getScrollX())
if mouseHit(1)==1 then
setX(id,getScrollX()+mouseX())
setY(id,getScrollY()+mouseY())
return 1
end
return 0
end
Und hier für den Spieler:
Code: [AUSKLAPPEN]
game.player={}
hunger=100.0
thirst=100.0
energy=100.0
comfort=100.0
life=100.0
needWindow=guiCreateWindow()
guiSetGadget(needWindow,0,0,155,86)
hungerGadget=guiCreateRow(needWindow,getLanguage("hunger"))
guiSetRowColor(hungerGadget,255,0,0)
thirstGadget=guiCreateRow(needWindow,getLanguage("thirst"))
guiSetRowColor(thirstGadget,0,0,255)
energyGadget=guiCreateRow(needWindow,getLanguage("energy"))
guiSetRowColor(energyGadget,0,255,0)
comfortGadget=guiCreateRow(needWindow,getLanguage("comfort"))
guiSetRowColor(comfortGadget,255,0,255)
lifeGadget=guiCreateRow(needWindow,getLanguage("life"))
guiSetRowColor(lifeGadget,0,255,255)
function game.player.update(id)
scrollToPosition(getX(id)-getScreenWidth()/2,getY(id)-getScreenHeight()/2)
if keyDown(KEY_LEFT)==1 then
controllerGoLeft(id)
elseif keyDown(KEY_RIGHT)==1 then
controllerGoRight(id)
end
if keyHit(KEY_SPACE)==1 then
controllerGoJump(id)
end
if currentGameState()==2 then
game.player.updateInEditor()
else
game.player.updateInGame()
end
x=getX(id)
calculateMovement(id)
end
function game.player.render(id)
local x=getObjectRelativeX(id)
local y=getObjectRelativeY(id)
setColor(255,0,0)
drawOval(x+1,y+1,8,32)
setColor(255,255,255)
if currentGameState()==2 then
game.player.renderInEditor()
else
game.player.renderInGame()
end
if mouseDown(1)==1 then
game.player[id].toX=tonumber((mouseX()+getScrollX())/2)*2
game.player[id].toY=tonumber((mouseY()+getScrollY())/2)*2
end
end
function game.player.create(id)
createController(id)
controllerSetSpeed(id, 2)
controllerSetMaxJump(id, 18)
game.player[id]={toX=0,toY=0,dir=0,jump=0}
end
function game.player.load(id)
game.player.create(id)
end
function game.player.save(id)
end
function game.player.remove(id)
end
function game.player.updateInEditor(id)
end
function game.player.renderInEditor(id)
guiHideGadget(needWindow)
end
function game.player.updateInGame(id)
--Bedürfnisse umrechnen
relHunger=hunger/100.0*150.0
guiSetGadget(hungerGadget,2,2,relHunger,14)
relThirst=thirst/100.0*150.0
guiSetGadget(thirstGadget,2,18,relThirst,14)
relEnergy=energy/100.0*150.0
guiSetGadget(energyGadget,2,18+14+2,relEnergy,14)
relComfort=comfort/100.0*150.0
guiSetGadget(comfortGadget,2,18+14*2+4,relComfort,14)
relLife=life/100.0*150.0
guiSetGadget(lifeGadget,2,18+14*3+6,relLife,14)
--Bedürfnisse sinken lassen
hunger=hunger-.02
thirst=thirst-.03
energy=energy-.01
comfort=comfort-.015
if hunger>100 then hunger=100 end
if thirst>100 then thirst=100 end
if energy>100 then energy=100 end
if life>100 then life=100 end
--Life ändern
if hunger<0 then
hunger=0
life=life-.05
end
if thirst<0 then
thirst=0
life=life-.05
end
if energy<0 then
energy=0
life=life-.05
end
if comfort<0 then
comfort=0
life=life-.05
end
end
function game.player.renderInGame(id)
end
function game.player.changeNeed(id, val)
if id==0 then
hunger=hunger+val
elseif id==1 then
thirst=thirst+val
elseif id==2 then
energy=energy+val
elseif id==3 then
comfort=comfort+val
elseif id==4 then
life=life+val
end
end
function game.player.goToPosition(x,y)
game.player[id].toX=x
game.player[id].toY=y
end
hunger=100.0
thirst=100.0
energy=100.0
comfort=100.0
life=100.0
needWindow=guiCreateWindow()
guiSetGadget(needWindow,0,0,155,86)
hungerGadget=guiCreateRow(needWindow,getLanguage("hunger"))
guiSetRowColor(hungerGadget,255,0,0)
thirstGadget=guiCreateRow(needWindow,getLanguage("thirst"))
guiSetRowColor(thirstGadget,0,0,255)
energyGadget=guiCreateRow(needWindow,getLanguage("energy"))
guiSetRowColor(energyGadget,0,255,0)
comfortGadget=guiCreateRow(needWindow,getLanguage("comfort"))
guiSetRowColor(comfortGadget,255,0,255)
lifeGadget=guiCreateRow(needWindow,getLanguage("life"))
guiSetRowColor(lifeGadget,0,255,255)
function game.player.update(id)
scrollToPosition(getX(id)-getScreenWidth()/2,getY(id)-getScreenHeight()/2)
if keyDown(KEY_LEFT)==1 then
controllerGoLeft(id)
elseif keyDown(KEY_RIGHT)==1 then
controllerGoRight(id)
end
if keyHit(KEY_SPACE)==1 then
controllerGoJump(id)
end
if currentGameState()==2 then
game.player.updateInEditor()
else
game.player.updateInGame()
end
x=getX(id)
calculateMovement(id)
end
function game.player.render(id)
local x=getObjectRelativeX(id)
local y=getObjectRelativeY(id)
setColor(255,0,0)
drawOval(x+1,y+1,8,32)
setColor(255,255,255)
if currentGameState()==2 then
game.player.renderInEditor()
else
game.player.renderInGame()
end
if mouseDown(1)==1 then
game.player[id].toX=tonumber((mouseX()+getScrollX())/2)*2
game.player[id].toY=tonumber((mouseY()+getScrollY())/2)*2
end
end
function game.player.create(id)
createController(id)
controllerSetSpeed(id, 2)
controllerSetMaxJump(id, 18)
game.player[id]={toX=0,toY=0,dir=0,jump=0}
end
function game.player.load(id)
game.player.create(id)
end
function game.player.save(id)
end
function game.player.remove(id)
end
function game.player.updateInEditor(id)
end
function game.player.renderInEditor(id)
guiHideGadget(needWindow)
end
function game.player.updateInGame(id)
--Bedürfnisse umrechnen
relHunger=hunger/100.0*150.0
guiSetGadget(hungerGadget,2,2,relHunger,14)
relThirst=thirst/100.0*150.0
guiSetGadget(thirstGadget,2,18,relThirst,14)
relEnergy=energy/100.0*150.0
guiSetGadget(energyGadget,2,18+14+2,relEnergy,14)
relComfort=comfort/100.0*150.0
guiSetGadget(comfortGadget,2,18+14*2+4,relComfort,14)
relLife=life/100.0*150.0
guiSetGadget(lifeGadget,2,18+14*3+6,relLife,14)
--Bedürfnisse sinken lassen
hunger=hunger-.02
thirst=thirst-.03
energy=energy-.01
comfort=comfort-.015
if hunger>100 then hunger=100 end
if thirst>100 then thirst=100 end
if energy>100 then energy=100 end
if life>100 then life=100 end
--Life ändern
if hunger<0 then
hunger=0
life=life-.05
end
if thirst<0 then
thirst=0
life=life-.05
end
if energy<0 then
energy=0
life=life-.05
end
if comfort<0 then
comfort=0
life=life-.05
end
end
function game.player.renderInGame(id)
end
function game.player.changeNeed(id, val)
if id==0 then
hunger=hunger+val
elseif id==1 then
thirst=thirst+val
elseif id==2 then
energy=energy+val
elseif id==3 then
comfort=comfort+val
elseif id==4 then
life=life+val
end
end
function game.player.goToPosition(x,y)
game.player[id].toX=x
game.player[id].toY=y
end
mfg
Coolo (ich hoffe DC ist mir nicht böse

PS: Das ist KEIN April Scherz