[Gelöst] Suchfenster zum anfassen von objekt

Mal ein hoffentlich simples Problem:

Ich hab von ccan.de den "gangverschluss". Das ist im Prinzip ein Kasten den man aufstellt. Je nach dem, in welche Richtung man beim aufstellen schaut, wird dann eine der beiden Varianten aufgestellt (einen für links , einen für rechts). Das ist dann erstmal nur ein Kasten. Diesen kann man anfassen und dann in die entsprechnde Richtung drücken, dmait dort eine kleine brücke gebaut wird, die man nun ein und ausfahren kann.
Das nervige ist nur, dass man das Objekt über seine gesamte Länge (Länge mit brücke) anfassen kann. Ich möchte, dass nur der kleine Kasten anfassbar ist, nicht der Teil wo die Brücke entsteht.  
In der Defcore steht
Width=73
Height=14
Das habe ich nun auf
Width=14
Height=14
angepasst und schon ist nur der Kasten anfassbar… zumindest in der Version die die Brücke von links nach rechts aufbaut. 
In der Version die die Brücke von rechts nach links aufbauen soll, ist nun sozusagen das Ende der Brücke anfassbar, anstatt der Kasten.   

Daraus schließe ich, dass die angegebene Länge "width" von links nach rechts vom Startpunkt aus geht.  Aber wie ändere ich den Startpunkt?
Die Werte sehen jetzt so aus:
Width=14
Height=14
Offset=-66,-7
Picture=0,14,73,17
Vertices=4
VertexX=-7,7,-7,7
VertexY=-7,-7,7,7

> Daraus schließe ich, dass die angegebene Länge "width" von links nach rechts vom Startpunkt aus geht.  Aber wie ändere ich den Startpunkt?


Den Startpunkt änderst du gar nicht. Width und Height sind tatsächlich dazu gedacht, die gesamten Breite und Höhe des Objekts anzugeben. Das kleiner anzugeben, als z.B. die Grafik hinterher, ist immer eine schlechte Idee. Du hast dadurch eine Menge Nachteile, welche jede Funktionalität im Spiel darauf ausgelegt, dass das Objekt richtige Maße hat.
Als Beispiel seien nur Explosionen genannt. Diese machen deiner Brücke dann nur Schaden, wenn sie auch mit dem "Shape" (die Fläche des Objekt in Breite x Höhe) überlappen. Hast du die Werte so klein angegeben, könnte die Brücke nur an dem Kasten beschädigt werden. Das ist nur ein Beispiel, es werden auch viele andere negative Effekte auftreten.

Die beste Lösung ist ein Hilfsobjekt mit entsprechend kleineren Ausmaßen, welches anfassbar ist und bei dem Kasten positioniert wird.

Falls du ein Beispiel suchst, guck dir den [Slot](https://github.com/lluchs/ClonkMars/tree/5e0bbe69f63a9ffa3a007d42d597d2ad424606fc/ClonkMars.c4d/Structures.c4d/Materialunit.c4d/Slot.c4d) aus ClonkMars an.

Wenn die Brücke nur über den Kasten zerstörbar wäre, würde mich das nicht groß stören ^^   die Brücke soll einzig und allein dafür da sein, dass man drüberlaufen kann, jegliche Interaktion soll nur über den Kasten funktionieren.
(oder kennt ihr noch ein besseres Objekt wie dieses, womit man eben auf die schnelle mal löcher schließen/öffnen kann?  Ich hab noch 2 Transportsperren für nen kleinen und nen großen Fahrstuhl gefunden, aber die funktionieren halt nur bei Fahrstuhlschächten.)

Aber gut, ein Hilfsobjekt wäre sicherlich nicht verkehrt, danke für die Idee :slight_smile:

Clonk Mars ist ein tolles Pack :)  Das hab ich auch schon ein wenig gezockt, allerdings nie verstanden, wie man diesen Slot nutzt :D  Dachte eig, das wäre was zum reinwerfen, wie es das beim normalen Foundry oderso gibt, aber mit der geänderteten Schwerkrakft wäre es nicht wirklich leicht, etwas da reinzuwerfen :smiley:
Wusste nicht, dass man es anfassen kann, wieder was gelernt :)  Also ist es wohl dazu da, wenn drinnen gerade jemand was produziert bzw. das Gebäude voll ist :slight_smile:

Was macht der Eintrag "Collection" in der DefCore?

Collection   4 Integer   Koordinaten des Aufnahmebereichs des Objekts relativ zur Objektmitte.
Wie funktioniert die Aufnahme? Welche Aufnahme genau? Eine Lore kann man scheinbar so nicht reinkriegen. (ich suche grad noch einen Weg, wie man in ein Nicht-betretbares Objekt möglichst viele Dinge schnell reinbekommt, also z.b mit einer Lore, damit man nicht alles einzeln reintun muss… einen Eingang einbauen wäre nur eine Option, wenn Clonks ihn nicht betreten können (also auch nicht rein und sofort wieder rausschmeißen), weil das immer sehr nervt, wenn man eigentlich springen will.)

