Diggerz

Kommentare anzeigen Worklog abonnieren

Worklogs Diggerz

Unter der haube... Fällt der apfel

Sonntag, 8. März 2009 von AnniXa
... Habe ich nun einiges verändert,jedoch kann man davon eigentlich nichts sehen, das Fallverhalten der Objekte wird nun nichtmehr über einen Array´s verwaltet, nun werden die daten in Types gespeichert, allgemein ist mein nächstes Ziel ein etwas realistischeres und dennoch Ressourcensparendes fallverhalten der Objekte zu basteln.
Derzeit werden objekte einfach so lange nach unten bewegt bis sie ein objekt berüren das als untergrund definiert ist, z.B. den boden, oder auch den boden von der Lore oder eines festen objektes.
Das ganze wurde vorher über einen Array geregeld in dem die EntityID´s der objekte gelistet waren, diese liste ist nun Type basierend.

Stapelt man Objekte aufeinander, also so zum beispiel:

OO
OOO

Werden die beiden oberen objekte dauerhaft nach untenbewegt, mann sieht es natürlich nicht, da die blitz interne kollisionskontrolle das nichtzuläst (modus slide).
aber wenn der Spieler nun just4fun viele dinge aufeinanderstapelt, könnten es bald viele Objekte sein die sinnloser weise eine "translateentity nach unten" Order bekommen.
deswegen möchte ich das es so erweitern das wenn ein objekt sich über einen zeitraum nicht nach unten bewegt hat (weil es eben nicht konnte) das es dann auch aus der Liste der fallenden Objekte herausgenommen wird, und somit nicht mehr nach unten bewegt wird.
Das klingt soweit ganz simpel, wenn der spieler dann jedoch darunter liegende Objekte entfernen würde, würde das oben liegende Objekt dann schweben.

Erst wollte ich, das wenn ich ein Objekt wieder in die liste der fallenden Objekte einfüge, dieses dann vorherst alle Objekte die es berüren ebenfalls in die Liste mit einträgt, in einem kurzen Test hat dies jedoch nicht funktioniert, da die kollision ja nur bei Bewegung greift.

Meine alternativ idee ist, das wenn ein Objekt fällt, und es mit einem anderem kollidiert, und dieses andere ebenfalls ein bewegliches Objekt ist, dieses dann eine art "fingerabdruck" erhält, das dieses Objekt also von dem anderem fallenden wärend seines fallweges berürt wurde, und somit ein potentieller verdächter ist ein objekt zu sein auf dem ein anderse objekt liegen könnte, die idee war nun dass das Objekt A (das fallende) dem Objekt B (das unten liegende) nun irgendwie einen fingerabdruck aufdrückt, und wenn nun irgendwann einmal Objekt B in die liste der fallenden Objekte aufgenommen wird, werden auch alle Objekte auf "fallend" gesetzt welche Objekt B auf ihrem fallweg berührt haben, (da sie ja im verdacht liegen auf objekt B draufzuliegen).

Daher die frage, ist dies vieleicht ein etwas Übertriebener Ansatzpunkt?
Habe ich etwas übersehen, oder gibt es einen viel simpleren weg das umzusetzen?

Ansonsten hatte ich diese Woche leider kaum Zeit.

Konsolen für das volk, und dateikram.

Freitag, 27. Februar 2009 von AnniXa
Tadaima

Leider habe ich nicht soviel Zeit diese und kommende Woche da beruflich etwas mehr los ist, aber ein bischen was machen kann ich ja vieleicht, malsehen.
Nun habe ich mal etwas relativ simples gemacht, eine art "Konsole" für mich das ich beim testen und so weiter mir text und status ausgaben machen kann, hatte ich ja schon,
mit dem befehl message("blablabla",1) hatte ich somit immer eine schöne alternative zum
print "bla"
waitkey
Nun dachte ich mir, ich warum das nicht etwas schöner verpacken und auch als info Ausgabe für den Spieler aufbereiten, gemacht getan, unten links die Spielervariante, oben rechts die Debug version.
Wenn ich nun Message ("",3) sage geht es auch in die untere konsole, zudem schneidet sie die ersten beiden Zeichen aus, wandelt sie in int um, und erhält daraus X Koordinaten wo aus meiner Grafikdatei, in welcher alle icons etc drin sind, ein icon mit draw3d´s "DrawRect3d" ausgeschnitten werden soll.

Dazu habe ich diese kleine Grafik, auf der sich alle möglichen Icons etc. welche im HUD und in den menus dargestellt werden sammeln:

user posted image


Und desweiteren habe ich nun noch kurz eine Funktion geschrieben das ich fix daten aus meiner config.cfg Datei laden kann, das ist einfach ne Textdatei im Spiel ordner wo ich Einstellungen vornehmen kann,

