mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Add tween actions (position, rotation and depth) for 3D objects (#6122)
This commit is contained in:
@@ -893,7 +893,7 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectPositionXTween2');
|
||||
|
||||
// deprecated use the 3D Tween extension
|
||||
// deprecated
|
||||
behavior
|
||||
.addAction(
|
||||
'AddObjectPositionZTween',
|
||||
@@ -926,6 +926,38 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectPositionZTween');
|
||||
|
||||
behavior
|
||||
.addAction(
|
||||
'AddObjectPositionZTween2',
|
||||
_('Tween object Z position'),
|
||||
_(
|
||||
'Tweens an object Z position (3D objects only) from its current Z position to a new one.'
|
||||
),
|
||||
_(
|
||||
'Tween the Z position of _PARAM0_ to _PARAM4_ with easing _PARAM5_ over _PARAM6_ seconds as _PARAM3_'
|
||||
),
|
||||
_('Position'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter("behavior", _("3D capability"), "Scene3D::Base3DBehavior")
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
.addParameter('expression', _('To Z'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Destroy this object when tween finishes'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('no')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectPositionZTween2');
|
||||
|
||||
// deprecated
|
||||
behavior
|
||||
.addAction(
|
||||
@@ -1079,6 +1111,38 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectDepthTween');
|
||||
|
||||
behavior
|
||||
.addAction(
|
||||
'AddObjectDepthTween2',
|
||||
_('Tween object depth'),
|
||||
_(
|
||||
'Tweens an object depth (suitable 3D objects only) from its current depth to a new one.'
|
||||
),
|
||||
_(
|
||||
'Tween the depth of _PARAM0_ to _PARAM4_ with easing _PARAM5_ over _PARAM6_ seconds as _PARAM3_'
|
||||
),
|
||||
_('Size'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter("behavior", _("3D capability"), "Scene3D::Base3DBehavior")
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
.addParameter('expression', _('To depth'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Destroy this object when tween finishes'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('no')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectDepthTween2');
|
||||
|
||||
// deprecated
|
||||
behavior
|
||||
.addAction(
|
||||
@@ -1203,6 +1267,66 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectAngleTween2');
|
||||
|
||||
behavior
|
||||
.addScopedAction(
|
||||
'AddObjectRotationXTween',
|
||||
_('Tween object rotation on X axis'),
|
||||
_('Tweens an object rotation on X axis from its current angle to a new one.'),
|
||||
_(
|
||||
'Tween the rotation on X axis of _PARAM0_ to _PARAM4_° with easing _PARAM5_ over _PARAM6_ seconds as _PARAM3_'
|
||||
),
|
||||
_('Angle'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter("behavior", _("3D capability"), "Scene3D::Base3DBehavior")
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
.addParameter('expression', _('To angle (in degrees)'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Destroy this object when tween finishes'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('no')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectRotationXTween');
|
||||
|
||||
behavior
|
||||
.addScopedAction(
|
||||
'AddObjectRotationYTween',
|
||||
_('Tween object rotation on Y axis'),
|
||||
_('Tweens an object rotation on Y axis from its current angle to a new one.'),
|
||||
_(
|
||||
'Tween the rotation on Y axis of _PARAM0_ to _PARAM4_° with easing _PARAM5_ over _PARAM6_ seconds as _PARAM3_'
|
||||
),
|
||||
_('Angle'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter("behavior", _("3D capability"), "Scene3D::Base3DBehavior")
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
.addParameter('expression', _('To angle (in degrees)'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Destroy this object when tween finishes'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('no')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectRotationYTween');
|
||||
|
||||
// deprecated
|
||||
behavior
|
||||
.addAction(
|
||||
@@ -1239,6 +1363,7 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectScaleTween');
|
||||
|
||||
// deprecated
|
||||
behavior
|
||||
.addScopedAction(
|
||||
'AddObjectScaleTween2',
|
||||
@@ -1253,6 +1378,7 @@ module.exports = {
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.setHidden()
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
@@ -1273,6 +1399,39 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectScaleTween2');
|
||||
|
||||
behavior
|
||||
.addScopedAction(
|
||||
'AddObjectScaleTween3',
|
||||
_('Tween object scale'),
|
||||
_(
|
||||
'Tweens an object scale from its current value to a new one (note: the scale can never be 0 or less).'
|
||||
),
|
||||
_(
|
||||
'Tween the scale of _PARAM0_ to _PARAM3_ (from center: _PARAM7_) with easing _PARAM4_ over _PARAM5_ seconds as _PARAM2_'
|
||||
),
|
||||
_('Size'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
.addParameter('expression', _('To scale'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Destroy this object when tween finishes'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('no')
|
||||
.addParameter('yesorno', _('Scale from center of object'), '', false)
|
||||
.setDefaultValue('no')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectScaleTween3');
|
||||
|
||||
// deprecated
|
||||
behavior
|
||||
.addAction(
|
||||
|
@@ -85,6 +85,32 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
return object;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {gdjs.RuntimeScene} runtimeScene
|
||||
*/
|
||||
const addCube = (runtimeScene) => {
|
||||
const object = new gdjs.Cube3DRuntimeObject(runtimeScene, {
|
||||
name: 'Cube',
|
||||
type: 'Scene3D::Cube3DObject',
|
||||
effects: [],
|
||||
variables: [],
|
||||
behaviors: [
|
||||
{
|
||||
type: 'Tween::TweenBehavior',
|
||||
name: behaviorName,
|
||||
},
|
||||
],
|
||||
// @ts-ignore
|
||||
content: {
|
||||
width: 64,
|
||||
height: 64,
|
||||
depth: 64,
|
||||
},
|
||||
});
|
||||
runtimeScene.addObject(object);
|
||||
return object;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {gdjs.RuntimeScene} runtimeScene
|
||||
*/
|
||||
@@ -123,6 +149,8 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
let object;
|
||||
/** @type {gdjs.SpriteRuntimeObject} */
|
||||
let sprite;
|
||||
/** @type {gdjs.Cube3DRuntimeObject} */
|
||||
let cube;
|
||||
/** @type {gdjs.TextRuntimeObject} */
|
||||
let textObject;
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
@@ -130,18 +158,23 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
let spriteBehavior;
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
let cubeBehavior;
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
let textObjectBehavior;
|
||||
beforeEach(() => {
|
||||
runtimeScene = createScene();
|
||||
runtimeScene.getLayer('').setTimeScale(1.5);
|
||||
object = addObject(runtimeScene);
|
||||
sprite = addSprite(runtimeScene);
|
||||
cube = addCube(runtimeScene);
|
||||
textObject = addTextObject(runtimeScene);
|
||||
//@ts-ignore
|
||||
behavior = object.getBehavior(behaviorName);
|
||||
//@ts-ignore
|
||||
spriteBehavior = sprite.getBehavior(behaviorName);
|
||||
//@ts-ignore
|
||||
cubeBehavior = cube.getBehavior(behaviorName);
|
||||
//@ts-ignore
|
||||
textObjectBehavior = textObject.getBehavior(behaviorName);
|
||||
});
|
||||
|
||||
@@ -216,6 +249,19 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
expect(object.getY()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the position on Z axis', () => {
|
||||
cube.setZ(200);
|
||||
cubeBehavior.addObjectPositionZTween(
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
250 / 1.5,
|
||||
false
|
||||
);
|
||||
checkProgress(6, () => cube.getZ());
|
||||
expect(cube.getZ()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the angle', () => {
|
||||
object.setAngle(200);
|
||||
behavior.addObjectAngleTween('MyTween', 600, 'linear', 250 / 1.5, false);
|
||||
@@ -237,6 +283,19 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
expect(object.getHeight()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the depth', () => {
|
||||
cube.setDepth(200);
|
||||
cubeBehavior.addObjectDepthTween(
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
250 / 1.5,
|
||||
false
|
||||
);
|
||||
checkProgress(6, () => cube.getDepth());
|
||||
expect(cube.getDepth()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the opacity', () => {
|
||||
sprite.setOpacity(128);
|
||||
spriteBehavior.addObjectOpacityTween(
|
||||
@@ -424,4 +483,46 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
expect(sprite.getX()).to.be(-7580);
|
||||
expect(sprite.getY()).to.be(-11120);
|
||||
});
|
||||
|
||||
it('can tween the scales in seconds', () => {
|
||||
sprite.setPosition(100, 400);
|
||||
sprite.setScaleX(200);
|
||||
sprite.setScaleY(300);
|
||||
spriteBehavior.addObjectScaleTween2(
|
||||
'MyTween',
|
||||
600,
|
||||
900,
|
||||
'linear',
|
||||
0.25,
|
||||
false,
|
||||
false
|
||||
);
|
||||
checkProgress(6, [() => sprite.getScaleX(), () => sprite.getScaleY()]);
|
||||
// The interpolation is exponential.
|
||||
expect(sprite.getScaleX()).to.be(386.6364089863524);
|
||||
expect(sprite.getScaleY()).to.be(579.9546134795287);
|
||||
expect(sprite.getX()).to.be(100);
|
||||
expect(sprite.getY()).to.be(400);
|
||||
});
|
||||
|
||||
it('can tween the scales from center in seconds', () => {
|
||||
sprite.setPosition(100, 400);
|
||||
sprite.setScaleX(200);
|
||||
sprite.setScaleY(300);
|
||||
spriteBehavior.addObjectScaleTween2(
|
||||
'MyTween',
|
||||
600,
|
||||
900,
|
||||
'linear',
|
||||
0.25,
|
||||
false,
|
||||
true
|
||||
);
|
||||
checkProgress(6, [() => sprite.getScaleX(), () => sprite.getScaleY()]);
|
||||
// The interpolation is exponential.
|
||||
expect(sprite.getScaleX()).to.be(386.6364089863524);
|
||||
expect(sprite.getScaleY()).to.be(579.9546134795287);
|
||||
expect(sprite.getX()).to.be(-5872.3650875632775);
|
||||
expect(sprite.getY()).to.be(-8558.547631344918);
|
||||
});
|
||||
});
|
||||
|
@@ -85,6 +85,32 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
return object;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {gdjs.RuntimeScene} runtimeScene
|
||||
*/
|
||||
const addCube = (runtimeScene) => {
|
||||
const object = new gdjs.Cube3DRuntimeObject(runtimeScene, {
|
||||
name: 'Cube',
|
||||
type: 'Scene3D::Cube3DObject',
|
||||
effects: [],
|
||||
variables: [],
|
||||
behaviors: [
|
||||
{
|
||||
type: 'Tween::TweenBehavior',
|
||||
name: behaviorName,
|
||||
},
|
||||
],
|
||||
// @ts-ignore
|
||||
content: {
|
||||
width: 64,
|
||||
height: 64,
|
||||
depth: 64,
|
||||
},
|
||||
});
|
||||
runtimeScene.addObject(object);
|
||||
return object;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {gdjs.RuntimeScene} runtimeScene
|
||||
*/
|
||||
@@ -123,6 +149,8 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
let object;
|
||||
/** @type {gdjs.SpriteRuntimeObject} */
|
||||
let sprite;
|
||||
/** @type {gdjs.Cube3DRuntimeObject} */
|
||||
let cube;
|
||||
/** @type {gdjs.TextRuntimeObject} */
|
||||
let textObject;
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
@@ -130,18 +158,23 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
let spriteBehavior;
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
let cubeBehavior;
|
||||
/** @type {gdjs.TweenRuntimeBehavior} */
|
||||
let textObjectBehavior;
|
||||
beforeEach(() => {
|
||||
runtimeScene = createScene();
|
||||
runtimeScene.getLayer('').setTimeScale(1.5);
|
||||
object = addObject(runtimeScene);
|
||||
sprite = addSprite(runtimeScene);
|
||||
cube = addCube(runtimeScene);
|
||||
textObject = addTextObject(runtimeScene);
|
||||
//@ts-ignore
|
||||
behavior = object.getBehavior(behaviorName);
|
||||
//@ts-ignore
|
||||
spriteBehavior = sprite.getBehavior(behaviorName);
|
||||
//@ts-ignore
|
||||
cubeBehavior = cube.getBehavior(behaviorName);
|
||||
//@ts-ignore
|
||||
textObjectBehavior = textObject.getBehavior(behaviorName);
|
||||
});
|
||||
|
||||
@@ -404,6 +437,20 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
expect(object.getY()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the position on Z axis', () => {
|
||||
cube.setZ(200);
|
||||
cubeBehavior.addObjectPositionZTween2(
|
||||
null,
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
0.25,
|
||||
false
|
||||
);
|
||||
checkProgress(6, () => cube.getZ());
|
||||
expect(cube.getZ()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the angle', () => {
|
||||
object.setAngle(200);
|
||||
behavior.addObjectAngleTween2('MyTween', 600, 'linear', 0.25, false);
|
||||
@@ -411,6 +458,34 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
expect(object.getAngle()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the rotation X', () => {
|
||||
cube.setRotationX(200);
|
||||
cubeBehavior.addObjectRotationXTween(
|
||||
null,
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
0.25,
|
||||
false
|
||||
);
|
||||
checkProgress(6, () => cube.getRotationX());
|
||||
expect(cube.getRotationX()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the rotation Y', () => {
|
||||
cube.setRotationY(200);
|
||||
cubeBehavior.addObjectRotationYTween(
|
||||
null,
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
0.25,
|
||||
false
|
||||
);
|
||||
checkProgress(6, () => cube.getRotationY());
|
||||
expect(cube.getRotationY()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the width', () => {
|
||||
object.setWidth(200);
|
||||
behavior.addObjectWidthTween2('MyTween', 600, 'linear', 0.25, false);
|
||||
@@ -425,6 +500,20 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
expect(object.getHeight()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween the depth', () => {
|
||||
cube.setDepth(200);
|
||||
cubeBehavior.addObjectDepthTween2(
|
||||
null,
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
0.25,
|
||||
false
|
||||
);
|
||||
checkProgress(6, () => cube.getDepth());
|
||||
expect(cube.getDepth()).to.be(440);
|
||||
});
|
||||
|
||||
it('can tween a number effect property', () => {
|
||||
sprite.addEffect({
|
||||
effectType: 'Outline',
|
||||
@@ -623,45 +712,79 @@ describe('gdjs.TweenRuntimeBehavior', () => {
|
||||
expect(object.getY()).to.be(660);
|
||||
});
|
||||
|
||||
it('can tween the scales', () => {
|
||||
it('can tween the scale', () => {
|
||||
sprite.setPosition(100, 400);
|
||||
sprite.setScaleX(200);
|
||||
sprite.setScaleY(300);
|
||||
spriteBehavior.addObjectScaleTween2(
|
||||
sprite.setScale(200);
|
||||
spriteBehavior.addObjectScaleTween3(
|
||||
'MyTween',
|
||||
600,
|
||||
900,
|
||||
'linear',
|
||||
0.25,
|
||||
false,
|
||||
false
|
||||
);
|
||||
checkProgress(6, [() => sprite.getScaleX(), () => sprite.getScaleY()]);
|
||||
checkProgress(6, () => sprite.getScale());
|
||||
// The interpolation is exponential.
|
||||
expect(sprite.getScaleX()).to.be(386.6364089863524);
|
||||
expect(sprite.getScaleY()).to.be(579.9546134795287);
|
||||
expect(sprite.getScale()).to.be(386.6364089863524);
|
||||
expect(sprite.getX()).to.be(100);
|
||||
expect(sprite.getY()).to.be(400);
|
||||
});
|
||||
|
||||
it('can tween the scales from center', () => {
|
||||
sprite.setPosition(100, 400);
|
||||
sprite.setScaleX(200);
|
||||
sprite.setScaleY(300);
|
||||
spriteBehavior.addObjectScaleTween2(
|
||||
sprite.setScale(200);
|
||||
spriteBehavior.addObjectScaleTween3(
|
||||
'MyTween',
|
||||
600,
|
||||
900,
|
||||
'linear',
|
||||
0.25,
|
||||
false,
|
||||
true
|
||||
);
|
||||
checkProgress(6, [() => sprite.getScaleX(), () => sprite.getScaleY()]);
|
||||
checkProgress(6, () => sprite.getScale());
|
||||
// The interpolation is exponential.
|
||||
expect(sprite.getScaleX()).to.be(386.6364089863524);
|
||||
expect(sprite.getScaleY()).to.be(579.9546134795287);
|
||||
expect(sprite.getScale()).to.be(386.6364089863524);
|
||||
expect(sprite.getX()).to.be(-5872.3650875632775);
|
||||
expect(sprite.getY()).to.be(-8558.547631344918);
|
||||
expect(sprite.getY()).to.be(-5572.3650875632775);
|
||||
});
|
||||
|
||||
it('can tween the scale of a cube', () => {
|
||||
cube.setPosition(100, 400);
|
||||
cube.setZ(800);
|
||||
cube.setScale(200);
|
||||
cubeBehavior.addObjectScaleTween3(
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
0.25,
|
||||
false,
|
||||
false
|
||||
);
|
||||
checkProgress(6, () => cube.getScale());
|
||||
// The interpolation is exponential.
|
||||
expect(cube.getScale()).to.be(386.6364089863524);
|
||||
expect(cube.getX()).to.be(100);
|
||||
expect(cube.getY()).to.be(400);
|
||||
expect(cube.getZ()).to.be(800);
|
||||
});
|
||||
|
||||
it('can tween the scales of a cube from center', () => {
|
||||
cube.setPosition(100, 400);
|
||||
cube.setZ(800);
|
||||
cube.setScale(200);
|
||||
cubeBehavior.addObjectScaleTween3(
|
||||
'MyTween',
|
||||
600,
|
||||
'linear',
|
||||
0.25,
|
||||
false,
|
||||
true
|
||||
);
|
||||
checkProgress(6, () => cube.getScale());
|
||||
// The interpolation is exponential.
|
||||
expect(cube.getScale()).to.be(386.6364089863524);
|
||||
expect(cube.getX()).to.be(-5872.3650875632775);
|
||||
expect(cube.getY()).to.be(-5572.3650875632775);
|
||||
expect(cube.getZ()).to.be(-5172.3650875632775);
|
||||
});
|
||||
});
|
||||
|
@@ -456,7 +456,7 @@ namespace gdjs {
|
||||
|
||||
/**
|
||||
* Tween an object Z position.
|
||||
* @deprecated Use the 3D Tween extension instead.
|
||||
* @deprecated Use addObjectPositionZTween2 instead.
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toZ The target Z position
|
||||
* @param easing Easing function identifier
|
||||
@@ -469,14 +469,59 @@ namespace gdjs {
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean
|
||||
) {
|
||||
this._addObjectPositionZTween(
|
||||
identifier,
|
||||
toZ,
|
||||
easing,
|
||||
duration / 1000,
|
||||
destroyObjectWhenFinished,
|
||||
this.owner.getRuntimeScene()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tween an object Z position.
|
||||
* @param object3DBehavior Only used by events can be set to null
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toZ The target Z position
|
||||
* @param easing Easing function identifier
|
||||
* @param duration Duration in seconds
|
||||
* @param destroyObjectWhenFinished Destroy this object when the tween ends
|
||||
*/
|
||||
addObjectPositionZTween2(
|
||||
object3DBehavior: any,
|
||||
identifier: string,
|
||||
toZ: number,
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean
|
||||
) {
|
||||
this._addObjectPositionZTween(
|
||||
identifier,
|
||||
toZ,
|
||||
easing,
|
||||
duration,
|
||||
destroyObjectWhenFinished,
|
||||
this.owner
|
||||
);
|
||||
}
|
||||
|
||||
private _addObjectPositionZTween(
|
||||
identifier: string,
|
||||
toZ: number,
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean,
|
||||
timeSource: gdjs.evtTools.tween.TimeSource
|
||||
) {
|
||||
const { owner } = this;
|
||||
if (!(owner instanceof gdjs.RuntimeObject3D)) return;
|
||||
|
||||
this._tweens.addSimpleTween(
|
||||
identifier,
|
||||
this.owner.getRuntimeScene(),
|
||||
duration / 1000,
|
||||
timeSource,
|
||||
duration,
|
||||
easing,
|
||||
linearInterpolation,
|
||||
owner.getZ(),
|
||||
@@ -558,6 +603,72 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tween a 3D object rotation X.
|
||||
* @param object3DBehavior Only used by events can be set to null
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toAngle The target angle
|
||||
* @param easing Easing function identifier
|
||||
* @param duration Duration in seconds
|
||||
* @param destroyObjectWhenFinished Destroy this object when the tween ends
|
||||
*/
|
||||
addObjectRotationXTween(
|
||||
object3DBehavior: any,
|
||||
identifier: string,
|
||||
toAngle: float,
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean
|
||||
) {
|
||||
const { owner } = this;
|
||||
if (!(owner instanceof gdjs.RuntimeObject3D)) return;
|
||||
|
||||
this._tweens.addSimpleTween(
|
||||
identifier,
|
||||
this.owner,
|
||||
duration,
|
||||
easing,
|
||||
linearInterpolation,
|
||||
owner.getRotationX(),
|
||||
toAngle,
|
||||
(value: float) => owner.setRotationX(value),
|
||||
destroyObjectWhenFinished ? () => this._deleteFromScene() : null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tween a 3D object rotation Y.
|
||||
* @param object3DBehavior Only used by events can be set to null
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toAngle The target angle
|
||||
* @param easing Easing function identifier
|
||||
* @param duration Duration in seconds
|
||||
* @param destroyObjectWhenFinished Destroy this object when the tween ends
|
||||
*/
|
||||
addObjectRotationYTween(
|
||||
object3DBehavior: any,
|
||||
identifier: string,
|
||||
toAngle: float,
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean
|
||||
) {
|
||||
const { owner } = this;
|
||||
if (!(owner instanceof gdjs.RuntimeObject3D)) return;
|
||||
|
||||
this._tweens.addSimpleTween(
|
||||
identifier,
|
||||
this.owner,
|
||||
duration,
|
||||
easing,
|
||||
linearInterpolation,
|
||||
owner.getRotationY(),
|
||||
toAngle,
|
||||
(value: float) => owner.setRotationY(value),
|
||||
destroyObjectWhenFinished ? () => this._deleteFromScene() : null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tween an object scale.
|
||||
* @deprecated Use addObjectScaleTween2 instead.
|
||||
@@ -593,6 +704,7 @@ namespace gdjs {
|
||||
|
||||
/**
|
||||
* Tween an object scale.
|
||||
* @deprecated Use addObjectScaleXTween2 and addObjectScaleYTween2 instead.
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toScaleX The target X-scale
|
||||
* @param toScaleY The target Y-scale
|
||||
@@ -666,6 +778,65 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tween an object scale.
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toScale The target scale
|
||||
* @param easing Easing function identifier
|
||||
* @param duration Duration in seconds
|
||||
* @param destroyObjectWhenFinished Destroy this object when the tween ends
|
||||
* @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin
|
||||
*/
|
||||
addObjectScaleTween3(
|
||||
identifier: string,
|
||||
toScale: number,
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean,
|
||||
scaleFromCenterOfObject: boolean
|
||||
) {
|
||||
this._addObjectScaleXTween(
|
||||
identifier,
|
||||
toScale,
|
||||
easing,
|
||||
duration,
|
||||
destroyObjectWhenFinished,
|
||||
scaleFromCenterOfObject,
|
||||
this.owner,
|
||||
exponentialInterpolation
|
||||
);
|
||||
const owner = this.owner;
|
||||
if (!isScalable(owner)) return;
|
||||
|
||||
const owner3d = owner instanceof gdjs.RuntimeObject3D ? owner : null;
|
||||
|
||||
const setValue = scaleFromCenterOfObject
|
||||
? (scale: float) => {
|
||||
const oldX = owner.getCenterXInScene();
|
||||
const oldY = owner.getCenterYInScene();
|
||||
const oldZ = owner3d ? owner3d.getCenterZInScene() : 0;
|
||||
owner.setScale(scale);
|
||||
owner.setCenterXInScene(oldX);
|
||||
owner.setCenterYInScene(oldY);
|
||||
if (owner3d) {
|
||||
owner3d.setCenterZInScene(oldZ);
|
||||
}
|
||||
}
|
||||
: (scaleX: float) => owner.setScale(scaleX);
|
||||
|
||||
this._tweens.addSimpleTween(
|
||||
identifier,
|
||||
this.owner,
|
||||
duration,
|
||||
easing,
|
||||
exponentialInterpolation,
|
||||
owner.getScale(),
|
||||
toScale,
|
||||
setValue,
|
||||
destroyObjectWhenFinished ? () => this._deleteFromScene() : null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tween an object X-scale.
|
||||
* @deprecated Use addObjectScaleXTween2 instead.
|
||||
@@ -1519,7 +1690,7 @@ namespace gdjs {
|
||||
|
||||
/**
|
||||
* Tween an object depth.
|
||||
* @deprecated Use the 3D Tween extension instead.
|
||||
* @deprecated Use addObjectDepthTween2 instead.
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toDepth The target depth
|
||||
* @param easing Easing function identifier
|
||||
@@ -1532,14 +1703,59 @@ namespace gdjs {
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean
|
||||
) {
|
||||
this._addObjectDepthTween(
|
||||
identifier,
|
||||
toDepth,
|
||||
easing,
|
||||
duration / 1000,
|
||||
destroyObjectWhenFinished,
|
||||
this.owner.getRuntimeScene()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tween an object depth.
|
||||
* @param object3DBehavior Only used by events can be set to null
|
||||
* @param identifier Unique id to identify the tween
|
||||
* @param toDepth The target depth
|
||||
* @param easing Easing function identifier
|
||||
* @param duration Duration in seconds
|
||||
* @param destroyObjectWhenFinished Destroy this object when the tween ends
|
||||
*/
|
||||
addObjectDepthTween2(
|
||||
object3DBehavior: any,
|
||||
identifier: string,
|
||||
toDepth: float,
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean
|
||||
) {
|
||||
this._addObjectDepthTween(
|
||||
identifier,
|
||||
toDepth,
|
||||
easing,
|
||||
duration,
|
||||
destroyObjectWhenFinished,
|
||||
this.owner
|
||||
);
|
||||
}
|
||||
|
||||
private _addObjectDepthTween(
|
||||
identifier: string,
|
||||
toDepth: float,
|
||||
easing: string,
|
||||
duration: float,
|
||||
destroyObjectWhenFinished: boolean,
|
||||
timeSource: gdjs.evtTools.tween.TimeSource
|
||||
) {
|
||||
const { owner } = this;
|
||||
if (!(owner instanceof gdjs.RuntimeObject3D)) return;
|
||||
|
||||
this._tweens.addSimpleTween(
|
||||
identifier,
|
||||
this.owner.getRuntimeScene(),
|
||||
duration / 1000,
|
||||
timeSource,
|
||||
duration,
|
||||
easing,
|
||||
linearInterpolation,
|
||||
owner.getDepth(),
|
||||
|
@@ -120,6 +120,10 @@ module.exports = function (config) {
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/TextObject/textruntimeobject.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/3D/A_RuntimeObject3D.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/3D/A_RuntimeObject3DRenderer.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/3D/Cube3DRuntimeObject.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/3D/Cube3DRuntimeObjectPixiRenderer.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/TweenBehavior/TweenManager.js',
|
||||
'./newIDE/app/resources/GDJS/Runtime/Extensions/TweenBehavior/tweentools.js',
|
||||
|
Reference in New Issue
Block a user