Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / [Gelöst] Objekt vergrößern/verkleinern
- - By Serpens66 (More than 200 posts.) Date 20.10.2014 13:53
Wie/wo wird geregelt, welche Größe ein Objekt hat?
In der DefCore gibt es ja:

Width=10
Height=10
Offset=-5,-5
Vertices=2
VertexX=-3,4
VertexY=-4,3

Aber wenn ich diese Werte nun einfach halbiere (abgesehen von vertices), dann ist das Objekt zwar kleiner, aber es wird auch nur noch ein Ausschnitt von der Grafik gezeigt.
Was muss ich noch ändern? Oder ist die Größe des Objekts in der Grafik fest verankert,, sodass ich die grafik selbst vergrößern/halbieren müsste?
Parent - - By TLK (More than 200 posts.) Date 20.10.2014 14:27
Die Werte Width und Height sind schon ausschlaggebend für die Größe des Objekts. Die Objektgröße ist also nicht in der Grafik verankert. Die Werte geben aber den Grafikausschnitt an, der Infame angezeigt wird. Am einfachsten ist es, wahrscheinlich, wenn du die Objektgrafik mit einem Bildbearbeitungsprogramm verkleinerst und dann die Werte dementsprechend anpasst.

Es gibt allerdings auch noch SetObjDrawTransform. SetObjDrawTransform(500,,,,500,this(),) halbiert z.b. die Breite (das erste 500) und die Höhe (das zweite 500) von this() (also dem aufrufendem Objekt). Die anderen Kommata zwischen denen nichts steht bleiben frei (das gleiche wie 0), hier könnte man eine Verschiebung erzeugen.
SetObjDrawTransform ändert NUR die Grafik des Objektes die Kollisionsabfrage durch die Vertices findet immernoch an den Ursprünglichen stellen statt. Für Statische Objekte kann man das gut machen, für komplexere sollte man lieber die Grafik anpassen oder Wachstum benutzen, welches den DefCore.txt-Wert StretchGrowth voraussetzt, wenn das Objekt nicht wie eine Hütte Pixelschichtweise angepasst werden soll.
Parent - - By Serpens66 (More than 200 posts.) Date 20.10.2014 15:50 Edited 20.10.2014 15:56
okay.. ich habs zuerst mit der SetObjDrawTransform(2000,0,0,0,2000,0,this(),0) Funktion probiert.  Wenn ich zusätzlich noch die oben erwähnten Werte in der DefCore ändere, werden aufeinmal mehrere Grafiken angezigt (also z.b auch der braune halbkreis bei der Superkuppel). Wenn ich die DefCore Werte unverändert lasse, sieht die Grafik zwar richtig aus, muss aber noch an die richtige Stelle geschoben werden. Außerdem stimmen natürlich die Solidmask Werte nicht. 
Da ich keine Ahnung habe, wie ich nun noch die Solidmaskwerte anpasse, habe ich nun erstmal Variante 2 probiert.

Also einfach die Grafikgröße verdoppelt. Nun noch:
Width=400
Height=200
Offset=-200,-100
Vertices=2
VertexX=0,399
VertexY=199,199
SolidMask=0,200,400,200,0,0
TopFace=0,400,400,200,0,0
Picture=0,400,400,200

umschreiben in:

Width=800
Height=400
Offset=-400,-200
Vertices=2
VertexX=0,798
VertexY=398,398
SolidMask=0,400,800,400,0,0
TopFace=0,800,800,400,0,0
Picture=0,800,800,400

Im Spiel sieht es schon ganz gut aus :) Ich habe aber festgestellt, dass oben auf der Kuppel quasi noch ein unsichtbares "Brett" draufliegt. Man kann die Kuppel hochklettern, stößt dann aber gegen dieses Brett. Wenn man per Luftschiff hochfliegt, kann man auch auf dem Brett laufen (logisch).
Bei der normalen Superkuppel gib es dieses "Brett" nicht... woher kommt das?

