-
Notifications
You must be signed in to change notification settings - Fork 0
/
GObject.js
81 lines (64 loc) · 2.93 KB
/
GObject.js
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
Un GameObject es un objeto básico de nuestro juego, y todos los demás objetos derivarán de este
Todos los GameObject disponen de una matriz de transformación, la cual contiene toda la información
sobre la posición, rotación y escalado del objeto.
Antes de pintar un objeto determinado, deberemos utilizar el método setTransform para que el canvas sepa cual es su posición y orientación
Incluye los métodos
* **Clone**: Para copiar el objeto sin referenciarlo.
* **setPosition**: Para definir una posición respecto al Mundo.
* **setPositionV**: Lo mismo, pero permite definirla a través de un Array de 2 elementos.
* **lookTo**: Modifica la matriz de tal modo que apunte hacia el punto que le hemos especificado.
* **rotate**: Rota la matriz un cierto número de grados (en radianes) y en el eje "axis", especificado con un array de tres 1 o 0: [1,0,0] para el eje x, [0,1,0] para el y, etc.
* **move**: Cambia la posición de la matriz de forma local. Tenemos que visualizar unos ejes imaginarios sobre el objeto, si el objeto está rotado y movemos sobre x, el objeto no se moverá horizontalmente, sino hacia donde apunte este eje teniendo en cuenta la rotación. Es lo más útil para hacer un juego.
* **beMoved**: A diferencia del anterior, simplemente suma x e y a la posición actual. Si movemos sobre x, el objeto se moverá horizontalmente independientemente de su rotación.
* **setTransform**: Como hemos mencionado antes, "avisa" al canvas HTML5 sobre cómo tiene que pintar el objeto.
*/
function GObject(x,y){
this.mt = new Matrix33();
this.mt.setIdentity();
this.mt.setPosition(x,y);
this.id = this.idCount;
this.idCount++;
this.toString = "GObject" + this.idCount.toString();
}
GObject.idCount = 0;
GObject.tau = 2*Math.PI;
GObject.prototype.clone = function(b){
this.mt = b.mt;
this.id = b.id;
this.toString = b.toString;
};
GObject.prototype.setPosition = function(x,y){
this.mt.setPosition(x,y);
};
GObject.prototype.setPositionV = function(pos){
this.mt.setPosition(pos[0],pos[1]);
};
GObject.prototype.lookTo = function(x,y){
var pos = this.mt.getPosition();
this.mt.setRotation(Math.atan2(y-pos[1], x-pos[0]),[0,0,1]);
};
/* We assume that coder is refering to a local rotation.
* If you want a global rotation you can do it with (GObject).mt.rotate(radians,axis);
*/
GObject.prototype.rotate = function(radians,axis){
this.mt.rotateLocal(radians,axis);
};
/* Not understanding the difference between move and beMoved can
* induce unexpected behaviour.
*/
GObject.prototype.move = function(x,y){
this.mt.translateLocal(x,y);
};
GObject.prototype.beMoved = function(x,y){
this.mt.translate(x,y);
};
GObject.prototype.setTransform = function(ctx){
ctx.setTransform(this.mt.get(0,0),
this.mt.get(1,0),
this.mt.get(0,1),
this.mt.get(1,1),
this.mt.get(0,2),
this.mt.get(1,2)
);
};