mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Fix scaling of a flipped sprite object for HTML5 games
This commit is contained in:
@@ -16,12 +16,14 @@ namespace gd
|
||||
{
|
||||
|
||||
ImageManager::ImageManager() :
|
||||
game(NULL)
|
||||
game(NULL)
|
||||
{
|
||||
#if !defined(EMSCRIPTEN)
|
||||
badTexture = std::shared_ptr<SFMLTextureWrapper>(new SFMLTextureWrapper);
|
||||
badTexture->texture.loadFromMemory(gd::InvalidImageData, sizeof(gd::InvalidImageData));
|
||||
badTexture->texture.setSmooth(false);
|
||||
badTexture->image = badTexture->texture.copyToImage();
|
||||
#endif
|
||||
}
|
||||
|
||||
std::shared_ptr<SFMLTextureWrapper> ImageManager::GetSFMLTexture(const std::string & name) const
|
||||
|
@@ -214,17 +214,19 @@ void RuntimeSpriteObject::ChangeScale( const std::string & operatorStr, double n
|
||||
|
||||
void RuntimeSpriteObject::SetScaleX(float val)
|
||||
{
|
||||
if (val == GetScaleX()) return;
|
||||
if (val < 0) val = 0;
|
||||
|
||||
scaleX = val;
|
||||
scaleX = val * (isFlippedX ? -1.0 : 1.0);
|
||||
needUpdateCurrentSprite = true;
|
||||
}
|
||||
|
||||
void RuntimeSpriteObject::SetScaleY(float val)
|
||||
{
|
||||
if (val == GetScaleY()) return;
|
||||
if (val < 0) val = 0;
|
||||
|
||||
scaleY = val;
|
||||
scaleY = val * (isFlippedY ? -1.0 : 1.0);
|
||||
needUpdateCurrentSprite = true;
|
||||
}
|
||||
|
||||
@@ -512,7 +514,7 @@ void RuntimeSpriteObject::FlipX(bool flip)
|
||||
{
|
||||
if ( flip != isFlippedX )
|
||||
{
|
||||
scaleX *= -1;
|
||||
scaleX *= -1.0;
|
||||
needUpdateCurrentSprite = true;
|
||||
}
|
||||
isFlippedX = flip;
|
||||
@@ -521,7 +523,7 @@ void RuntimeSpriteObject::FlipY(bool flip)
|
||||
{
|
||||
if ( flip != isFlippedY )
|
||||
{
|
||||
scaleY *= -1;
|
||||
scaleY *= -1.0;
|
||||
needUpdateCurrentSprite = true;
|
||||
}
|
||||
isFlippedY = flip;
|
||||
|
@@ -41,6 +41,7 @@ TEST_CASE( "RuntimeSpriteObject", "[game-engine]" ) {
|
||||
REQUIRE(object.IsFlippedX() == true);
|
||||
object.FlipX(false);
|
||||
REQUIRE(object.GetScaleX() == 0.42f);
|
||||
REQUIRE(object.IsFlippedX() == false);
|
||||
}
|
||||
SECTION("Angle") {
|
||||
REQUIRE(object.GetAngle() == 0);
|
||||
|
@@ -706,42 +706,39 @@ gdjs.SpriteRuntimeObject.prototype.getHeight = function() {
|
||||
gdjs.SpriteRuntimeObject.prototype.setWidth = function(newWidth) {
|
||||
if ( this._spriteDirty ) this._updatePIXISprite();
|
||||
var newScaleX = newWidth/this._sprite.texture.frame.width;
|
||||
this.setScaleX(!this._isFlippedX ? newScaleX : -newScaleX);
|
||||
this.setScaleX(newScaleX);
|
||||
};
|
||||
|
||||
gdjs.SpriteRuntimeObject.prototype.setHeight = function(newHeight) {
|
||||
if ( this._spriteDirty ) this._updatePIXISprite();
|
||||
var newScaleY = newHeight/this._sprite.texture.frame.height;
|
||||
this.setScaleY(!this._isFlippedY ? newScaleY : -newScaleY);
|
||||
this.setScaleY(newScaleY);
|
||||
};
|
||||
|
||||
gdjs.SpriteRuntimeObject.prototype.setScale = function(newScale) {
|
||||
if ( newScale === Math.abs(this._scaleX) && newScale === Math.abs(this._scaleY) ) return;
|
||||
if ( newScale < 0 ) newScale = 0;
|
||||
|
||||
if ( newScale > 0 ) {
|
||||
this._scaleX = newScale;
|
||||
this._scaleY = newScale;
|
||||
}
|
||||
if ( this._isFlippedX ) this._scaleX *= -1;
|
||||
if ( this._isFlippedY ) this._scaleY *= -1;
|
||||
this._scaleX = newScale * (this._flippedX ? -1 : 1);
|
||||
this._scaleY = newScale * (this._flippedY ? -1 : 1);
|
||||
this._spriteDirty = true;
|
||||
this.hitBoxesDirty = true;
|
||||
};
|
||||
|
||||
gdjs.SpriteRuntimeObject.prototype.setScaleX = function(newScale) {
|
||||
if ( newScale === Math.abs(this._scaleX) ) return;
|
||||
if ( newScale < 0 ) newScale = 0;
|
||||
|
||||
if ( newScale > 0 ) this._scaleX = newScale;
|
||||
if ( this._isFlippedX ) this._scaleX *= -1;
|
||||
this._scaleX = newScale * (this._flippedX ? -1 : 1);
|
||||
this._spriteDirty = true;
|
||||
this.hitBoxesDirty = true;
|
||||
};
|
||||
|
||||
gdjs.SpriteRuntimeObject.prototype.setScaleY = function(newScale) {
|
||||
if ( newScale === Math.abs(this._scaleY) ) return;
|
||||
if ( newScale < 0 ) newScale = 0;
|
||||
|
||||
if ( newScale > 0 ) this._scaleY = newScale;
|
||||
if ( this._isFlippedY ) this._scaleY *= -1;
|
||||
this._scaleY = newScale * (this._flippedY ? -1 : 1);
|
||||
this._spriteDirty = true;
|
||||
this.hitBoxesDirty = true;
|
||||
};
|
||||
|
@@ -17,6 +17,7 @@ describe('gdjs.SpriteRuntimeObject', function() {
|
||||
expect(object.getScaleX()).to.be(0.42);
|
||||
expect(object.isFlippedX()).to.be(true);
|
||||
object.flipX(false);
|
||||
expect(object.isFlippedX()).to.be(false);
|
||||
expect(object.getScaleX()).to.be(0.42);
|
||||
});
|
||||
});
|
||||
|
Reference in New Issue
Block a user