Edit:
ach und nochmal ne allgemeine Frage zur Superkuppel: Der sinn ist es ja, normale Gebäude darunter zu beherbergen. Das klappt auch, wenn man erst die Superkuppel und dann gebäude baut (weil sie nach dem Bau als Static Back eingestuft wird). Aber wenn schon Gebäude da stehen, und man will die Kuppel drüber bauen, kommt immer die Meldung, die Gebäude seien im Weg.   Gibt es einen einfachen weg das anzupassen?  Ich tippe mal drauf, man muss im Bausatz-Skript einstellen ,dass falls idtype die supperkuppel ist, dass es dann eben eine ausnahme machen soll.  Allerdings müssen ja schon die Maße der Supperkuppel berücksichtigt werden. Da wo die Kuppel zuende ist (ob oben oder links/rechts) dürfen natürlich weiterhin keine Gebäude stehen.  Wie berücksichtige ich das? (ich glaube dafür ist der braune halbkreis der Superkuppel da, würde zumindest sinn ergeben :) )
Parent - - By TLK (More than 200 posts.) Date 20.10.2014 15:57
Die Solid Mask scheint irgendwie nicht richtig gesetzt zu sein vielleicht hilft dir Cr-Tools weiter, weiß allerdings ob das noch richtig funkt.
Parent - - By Serpens66 (More than 200 posts.) Date 20.10.2014 17:33 Edited 20.10.2014 17:41
hmm.. wenn ich die Anwedung dazu ausführen will, kommt die fehlermeldung ich müsse NET Framework v 4.0.30319 installiert haben
Das kommt sowohl bei XP als auch Windows 7.
ich mein zumindest bei windows7 sollte die meldung doch eig nicht kommen, oder? Muss man sich das immer manuell runterladen? ich dachte eig das würde mit den autom.updates gemacht.
edit:  okay sehe gerade es wird mir unter optionale updates angezeigt, na dann installier ich das mal...
Parent - By TLK (More than 200 posts.) Date 20.10.2014 17:50
Das Programm nimmt einem eigentlich nur die Schreibarbeit ab. Ich habe leider keine Ahnung wo es Funktionieren sollte ich habe Windows schon ewig nicht mehr benutzt, für mich war das Programm nur immer echt hilfreich.
Parent - - By TLK (More than 200 posts.) Date 20.10.2014 17:51
Die Solidmask wird ja im Defcore mithilfe von 6 Integern realisiert. Die ersten 4 sind: Die x-Koordinate der oberen Linken Ecke, die y-Koordinate der oberen Linken Ecke, die Breite, die Höhe. Wenn die Solidmask oben also aus irgendeinem Grund eine Plattform bildet ist es wahrscheinlich, dass die Angabe nicht ganz richtig ist. Wenn du oben drauf rum laufen kannst ist, denke ich die y-Koordinate nicht ganz richtig, obwohl diese eigentlich bei einer Verdopplung einfach mitverdoppelt werden sollte. Vielleicht klappt:

Width=800
Height=400
Offset=-400,-200
Vertices=2
VertexX=0,798
VertexY=398,398
SolidMask=0,402,800,400,0,0
TopFace=0,800,800,400,0,0
Picture=0,800,800,400

da ist die SolidMask um 2 Pixel weiter unten. Wenns nicht klappt kannst du sie immer weiter nach unten schieben. Irgendwann ist die unsichtbare Plattform weg, wenn dann ein Loch im Dach der Kuppel ist, ist in der Grafik irgendwo ein Fehler (z.b. sind die einzelnen Bilder in einander geschoben).
Parent - By Serpens66 (More than 200 posts.) Date 20.10.2014 17:56
aaaah, es klappt, vielen Dank =)

Hast du noch eine Idee zum Bauen der Superkuppel?
Parent - - By TLK (More than 200 posts.) Date 20.10.2014 18:36
Es wäre möglich ein #appendto für den Bausatz zu schreiben. Der Bausatz ruft eine Funktion "RejectConstruction" auf um zu prüfen ob dort gebaut werden darf.  Eigentlich macht es keinen Sinn, dann nicht stattdessen diese anzupassen, da sie offensichtlich zum Überprüfen der Baubarkeit gedacht ist. Allerdings konnte ich die Funktion nirgendwo finden und sie scheint auch nicht Dokumentiert zu sein.

Der braune Halbkreis in der Grafikdatei ist übrigens die SolidMask, bzw. es soll die Solidmask sein die auf das Objekt gelegt wird, die Solidmask wird natürlich im DefCore definiert (wenn du dort z.b. SolidMask=0,0,800,400,0,0 einträgst wird die Kuppel massiv, da an dieser Stelle in der Grafikdatei das Bild der Kuppel liegt). Eine Überprüfung ob sich etwas in der Solidmask eines Objektes befindet ist glaube ich nicht möglich. Eine Funktion die also die Baubarkeit der Kuppel prüft, müsste etwas komplizierter aussehen, es seie denn du willst das die Kuppel einfach immer Baubar ist, das wäre einfach :P .
Parent - - By Serpens66 (More than 200 posts.) Date 20.10.2014 19:27 Edited 20.10.2014 19:29
CreateConstructionSite(idType) wird für einen Transportfahrstuhl (bzw. den Verschluss dafür) verwendet, den ich auf ccan gefunden habe.
Also ich denke da wüsste ich schon, wie ich das schreiben muss, damit die Kuppel immer baubar ist.