Falls sie jemand haben möchte, oder vieleicht noch verbesserungs ideen hat:

es gibt 2 funktionen hierdrin LadeWertAusDatei$(wert$,datei$)
damit kann man einen wert laden, welcher in diesem Format in der datei$ stehen sollte:
FullScreen=1

und gleich für dinge die man vllt öfter braucht, gibt es "getConfig(wert$)"
die übergibt wert direkt weiter an LadeWertAusDatei und gibt als datei$ "config.cfg" an

Code: [AUSKLAPPEN]

Function LadeWertAusDatei$(wert$,datei$)
; holt wert$ aus datei$ und gibt den wert zurück
; werte sollten in format name=wert in der datei stehen.
; kommt ein wert mehrmals vor wird nur der erste in der datei gefundene genommen.
; kommt ein wert nicht vor wird 0 zurückgegeben.
; achtung in dateien ist alles CasE SenSitIvE
; internes: Stream = dateihandle.
Stream = ReadFile (datei$);
If Stream = 0 ; die datei öffnen,wenn nich dann return und fehlermeldung
   Message ("Die datei:" + datei$ + " konnte nicht gefunden werden.")
   return 0
EndIf

While Not Eof (Stream) ;diese schleife wiederholen bis Eof (ende der datei Stream) true ist.
   ;eine zeile lesen, und herausfinden was in der zeile vor dem "=" ist:
   zeile$ = ReadLine (Stream)                   ; aktuelle zeile lesen.
   pos = Instr (zeile$,"=" ,1)                 ; in der ebend gelesen zeile nach einem "=" suchen, und die stelle in pos merken.
   eigenschaft$ = Left$ (zeile$, pos-1)          ; nun nur den teil links neben dem "=" auschneiden.
   If eigenschaft$ = wert$   Then                ; wenn eigenschaft = dem gefragten wert dann...
   ergebniss$ = Right (zeile$, Len(zeile$) - pos)   ; den wert aus dem string ausschneiden... (also alles rechts dem = zeichen)
   CloseFile (Stream)                        ; die datei Stream wieder schliesen...
   Return (ergebniss$)                           ; und den wert zurückgeben
   EndIf
Wend

End Function

Function GetConfig$(wert$) ; ein kleiner umleiter für config.cfg
Return LadeWertAusDatei$(wert$,"config.cfg")
End Function




damit kann ich nun komfortabel den screen per cfg datei einstellen, z.B. so:

Code: [AUSKLAPPEN]
Graphics3D getconfig("ScreenX"), getconfig("ScreenY"), getconfig("BitsProPixel"),getconfig("FullScreen")


und die config.cfg sieht dann so aus:

ScreenX=1024
ScreenY=768
BitsProPixel=32
FullScreen=1
CreateCollisionSphere=0
TerrainLOD=7000
WalkSpeed=3
Cheat=1
DebugKonsole=1
TunnelNoClip=0

Achja und die "Spielervariante" der der Infoausgabe sieht nun so aus wie unten links,
oben rechts ist die für debug zwecke:

user posted image


Es wird zeit das ich diese Types mal erlene, ich komme damit irgendwie nicht klar,
das For - Each gedöööns errinert mich immer an SQL, und eigentlich scheint es superleicht zu sein, aber irgendwie steig ich nicht durch.

Und zu guter letzt habe ich herausgefunden das mein spiel auf meinen kleinen Acer One Laptop nicht läuft, es heist immer MaV, weil eine Textur nicht existiert, wenn ich diese mit CreateTexture erzeuge, Lade ich sie aus einer Datei geht es alles wunderbar...

Äuserst kurios

ja mata ne

The beginning ^^

Mittwoch, 25. Februar 2009 von AnniXa
Hiho, ich dachte mir, da ich ja doch es mal recht lange aushalte an einem Projekt zu arbeiten, das ich mal auch solch ein worklog anlege.

Mein Projekt ist, wie sollte es auch anders sein, ein Spiel.

Ich nenne es erstmal "Diggerz" auch wenn es vermutlich nur ein single player Spiel bleiben wird, und es somit eigentlich Digger heisen sollte.

Worum gehts?

Im groben muss man buddeln, Dinge suchen und diese verkaufen oder weiterverarbeiten.
Stark inspiriert ist das Spiel durch das Spiel "Clonk" aber auch durch das alte Amiga-spiel "Diggers" (daher auch der name) als auch ein bischen durch Dungeon Keeper.

Man buddelt also tunnel, und sucht nach mehr oder weniger wertvollen Gegenständen wie zum beispiel Gold, Metalle etc.
Dieses Gefundene kann man entweder verkaufen, und von dem Erlös sich bessere Ausrüstung zulegen, oder es zu anderen nützlichen dingen Weiterverarbeiten.

