Hallo,
ich habe mich lange (sind echt DREI Wochen vergangen?) nicht mehr gemeldet und das aus verschiedensten Gründen. Zum einen will ich niemanden nerven. Zum anderen ist aber auch nicht so übermäßig viel passiert. Viel Arbeit ging in ABENDfüllendes Suchen von kleinen Fehlern verloren. Was habe ich nun aber in den drei Wochen geschafft? Meine Skriptsprache, die sich ja ständig wandelt und wo ich gerne mal Arbeit von Tagen übern Haufen werfe, ist soweit fertig. Alles ist schön in einem Block von Token. Zudem habe ich mir eine Halb iterative, halb rekursive Auflösung von Termen überlegt. Sie funktioniert folgendermaßen. Wir bewegen uns auf einer indizierten Liste. Ich beginnen einfachheitshalber bei 1. Die Liste sehe folgendermaßen aus:
[10,+,7,*,3,/,8,*,(,3,+,5,),+,1]
Ich denke, es ist ersichtlich, dass dies der Ausdruck 10+7*3/8*(3+5)+1 darstellt.
Die Funktion für das Lösen des Termes sei "solveterm". Ich brauche vier Hilfsvariablen:
Summe wird mit "0" initialisiert und speichert die Aufsummierung.
Produkt wird auch mit "0" initialisiert und speichert die Zwischenprodukte.
lastrz speichert das letzte Rechenzeichen. Es ist '+', damit es neutral beginnt.
wert speichert den letzten ausgelesenen Wert. Der sei 0, ist aber eigentlich egal...
Der Grundgedanke ist, dass bei einem Rechenzeichen gerechnet wird, je nach den Werten von Summe, Produkt und lastvz und bei "allem anderen" wird wert gesetzt.
Los gehts!
1. [10]: wert:=10 (Ich denke das ist logisch)
2. [+]: Als letztes Rechenzeichen kam Strichrechnung, damit wird summe:=summe+wert (=10) gerechnet. lastrz sei (das neue) '+'
3. [7]: wert:=7
4. [*]: Als letztes Rechenzeichen kam Strichrechnung, damit wird produkt:=wert (=7), lastrz sei '*'
5. [3]: wert:=3
6. [/]: Als letztes Rechenzeichen kam Punktrechnung, damit wird produkt:=produkt*wert (=21), lastrz sei '/'
7. [8]: wert:=8
6. [*]: Als letztes Rechenzeichen kam Punktrechnung, damit wird produkt:=produkt*wert (=2,625), lastrz sei '/'
7. [(]: wert:=solveterm von 7 bis Ende (also 11), wird machen bei 12 weiter (wert=8)
12. [+]: Als letztes Rechenzeichen kam Punktrechnung, damit wird summe:=summe+produkt*wert (=10+2,625*8=31), lastrz sei '+'
13. [1]: wert:=1
Zu letzt wird nochmal "so getan", als ob noch ein Plus käme: summe:=summe+wert (=32)
Ich hoffe, ich habe mich nicht verrechnet und ich hoffe der rekursive Aufruf ist klar (bei Funktionen wird genauso verfahren), aber es ging ja nur ums Prinzip. Hauptsache es funktioniert und ist schnell: Und beides trifft zu! Bei einem Minus muss natürlich getrickst werden, aber das ist nicht weiter schlimm und auch logisch. Zudem musste ich mir erstmal ein Modulo für Floats überlegen (Wen interessiert: x%y=(x/y-trunc(x/y))*y)
Außerdem habe ich meine Sckriptsprache um "Kleinigkeiten" erweitert. Ohne Stack gehen Funktionsaufrufe z.B. nicht, fiel mir irgendwann dann doch auf, Variablen sind eh ALLE Floats, also müssen sie nicht deklariert werden, bei der ersten Benutzung, stehen sie (mit dem Wert 0) zur Verfügung und so weiter. Außerdem optimiere ich dahingehend, dass jede öffnende Klammer z.B. "weiß", wo ihre schließende ist. So spare ich mir viel iterieren, auch wenn die Analyse mich viele besagte Nächte gekostet hat. Es scheint nun aber alles soweit zu funktionieren. Auch habe ich mir Gedanken um die Anwendung der Sprache gemacht. Man soll ja z.B. zwei Objekte gleichzeitig bewegen können, deshalb macht die Sprache prinzipiell NICHTS, erst wenn "sync" aufgerufen wird, pausiert das Skript und grafische Bewegungen werden gezeigt. Nach dem ENDE der Bewegungen wird ein Skript weiter ausgeführt bis "return". Außerdem wird man im Skript wohl auch Partikel erzeugen und steuern können. Genauso können in der XML-Datei Partikel schon definiert werden und ihre Berechnungsfunktion. Z.B. für Wolken, Vögel oder ein Flugzeug, das vorbeifliegt oder so ähnlich. Dabei bekommt die Berechnungsfunktion relativ viele Informationen über den Stack und meine Partikelengine kann den dann direkt auslesen. Wenn ich die Reihenfolge wie in der Partikelengine wähle, kann ich auch das böse, veraltete memcpy nehmen.
Was habe ich noch gemacht? Ich habe zwar leider kein Video davon, aber ich habe, wie schon angedeutet, eine, wie ich finde, recht performante, simple Partikelengine gebastelt. Sie kann Sprites oder auch eigene Zeichenfunktionen nutzen. Klein aber praktisch. ^^ Außerdem habe ich vieles überdacht, meine MindMaps aktualisiert und mit Joysticks rumgespielt. Meine "Hauptengine" (die sich um ALLES kümmert ^^ (windowmanagment, programmschleifen, events, xml, partikel, texturen, modells, etc.)) erkennt nun beim Start des Programmes alle Joysticks und bindet sie mir einfach ein, dass ich dahingehend nichts mehr machen muss.
Zudem habe ich mir über das Leveldesignen nochmal überdacht. Mein Leveldesigner (von dem ich immer Videos zeige) ist wahnsinnig unpraktisch, um damit wirklich Level zu erstellen. Für Details reicht er, aber das Erstellen stinkt. Also habe ich mir gedacht, dass ich mir ein Bild nehme, wie das hier z.B.: (zoomt ran, sonst sieht man garnichts ^^), und mit den Punkten so ein Level definiere. Damit ein Punkt als Set erkannt wird, muss er einen Grün-Wert von 0 haben. Die x-Koordinate wird zur X-Koordinate des Sets (natürlich anders skaliert. ), die y-Koordinate zur Z-Koordinate, der rot-Wert zur Y-Koordinate (128 ist 0.0000) und der blau-Wert gibt die Nummer an. Dauert zwar auch einen Moment so etwas in Gimp zu erstellen, geht aber UM LÄNGEN (Faktor 100 oder so ^^) schneller als es im leveldesigner "von Hand" zu machen. Außerdem habe ich mir noch ein paar Gedanken zum "Würfellauf" gemacht, wie man in dem Video sieht, dass auch das fertig aus dem Bild erzeugte Level zeigt.
So, ich hoffe, ich habe nichts vergessen, was noch spannendes in den letzten 3 Wochen passiert ist. Zumindest nichts, was mit Open Party zu tun hat ^^.
Morgen mache ich mich (vielleicht, aber wahrscheinlich) an die Planungen für ein erstes richtiges Spielbrett, wo ich mich dann mit der Scriptsprache zum ersten mal richtig Austoben kann. Wobei das wohl auch länger dauern wird. Was auch immer ich wähle (ich bin noch unschlüssig, aber die Ideen sind da), es braucht Modelle. Und woher nehmen, wenn nicht raubmordkopieren? ^^ Also werde ich morgen wohl auch noch ein paar Modelle erstellen. Ich hoffe, ich kann dann bald ein komplettes Spielbrett mit allem drum und dran zeigen.
Hier nun noch der versprochene Youtube-Link: http://www.youtube.com/watch?v=3fOGfIvoOok
Die Farben sind leider total daneben . Und zu dunkel. Achtet auf die Animationen und ignoriert den Rest. ^^
Ach und eine Sache noch.! Ich probiere gerade den neuen Kernel 2.6.30 aus. Er brachte bei mir ca. 50% mehr Grafikleistung in OpenGL!!!
LG Ziz
Edit: Weil die Qualität wirklich SEHR schlecht ist von dem Video, habe ich es nochmal gefilmt (bei mir Licht) und hochgeladen. Ein WENIG besser ist es, auch wenn es stockt, weil ich noch ein paar andere Sachen im Hintergrund laufen hatte...
http://www.youtube.com/watch?v=SRd3FIBbNGo
|