Gestrandet Unlimited

Kommentare anzeigen Worklog abonnieren

Worklogs Gestrandet Unlimited

Auftrieb und Inventar

Samstag, 5. November 2011 von coolo
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?

user posted image
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.

user posted image
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 Smile!
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.

user posted image
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.)

user posted image
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:

user posted image
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 Very Happy) aber es wirkt einigermaßen korrekt.

Tja dies habe ich die letzten paar Tage gemacht!

MfG!

Grafik Verbesserungen!

Montag, 31. Oktober 2011 von coolo
Servus!

Gestrandet ist wieder ziemlich weit gekommen - doch gehen wir der Reihe nach, was alles nun im Spiel ist!

user posted image
Eine Untergrundtextur ist nun eingebaut!

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

user posted image
Ein Verlauf als Hintergrund!

user posted image
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!

user posted image
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.

user posted image
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

Samstag, 22. Oktober 2011 von coolo
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 Razz).
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)

user posted image
Spielerstapelung dank schnellem Kollisionssystem ohne weiteres möglich

user posted image
2400 Palmen ohne weiteres möglich.

user posted image
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!

Donnerstag, 25. November 2010 von coolo
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).
user posted image
(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>


*) 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):
user posted image

*) 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!

Montag, 25. Oktober 2010 von coolo
user posted image
GEILE GRAFIK
user posted image
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!

Donnerstag, 21. Oktober 2010 von coolo
Guten Abend!
user posted image
(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 Very Happy. 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.

Lauf C#, Lauf!

Mittwoch, 2. Juni 2010 von coolo
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...

Wegfindung ftw!

Mittwoch, 7. April 2010 von coolo
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 Smile

Es werde Licht!

Freitag, 2. April 2010 von coolo
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: user posted image

mfg
Robert

Was schon wieder ein Spiel von Coolo...?

Donnerstag, 1. April 2010 von coolo
user posted image
Damit mir die Benutzer nicht davonlaufen Very Happy.
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 Very Happy. Also gedacht getan habe ich mich hingesetzt und mit BB einige Tests durchgeführt. Doch leider waren dieser nicht sehr vielversprechend, vorallem die Tatsache dass es mir zu wenig "eigenständig" war, es sollte eben kein billiger Stranded/Schiffbruch Klon sein.
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 Wink)


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:
user posted image

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


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


mfg
Coolo (ich hoffe DC ist mir nicht böse Smile)

PS: Das ist KEIN April Scherz