Das definiert einen Bereich, in dem einsammelbare Objekte (also alles, was auch dein Clonk in sein Inventar packen, d.h. keine Fahrzeuge, sondern nur Sachen mit Collectible=1 in DefCore.txt) vom Objekt eingesammelt werden. Beispiele dafür sind der Clonk (im gesamten Bereich) oder auch Einwurfschächte von Gebäuden (Hochofen z.B.) oder die Lore (fast der gesamte Bereich, nicht am Boden bei den Rädern).

ah , dankesehr :slight_smile:

gut, in einen schacht dinge reinwerfen geht relativ schnell, also passt das in diesem Fall so, super :slight_smile:

so… ich hab nun ein Hilfsobjekt gemacht, welches auch fast einwandfrei funktioniert.
Es geht so, dass das Hilfsobjekt automatisch mit erstellt wird. Das hilfsobjekt sucht dann das hauptobjekt ("main") und gibt dann die Befehle daran weiter.
In die rechte Richtung mit "Find_Distance(5)" funktioniert mal wieder alles wunderbar. Nur links macht weiterhin große Probleme, da das das ganze wieder irgendwie verschoben ist, brauche ich da einen größeren Distance Wert, damit es klappt.  Da das aber zu Problemen führen kann ,wenn mehrere solche Teile nebeneinander stehen, wollte ich rausfinden in welche Richtung das ganze verschoben ist, und dann eben den Find_InRect oder Find_AtRect Befehl verwenden.  Aber der Befehl findet das hauptobjekt nicht.

Nach stundenlangem rumprobieren habe ich gemerkt, dass selbst das hier nichts findet:
    main = FindObject2(Find_ID(G25Y),Find_InRect(0,0,0,0) ) ;

Was mache ich falsch? Das sollte doch eigentlich alles auf der Karte finden?

Mit Find_Distance(100), wirds jedenfalls gefunden, kann halt nur zu problemen führen…

Dein "main" erzeugt doch das Hilfsobjekt, oder? Warum sagt es ihm dann nicht auch gleich, wozu es gehört?

>Das sollte doch eigentlich alles auf der Karte finden?


Nein, das ist nicht so rumgehacke wie bei FindObject. Find_InRect(x, y, wdt, hgt) findet alles in dem Rechteck. Wenn Weite und Höhe 0 sind, dann ist das Rechteck eben unendlich klein und es wird nichts gefunden.
Ohne die Einschränkung würdest du alles auf der Karte finden: FindObject2(Find_ID(G25Y))

achso, ich dachte das arbeitet genauso wie findobject ^^

das mit dem Zuordnen ist ne gute Idee…

hatte da nur vorher noch einen timer im hilfsobjekt, welcher immer wieder schauen soll, ob main noch da ist.  Hatte nämlich erst in beide objekte ein eine Destruction Funktion , damit das main "hilfe" entfernt, und hilfe "main" entfernt, wenn eines von beiden zerstört wird.  Zusätzlich dann noch wenn das hauptobjket wieder aufgenommen wird, das entfernen vom hilfsobjekt.
Das hat das Spiel natürlich zum absturz gebracht, weshalb der Timer hermusste :smiley:

Aber habs jetzt anders gemacht. Das hilfsobjekt ist unzerstörbar, muss also nicht das mainobjekt entfernen. und nur wenn das Mainobjekt zerstört wird, wird auch das hilfsobjekt entfernt. Wobei ich jetzt noch nen timer brauche, der prüft ob main brennt, damit "hilfe" dann schon enfernt wird und nicht erst wenns abgebrannt ist.
Pass jetzt also so :slight_smile:

ah und ich muss noch ein setposition reinmachen, damit main und hilfe immer auf derselben stelle sind…

edit: hat alles geklappt, problem gelöst :slight_smile:

>hatte da nur vorher noch einen timer im hilfsobjekt, welcher immer wieder schauen soll, ob main noch da ist.  Hatte nämlich erst in beide objekte ein eine Destruction Funktion , damit das main "hilfe" entfernt, und hilfe "main" entfernt, wenn eines von beiden zerstört wird.  Zusätzlich dann noch wenn das hauptobjket wieder aufgenommen wird, das entfernen vom hilfsobjekt.


Als Hinweis:
Wenn dein Hilfsobjekt per Action mit der Prozedur `ATTACH` an dein main-Objekt rangeklebt ist, bekommt es den Callback `AttachTargetLost` aufgerufen. Um also dein Hilfsobjekt zu entfernen, wenn das Hauptobjekt entfernt wird, würde das hier gehen:
```
func AttachTargetLost()
{
    RemoveObject();
}
```