344 lines
9.5 KiB
JavaScript
344 lines
9.5 KiB
JavaScript
gdjs.PanelSpriteRuntimeObjectPixiRenderer = function(
|
|
runtimeObject,
|
|
runtimeScene,
|
|
textureName,
|
|
tiled
|
|
) {
|
|
this._object = runtimeObject;
|
|
|
|
if (this._spritesContainer === undefined) {
|
|
var texture = runtimeScene
|
|
.getGame()
|
|
.getImageManager()
|
|
.getPIXITexture(textureName);
|
|
|
|
var StretchedSprite = !tiled ? PIXI.Sprite : PIXI.extras.TilingSprite;
|
|
|
|
this._spritesContainer = new PIXI.Container();
|
|
this._centerSprite = new StretchedSprite(new PIXI.Texture(texture));
|
|
this._borderSprites = [
|
|
new StretchedSprite(new PIXI.Texture(texture)), //Right
|
|
new PIXI.Sprite(texture), //Top-Right
|
|
new StretchedSprite(new PIXI.Texture(texture)), //Top
|
|
new PIXI.Sprite(texture), //Top-Left
|
|
new StretchedSprite(new PIXI.Texture(texture)), //Left
|
|
new PIXI.Sprite(texture), //Bottom-Left
|
|
new StretchedSprite(new PIXI.Texture(texture)), //Bottom
|
|
new PIXI.Sprite(texture), //Bottom-Right
|
|
];
|
|
}
|
|
|
|
this.setTexture(textureName, runtimeScene);
|
|
|
|
this._spritesContainer.removeChildren();
|
|
this._spritesContainer.addChild(this._centerSprite);
|
|
for (var i = 0; i < this._borderSprites.length; ++i) {
|
|
this._spritesContainer.addChild(this._borderSprites[i]);
|
|
}
|
|
|
|
this._alpha = this._spritesContainer.alpha;
|
|
runtimeScene
|
|
.getLayer('')
|
|
.getRenderer()
|
|
.addRendererObject(this._spritesContainer, runtimeObject.getZOrder());
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectRenderer =
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer; //Register the class to let the engine use it.
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.getRendererObject = function() {
|
|
return this._spritesContainer;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.ensureUpToDate = function() {
|
|
if (this._spritesContainer.visible && this._wasRendered) {
|
|
// Update the alpha of the container to make sure that it's applied.
|
|
// If not done, the alpha will be back to full opaque when changing the color
|
|
// of the object.
|
|
this._spritesContainer.alpha = this._alpha;
|
|
this._spritesContainer.cacheAsBitmap = true;
|
|
}
|
|
|
|
this._wasRendered = true;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateOpacity = function() {
|
|
//TODO: Workaround a not working property in PIXI.js:
|
|
this._spritesContainer.alpha = this._spritesContainer.visible
|
|
? this._object.opacity / 255
|
|
: 0;
|
|
this._alpha = this._spritesContainer.alpha;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateAngle = function() {
|
|
this._spritesContainer.rotation = gdjs.toRad(this._object.angle);
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updatePosition = function() {
|
|
this._spritesContainer.position.x = this._object.x + this._object._width / 2;
|
|
this._spritesContainer.position.y = this._object.y + this._object._height / 2;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype._updateLocalPositions = function() {
|
|
var obj = this._object;
|
|
|
|
this._centerSprite.position.x = obj._lBorder;
|
|
this._centerSprite.position.y = obj._tBorder;
|
|
|
|
//Right
|
|
this._borderSprites[0].position.x = obj._width - obj._rBorder;
|
|
this._borderSprites[0].position.y = obj._tBorder;
|
|
|
|
//Top-right
|
|
this._borderSprites[1].position.x = obj._width - this._borderSprites[1].width;
|
|
this._borderSprites[1].position.y = 0;
|
|
|
|
//Top
|
|
this._borderSprites[2].position.x = obj._lBorder;
|
|
this._borderSprites[2].position.y = 0;
|
|
//Top-Left
|
|
this._borderSprites[3].position.x = 0;
|
|
this._borderSprites[3].position.y = 0;
|
|
//Left
|
|
this._borderSprites[4].position.x = 0;
|
|
this._borderSprites[4].position.y = obj._tBorder;
|
|
//Bottom-Left
|
|
this._borderSprites[5].position.x = 0;
|
|
this._borderSprites[5].position.y =
|
|
obj._height - this._borderSprites[5].height;
|
|
//Bottom
|
|
this._borderSprites[6].position.x = obj._lBorder;
|
|
this._borderSprites[6].position.y = obj._height - obj._bBorder;
|
|
//Bottom-Right
|
|
this._borderSprites[7].position.x = obj._width - this._borderSprites[7].width;
|
|
this._borderSprites[7].position.y =
|
|
obj._height - this._borderSprites[7].height;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype._updateSpritesAndTexturesSize = function() {
|
|
var obj = this._object;
|
|
|
|
this._centerSprite.width = Math.max(
|
|
obj._width - obj._rBorder - obj._lBorder,
|
|
0
|
|
);
|
|
this._centerSprite.height = Math.max(
|
|
obj._height - obj._tBorder - obj._bBorder,
|
|
0
|
|
);
|
|
|
|
//Right
|
|
this._borderSprites[0].width = obj._rBorder;
|
|
this._borderSprites[0].height = Math.max(
|
|
obj._height - obj._tBorder - obj._bBorder,
|
|
0
|
|
);
|
|
|
|
//Top
|
|
this._borderSprites[2].height = obj._tBorder;
|
|
this._borderSprites[2].width = Math.max(
|
|
obj._width - obj._rBorder - obj._lBorder,
|
|
0
|
|
);
|
|
//Left
|
|
this._borderSprites[4].width = obj._lBorder;
|
|
this._borderSprites[4].height = Math.max(
|
|
obj._height - obj._tBorder - obj._bBorder,
|
|
0
|
|
);
|
|
//Bottom
|
|
this._borderSprites[6].height = obj._bBorder;
|
|
this._borderSprites[6].width = Math.max(
|
|
obj._width - obj._rBorder - obj._lBorder,
|
|
0
|
|
);
|
|
|
|
this._wasRendered = true;
|
|
this._spritesContainer.cacheAsBitmap = false;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function(
|
|
textureName,
|
|
runtimeScene
|
|
) {
|
|
var obj = this._object;
|
|
var texture = runtimeScene
|
|
.getGame()
|
|
.getImageManager()
|
|
.getPIXITexture(textureName);
|
|
|
|
function makeInsideTexture(rect) {
|
|
//TODO
|
|
if (rect.width < 0) rect.width = 0;
|
|
if (rect.height < 0) rect.height = 0;
|
|
if (rect.x < 0) rect.x = 0;
|
|
if (rect.y < 0) rect.y = 0;
|
|
if (rect.x > texture.width) rect.x = texture.width;
|
|
if (rect.y > texture.height) rect.y = texture.height;
|
|
if (rect.x + rect.width > texture.width)
|
|
rect.width = texture.width - rect.x;
|
|
if (rect.y + rect.height > texture.height)
|
|
rect.height = texture.height - rect.y;
|
|
|
|
return rect;
|
|
}
|
|
|
|
this._centerSprite.texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
obj._lBorder,
|
|
obj._tBorder,
|
|
texture.width - obj._lBorder - obj._rBorder,
|
|
texture.height - obj._tBorder - obj._bBorder
|
|
)
|
|
)
|
|
);
|
|
|
|
//Top, Bottom, Right, Left borders:
|
|
this._borderSprites[0].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
texture.width - obj._rBorder,
|
|
obj._tBorder,
|
|
obj._rBorder,
|
|
texture.height - obj._tBorder - obj._bBorder
|
|
)
|
|
)
|
|
);
|
|
this._borderSprites[2].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
obj._lBorder,
|
|
0,
|
|
texture.width - obj._lBorder - obj._rBorder,
|
|
obj._tBorder
|
|
)
|
|
)
|
|
);
|
|
this._borderSprites[4].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
0,
|
|
obj._tBorder,
|
|
obj._lBorder,
|
|
texture.height - obj._tBorder - obj._bBorder
|
|
)
|
|
)
|
|
);
|
|
this._borderSprites[6].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
obj._lBorder,
|
|
texture.height - obj._bBorder,
|
|
texture.width - obj._lBorder - obj._rBorder,
|
|
obj._bBorder
|
|
)
|
|
)
|
|
);
|
|
|
|
this._borderSprites[1].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
this._borderSprites[1].width - obj._rBorder,
|
|
0,
|
|
obj._rBorder,
|
|
obj._tBorder
|
|
)
|
|
)
|
|
);
|
|
this._borderSprites[3].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(new PIXI.Rectangle(0, 0, obj._lBorder, obj._tBorder))
|
|
);
|
|
this._borderSprites[5].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
0,
|
|
this._borderSprites[5].height - obj._bBorder,
|
|
obj._lBorder,
|
|
obj._bBorder
|
|
)
|
|
)
|
|
);
|
|
this._borderSprites[7].texture = new PIXI.Texture(
|
|
texture,
|
|
makeInsideTexture(
|
|
new PIXI.Rectangle(
|
|
this._borderSprites[7].width - obj._rBorder,
|
|
this._borderSprites[7].height - obj._bBorder,
|
|
obj._rBorder,
|
|
obj._bBorder
|
|
)
|
|
)
|
|
);
|
|
|
|
this._updateSpritesAndTexturesSize();
|
|
this._updateLocalPositions();
|
|
this.updatePosition();
|
|
this._spritesContainer.pivot.x = this._object._width / 2;
|
|
this._spritesContainer.pivot.y = this._object._height / 2;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateWidth = function() {
|
|
this._spritesContainer.pivot.x = this._object._width / 2;
|
|
this._updateSpritesAndTexturesSize();
|
|
this._updateLocalPositions();
|
|
this.updatePosition();
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateHeight = function() {
|
|
this._spritesContainer.pivot.y = this._object._height / 2;
|
|
this._updateSpritesAndTexturesSize();
|
|
this._updateLocalPositions();
|
|
this.updatePosition();
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setColor = function(
|
|
rgbColor
|
|
) {
|
|
var colors = rgbColor.split(';');
|
|
if (colors.length < 3) return;
|
|
|
|
this._centerSprite.tint =
|
|
'0x' +
|
|
gdjs.rgbToHex(
|
|
parseInt(colors[0], 10),
|
|
parseInt(colors[1], 10),
|
|
parseInt(colors[2], 10)
|
|
);
|
|
|
|
for (
|
|
var borderCounter = 0;
|
|
borderCounter < this._borderSprites.length;
|
|
borderCounter++
|
|
) {
|
|
this._borderSprites[borderCounter].tint =
|
|
'0x' +
|
|
gdjs.rgbToHex(
|
|
parseInt(colors[0], 10),
|
|
parseInt(colors[1], 10),
|
|
parseInt(colors[2], 10)
|
|
);
|
|
}
|
|
|
|
this._spritesContainer.cacheAsBitmap = false;
|
|
};
|
|
|
|
gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.getColor = function() {
|
|
var rgb = PIXI.utils.hex2rgb(this._centerSprite.tint);
|
|
return (
|
|
Math.floor(rgb[0] * 255) +
|
|
';' +
|
|
Math.floor(rgb[1] * 255) +
|
|
';' +
|
|
Math.floor(rgb[2] * 255)
|
|
);
|
|
};
|