Ziel ist es einen bestimmte Zielsumme an Geld zu erreichen, einige superseltene Gegenstände zu finden und ähnliches.

Wie macht man das?

Die Steuerung ist eigentlich genau wie in einem "First Person Shooter",
nur das man nicht die Köpfe der Gegner anklicken muss, sondern das man die objekte und geräte anklicken kann um damit zu Interagieren, oder die "wand" anklicken kann um sie wegzugraben.
Fahrzeuge lassen sich schieben, Maschinen bedienen und Gegenstände lassen sich aufheben und ablegen.
Laufen mit WASD oder den Pfeiltasten, später kann man das natürlich dann irgendwo einstellen.


Wie siehts bisher aus?

Ein bild sagt mehr als Tausend worte^^ und viele Bilder wohl noch mehr.

Ich bin erstaunt über mich selbst, das ich es bisher soweit gebracht habe mit diesem Projekt,
Aktuell steht ein primitives "Gravity" System, es gibt eine kleine Minimap, schieb und ziehbare Fahrzeuge gibt es bereits:

user posted image
user posted image

Desweiteren gibt es einige Kontrollgeräte, welche mit einer art "Ringmenu" bedient werden können,
die farbe des Icons bzw des kreises darum gibt wieder ob es eine Information ist (gelb) Anklickbar (grün) Blockiert (grau) oder ein zurück bzw abrechen button (Rot) ist.

user posted image
user posted image

Ansonsten kann man es sogar schon spielen, Man kann dinge in den Aufzug laden, und diesen an die Oberwelt entsenden wo sein Inhalt verkauft und gutgeschrieben wird.

user posted image

Da es in so einem gang recht düster ist, lohnt es sich immer eine lampe dabei zu haben...

user posted image

Und das grund element des spiels: Graben ^^

user posted image

Was Kommt noch?

Geplant ist noch:
Arrow Ein statik system (also das man die tunnel auch abstützen muss da sie sonst evtl einstürzen), daran arbeite ich derzeit am meisten.
Arrow Abnutzung der Spitzhacke, jeh nach härtegrad des Materials
Arrow Schienensystem für größere selbstfahrende Fahrzeuge (ein Freund baut etwas Derartiges woran ich mich dann bedienen darf ^^)
Arrow Besseres Gravity System
Arrow Ausrüstungs system (Man kann seine figur ausrüsten mit Items wie z.B. Taschenlampe, Schuhe für schnellere Laufgeschwindigkeit etc.)
Arrow evtl. Trolle, die in das Tunnelsystem eindringen und gegenstände Klauen
Arrow Strukturen bauen, Wände bauen, Türen bauen und Geräte bauen.
Arrow Dynamit
Arrow Große Bohrmaschine für hartes material

und einiges anderes noch was in meinem kopf herumgeistert, das ich aber lieber nicht aufschreibe bzw es mir erstmal nicht vornehme, da es sonst zu viel wird...

Wo steckt der Hacken?

Der Hacken bin ich, ich bin eigentlich Sehr schlecht im Programmieren, und neige dazu alles sehr umständlich zu machen, ein beispiel ist z.B. das ich erst vor kurzen den Befehl "TurnEntity" entdeckt habe... davor habe ich immer RotateEntity benutzt, und mit EntityYaw(...)+0.5 etc gearbeitet, zudem verkrampfe ich an dein einfachsten dingen.

Womit das optische?

Für die 3d dinge nutze ich Blender, und bastel mir mit texturteilen von http://www.cgtextures.net meine texturen mit Gimp 2.6 zusammen,
bisher sind es nur 3, Alle objekte, und Fahrzeuge nutzen eine, alle großen maschinen und die steuerelemente nutzen eine, und eine dritte ist das für den boden.

Ich frage mich, macht es sinn wenn viele Objekte verschiedener art die selbe Textur benutzen? mit ein bischen intelligentem UV mapping sieht das ja auch relativ toll aus =)
ich lade die textur mit
Global OBJtextur=loadTextur("bla.png")
und weise dann mit
EntityTexture Entity, OBJtextur
die textur zu, das sehr oft, ich hoffe das dies speicher spart wenn die textur nur einmal geladen wird?

Die Pixel dinge,also die icons und so, mache ich mit Cosmigo Pro Motion, dem einzigsten Programm auf der Welt das es in sachen Funktionalität und Workflow mit DPaintIV / DpaintV vom Amiga aufnehmen kann. ( nein ich kriege kein geld für diese schleichwerbung :/ )

Was steckt dahinter?

Derzeit nutze ich B3D und dazu Hectic´s tolles Draw3D.