Hmm.. also kann ich wohl nur wählen zwischen:
-Kuppel nur baubar, wenn genug Platz und keine Gebäude bisher dort gebaut.
-Kuppel immer baubar, egal was da steht, allerdings kann es dadurch passieren, dass z.b. hohe Gebäude an den Seiten rausragen oder das Airlock ein Gebäude blockiert...

Bei der Größe meiner "MegaKupppel" die ich nun erstellt habe, wäre zweiteres sinnvoller. Aber sie ist natürlich auch dementsprechend teuer, was das Baumaterial angeht... Wäre doof, wenn man da soviel Material und Zeit reinsteckt, dann aber das Airlock ein Gebäude blockiert... 
Andererseits kann man in meinem Pack Gebäude abreißen, also zur Not reißt man dann das Gebäude ab.

hab es jetzt mal probiert, in der oben erwähnten Funktion folgendes zu ändern:
  // Pruefen, ob das Gebaeude hier gebaut werden kann
if(!(idType==SPDM) || !(idType==SPD2) || !(idType==SPD3) || !(idType==SPD4) )
  {if (idType->~RejectConstruction(0, 10, Contained()) ) return(0);}

aber irgendwie klappt das nicht... ist aber auch immer schwer, mit den || oder &&  :D   ich möchte, dass der Schritt der Prüfung übersprungen wird, wenn es sich um eines der vier Gebäude handelt.

zum braunen halbkreis:
ja dachte ich mir schon, dass der dafür da ist. An sich müsste man den noch ne Nummer kleiner machen, weil man immer ein wenig über der Kuppel schwebt, wenn man darauf rumläuft.  Aber das wär zu kompliziert den einzeln zu verkleinern, von daher lasse ich das denke ich einfach so.
Die Airlocks konnte ich mittlerweile auch schon anpassen, da mussten in der ActMap und im Script noch eineige Werte angepasst werden.
Parent - - By TLK (More than 200 posts.) Date 20.10.2014 19:43
|| ist ein Logisches "oder"  während && ein Logisches "und" ist. || ist also richtig, da eine id ja schlecht sowohl SPDM als auch SPD2 sein kann. Ich sehe da eigentlich keinen Fehler. Wenn du's wie in dem Fahrstuhl machen willst verstehe ich den Code aber auch nicht ganz.
Ein Bausatzappendto z.b.:



protected func CreateConstructionSite(idType)
{
  // Nur wenn der Clonk steht und sich im Freien befindet
  if (GetAction(Contained()) ne "Walk") return(0);
  if (Contained(Contained())) return(0);
 
  if ( (idType==SPDM) || (idType==SPD2) || (idType==SPD3) || (idType==SPD4) )
      {
      CreateConstruction(idType,GetX(Contained()), GetY(Contained()), GetOwner(Contained()), 1, 1, 0);
      return(RemoveObject(this()));
      }
   
   //Falls keine Kuppel: Normale Funktion aufrufen!
  return(_inherited(idType));
}

Hier könnte man in das if auch noch ne Prüfung einbauen ob die Kuppel da auch hinpasst, was dann aber wieder selbst gemacht werden muss. Kann sein das du die X und Y Wert anpassen musst, habs nicht ausprobiert.
Parent - By Serpens66 (More than 200 posts.) Date 20.10.2014 20:39 Edited 20.10.2014 20:54
wenn ich es so übernehme, kommt beim Bau die Meldung:

ERROR: internal error: value stack overflow!
by: Destruction() (obj Superkuppel #734) (C:\Programme\Clonk Rage\allerlei ltest.c4d\Superdome.c4d\Script.c:30)

aber ja, es liegt an den x und y werten.. mal schauen, was ich da anders eintragen muss... =/

edit:
so funktionierts =)

CreateConstruction(idType,AbsX(GetX(Contained())), AbsY(GetY(Contained()))+15, GetOwner(Contained()), 1, 1, 0);

habe außerdem das exclusive=0 aus dem Airlock entfernt, sodass dahinterliegende Gebäude nicht blockiert werden :)
Up Topic Deutsch / Hilfestellung / [Gelöst] Objekt vergrößern/verkleinern

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill