Skip to content

Commit f4a1a30

Browse files
Merge remote-tracking branch 'origin/master'
2 parents cd43f00 + a69765d commit f4a1a30

43 files changed

Lines changed: 600 additions & 129 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

v3/src/display/mask/BitmapMask.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,16 @@ var BitmapMask = new Class({
144144

145145
// Apply alpha masking using mask renderer
146146
maskRenderer.draw(null, null, this.mainTexture, this.maskTexture);
147+
},
148+
149+
preRenderCanvas: function (renderer, mask, camera)
150+
{
151+
// NOOP
152+
},
153+
154+
postRenderCanvas: function (renderer)
155+
{
156+
// NOOP
147157
}
148158

149159
});

v3/src/display/mask/GeometryMask.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,21 @@ var GeometryMask = new Class({
4646
// Force flush before disabling stencil test
4747
renderer.currentRenderer.flush();
4848
gl.disable(gl.STENCIL_TEST);
49+
},
50+
51+
preRenderCanvas: function (renderer, mask, camera)
52+
{
53+
var geometryMask = this.geometryMask;
54+
renderer.currentContext.save();
55+
//renderer.currentContext.beginPath();
56+
geometryMask.renderCanvas(renderer, geometryMask, 0.0, camera, null, true);
57+
renderer.currentContext.clip();
58+
},
59+
60+
postRenderCanvas: function (renderer)
61+
{
62+
//renderer.currentContext.closePath();
63+
renderer.currentContext.restore();
4964
}
5065

5166
});

v3/src/gameobjects/graphics/GraphicsCanvasRenderer.js

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
var Commands = require('./Commands');
22
var GameObject = require('../GameObject');
33

4-
var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, camera, renderTargetCtx)
4+
var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, camera, renderTargetCtx, allowClip)
55
{
66
if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera._id)))
77
{
@@ -102,20 +102,38 @@ var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, c
102102
break;
103103

104104
case Commands.FILL_PATH:
105-
ctx.fill();
105+
if (!allowClip)
106+
{
107+
ctx.fill();
108+
}
106109
break;
107110

108111
case Commands.STROKE_PATH:
109-
ctx.stroke();
112+
if (!allowClip)
113+
{
114+
ctx.stroke();
115+
}
110116
break;
111117

112118
case Commands.FILL_RECT:
113-
ctx.fillRect(
114-
commandBuffer[index + 1],
115-
commandBuffer[index + 2],
116-
commandBuffer[index + 3],
117-
commandBuffer[index + 4]
118-
);
119+
if (!allowClip)
120+
{
121+
ctx.fillRect(
122+
commandBuffer[index + 1],
123+
commandBuffer[index + 2],
124+
commandBuffer[index + 3],
125+
commandBuffer[index + 4]
126+
);
127+
}
128+
else
129+
{
130+
ctx.rect(
131+
commandBuffer[index + 1],
132+
commandBuffer[index + 2],
133+
commandBuffer[index + 3],
134+
commandBuffer[index + 4]
135+
);
136+
}
119137
index += 4;
120138
break;
121139

@@ -125,7 +143,10 @@ var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, c
125143
ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
126144
ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
127145
ctx.closePath();
128-
ctx.fill();
146+
if (!allowClip)
147+
{
148+
ctx.fill();
149+
}
129150
index += 6;
130151
break;
131152

@@ -135,7 +156,10 @@ var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, c
135156
ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
136157
ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
137158
ctx.closePath();
138-
ctx.stroke();
159+
if (!allowClip)
160+
{
161+
ctx.stroke();
162+
}
139163
index += 6;
140164
break;
141165

v3/src/gameobjects/tilemap/Tile.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ var Tile = new Class({
103103

104104
setCollision: function (left, right, up, down)
105105
{
106+
if (right === undefined) { right = left; }
107+
if (up === undefined) { up = left; }
108+
if (down === undefined) { down = left; }
109+
106110
this.collideLeft = left;
107111
this.collideRight = right;
108112
this.collideUp = up;

v3/src/gameobjects/tilemap/Tilemap.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -334,20 +334,20 @@ var Tilemap = new Class({
334334
}
335335
},
336336

337-
putTileAt: function (tile, tileX, tileY, layer)
337+
putTileAt: function (tile, tileX, tileY, recalculateFaces, layer)
338338
{
339339
layer = this.getLayer(layer);
340340
if (this._isStaticCall(layer, 'putTileAt')) { return null; }
341341
if (layer === null) { return null; }
342-
return TilemapComponents.PutTileAt(tile, tileX, tileY, layer);
342+
return TilemapComponents.PutTileAt(tile, tileX, tileY, recalculateFaces, layer);
343343
},
344344

345-
putTileAtWorldXY: function (tile, worldX, worldY, camera, layer)
345+
putTileAtWorldXY: function (tile, worldX, worldY, recalculateFaces, camera, layer)
346346
{
347347
layer = this.getLayer(layer);
348348
if (this._isStaticCall(layer, 'putTileAtWorldXY')) { return null; }
349349
if (layer === null) { return null; }
350-
return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, camera, layer);
350+
return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, recalculateFaces, camera, layer);
351351
},
352352

353353
randomize: function (tileX, tileY, width, height, indices, layer)
@@ -361,11 +361,11 @@ var Tilemap = new Class({
361361
return this;
362362
},
363363

364-
recalculateFaces: function (layer)
364+
calculateFacesWithin: function (tileX, tileY, width, height, layer)
365365
{
366366
layer = this.getLayer(layer);
367367
if (layer === null) { return this; }
368-
TilemapComponents.RecalculateFaces(layer);
368+
TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, layer);
369369
return this;
370370
},
371371

@@ -376,20 +376,20 @@ var Tilemap = new Class({
376376
return this;
377377
},
378378

379-
removeTileAt: function (tileX, tileY, replaceWithNull, layer)
379+
removeTileAt: function (tileX, tileY, replaceWithNull, recalculateFaces, layer)
380380
{
381381
layer = this.getLayer(layer);
382382
if (this._isStaticCall(layer, 'removeTileAt')) { return null; }
383383
if (layer === null) { return null; }
384-
return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, layer);
384+
return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, layer);
385385
},
386386

387-
removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, camera, layer)
387+
removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, recalculateFaces, camera, layer)
388388
{
389389
layer = this.getLayer(layer);
390390
if (this._isStaticCall(layer, 'removeTileAtWorldXY')) { return null; }
391391
if (layer === null) { return null; }
392-
return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, camera, layer);
392+
return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, recalculateFaces, camera, layer);
393393
},
394394

