Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
loeasy68
GitHub Repository: loeasy68/loeasy68.github.io
Path: blob/main/website/GAUSS/js/canvas-manager.js
2941 views
1
var $canvas, canvas, canvas_Char, ctx, ctx_Char;
2
3
/*var canvas_cMenu =
4
{
5
'spritePositioning' :
6
[{
7
'text' : 'Place object here',
8
'action' : function() { console.log('Elt')}
9
}]
10
}
11
;*/
12
13
paper.Point.getDistance = function(p)
14
{
15
return Math.sqrt(Math.pow(this.x - p.x, 2) - Math.pow(this.y - p.y, 2));
16
};
17
18
var drawPolygon = function(polygon, fillColor, strokeColor, ctx, drawHandles)
19
{
20
ctx.strokeStyle = 'black';
21
ctx.lineWidth = 1;
22
23
if(polygon.points.length == 0)
24
return;
25
if (polygon.points.length == 1)
26
{
27
ctx.fillRect(polygon.points[0].x - 5, polygon.points[0].y - 5, 10, 10);
28
return;
29
}
30
else
31
{
32
var shiftX = 0, shiftY = 0;
33
if(ctx === gameCtx)
34
{
35
shiftX = viewport.left;
36
shiftY = viewport.top;
37
}
38
ctx.beginPath();
39
ctx.moveTo(polygon.points[0].x - shiftX, polygon.points[0].y - shiftY);
40
for (var i = 0; i < polygon.points.length; i++) {
41
if (polygon.points[i + 1] != undefined) {
42
if (polygon.points[i + 1].x == polygon.points[i].x && polygon.points[i + 1].y == polygon.points[i].y)
43
continue;
44
ctx.lineTo(polygon.points[i + 1].x + 0.5 - shiftX, polygon.points[i + 1].y - shiftY);
45
}
46
else if (polygon.closed) {
47
ctx.closePath();
48
if(fillColor)
49
{
50
ctx.fillStyle = fillColor;
51
ctx.fill();
52
break;
53
}
54
55
}
56
}
57
58
if(strokeColor)
59
{
60
ctx.lineWidth = 3;
61
ctx.strokeStyle = strokeColor;
62
}
63
ctx.stroke();
64
ctx.strokeStyle = 'black';
65
66
ctx.fillStyle = 'black';
67
68
/*for(var i = 0; i < polygon.edges.length; i++)
69
{
70
if(polygon.edges[i].highlight)
71
{
72
//alert('Close to edge!');
73
ctx.fillRect(0, 0, 50, 50);
74
ctx.strokeStyle = 'blue';
75
ctx.lineTo(polygon.edges[i][0] + 0.5, polygon.edges[i][1]);
76
break;
77
}
78
}
79
*/
80
if (!polygon.closed || drawHandles === true)
81
for(var i = 0; i < polygon.points.length; i++)
82
{
83
if(polygon.points[i].highlight)
84
ctx.fillStyle = 'red';
85
ctx.fillRect(polygon.points[i].x - 5, polygon.points[i].y - 5, 10, 10);
86
ctx.fillStyle = 'black';
87
}
88
89
90
}
91
};
92
93
94
/*=======================================================================================================*/
95
var getItemWithSpriteContaining = function(point)
96
{
97
/* The point must be sought starting from the highest layers down to the lowest.
98
This allows the user to select an item whose bounding box is completely contained inside another object's bounding box */
99
100
var ks = new Array();
101
for(var layer in editorCurrentRoom.zOrderMap)
102
ks.push(layer);
103
ks.sort(); // Since you can't order an object by keys in Javascript, order its keys
104
105
for(var i = ks.length - 1; i >= 0; i--)
106
{
107
for(var j = 0; j < editorCurrentRoom.zOrderMap[ks[i]].length; j++)
108
{
109
var currentItem = editorMapIdItem[editorCurrentRoom.zOrderMap[ks[i]][j]];
110
if (currentItem.defaultAnims.default == null)
111
continue;
112
var anim = editorMapIdAnim[currentItem.defaultAnims.default];
113
if(!anim)
114
continue;
115
var frame = anim.frames[anim.start_idx];
116
var bb = new paper.Rectangle(currentItem.position.x - frame.img.width / 2, currentItem.position.y - frame.img.height, frame.img.width, frame.img.height);
117
if (bb.contains(point))
118
return currentItem;
119
}
120
}
121
return null;
122
};
123
124
var getCharacterWithSpriteContaining = function(point)
125
{
126
var room = editorMapIdCharacter[editorCurrentCharacter.id];
127
var characters = [];
128
129
for(var key in editorMapIdCharacter)
130
if(editorMapIdCharacter[key].id == room.id)
131
characters.push(editorMapIdCharacter[key]);
132
133
for(var i = 0; i < characters.length; i++)
134
{
135
if (characters[i].defaultAnims.stand.FL == null)
136
continue;
137
var anim = editorMapIdAnim[characters[i].defaultAnims.stand.FL];
138
if(!anim)
139
continue;
140
var frame = anim.frames[anim.start_idx];
141
var bb = new paper.Rectangle(characters[i].position.x - frame.img.width / 2, characters[i].position.y - frame.img.height, frame.img.width, frame.img.height);
142
if (bb.contains(point))
143
return characters[i];
144
}
145
return null;
146
};
147
148
var drawItemBoundingBox = function(item, ctx)
149
{
150
if(item == null)
151
return;
152
var frame = getItemPlaceHolder(item);
153
ctx.beginPath();
154
ctx.lineWidth = '2';
155
ctx.setLineDash([2]);
156
ctx.strokeStyle = '#2200ff';
157
ctx.rect(item.position.x - frame.img.width / 2, item.position.y - frame.img.height, frame.img.width, frame.img.height);
158
ctx.stroke();
159
};
160
161
var updateCanvas = function(room, which)
162
{
163
if(!room)
164
{
165
$('.container.' + which).hide();
166
return;
167
}
168
169
var _canvas;
170
var _context;
171
var _selectedData;
172
var _drawRoomChunks;
173
174
switch(which)
175
{
176
case 'room':
177
_canvas = canvas;
178
_context = ctx;
179
_selectedData = editorCurrentItem;
180
_drawRoomChunks = function()
181
{
182
for(var key in room.zOrderMap)
183
{
184
var itemsKeyList = room.zOrderMap[key];
185
for (var i = 0; i < itemsKeyList.length; i++)
186
{
187
var item = editorMapIdItem[itemsKeyList[i]];
188
if(item.hideFromCanvas === true)
189
continue;
190
var frame = getItemPlaceHolder(item);
191
if (!frame)
192
continue;
193
if (item.position.x == null || item.position.y == null)
194
continue;
195
_context.drawImage(frame.img, item.position.x - frame.img.width / 2, item.position.y - frame.img.height);
196
}
197
}
198
};
199
break;
200
case 'character':
201
_canvas = canvas_Char;
202
_context = ctx_Char;
203
_selectedData = editorCurrentCharacter;
204
_drawRoomChunks = function()
205
{
206
for (var key in editorMapIdCharacter)
207
{
208
var character = editorMapIdCharacter[key];
209
if (character.parentRoomId != room.id)
210
continue;
211
var frame = getItemPlaceHolder(character);
212
if (!frame)
213
continue;
214
if (character.position.x == null || character.position.y == null)
215
continue;
216
_context.drawImage(frame.img, character.position.x - frame.img.width / 2, character.position.y - frame.img.height);
217
}
218
};
219
break;
220
}
221
222
_context.clearRect(0, 0, _canvas.width, _canvas.height);
223
224
if(room.items.length == 0)
225
{
226
$('.container.' + which).hide();
227
//$('.canvas.room').hide();
228
//$('.toolbar.room').hide();
229
//$('.item').hide();
230
return;
231
}
232
233
//$(_canvas).css({ 'width' : room.items[0].boundingBox.width, 'height' : room.items[0].boundingBox.height });
234
_canvas.width = room.items[0].boundingBox.width;
235
//_canvas.width = resolution.width;
236
_canvas.height = room.items[0].boundingBox.height;
237
//_canvas.height = resolution.height;
238
239
_context.drawImage(room.items[0].img, room.items[0].boundingBox.left, room.items[0].boundingBox.top);
240
241
_drawRoomChunks();
242
switch(_canvas.state)
243
{
244
case 'sprite':
245
drawItemBoundingBox(_canvas.selected, _context);
246
break;
247
case 'hotspot':
248
if(_selectedData != null && _selectedData.hotspot != null)
249
drawPolygon(_selectedData.hotspot, '', _selectedData.hotspot['closed'] ? 'red' : '', _context);
250
break;
251
case 'pathfinding':
252
if(keys(editorCurrentRoom.walkBoxes).length > 0)
253
{
254
for(var i in editorCurrentRoom.walkBoxes)
255
{
256
var fillColor = 'rgba(255, 255, 0, 0.5)';
257
var lineColor = 'orange';
258
if(editorCurrentWalkBox === editorCurrentRoom.walkBoxes[i].id)
259
{
260
fillColor = 'rgba(255, 0, 0, 0.5)';
261
lineColor = 'purple';
262
}
263
drawPolygon(editorCurrentRoom.walkBoxes[i].polygon, fillColor, lineColor, ctx, true);
264
}
265
}
266
break;
267
case 'crop-image':
268
if(cropPoly != null)
269
{
270
drawPolygon(cropPoly, '', cropPoly['closed'] ? 'red' : '', ctx);
271
if(cropPoly['closed'] === true)
272
{
273
var data = cropImage(cropPoly);
274
var croppedImage = new Image();
275
croppedImage.src = data.src;
276
$(croppedImage).css('border', '1px solid black');
277
var croppedImageDiv = $('#cropped-image');
278
croppedImageDiv.empty();
279
croppedImageDiv.append(croppedImage);
280
$('#cropped-image-modal').modal('show');
281
cropPoly = null;
282
}
283
}
284
break;
285
case 'walk-behind':
286
if(editorCurrentItem != null && editorCurrentItem.centralPerspectiveWalkBehind != null)
287
{
288
ctx.strokeStyle = 'black';
289
ctx.lineWidth = 1;
290
291
ctx.beginPath();
292
ctx.moveTo(0, editorCurrentItem.centralPerspectiveWalkBehind);
293
ctx.lineTo(canvas.width, editorCurrentItem.centralPerspectiveWalkBehind);
294
ctx.closePath();
295
ctx.stroke();
296
}
297
break;
298
default:
299
break;
300
}
301
$('.container.' + which).show(); // Show the right part of the page
302
//$('.canvas.room').show();
303
$('.toolbar.' + which).width($('.canvas.' + which).width());
304
$('.item.' + which).show();
305
};
306