Grundsätzlich sieht der Codeausschnitt nicht sonderlicht verwerflich aus. Du könntest überlegen, die 3. und 4. Zeile einzusparen, indem sie mit in die beiden darüber eingebettet werden.
Weiterhin könntest du dir für die Koordinaten eine eigene Vektor-"Klasse" implementieren (bzw. einen Konstruktor mit entsprechendem Prototypen), wodurch an vielen Stellen die Anzahl an Zeilen halbiert wird und an anderen diese insgesamt einfacher werden könnten. Dies würde im Groben so aussehen:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
function Vector2(x, y) {
this.x = x;
this.y = y;
}
Vector2.prototype.add = function(other) {
return new Vector2(this.x + other.x, this.y + other.y);
};
Vector2.prototype.subtract = function(other) {
return new Vector2(this.x - other.x, this.y - other.y);
};
Vector2.prototype.multiply = function(value) {
return new Vector(this.x * value, this.y * value);
};
Object.defineProperty(Vector2.prototype, 'sqrMagnitude', {
get: function() {
return this.x * this.x + this.y * this.y;
}
});
Object.defineProperty(Vector2.prototype, 'magnitude', {
get: function() {
return Math.sqrt(this.sqrMagnitude);
}
});
Vector2.one = new Vector2(1, 1);
[...]
|
Zu beachten ist, dass darüber erzeugte Objekte immutable sind, ihr interner Zustand sich also nicht durch den Aufruf von Funktionen verändert. Genau genommen können die Werte durch direkte Manipulation noch verändert werden, nur wollte ich den Code oben einfach halten. Will man einen Schutz davor haben, würde man
Object.defineProperty verwenden, um die Werte innerhalb des Konstruktors als Properties zu definieren, wodurch sie, bei den richtigen Argumenten, nicht verändert werden können. (Gleiches gilt für die Konstante
Vector2.one, welche theoretisch noch überschrieben werden könnte.)
Das Verhalten kann unter Umständen nicht gewünscht sein, in den meisten Fällen beugt sowas aber unvorhergesehene Fehler vor.
Verwenden kann man dies bspw. so:
|
Quellcode
|
1
2
3
4
5
|
var playerPosition = new Vector2(5, 12);
var cameraPosition = new Vector2(0, 5);
var displayPosition = playerPosition.subtract(cameraPosition);
console.log(displayPosition.x, displayPosition.y);
[...]
|
Leider wird man so nicht mit den Zeichen für Addition, Subtraktion etc. arbeiten können, da JavaScript Operatorüberladung meines Wissens nicht unterstützt.