CNDG
Würden Sie gerne auf diese Nachricht reagieren? Erstellen Sie einen Account in wenigen Klicks oder loggen Sie sich ein, um fortzufahren.


Ein Forum, in dem sich neue Clonk Entwickler untereinander austauschen können.
 
StartseiteStartseite  PortalPortal  SuchenSuchen  Neueste BilderNeueste Bilder  AnmeldenAnmelden  LoginLogin  

 

 Teil der Landschaft Speichern und entfernen

Nach unten 
4 verfasser
AutorNachricht
Merlinus_verus
Leutnant
Leutnant
Merlinus_verus


Männlich Alter : 30
Anmeldedatum : 20.04.09

Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen EmptyDo Jul 09, 2009 9:43 pm

Hallo, ich habe mal wieder ein Problem:
Mit dem folgenden Script sollen in einem Teil der Landschaft (100*100 Pixel) die Objekte und das Material gespeichert, entfernt, und später wiederhergestellt werden. Bis zum entfernen läufts ganz gut, die Arrays fürs Speichern sind voll, die Objekte werden erstellt. Aber Das Material verändert sich nicht wie gewünscht... eigentlich gar nicht. Was läuft da schief?

EDIT: Besondere DefCore Einträge und Actions sind nicht vorhanden, der Script kann zum testen einfach in z.B. einen Stein kopiert werden.

Code:

#strict 2

local RefPoint, SavedObjects, SavedMaterials,RecTime,IsLoading;

func Initialize()
{
  return(1);
}

func Activate()
{
   if(IsLoading) return(0); // Läd noch?

   SavedObjects = [0]; SavedMaterials = [0]; // Sorgt dafür, dass es nicht zu Objektverwechslungen kommt.
   RecTime = 60; RefPoint = [GetX(this()),GetY(this())];

   FindTheObjects();
   SaveMaterials();
   Clear();
   ScheduleCall(0, "Restore",100,1,);
   AddEffect("IsRecharching", this(), 111, (36*RecTime), this()); // Erstmal verschnaufen
}

/* Speicherfunktionen */
func FindTheObjects()
{
   SaveObjects(FindObjects(Find_InRect(-50,-50,100,100),Find_Exclude(this()),Find_Exclude(Contained(this()))));
}

func SaveObjects(Arr)
{
   var i;
   for(var obj in Arr)
   {
      SaveHelper(obj,i);
   }
}

func SaveHelper(&obj,&i)
{
   SavedObjects[i] = GetID(obj);SavedObjects[i+1] = GetX(obj); SavedObjects[i+2] = GetY(obj);i += 3;
}


func SaveMaterials()
{
   var i = 0;
   var y = -50;
   var x = -50;

   while(y <= 50)
   {
      x = -50;
      while(x <= 50)
      {
         SavedMaterials[i] = (GetMaterial(x,y));
         x ++;
         i ++;
      }
      y ++;
   }

}
/*Hauptfunktionalität */
func Restore()
{
   for(var i= 0; i < 6; i += 3)
   {
      CreateObject(SavedObjects[i],AbsX(SavedObjects[i+1]),AbsY(SavedObjects[i+2]));
   }

   var k = 0;
   var y = 0;
   var x = 0;

   while(y <= 100)
   {
      x = 0;
      while(x <= 100)
      {
         DrawMaterialQuad(MaterialName(SavedMaterials[k]),RefPoint[0] + x,RefPoint[1] + y,RefPoint[0] + x,RefPoint[1] + y,RefPoint[0] + x,RefPoint[1] + y,RefPoint[0] + x,RefPoint[1] + y);
         x ++;
         k ++;
         // Log("%v,%v,%v",x,y,k);
      }
      y ++;
   }
}
func Clear()
{
   DrawMaterialQuad("Tunnel-Rough",GetX(this())-50,GetY(this())-50,GetX(this())+50,GetY(this())-50,GetX(this())+50,GetY(this())+50,GetX(this())-50,GetY(this())+50);
   for(var obj in FindObjects(Find_InRect(-50,-50,100,100),Find_Exclude(Contained(this())),Find_Exclude(this())))
      RemoveObject(obj,1);
}

/* Effekte */
func FxIsRecharchingStart()
{
   IsLoading = true;
}

func FxIsRecharchingStop()
{
   IsLoading = false;
}

Achja, bevor jemand was sagt: Ja, ich weiß, dass das Materialarray 10.000 Stellen lang ist, da Clonk aber ordentlich weiterläuft, wenn man das Material wiederherstellen will, sollte das kein allzugroßes Problem sein.
Nach oben Nach unten
NilsZ
Admiral
Admiral



Männlich Ort : Mein Rekord: 27 Punkte! :D
Anmeldedatum : 07.08.08

Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Re: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen EmptyFr Jul 10, 2009 3:33 am

