Hi, ich will derzeit mal wieder ein Spiel beginnen und baue eben einen Leveleditor, damit das ganze gebastel einfacher wird. Nun ist die Frage, wie geht man an soetwas heran?
Mein Leveleditor kann vergleichsweise einfach sein, da es um ein Felderbasierendes Spiel geht, wo man also recht einfach alle Daten verwalten können sollte.
Bei der Speicherung dachte ich an XML, nicht weils klein ist sondern weils uebersichtlich ist.
Wo nun meine eigentliche Frage liegt, wie baut man so einen Editor an sich auf? Wie könnte man rangehen? Klickt man auf die Felder udn legt Texturen und allen Blabla fest?
Naja meine Fragen sind ein wenig... "Wuwa"^^, liegt halt dran, dass ich im MOment noch nich wirklich Ideenhab
Ich würde jedem feld eine getrennte grafik und funktionseigenschaft geben. Im Editor setzt man standardmäßig die grafikeigenschaft, wobei die funktion automatisch angepasst wird. Wenn man dann die funktion manuell ändert, wird die vom standard abweichende funktion durch ein overlay gekenntzeichnet.
Ich würde hier eher zu einem binären format tendieren, weil bei einem 2D array der XML-Overhead schon recht groß ist.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Als Datenstruktur würde ich auf 2d array mit Linklisten für die Felder arbeiten,dass erlaubt mehere Ebenen.
Für Dungeons eventuell noch Graphen mit Linklisten für die einzelnen Punkte.
Ich würde ein Record mit benötigten Feldinformationen(begehbar,Textur,Ebene,Eingang,...) erstellen und diese über eine ID fest ins Spiel verdrahten.
Diese ID stellt dann Quasi ein DefaultSetting für ein Feld dar und im Feld legst du den gleichen Record als Pointer nochmal an, um dann Spezielle Settings zu realisieren.
Sonnst kann man nur sagen "keep it simple stupid".
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Also ich hab jetz mal was zusammen gebaut und mich dabei etwas an dem Napalmeditor von Sascha orientiert.
Ich kann jetzt auf einem Feld von X*X nach belieben jedem Feld Top- und Sidetexturen zuweisen. Jedes Feld ist also eigentlich ein Quader, allerdings werden die Seitenteile des Quaders nur dann anzeigt, wenn eines der umliegenden Acht Felder eine geringere Höhe hat und man somit auf eine Seite des entsprechenden Feldes schauen könnte.
So spart man schon etwas performance
Ich zeig euch mal eben nen Screenshot:
Allerdings sieht mir das alles noch so kantig und langweilig aus.
Wenn man sich im Vergleich dazu Geos' Screenshots ansieht, machen die schon einiges mehr her:
Nun frage ich mich, wie man, mit möglichst wenig Aufwand, die Gebirge da im Hintergrund etwas abrundet und wie man die Uebergangen zwischen Wasser und Gras so schoen hinbekommt. Wie gesagt die Hoehenunterschiede gibs bei mir alles schon, jetzt muss das nur noch etwas "runder" werden. Hoffe mla ihr habt da Ideen
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Shaddow hat geschrieben:
Nun frage ich mich, wie man, mit möglichst wenig Aufwand, die Gebirge da im Hintergrund etwas abrundet und wie man die Uebergangen zwischen Wasser und Gras so schoen hinbekommt. Wie gesagt die Hoehenunterschiede gibs bei mir alles schon, jetzt muss das nur noch etwas "runder" werden. Hoffe mla ihr habt da Ideen
Dazu kannst du die vorhanden Punkte deiner HeightMap nehmen und diesen dann erst zeilenweise und dann spaltenweise interpolieren, um damit eine größere (feinere) Heightmap zu erstellen.
Das Ganze müsste so funktionieren: Du nimmst zunächst alle Punkte zeilenweise und interpolierst die Zeile nach deinem Geschmack: siehe http://de.wikipedia.org/wiki/Interpolation. Davon nimmst du dann zB. nicht nur im Bereich von 0 bis 31 im Abstand von 1 einen Punkt, sondern zB. im Abstand 0,25, somit erhälst du also 4mal soviele Punkte.
Dann hast du zB. [256,32] statt ursprünglich [32,32]. Danach machst du das ganze nochmal, nur diesmal spaltenweise und erhälst so eine - je nach Verfahren - abgerundete [256,256] Heightmap.
Alternativ kannst du natürlich auch die HeightMap als Bitmap bearbeiten und hochskalieren, sodass zB. 4 neue Pixel auf 1 Pixel kommen und darauf dann einen entsprechenden Weichzeichner anwenden.
Also die Sache ist ja, ich benutze gar keine Heightmap ^^
Aber an Interpolation könnte ich wirklich mal denken und einfach die Feldgröße etwas kleiner setzen, muss ich mal schauen. Mehr ist das nicht?
Ich dachte irgendwie, dass man die Ufer zb ueber irgendeine komplizierte Technik realisieren könnte, wüsste gar nich, wie ich da ne Heightmap ansetzen sollte ^^
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Ob Height-Map oder Height-Array, das kommt ja aufs Gleiche raus. Und selbst wenn du das nicht, kann man sich normalerweise eine fürs fertige Level errechnen.
Wenn du zB. die Cubic-Spline-Interpolation wählst, ergibt das zumeist schöne Kurven:
Für die Ufer könntest du bei Bedarf auch eine andere Funktion verwenden, vllt. eine nach unten geöffnete Parabel - es geht ja theoretisch alles mögliche.
und muss sagen,... obwohl ich vor nicht allzulanger Zeit Integral- und Differenzialrechnung hatte, leuchtet mir diese Fachbeschreibung bei Wikipedia wenig bis gar nicht ein ^^
So sieht ne Cubische berzier aus, du müsstest die noch auf die 3. oder auf die 1. Dimmension anpassen.
Die Formel steht kommentiert nach dem begin. Die aktuelle arbeitet mit integer auf 2 koordinaten, da der Code aus meiner GUI ist.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Ok ich nehme also drei nebeneinander liegende Vertices und uebergeb die an diese Funktion. Was ist dann das t? Welchem Parameter entspricht das?
Und da ich ja weit mehr als 3 Punkte habe (realistischer wären 300), setze ich die reihe dann einfach immer weiter fort?
Also ich fange mit Punkt 1, Punkt2 und Punkt 3 an
Dann Punkt2,Punkt3 und Punk4
Und immer so weiter?
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Als erster Schritt musst du 1 Vertice aus deinem Orginalmesh wählen, welches du nun verarbeiten willst, dann wählst du seine nachbarn, 2 und 3.
Der Funktion übergibst du nun p1,p2,p3 und t wobei p2 der Punkt ist der Kanten zu den anderen beiden hat und t ist die Zeit, also 0-1.
0=position von p1
1=position von p2
dazwischen ist halt ein neuer berechneter Wert
Einfach die Kommentare im Code lesen.
Code:
procedure TKar_OGLShape.GenerateRoundStepVertice;
var
p1,
p2,
p3:TGLVectori2;
ind,i,n:cardinal;
StepValue,//how big is one part of a round
len,newlen:single;//need to calc the len of 2 vector
begin
StepValue:=1/FBorder.RoundSteps;//wie groß ist ein Schritt(für t später)
setlength(FCalculatedVertice,length(FVertice)*2+(Fborder.RoundSteps-1)*length(FVertice));//speicher holen um unsere neuen werte zwischen zu speichener
ind:=0;
for i:=0tohigh(FVertice)do//alle vertice des orginal terrains durchgehen
begin
//get prev,next and current points for rounding
//use last vert if there no prev vert
if i=0then
p1:=FVertice[high(FVertice)]
else
p1:=FVertice[i-1];
//current point need no changes
p2:=FVertice[i];
//use first vert if there is no next vert
if i=high(FVertice)then
p3:=FVertice[0]
else
p3:=FVertice[i+1];
//Hier nehme ich den 2. Punkt, also den wir gerade im orginal mesh verändern wollen.
//Ich habe festgelegt, wie weit die rundung einwirkung haben darf und daher muss ich die
//länge zu beiden nachbarpunkten prüfen und dann in meinen zwischenspeicher dann von
//den neuen Punkten ausgehen. Dieser Schritt würde entfallen wenn du das Ganze Terrain
//abrunden willst, dann müsstest du einfach den part löschen. So hast du aber die möglichkeit
//einfach nur alle Punkte zu verarbeiten, die eine Bergspitze ergeben und dann könntest du über
//RoundStepSize z.B. nur ein Teil des Berges abrunden und ned von Sole bis Spitze.
//calculate the new position of the prev point because we have a roundingsize
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Man sollte dazu aber auch sagen, Bezierkurven sind hauptsächlich Kurven zwischen dem 1. und 3. Punkt und erreichen den 2. eigentlich nicht.
Eine Spline-Interpolation ist im Grunde nur ein Polynom, die jeweils nur für wenige Punkte gilt, und somit mehrfach berechnet werden muss.
Warum so kompliziert? Würde man alle Werte in ein Polynom einsetzen, wäre das nicht sehr gut, denn das Polynom würde stark oszillieren, also quasi Wellen zwischen den Punkten schlagen.
Im Falle von Cubic-Spline ist es eine kubische Funktion (Polynom 3. Grades, ax³+bx²+cx+d), die Funktion gilt zwischen jeweils 2 Punkte. Auf http://www.arndt-bruenner.de/mathe/scri ... spline.htm findest du eine Erklärung mit einem Beispielapplet. In WP steht im Abschnitt Kubische C2-Spline findet sich auch eine Erklärung für eine Berechnung der Koeffizienten.
Also von der erklärung auf dieser seite find ich das echt gut und ich komm da auch recht gut mit, nur ich versteh absolut nicht, was mir die "finale" Formel sagt. Ich versteh, wie man dahin kommt usw. aber hab nicht den blassesten Dunst, wie ich das nun verwenden kann
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Indem ein LGS für b (dort in Matrixform) aufgestellt wird, kannst du damit b für die jeweilige Spline berechnen und darüber dann alle restlichen Koeffizienten (also a, c, d) der jeweiligen Spline; für die die Formel wie gesagt ax³+bx²+cx+d ist; und dann die Interpolation darstellt, wenn x zwischen den beiden Punkten, für die die Spline gültig ist, gewählt wurde.
Ein solches LGS lässt sich beispielsweise mit Gauß-Jordan-Algorithmus geschickt lösen, siehe http://de.wikipedia.org/wiki/Gau%C3%9F-Jordan-Algorithmus.
Falls dir das alles zuviel Rechenaufwand ist, kannst du es auch einfach mal damit probieren, mittels normaler Polynominterpolation (http://de.wikipedia.org/wiki/Polynominterpolation) immer nur zwischen 2 Punkten zu interpolieren.
Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.