Langsam verzweifle ich an einem kleinen Problem... sitze da schon 3 Stunden dran und die Ergebnisse sind immer unerwartet
Ich möchte eine Funktion/Methode basteln, mit der ich eine 2D Position (z.B. eine Interessante Position auf einer Karte) sozusagen begrenzen kann auf den aktuellen Anzeigebereich.
Die Karte ist relativ zur Spielerposition. Also 0,0 ist genau die Mitte, dort wo der Spieler ist. Und die interessante Position ist eine relative Position zu diesem Nullpunkt/Zentrum.
Von der Karte wird ein Quadratischer Ausschnitt angezeigt der sowohl entlang von X als auch Y, im Bereich von -1 bis +1 liegt.
Diese interessante Position kann nun, z.B. auf 0.75,-0.5 sein. Dann wäre sie ganz normal innerhalb der Anzeige. Die Position muss dann nicht verändert/begrenzt werden.
Interessant wird es nun, wenn der Spieler sich weiter weg von dieser Position bewegt, und so diese Position außerhalb von -1/+1 wandert.
Also die Position wandert nun z.B. auf +3/-1.8. In diesem Fall wäre die Position außerhalb der Anzeige.
Hier möchte ich nun meinen Begrenzer einbauen. Und zwar so, das der Marker welcher anzeigt wo diese 'interessante Position' liegt, am Kartenrand klebt. Um so anzuzeigen in welcher Richtung diese interessante Position liegt.
Der Begrenzer müsste nun so arbeiten, dass vom Marker die X/Y Achse mit dem größeren Wert, genau +1 oder -1 ist, und die Achse mit dem kleineren Wert müsste entsprechend kleiner skaliert sein. Aus dem Beispiel +3/-1.8 sollte also werden: +1/-0.6
Habe ich hier schon einen Denkfehler? +3/-1.8 und +1/-0.6 sind doch genau in der gleichen Richtung (Winkel) vom 0,0 Zentrum, oder?
Genau genommen möchte ich den Bereich noch weiter begrenzen auf +/- 0.96, so das der Marker nicht halb aus der Anzeige raus ist, sondern noch vollständig innerhalb der Anzeige zu sehen ist. Aber zur Einfachheit bleiben wir mal bei einem Bereich von +/- 1
Mein Problem ist nun, das egal auf welche Idee ich komme um das zu Berechnen, zwar der Marker innerhalb des Anzeigebereichs landet, aber die Achse mit dem kleineren Wert wird immer irgendwie ein wenig falsch berechnet.
Hier die zwei Code Ideen, die mir bisher die 'am wenigsten falschen' (
) Ergebnisse gebracht haben.
Idee 1:
|
C#-Quelltext
|
1
2
3
4
5
6
7
|
Vector2 pos = ...;
const float xyMax = 0.96f;
if(pos.x > +xyMax || pos.x < -xyMax || pos.y > +xyMax || pos.y < -xyMax) {
// Das Größere von x/y zu genau +xyMax bzw. -xyMax. machen. z.B. wenn xyMax=1 dann wird x=3 y=-1.8 zu x=1 y=-0.6
float scal = Mathf.Max(pos.x.Abs(), pos.y.Abs()) / xyMax;
pos = pos / scal;
}
|
Idee 2:
|
C#-Quelltext
|
1
2
3
4
5
|
Vector2 pos = ...;
const float xyMax = 0.96f;
if(pos.x > +xyMax || pos.x < -xyMax || pos.y > +xyMax || pos.y < -xyMax) {
pos = (pos.normalized * xyMax);
}
|