hmm Also mit DrawMaterialQuad tut sich bei mir auch nichts. mit DrawMap(x,y,x +1,y +1, Format("map Klotz{ mat=%s; };", MaterialName(SavedMaterials[k]) ) ); geht es zwar aber dann wird es oben in die Ecke gezeichnet. Wenn man dann aber die Refpoints dazu gibt stürtzt merkwürdiger Weise immer die Clonk Engine ab...
Nach oben Nach unten
Liech
Fregattenkapitän
Fregattenkapitän



Männlich Alter : 33
Anmeldedatum : 02.02.09

Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Re: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen EmptyFr Jul 10, 2009 11:15 am

Ich würde das ja mit mehrdimensionalen Arrays lösen. Sprich: Arrays in einem array. Da sind die daten dann wesentlich besser organisiert. Auserdem ist der Zugriff schöner und man hat, wenn nicht Objekte dann doch immerhin Tuppel.

Rufst du Restore eigentlich Manuell auf?

Jedenfalls ist NilsZ idee eigentlich garnicht so verkehrt. Nur die Funktion ist nicht wirklich brauchbar. Was du immoment zeichnest ist ein 0x0 Materialblock an der korrekten stelle. Sorge dafür das es ein 1x1 block wird:

Zitat :
DrawMaterialQuad(MaterialName(SavedMaterials[k]),RefPoint[0] + x,RefPoint[1] + y,RefPoint[0] + x + 1,RefPoint[1] + y,RefPoint[0] + x + 1,RefPoint[1] + y + 1,RefPoint[0] + x,RefPoint[1] + y + 1);

Andere Logikfehler hab ich jetzt nicht gefunden.
Nach oben Nach unten
Merlinus_verus
Leutnant
Leutnant
Merlinus_verus


Männlich Alter : 30
Anmeldedatum : 20.04.09

Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Re: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen EmptyFr Jul 10, 2009 3:46 pm

Hab die Funktion jetzt in Liechs Vorschlag geändert. Es sind aber zwei Probleme aufgetreten, die ich zwar identifizieren, aber nicht beheben kann:

1. RefPoint wird beim Aufruf der Restore Funktion aus irgendeinem Grund redefiniert, das heißt, das Material wird an der falschen Stelle verändert. Speichert RefPoint die Zahl, oder die Funktion?

2. "Sky" wird von DrawMaterialQuad nicht angenommen, also verändert sich an den Stellen des Himmels nichts. Gibt es einen Weg, in einem Bereich alle Materialien in Sky zu ändern?
Nach oben Nach unten
NilsZ
Admiral
Admiral



Männlich Ort : Mein Rekord: 27 Punkte! :D
Anmeldedatum : 07.08.08

Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Re: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen EmptyFr Jul 10, 2009 4:42 pm

1. RefPoint wird beim Aufruf der Restore Funktion aus irgendeinem Grund redefiniert, das heißt, das Material wird an der falschen Stelle verändert. Speichert RefPoint die Zahl, oder die Funktion?

Das war mir auch aufgefallen, deshalb hab ich einfach Refpoint1 und Refpoint2 als locals deklariert.

2. "Sky" wird von DrawMaterialQuad nicht angenommen, also verändert sich an den Stellen des Himmels nichts. Gibt es einen Weg, in einem Bereich alle Materialien in Sky zu ändern?

Deshalb habe ich auch DrawMap benutzt, DrawMaterialQuad macht 1. keine Erde hinter dem Material und 2. unterstützt es auch keinen Sky. Bei DrawMap ist aber der Nachteil dass es in diesem Ausmaß rechenintensiever ist und falls die Maße über die Landschaft nach unten hin hinausragen stürtzt das Spiel ab.
Nach oben Nach unten
Extremclonk
Staatsrat
Staatsrat
Extremclonk


Männlich Ort : Am Anti-Spam-Limes
Anmeldedatum : 19.01.09

Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Re: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen EmptyFr Jul 10, 2009 4:44 pm

Uns Sky zu plazieren verwendet man FreeRect.
Nach oben Nach unten
Merlinus_verus
Leutnant
Leutnant
Merlinus_verus


Männlich Alter : 30
Anmeldedatum : 20.04.09

Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Re: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen EmptyFr Jul 10, 2009 5:06 pm

Danke, es funktioniert, das mit dem redefinieren der Refpoints war ein Denkfehler meinerseits. Ich hatte eine Fuktion in Gedanken bereits verändert, aber nicht aufgeschrieben.
Nach oben Nach unten
Gesponserte Inhalte





Teil der Landschaft Speichern und entfernen Empty
BeitragThema: Re: Teil der Landschaft Speichern und entfernen   Teil der Landschaft Speichern und entfernen Empty

Nach oben Nach unten
 
Teil der Landschaft Speichern und entfernen
Nach oben 
Seite 1 von 1
 Ähnliche Themen
-
» Objekt & Scenariocalls beim Speichern.
» BrueckenEntfern-Zauber soll wand und bruecke entfernen - loesung gesucht!

Befugnisse in diesem ForumSie können in diesem Forum nicht antworten
CNDG :: Sonstiges :: Scripthilfe-
Gehe zu: