Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 08:45

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Konzeptidee Leveleditor
BeitragVerfasst: Mo Sep 17, 2007 16:11 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
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

Hoffe mal ihr könnt mir da helfen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 17, 2007 16:18 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
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.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 17, 2007 16:41 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Je nachdem was du bauen willst. Siehe Leveleditor/Mapeditor vom Napalmbomber3D (Tutorial1)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 18, 2007 04:07 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 12:24 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
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:
Bild

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:
Bild
Bild

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 ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 12:52 
Offline
DGL Member
Benutzeravatar

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.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 12:57 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
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 ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 13:07 
Offline
DGL Member
Benutzeravatar

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:
Bild
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.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 13:49 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also das sieht alles schon sehr nach dem aus, was ich suche. Hab mir das mal angesehene:
http://de.wikipedia.org/wiki/Spline-Interpolation

und muss sagen,... obwohl ich vor nicht allzulanger Zeit Integral- und Differenzialrechnung hatte, leuchtet mir diese Fachbeschreibung bei Wikipedia wenig bis gar nicht ein ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 14:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
  1. //need 3 points for a quadric bezier curve
  2. //the function explode in 2 calculations X and Y
  3. function TKar_OGLShape.quadbezier(t:single;p1,p2,p3:TGLVectori2):TGLVectori2;
  4. var
  5.   t1,
  6.   t2,
  7.   t3:single;
  8. begin
  9.   //result:=((t*t)*p3)+((2*t*(1-t))*p2)+(((1-t)*(1-t))*p1);
  10.   t1:=t*t;    //t*t
  11.   t2:=1-t;
  12.   t3:=t2*t2;  //(1-t)*(1-t)
  13.   t2:=t2*t*2; //2*t*(1-t)
  14.   result[0]:=trunc(t1*p3[0]+t2*p2[0]+t3*p1[0]);
  15.   result[1]:=trunc(t1*p3[1]+t2*p2[1]+t3*p1[1]);
  16. end;

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 14:42 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 15:47 
Offline
DGL Member
Benutzeravatar

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:
  1. procedure TKar_OGLShape.GenerateRoundStepVertice;
  2. var
  3.   p1,
  4.   p2,
  5.   p3:TGLVectori2;
  6.   ind,i,n:cardinal;
  7.   StepValue, //how big is one part of a round
  8.   len,newlen:single;//need to calc the len of 2 vector
  9. begin
  10.   StepValue:=1/FBorder.RoundSteps; //wie groß ist ein Schritt(für t später)
  11.   setlength(FCalculatedVertice,length(FVertice)*2+(Fborder.RoundSteps-1)*length(FVertice));//speicher holen um unsere neuen werte zwischen zu speichener
  12.   ind:=0;
  13.   for i:=0 to high(FVertice) do//alle vertice des orginal terrains durchgehen
  14.   begin
  15.     //get prev,next and current points for rounding
  16.     //use last vert if there no prev vert
  17.     if i=0 then
  18.       p1:=FVertice[high(FVertice)]
  19.     else
  20.       p1:=FVertice[i-1];
  21.     //current point need no changes
  22.     p2:=FVertice[i];
  23.     //use first vert if there is no next vert
  24.     if i=high(FVertice) then
  25.       p3:=FVertice[0]
  26.     else
  27.       p3:=FVertice[i+1];
  28.  
  29.     //Hier nehme ich den 2. Punkt, also den wir gerade im orginal mesh verändern wollen.
  30.     //Ich habe festgelegt, wie weit die rundung einwirkung haben darf und daher muss ich die
  31.     //länge zu beiden nachbarpunkten prüfen und dann in meinen zwischenspeicher dann von
  32.     //den neuen Punkten ausgehen. Dieser Schritt würde entfallen wenn du das Ganze Terrain
  33.     //abrunden willst, dann müsstest du einfach den part löschen. So hast du aber die möglichkeit
  34.     //einfach nur alle Punkte zu verarbeiten, die eine Bergspitze ergeben und dann könntest du über
  35.     //RoundStepSize z.B. nur ein Teil des Berges abrunden und ned von Sole bis Spitze.
  36.  
  37.     //calculate the new position of the prev point because we have a roundingsize
  38.     len:=sqrt(power(p2[0]-p1[0],2)+power(p2[1]-p1[1],2));
  39.     if len>=FBorder.RoundStepSize*2 then
  40.       newlen:=len-FBorder.RoundStepSize
  41.     else
  42.       newlen:=len-((FBorder.RoundStepSize*2-len)/2);
  43.     p1[0]:=trunc(p1[0]+(p2[0]-p1[0])*(newlen/len));
  44.     p1[1]:=trunc(p1[1]+(p2[1]-p1[1])*(newlen/len));
  45.     //calculate the new position of the next point because we have a roundingsize
  46.     len:=sqrt(power(p2[0]-p3[0],2)+power(p2[1]-p3[1],2));
  47.     if len>=FBorder.RoundStepSize*2 then
  48.       newlen:=len-FBorder.RoundStepSize
  49.     else
  50.       newlen:=len-((FBorder.RoundStepSize*2-len)/2);
  51.     p3[0]:=trunc(p3[0]+(p2[0]-p3[0])*(newlen/len));
  52.     p3[1]:=trunc(p3[1]+(p2[1]-p3[1])*(newlen/len));
  53.     //loop for the roundingsteps
  54.     for n:=0 to FBorder.RoundSteps do
  55.     begin
  56.       FCalculatedVertice[ind]:=quadbezier(n*StepValue,p1,p2,p3);
  57.       inc(ind);
  58.     end;
  59.   end;
  60.   //sehr unwarhscheinlich aber wenn RoundStepSize und die kantenlänge gleich sind
  61.   //dann hast du 2 punkte übereinander und das muss ned sein.
  62.   //remove doubles
  63.   i:=0;
  64.   while i<high(FCalculatedVertice) do
  65.   begin
  66.     if (FCalculatedVertice[i][0]=FCalculatedVertice[i+1][0]) and
  67.        (FCalculatedVertice[i][1]=FCalculatedVertice[i+1][1]) then
  68.     begin
  69.       for n:=i to high(FCalculatedVertice)-1 do
  70.         FCalculatedVertice[n]:=FCalculatedVertice[n+1];
  71.       setlength(FCalculatedVertice,high(FCalculatedVertice));
  72.     end;
  73.     inc(i);
  74.   end;
  75. end;

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 17:51 
Offline
DGL Member
Benutzeravatar

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.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 18:46 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 19:11 
Offline
DGL Member
Benutzeravatar

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.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]