covid19-demo/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87a.../Extensions/PanelSpriteObject/panelspriteruntimeobject-pi...

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)
);
};