Fix scaling of a flipped sprite object for HTML5 games

This commit is contained in:
Florian Rival
2015-06-03 23:55:24 +12:00
parent 3038f05f25
commit 0ac53b0fcf
5 changed files with 20 additions and 17 deletions

View File

@@ -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

View File

@@ -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;

View File

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

View File

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

View File

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