395395
replaceByIndex: function (findIndex, newIndex, tileX, tileY, width, height, layer)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
var GetTileAt = require('./GetTileAt');
2+
var GetTilesWithin = require('./GetTilesWithin');
3+
4+
var CalculateFacesWithin = function (tileX, tileY, width, height, layer)
5+
{
6+
var above = null;
7+
var below = null;
8+
var left = null;
9+
var right = null;
10+
11+
var tiles = GetTilesWithin(tileX, tileY, width, height, layer);
12+
13+
for (var i = 0; i < tiles.length; i++)
14+
{
15+
var tile = tiles[i];
16+
17+
if (tile && tile.collides)
18+
{
19+
above = GetTileAt(tile.x, tile.y - 1, true, layer);
20+
below = GetTileAt(tile.x, tile.y + 1, true, layer);
21+
left = GetTileAt(tile.x - 1, tile.y, true, layer);
22+
right = GetTileAt(tile.x + 1, tile.y, true, layer);
23+
24+
tile.faceTop = (above && above.collides) ? false : true;
25+
tile.faceBottom = (below && below.collides) ? false : true;
26+
tile.faceLeft = (left && left.collides) ? false : true;
27+
tile.faceRight = (right && right.collides) ? false : true;
28+
}
29+
}
30+
};
31+
32+
module.exports = CalculateFacesWithin;

v3/src/gameobjects/tilemap/components/Copy.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var GetTilesWithin = require('./GetTilesWithin');
22

3-
var Fill = function (srcTileX, srcTileY, width, height, destTileX, destTileY, layer)
3+
// Copies indices, not other properties. Does not modify collisions.
4+
var Copy = function (srcTileX, srcTileY, width, height, destTileX, destTileY, layer)
45
{
56
if (srcTileX === undefined || srcTileX < 0) { srcTileX = 0; }
67
if (srcTileY === undefined || srcTileY < 0) { srcTileY = 0; }
@@ -21,4 +22,4 @@ var Fill = function (srcTileX, srcTileY, width, height, destTileX, destTileY, la
2122
}
2223
};
2324

24-
module.exports = Fill;
25+
module.exports = Copy;

v3/src/gameobjects/tilemap/components/Fill.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var GetTilesWithin = require('./GetTilesWithin');
22

3+
// Fills indices, not other properties. Does not modify collisions. Matches v2 functionality.
34
var Fill = function (index, tileX, tileY, width, height, layer)
45
{
56
var tiles = GetTilesWithin(tileX, tileY, width, height, layer);

v3/src/gameobjects/tilemap/components/PutTileAt.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
var Tile = require('../Tile');
22
var IsInLayerBounds = require('./IsInLayerBounds');
3+
var RecalculateFacesAt = require('./RecalculateFacesAt');
34

45
// Put Phaser.Tile|number. Note: does not place a reference to tile, it copies the tile or creates a
56
// new one.
6-
var PutTileAt = function (tile, tileX, tileY, layer)
7+
var PutTileAt = function (tile, tileX, tileY, recalculateFaces, layer)
78
{
89
if (!IsInLayerBounds(tileX, tileY, layer)) { return null; }
10+
if (recalculateFaces === undefined) { recalculateFaces = true; }
11+
12+
var oldTile = layer.data[tileY][tileX];
13+
var oldTileCollides = oldTile && oldTile.collides;
914

1015
if (tile instanceof Tile)
1116
{
@@ -31,9 +36,24 @@ var PutTileAt = function (tile, tileX, tileY, layer)
3136
}
3237
}
3338

34-
// TODO: collision & re-calculate faces
39+
// Updating colliding flag on the new tile
40+
var newTile = layer.data[tileY][tileX];
41+
if (layer.collideIndexes.indexOf(newTile.index) !== -1)
42+
{
43+
newTile.setCollision(true);
44+
}
45+
else
46+
{
47+
newTile.resetCollision();
48+
}
49+
50+
// Recalculate faces only if the colliding flag at (tileX, tileY) has changed
51+
if (recalculateFaces && (oldTileCollides !== newTile.collides))
52+
{
53+
RecalculateFacesAt(tileX, tileY, layer);
54+
}
3555

36-
return layer.data[tileY][tileX];
56+
return newTile;
3757
};
3858

3959
module.exports = PutTileAt;

v3/src/gameobjects/tilemap/components/PutTileAtWorldXY.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ var PutTileAt = require('./PutTileAt');
22
var WorldToTileX = require('./WorldToTileX');
33
var WorldToTileY = require('./WorldToTileY');
44

5-
var PutTileAtWorldXY = function (tile, worldX, worldY, camera, layer)
5+
var PutTileAtWorldXY = function (tile, worldX, worldY, recalculateFaces, camera, layer)
66
{
77
var tileX = WorldToTileX(worldX, camera, layer);
88
var tileY = WorldToTileY(worldY, camera, layer);

0 commit comments

Comments
 (0)