-
Notifications
You must be signed in to change notification settings - Fork 0
/
node.js
155 lines (151 loc) · 4.63 KB
/
node.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*global a2d, window */
/**
* Base node. Anything that is displayed inherits from this.
* @augments a2d.Events
* @augments a2d.Collection
* @class
*/
//warning: SceneNode pretends to be an array, do not use numerical indices unless you know what you are doing...
a2d.Node = function () {
'use strict';
a2d.Collection.apply(this);
a2d.Events.apply(this);
var self = this;
this.absolute = false;
this.scrollLock = false;
this.opacity = 1.0;
this.position = new a2d.Position(0, 0);
this.offset = new a2d.Position(0, 0);
this.set = function(config) {
for(var p in config) {
this[p] = config[p];
}
};
/**
* gets or sets the absolute position for this node.
* automagically updates relative position, if applicable.
* @property {a2d.Position} absolutePosition
* @name a2d.Node#absolutePosition
*/
this.__defineGetter__("absolutePosition", function() {
if(this.parent) {
var aPos = this.parent.absolutePosition.clone();
aPos.add(this.position);
return aPos;
}
return this.position;
});
this.__defineSetter__("absolutePosition", function(p) {
if(this.parent) {
var aPos = this.parent.absolutePosition.clone();
aPos.subtract(p);
this.position = aPos;
} else {
this.position = p;
}
});
/**
* gets or sets the absolute offset for this node.
* automagically updates relative position, if applicable.
* @property {a2d.Position} absoluteOffset
* @name a2d.Node#absoluteOffset
*/
this.__defineGetter__("absoluteOffset", function() {
if(this.parent) {
var aPos = this.parent.absoluteOffset.clone();
aPos.add(this.offset);
return aPos;
}
return this.offset;
});
this.__defineSetter__("absoluteOffset", function(p) {
if(this.parent) {
var aPos = this.parent.absoluteOffset.clone();
aPos.subtract(p);
this.offset = aPos;
} else {
this.offset = p;
}
});
/**
* bounding box of this node, if applicable. Nodes that display things and want to handle mouse events should take care of setting this.
* @type a2d.Rectangle
*/
this.boundingBox = new a2d.Rectangle(new a2d.Position(0, 0), new a2d.Position(0, 0));
/**
* True if mouse is currently over this node(and mouse tracking is enabled for this node)
* @type boolean
*/
this.hover = false;
/**
* Scale.
* @default (1, 1)
* @type a2d.Vector
*/
this.scale = new a2d.Vector(1, 1);
/**
* Node will not be displayed when this is set to false.
* @default true
* @type boolean
*/
this.visible = true;
/**
* The name of this node.
* @default "SceneNode"
* @type string
*/
this.name = "Node";
/**
* Find node at given position
* @param {a2d.Position} position to look for
* @returns node if found, null if not
*/
this.findNodeAt = function(pos) {
var searchPos = new a2d.Position(pos.X, pos.Y);
if(this.offset && !this.absolute) {
searchPos.add(this.offset);
}
/*if(this.scrollLock) {
searchPos.add(a2d.offset);
}*/
//look up in reverse drawing order so only the top node is returned
for(var i = self.length - 1; i >= 0; i--) {
var found = self[i].findNodeAt(searchPos);
if(found){
return found;
}
}
if(searchPos.isInside(self.boundingBox) && (self.hasEvent("click") || self.hasEvent("mousedown"))) {
return self;
}
return null;
};
/**
* Draws this node and its children
*/
this.draw = function () {
var i,
mouse = a2d.mousePosition ? new a2d.Position(a2d.mousePosition.X, a2d.mousePosition.Y) : new a2d.Position(0, 0);
if(mouse && mouse.isInside(this.boundingBox)) {
if(!this.hover) {
this.fireEvent("mouseover");
this.fireEvent("hover");
this.hover = true;
}
} else {
if(this.hover) {
this.fireEvent("mouseout");
this.hover = false;
}
}
if(this.visible) {
for (i = 0; i < this.length; i++) {
this[i].draw();
}
}
this.fireEvent("draw");
if(a2d.drawCounter !== undefined) {
a2d.drawCounter++;
}
};
};