gdcore-tools 2.0.0-gd-v5.5.224-autobuild → 2.0.0-gd-v5.5.225-autobuild
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Runtime/CustomRuntimeObject.js +1 -1
- package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
- package/dist/Runtime/CustomRuntimeObject2D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Base3DBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObjectPixiRenderer.js +1 -1
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObjectPixiRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/3D/JsExtension.js +219 -108
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js +1 -1
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/AdMob/JsExtension.js +63 -1
- package/dist/Runtime/Extensions/AdMob/admobtools.js +1 -1
- package/dist/Runtime/Extensions/AdMob/admobtools.js.map +2 -2
- package/dist/Runtime/Extensions/AdvancedWindow/electron-advancedwindowtools.js.map +2 -2
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/BBText/JsExtension.js +10 -9
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/BitmapText/JsExtension.js +4 -6
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/DialogueTree/dialoguetools.js.map +2 -2
- package/dist/Runtime/Extensions/DraggableBehavior/draggableruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/pixi-filters/types/drop-shadow/types.d.ts +10 -4
- package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js.map +2 -2
- package/dist/Runtime/Extensions/FacebookInstantGames/facebookinstantgamestools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/A_firebasejs/firebase.d.ts +5 -4
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/D_cloudfirestoretools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/D_remoteconfigtools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/JsExtension.js +21 -21
- package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +1 -0
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/JsExtension.js +2 -2
- package/dist/Runtime/Extensions/Lighting/lightobstacleruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +122 -0
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/peerjs.d.ts +8 -10
- package/dist/Runtime/Extensions/P2P/peerjs.d.ts +8 -10
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/pixi-particles-pixi-renderer.d.ts +2 -1
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingobstacleruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics2Behavior/JsExtension.js +106 -106
- package/dist/Runtime/Extensions/Physics2Behavior/box2d.d.ts +13 -7
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics3DBehavior/Physics3DRuntimeBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCharacter3DRuntimeBehavior.js +1 -1
- package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCharacter3DRuntimeBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PhysicsBehavior/physicsruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js.map +1 -1
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js +1 -1
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/SpatialSound/spatialsoundtools.js +1 -1
- package/dist/Runtime/Extensions/SpatialSound/spatialsoundtools.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/JsExtension.js +5 -4
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js +1 -1
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js +1 -1
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/spineruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Steamworks/JsExtension.js +12 -12
- package/dist/Runtime/Extensions/Steamworks/Z_steamworksinputtools.js.map +2 -2
- package/dist/Runtime/Extensions/Steamworks/steamworkstools.js.map +2 -2
- package/dist/Runtime/Extensions/TextEntryObject/textentryruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/JsExtension.js +20 -18
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts +1 -3
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js.map +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js.map +1 -1
- package/dist/Runtime/Extensions/Video/JsExtension.js +2 -1
- package/dist/Runtime/Extensions/Video/videoruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
- package/dist/Runtime/InAppTutorialMessage.js +6 -0
- package/dist/Runtime/InAppTutorialMessage.js.map +7 -0
- package/dist/Runtime/Model3DManager.js.map +2 -2
- package/dist/Runtime/ResourceLoader.js.map +2 -2
- package/dist/Runtime/RuntimeCustomObjectLayer.js +1 -1
- package/dist/Runtime/RuntimeCustomObjectLayer.js.map +2 -2
- package/dist/Runtime/RuntimeInstanceContainer.js.map +1 -1
- package/dist/Runtime/RuntimeLayer.js.map +2 -2
- package/dist/Runtime/SpriteAnimator.js.map +2 -2
- package/dist/Runtime/affinetransformation.js.map +1 -1
- package/dist/Runtime/debugger-client/abstract-debugger-client.js.map +2 -2
- package/dist/Runtime/debugger-client/hot-reloader.js +2 -2
- package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
- package/dist/Runtime/debugger-client/websocket-debugger-client.js +1 -1
- package/dist/Runtime/debugger-client/websocket-debugger-client.js.map +2 -2
- package/dist/Runtime/events-tools/networktools.js +1 -1
- package/dist/Runtime/events-tools/networktools.js.map +2 -2
- package/dist/Runtime/fontfaceobserver-font-manager/fontfaceobserver-font-manager.js.map +2 -2
- package/dist/Runtime/gd.js.map +2 -2
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js +1 -1
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js.map +2 -2
- package/dist/Runtime/inputmanager.js.map +2 -2
- package/dist/Runtime/jsonmanager.js.map +2 -2
- package/dist/Runtime/layer.js.map +2 -2
- package/dist/Runtime/libs/nanomarkdown.js +5 -0
- package/dist/Runtime/libs/nanomarkdown.js.map +7 -0
- package/dist/Runtime/object-capabilities/AnimatableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/EffectBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/FlippableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/OpacityBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/ResizableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/ScalableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/TextContainerBehavior.js.map +2 -2
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/loadingscreen-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-bitmapfont-manager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-image-manager.js +1 -1
- package/dist/Runtime/pixi-renderers/pixi-image-manager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi.js +123 -177
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js +1 -1
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/runtimescene-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/profiler.js.map +2 -2
- package/dist/Runtime/runtimegame.js +1 -1
- package/dist/Runtime/runtimegame.js.map +2 -2
- package/dist/Runtime/runtimeobject.js +1 -1
- package/dist/Runtime/runtimeobject.js.map +2 -2
- package/dist/Runtime/runtimescene.js.map +2 -2
- package/dist/Runtime/runtimewatermark.js.map +2 -2
- package/dist/Runtime/scenestack.js.map +2 -2
- package/dist/Runtime/spriteruntimeobject.js.map +2 -2
- package/dist/Runtime/variable.js.map +2 -2
- package/dist/Runtime/variablescontainer.js.map +2 -2
- package/dist/lib/libGD.cjs +1 -1
- package/dist/lib/libGD.wasm +0 -0
- package/gd.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/TweenBehavior/tweenruntimebehavior.ts"],
|
|
4
|
-
"sourcesContent": ["/*\nGDevelop - Tween Behavior Extension\nCopyright (c) 2010-2023 Florian Rival (Florian.Rival@gmail.com)\n */\nnamespace gdjs {\n const logger = new gdjs.Logger('Tween');\n interface IColorable extends gdjs.RuntimeObject {\n setColor(color: string): void;\n getColor(): string;\n }\n\n interface ICharacterScalable extends gdjs.RuntimeObject {\n setCharacterSize(characterSize: number): void;\n getCharacterSize(): number;\n }\n\n function isScalable(\n object: gdjs.RuntimeObject\n ): object is gdjs.RuntimeObject & gdjs.Scalable {\n return (\n //@ts-ignore We are checking if the methods are present.\n object.setScaleX &&\n //@ts-ignore\n object.setScaleY &&\n //@ts-ignore\n object.getScaleX &&\n //@ts-ignore\n object.getScaleY\n );\n }\n\n function isOpaque(\n object: gdjs.RuntimeObject\n ): object is gdjs.RuntimeObject & gdjs.OpacityHandler {\n //@ts-ignore We are checking if the methods are present.\n return object.setOpacity && object.getOpacity;\n }\n\n function is3D(\n object: gdjs.RuntimeObject\n ): object is gdjs.RuntimeObject & gdjs.Base3DHandler {\n //@ts-ignore We are checking if the methods are present.\n return object.getZ && object.setZ;\n }\n\n function isColorable(object: gdjs.RuntimeObject): object is IColorable {\n //@ts-ignore We are checking if the methods are present.\n return object.setColor && object.getColor;\n }\n\n function isCharacterScalable(\n object: gdjs.RuntimeObject\n ): object is ICharacterScalable {\n //@ts-ignore We are checking if the methods are present.\n return object.setCharacterSize && object.getCharacterSize;\n }\n\n const linearInterpolation = gdjs.evtTools.common.lerp;\n const exponentialInterpolation =\n gdjs.evtTools.common.exponentialInterpolation;\n\n export class TweenRuntimeBehavior extends gdjs.RuntimeBehavior {\n private _tweens = new gdjs.evtTools.tween.TweenManager();\n private _isActive: boolean = true;\n\n /**\n * @param instanceContainer The instance container the behavior belongs to.\n * @param behaviorData The data to initialize the behavior\n * @param owner The runtime object the behavior belongs to.\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n behaviorData: BehaviorData,\n owner: gdjs.RuntimeObject\n ) {\n super(instanceContainer, behaviorData, owner);\n }\n\n updateFromBehaviorData(\n oldBehaviorData: BehaviorData,\n newBehaviorData: BehaviorData\n ): boolean {\n // Nothing to update.\n return true;\n }\n\n doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n this._tweens.step();\n }\n\n private _deleteFromScene() {\n this.owner.deleteFromScene(this.owner.getInstanceContainer());\n }\n\n /**\n * Add an object variable tween.\n * @deprecated Use addVariableTween3 instead.\n * This function is misleading since one could think that the tween starts\n * right at the moment this function is called whereas the value of the variable\n * will change at the next frame only. Moreover, the variable will not start from\n * the start value exactly since time will have passed at the moment the next\n * frame is rendered.\n * See https://github.com/4ian/GDevelop/issues/4270\n * @param identifier Unique id to identify the tween\n * @param variable The object variable to store the tweened value\n * @param fromValue Start value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addVariableTween(\n identifier: string,\n variable: gdjs.Variable,\n fromValue: float,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._tweens.addSimpleTween(\n identifier,\n this.owner.getRuntimeScene(),\n duration / 1000,\n easing,\n linearInterpolation,\n fromValue,\n toValue,\n (value: float) => variable.setNumber(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object variable.\n * @deprecated Use addVariableTween3 instead.\n * @param identifier Unique id to identify the tween\n * @param variable The object variable to store the tweened value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addVariableTween2(\n identifier: string,\n variable: gdjs.Variable,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addVariableTween(\n identifier,\n variable,\n toValue,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object variable.\n * @param identifier Unique id to identify the tween\n * @param variable The object variable to store the tweened value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addVariableTween3(\n identifier: string,\n variable: gdjs.Variable,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addVariableTween(\n identifier,\n variable,\n toValue,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addVariableTween(\n identifier: string,\n variable: gdjs.Variable,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n if (variable.getType() !== 'number') {\n return;\n }\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n variable.getValue() as number,\n toValue,\n (value: float) => variable.setNumber(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Add an object value tween.\n * @param identifier Unique id to identify the tween\n * @param fromValue Start value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param useExponentialInterpolation Set it to true to use a exponential\n * It's useful for values that are factors like a scale or a zoom.\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addValueTween(\n identifier: string,\n fromValue: float,\n toValue: float,\n easing: string,\n duration: float,\n useExponentialInterpolation: boolean,\n destroyObjectWhenFinished: boolean\n ) {\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n useExponentialInterpolation\n ? exponentialInterpolation\n : linearInterpolation,\n fromValue,\n toValue,\n (value: float) => {},\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object position.\n * @deprecated Use addObjectPositionTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionTween(\n identifier: string,\n toX: number,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionTween(\n identifier,\n toX,\n toY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object position.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionTween2(\n identifier: string,\n toX: number,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionTween(\n identifier,\n toX,\n toY,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionTween(\n identifier: string,\n toX: number,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n [this.owner.getX(), this.owner.getY()],\n [toX, toY],\n ([x, y]) => this.owner.setPosition(x, y),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object X position.\n * @deprecated Use addObjectPositionXTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionXTween(\n identifier: string,\n toX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionXTween(\n identifier,\n toX,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object X position.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionXTween2(\n identifier: string,\n toX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionXTween(\n identifier,\n toX,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionXTween(\n identifier: string,\n toX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getX(),\n toX,\n (value: float) => this.owner.setX(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object Y position.\n * @deprecated Use addObjectPositionYTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionYTween(\n identifier: string,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionYTween(\n identifier,\n toY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object Y position.\n * @param identifier Unique id to identify the tween\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionYTween2(\n identifier: string,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionYTween(\n identifier,\n toY,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionYTween(\n identifier: string,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getY(),\n toY,\n (value: float) => this.owner.setY(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object Z position.\n * @deprecated Use addObjectPositionZTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toZ The target Z position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionZTween(\n identifier: string,\n toZ: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionZTween(\n identifier,\n toZ,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object Z position.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toZ The target Z position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionZTween2(\n object3DBehavior: any,\n identifier: string,\n toZ: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionZTween(\n identifier,\n toZ,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionZTween(\n identifier: string,\n toZ: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n owner.getZ(),\n toZ,\n (value: float) => owner.setZ(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object angle.\n * @deprecated Use addObjectAngleTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectAngleTween(\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectAngleTween(\n identifier,\n toAngle,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object angle.\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectAngleTween2(\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectAngleTween(\n identifier,\n toAngle,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectAngleTween(\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getAngle(),\n toAngle,\n (value: float) => this.owner.setAngle(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a 3D object rotation X.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectRotationXTween(\n object3DBehavior: any,\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n owner.getRotationX(),\n toAngle,\n (value: float) => owner.setRotationX(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a 3D object rotation Y.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectRotationYTween(\n object3DBehavior: any,\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n owner.getRotationY(),\n toAngle,\n (value: float) => owner.setRotationY(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object scale.\n * @deprecated Use addObjectScaleTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleTween(\n identifier: string,\n toScaleX: number,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleTween(\n identifier,\n toScaleX,\n toScaleY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween an object scale.\n * @deprecated Use addObjectScaleXTween2 and addObjectScaleYTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleTween2(\n identifier: string,\n toScaleX: number,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleTween(\n identifier,\n toScaleX,\n toScaleY,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addObjectScaleTween(\n identifier: string,\n toScaleX: number,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n if (toScaleX < 0) toScaleX = 0;\n if (toScaleY < 0) toScaleY = 0;\n\n const setValue = scaleFromCenterOfObject\n ? ([scaleX, scaleY]: float[]) => {\n const oldX = owner.getCenterXInScene();\n const oldY = owner.getCenterYInScene();\n owner.setScaleX(scaleX);\n owner.setScaleY(scaleY);\n owner.setCenterPositionInScene(oldX, oldY);\n }\n : ([scaleX, scaleY]: float[]) => {\n owner.setScaleX(scaleX);\n owner.setScaleY(scaleY);\n };\n\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n [owner.getScaleX(), owner.getScaleY()],\n [toScaleX, toScaleY],\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object scale.\n * @param identifier Unique id to identify the tween\n * @param toScale The target scale\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleTween3(\n identifier: string,\n toScale: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleXTween(\n identifier,\n toScale,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n // This action doesn't require 3D capabilities.\n // So, gdjs.RuntimeObject3D may not exist\n // when the 3D extension is not used.\n const owner3d = is3D(owner) ? owner : null;\n\n const setValue = scaleFromCenterOfObject\n ? (scale: float) => {\n const oldX = owner.getCenterXInScene();\n const oldY = owner.getCenterYInScene();\n const oldZ = owner3d ? owner3d.getCenterZInScene() : 0;\n owner.setScale(scale);\n owner.setCenterXInScene(oldX);\n owner.setCenterYInScene(oldY);\n if (owner3d) {\n owner3d.setCenterZInScene(oldZ);\n }\n }\n : (scale: float) => owner.setScale(scale);\n\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n exponentialInterpolation,\n owner.getScale(),\n toScale,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object X-scale.\n * @deprecated Use addObjectScaleXTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleXTween(\n identifier: string,\n toScaleX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleXTween(\n identifier,\n toScaleX,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween an object X-scale.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleXTween2(\n identifier: string,\n toScaleX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleXTween(\n identifier,\n toScaleX,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addObjectScaleXTween(\n identifier: string,\n toScaleX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n const setValue = scaleFromCenterOfObject\n ? (scaleX: float) => {\n const oldX = owner.getCenterXInScene();\n owner.setScaleX(scaleX);\n owner.setCenterXInScene(oldX);\n }\n : (scaleX: float) => owner.setScaleX(scaleX);\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n owner.getScaleX(),\n toScaleX,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object Y-scale.\n * @deprecated Use addObjectScaleYTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleYTween(\n identifier: string,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleYTween(\n identifier,\n toScaleY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween an object Y-scale.\n * @param identifier Unique id to identify the tween\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleYTween2(\n identifier: string,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleYTween(\n identifier,\n toScaleY,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addObjectScaleYTween(\n identifier: string,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n const setValue = scaleFromCenterOfObject\n ? (scaleY: float) => {\n const oldY = owner.getCenterYInScene();\n owner.setScaleY(scaleY);\n owner.setCenterYInScene(oldY);\n }\n : (scaleY: float) => owner.setScaleY(scaleY);\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n owner.getScaleY(),\n toScaleY,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object opacity.\n * @deprecated Use addObjectOpacityTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toOpacity The target opacity\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectOpacityTween(\n identifier: string,\n toOpacity: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectOpacityTween(\n identifier,\n toOpacity,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object opacity.\n * @param identifier Unique id to identify the tween\n * @param toOpacity The target opacity\n * @param easing Easing function identifier\n * @param duration Duration in second\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectOpacityTween2(\n identifier: string,\n toOpacity: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectOpacityTween(\n identifier,\n toOpacity,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectOpacityTween(\n identifier: string,\n toOpacity: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const owner = this.owner;\n if (!isOpaque(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n owner.getOpacity(),\n toOpacity,\n (value: float) => owner.setOpacity(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a numeric object effect property.\n * @param effectBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toValue The targeted value\n * @param effectName Effect name\n * @param propertyName Property name\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addNumberEffectPropertyTween(\n effectBehavior: any,\n identifier: string,\n toValue: float,\n effectName: string,\n propertyName: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const effect = this.owner.getRendererEffects()[effectName];\n if (!effect) {\n logger.error(\n `The object \"${this.owner.name}\" doesn't have any effect called \"${effectName}\"`\n );\n }\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n effect ? effect.getDoubleParameter(propertyName) : 0,\n toValue,\n (value: float) => {\n if (effect) {\n effect.updateDoubleParameter(propertyName, value);\n }\n },\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a color object effect property.\n * @param effectBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toColorStr The target RGB color (format \"128;200;255\" with values between 0 and 255 for red, green and blue)\n * @param effectName Effect name\n * @param propertyName Property name\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addColorEffectPropertyTween(\n effectBehavior: any,\n identifier: string,\n toColorStr: string,\n effectName: string,\n propertyName: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const effect = this.owner.getRendererEffects()[effectName];\n if (!effect) {\n logger.error(\n `The object \"${this.owner.name}\" doesn't have any effect called \"${effectName}\"`\n );\n }\n const rgbFromColor = gdjs.hexNumberToRGB(\n effect ? effect.getColorParameter(propertyName) : 0\n );\n const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr);\n\n this._tweens.addMultiTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n gdjs.evtTools.tween.rgbToHsl(\n rgbFromColor.r,\n rgbFromColor.g,\n rgbFromColor.b\n ),\n gdjs.evtTools.tween.rgbToHsl(\n rgbToColor[0],\n rgbToColor[1],\n rgbToColor[2]\n ),\n ([hue, saturation, lightness]) => {\n if (effect) {\n const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb(\n hue,\n saturation,\n lightness\n );\n effect.updateColorParameter(\n propertyName,\n gdjs.rgbToHexNumber(\n rgbFromHslColor[0],\n rgbFromHslColor[1],\n rgbFromHslColor[2]\n )\n );\n }\n },\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object color.\n * @deprecated Use addObjectColorTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toColorStr The target RGB color (format \"128;200;255\" with values between 0 and 255 for red, green and blue)\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param useHSLColorTransition Tween using HSL color mappings, rather than direct RGB line\n */\n addObjectColorTween(\n identifier: string,\n toColorStr: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n useHSLColorTransition: boolean\n ) {\n this._addObjectColorTween(\n identifier,\n toColorStr,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n useHSLColorTransition,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object color.\n * @param identifier Unique id to identify the tween\n * @param toColorStr The target RGB color (format \"128;200;255\" with values between 0 and 255 for red, green and blue)\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param useHSLColorTransition Tween using HSL color mappings, rather than direct RGB line\n */\n addObjectColorTween2(\n identifier: string,\n toColorStr: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n useHSLColorTransition: boolean = true\n ) {\n this._addObjectColorTween(\n identifier,\n toColorStr,\n easing,\n duration,\n destroyObjectWhenFinished,\n useHSLColorTransition,\n this.owner\n );\n }\n\n private _addObjectColorTween(\n identifier: string,\n toColorStr: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n useHSLColorTransition: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const owner = this.owner;\n if (!isColorable(owner)) {\n return;\n }\n\n const rgbFromColor: float[] = gdjs.rgbOrHexToRGBColor(owner.getColor());\n const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr);\n\n let initialValue;\n let targetedValue;\n let setValue;\n if (useHSLColorTransition) {\n initialValue = gdjs.evtTools.tween.rgbToHsl(\n rgbFromColor[0],\n rgbFromColor[1],\n rgbFromColor[2]\n );\n targetedValue = gdjs.evtTools.tween.rgbToHsl(\n rgbToColor[0],\n rgbToColor[1],\n rgbToColor[2]\n );\n setValue = ([hue, saturation, lightness]) => {\n const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb(\n hue,\n saturation,\n lightness\n );\n owner.setColor(\n Math.floor(rgbFromHslColor[0]) +\n ';' +\n Math.floor(rgbFromHslColor[1]) +\n ';' +\n Math.floor(rgbFromHslColor[2])\n );\n };\n } else {\n initialValue = rgbFromColor;\n targetedValue = rgbToColor;\n setValue = ([red, green, blue]) => {\n owner.setColor(\n Math.floor(red) + ';' + Math.floor(green) + ';' + Math.floor(blue)\n );\n };\n }\n\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n initialValue,\n targetedValue,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object HSL color, with the \"to\" color given using HSL (H: any number, S and L: 0-100).\n * @deprecated Use addObjectColorHSLTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toHue The target hue, or the same as the from color's hue if blank\n * @param animateHue, include hue in calculations, as can't set this to -1 as default to ignore\n * @param toSaturation The target saturation, or the same as the from color's saturation if blank\n * @param toLightness The target lightness, or the same as the from color's lightness if blank\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectColorHSLTween(\n identifier: string,\n toHue: number,\n animateHue: boolean,\n toSaturation: number,\n toLightness: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectColorHSLTween(\n identifier,\n toHue,\n animateHue,\n toSaturation,\n toLightness,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object HSL color, with the \"to\" color given using HSL (H: any number, S and L: 0-100).\n * @param identifier Unique id to identify the tween\n * @param toHue The target hue, or the same as the from color's hue if blank\n * @param animateHue, include hue in calculations, as can't set this to -1 as default to ignore\n * @param toSaturation The target saturation, or the same as the from color's saturation if blank\n * @param toLightness The target lightness, or the same as the from color's lightness if blank\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectColorHSLTween2(\n identifier: string,\n toHue: number,\n animateHue: boolean,\n toSaturation: number,\n toLightness: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectColorHSLTween(\n identifier,\n toHue,\n animateHue,\n toSaturation,\n toLightness,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectColorHSLTween(\n identifier: string,\n toHue: number,\n animateHue: boolean,\n toSaturation: number,\n toLightness: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n if (!isColorable(this.owner)) return;\n const owner = this.owner;\n\n const rgbFromColor: string[] = owner.getColor().split(';');\n if (rgbFromColor.length < 3) return;\n const hslFromColor = gdjs.evtTools.tween.rgbToHsl(\n parseFloat(rgbFromColor[0]),\n parseFloat(rgbFromColor[1]),\n parseFloat(rgbFromColor[2])\n );\n\n const toH = animateHue ? toHue : hslFromColor[0];\n const toS =\n -1 === toSaturation\n ? hslFromColor[1]\n : Math.min(Math.max(toSaturation, 0), 100);\n const toL =\n -1 === toLightness\n ? hslFromColor[2]\n : Math.min(Math.max(toLightness, 0), 100);\n\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n\n hslFromColor,\n [toH, toS, toL],\n ([hue, saturation, lightness]) => {\n const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb(\n hue,\n saturation,\n lightness\n );\n\n owner.setColor(\n Math.floor(rgbFromHslColor[0]) +\n ';' +\n Math.floor(rgbFromHslColor[1]) +\n ';' +\n Math.floor(rgbFromHslColor[2])\n );\n },\n\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a text object character size.\n * @deprecated Use addTextObjectCharacterSizeTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toSize The target character size\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addTextObjectCharacterSizeTween(\n identifier: string,\n toSize: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addTextObjectCharacterSizeTween(\n identifier,\n toSize,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween a text object character size.\n * @param identifier Unique id to identify the tween\n * @param toSize The target character size\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addTextObjectCharacterSizeTween2(\n identifier: string,\n toSize: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addTextObjectCharacterSizeTween(\n identifier,\n toSize,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addTextObjectCharacterSizeTween(\n identifier: string,\n toSize: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isCharacterScalable(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n owner.getCharacterSize(),\n toSize,\n (value: float) => owner.setCharacterSize(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object width.\n * @deprecated Use addObjectWidthTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toWidth The target width\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectWidthTween(\n identifier: string,\n toWidth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectWidthTween(\n identifier,\n toWidth,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object width.\n * @param identifier Unique id to identify the tween\n * @param toWidth The target width\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectWidthTween2(\n identifier: string,\n toWidth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectWidthTween(\n identifier,\n toWidth,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectWidthTween(\n identifier: string,\n toWidth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getWidth(),\n toWidth,\n (value: float) => this.owner.setWidth(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object height.\n * @deprecated Use addObjectHeightTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toHeight The target height\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectHeightTween(\n identifier: string,\n toHeight: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectHeightTween(\n identifier,\n toHeight,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object height.\n * @param identifier Unique id to identify the tween\n * @param toHeight The target height\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectHeightTween2(\n identifier: string,\n toHeight: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectHeightTween(\n identifier,\n toHeight,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectHeightTween(\n identifier: string,\n toHeight: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getHeight(),\n toHeight,\n (value: float) => this.owner.setHeight(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object depth.\n * @deprecated Use addObjectDepthTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toDepth The target depth\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectDepthTween(\n identifier: string,\n toDepth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectDepthTween(\n identifier,\n toDepth,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object depth.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toDepth The target depth\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectDepthTween2(\n object3DBehavior: any,\n identifier: string,\n toDepth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectDepthTween(\n identifier,\n toDepth,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectDepthTween(\n identifier: string,\n toDepth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n owner.getDepth(),\n toDepth,\n (value: float) => owner.setDepth(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween is playing.\n * @param identifier Unique id to identify the tween\n */\n isPlaying(identifier: string): boolean {\n return this._tweens.isPlaying(identifier);\n }\n\n /**\n * Tween exists.\n * @param identifier Unique id to identify the tween\n * @returns The tween exists\n */\n exists(identifier: string): boolean {\n return this._tweens.exists(identifier);\n }\n\n /**\n * Tween has finished.\n * @param identifier Unique id to identify the tween\n */\n hasFinished(identifier: string): boolean {\n return this._tweens.hasFinished(identifier);\n }\n\n /**\n * Pause a tween.\n * @param identifier Unique id to identify the tween\n */\n pauseTween(identifier: string) {\n if (this._isActive) {\n this._tweens.pauseTween(identifier);\n }\n }\n\n /**\n * Stop a tween.\n * @param identifier Unique id to identify the tween\n * @param jumpToDest Move to destination\n */\n stopTween(identifier: string, jumpToDest: boolean) {\n if (this._isActive) {\n this._tweens.stopTween(identifier, jumpToDest);\n }\n }\n\n /**\n * Resume a tween.\n * @param identifier Unique id to identify the tween\n */\n resumeTween(identifier: string) {\n if (this._isActive) {\n this._tweens.resumeTween(identifier);\n }\n }\n\n /**\n * Remove a tween.\n * @param identifier Unique id to identify the tween\n */\n removeTween(identifier: string) {\n this._tweens.removeTween(identifier);\n }\n\n /**\n * Get tween progress.\n * @param identifier Unique id to identify the tween\n * @returns Progress of playing tween animation (between 0.0 and 1.0)\n */\n getProgress(identifier: string): float {\n return this._tweens.getProgress(identifier);\n }\n\n /**\n * Get tween value.\n *\n * It returns 0 for tweens with several values.\n *\n * @param identifier Unique id to identify the tween\n * @returns Value of playing tween animation\n */\n getValue(identifier: string): float {\n return this._tweens.getValue(identifier);\n }\n\n onDeActivate() {\n this._isActive = false;\n }\n\n onActivate() {\n this._isActive = true;\n }\n }\n gdjs.registerBehavior('Tween::TweenBehavior', gdjs.TweenRuntimeBehavior);\n}\n"],
|
|
4
|
+
"sourcesContent": ["/*\nGDevelop - Tween Behavior Extension\nCopyright (c) 2010-2023 Florian Rival (Florian.Rival@gmail.com)\n */\nnamespace gdjs {\n const logger = new gdjs.Logger('Tween');\n interface IColorable extends gdjs.RuntimeObject {\n setColor(color: string): void;\n getColor(): string;\n }\n\n interface ICharacterScalable extends gdjs.RuntimeObject {\n setCharacterSize(characterSize: number): void;\n getCharacterSize(): number;\n }\n\n function isScalable(\n object: gdjs.RuntimeObject\n ): object is gdjs.RuntimeObject & gdjs.Scalable {\n return (\n //@ts-ignore We are checking if the methods are present.\n object.setScaleX &&\n //@ts-ignore\n object.setScaleY &&\n //@ts-ignore\n object.getScaleX &&\n //@ts-ignore\n object.getScaleY\n );\n }\n\n function isOpaque(\n object: gdjs.RuntimeObject\n ): object is gdjs.RuntimeObject & gdjs.OpacityHandler {\n //@ts-ignore We are checking if the methods are present.\n return object.setOpacity && object.getOpacity;\n }\n\n function is3D(\n object: gdjs.RuntimeObject\n ): object is gdjs.RuntimeObject & gdjs.Base3DHandler {\n //@ts-ignore We are checking if the methods are present.\n return object.getZ && object.setZ;\n }\n\n function isColorable(object: gdjs.RuntimeObject): object is IColorable {\n //@ts-ignore We are checking if the methods are present.\n return object.setColor && object.getColor;\n }\n\n function isCharacterScalable(\n object: gdjs.RuntimeObject\n ): object is ICharacterScalable {\n //@ts-ignore We are checking if the methods are present.\n return object.setCharacterSize && object.getCharacterSize;\n }\n\n const linearInterpolation = gdjs.evtTools.common.lerp;\n const exponentialInterpolation =\n gdjs.evtTools.common.exponentialInterpolation;\n\n export class TweenRuntimeBehavior extends gdjs.RuntimeBehavior {\n private _tweens = new gdjs.evtTools.tween.TweenManager();\n private _isActive: boolean = true;\n\n /**\n * @param instanceContainer The instance container the behavior belongs to.\n * @param behaviorData The data to initialize the behavior\n * @param owner The runtime object the behavior belongs to.\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n behaviorData: BehaviorData,\n owner: gdjs.RuntimeObject\n ) {\n super(instanceContainer, behaviorData, owner);\n }\n\n updateFromBehaviorData(\n oldBehaviorData: BehaviorData,\n newBehaviorData: BehaviorData\n ): boolean {\n // Nothing to update.\n return true;\n }\n\n doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n this._tweens.step();\n }\n\n private _deleteFromScene() {\n this.owner.deleteFromScene(this.owner.getInstanceContainer());\n }\n\n /**\n * Add an object variable tween.\n * @deprecated Use addVariableTween3 instead.\n * This function is misleading since one could think that the tween starts\n * right at the moment this function is called whereas the value of the variable\n * will change at the next frame only. Moreover, the variable will not start from\n * the start value exactly since time will have passed at the moment the next\n * frame is rendered.\n * See https://github.com/4ian/GDevelop/issues/4270\n * @param identifier Unique id to identify the tween\n * @param variable The object variable to store the tweened value\n * @param fromValue Start value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addVariableTween(\n identifier: string,\n variable: gdjs.Variable,\n fromValue: float,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._tweens.addSimpleTween(\n identifier,\n this.owner.getRuntimeScene(),\n duration / 1000,\n easing,\n linearInterpolation,\n fromValue,\n toValue,\n (value: float) => variable.setNumber(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object variable.\n * @deprecated Use addVariableTween3 instead.\n * @param identifier Unique id to identify the tween\n * @param variable The object variable to store the tweened value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addVariableTween2(\n identifier: string,\n variable: gdjs.Variable,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addVariableTween(\n identifier,\n variable,\n toValue,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object variable.\n * @param identifier Unique id to identify the tween\n * @param variable The object variable to store the tweened value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addVariableTween3(\n identifier: string,\n variable: gdjs.Variable,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addVariableTween(\n identifier,\n variable,\n toValue,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addVariableTween(\n identifier: string,\n variable: gdjs.Variable,\n toValue: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n if (variable.getType() !== 'number') {\n return;\n }\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n variable.getValue() as number,\n toValue,\n (value: float) => variable.setNumber(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Add an object value tween.\n * @param identifier Unique id to identify the tween\n * @param fromValue Start value\n * @param toValue End value\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param useExponentialInterpolation Set it to true to use a exponential\n * It's useful for values that are factors like a scale or a zoom.\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addValueTween(\n identifier: string,\n fromValue: float,\n toValue: float,\n easing: string,\n duration: float,\n useExponentialInterpolation: boolean,\n destroyObjectWhenFinished: boolean\n ) {\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n useExponentialInterpolation\n ? exponentialInterpolation\n : linearInterpolation,\n fromValue,\n toValue,\n (value: float) => {},\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object position.\n * @deprecated Use addObjectPositionTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionTween(\n identifier: string,\n toX: number,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionTween(\n identifier,\n toX,\n toY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object position.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionTween2(\n identifier: string,\n toX: number,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionTween(\n identifier,\n toX,\n toY,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionTween(\n identifier: string,\n toX: number,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n [this.owner.getX(), this.owner.getY()],\n [toX, toY],\n ([x, y]) => this.owner.setPosition(x, y),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object X position.\n * @deprecated Use addObjectPositionXTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionXTween(\n identifier: string,\n toX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionXTween(\n identifier,\n toX,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object X position.\n * @param identifier Unique id to identify the tween\n * @param toX The target X position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionXTween2(\n identifier: string,\n toX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionXTween(\n identifier,\n toX,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionXTween(\n identifier: string,\n toX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getX(),\n toX,\n (value: float) => this.owner.setX(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object Y position.\n * @deprecated Use addObjectPositionYTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionYTween(\n identifier: string,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionYTween(\n identifier,\n toY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object Y position.\n * @param identifier Unique id to identify the tween\n * @param toY The target Y position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionYTween2(\n identifier: string,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionYTween(\n identifier,\n toY,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionYTween(\n identifier: string,\n toY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getY(),\n toY,\n (value: float) => this.owner.setY(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object Z position.\n * @deprecated Use addObjectPositionZTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toZ The target Z position\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionZTween(\n identifier: string,\n toZ: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionZTween(\n identifier,\n toZ,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object Z position.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toZ The target Z position\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectPositionZTween2(\n object3DBehavior: any,\n identifier: string,\n toZ: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectPositionZTween(\n identifier,\n toZ,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectPositionZTween(\n identifier: string,\n toZ: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n owner.getZ(),\n toZ,\n (value: float) => owner.setZ(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object angle.\n * @deprecated Use addObjectAngleTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectAngleTween(\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectAngleTween(\n identifier,\n toAngle,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object angle.\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectAngleTween2(\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectAngleTween(\n identifier,\n toAngle,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectAngleTween(\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getAngle(),\n toAngle,\n (value: float) => this.owner.setAngle(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a 3D object rotation X.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectRotationXTween(\n object3DBehavior: any,\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n owner.getRotationX(),\n toAngle,\n (value: float) => owner.setRotationX(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a 3D object rotation Y.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toAngle The target angle\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectRotationYTween(\n object3DBehavior: any,\n identifier: string,\n toAngle: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n owner.getRotationY(),\n toAngle,\n (value: float) => owner.setRotationY(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object scale.\n * @deprecated Use addObjectScaleTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleTween(\n identifier: string,\n toScaleX: number,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleTween(\n identifier,\n toScaleX,\n toScaleY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween an object scale.\n * @deprecated Use addObjectScaleXTween2 and addObjectScaleYTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleTween2(\n identifier: string,\n toScaleX: number,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleTween(\n identifier,\n toScaleX,\n toScaleY,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addObjectScaleTween(\n identifier: string,\n toScaleX: number,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n if (toScaleX < 0) toScaleX = 0;\n if (toScaleY < 0) toScaleY = 0;\n\n const setValue = scaleFromCenterOfObject\n ? ([scaleX, scaleY]: float[]) => {\n const oldX = owner.getCenterXInScene();\n const oldY = owner.getCenterYInScene();\n owner.setScaleX(scaleX);\n owner.setScaleY(scaleY);\n owner.setCenterPositionInScene(oldX, oldY);\n }\n : ([scaleX, scaleY]: float[]) => {\n owner.setScaleX(scaleX);\n owner.setScaleY(scaleY);\n };\n\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n [owner.getScaleX(), owner.getScaleY()],\n [toScaleX, toScaleY],\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object scale.\n * @param identifier Unique id to identify the tween\n * @param toScale The target scale\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleTween3(\n identifier: string,\n toScale: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleXTween(\n identifier,\n toScale,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n // This action doesn't require 3D capabilities.\n // So, gdjs.RuntimeObject3D may not exist\n // when the 3D extension is not used.\n const owner3d = is3D(owner) ? owner : null;\n\n const setValue = scaleFromCenterOfObject\n ? (scale: float) => {\n const oldX = owner.getCenterXInScene();\n const oldY = owner.getCenterYInScene();\n const oldZ = owner3d ? owner3d.getCenterZInScene() : 0;\n owner.setScale(scale);\n owner.setCenterXInScene(oldX);\n owner.setCenterYInScene(oldY);\n if (owner3d) {\n owner3d.setCenterZInScene(oldZ);\n }\n }\n : (scale: float) => owner.setScale(scale);\n\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n exponentialInterpolation,\n owner.getScale(),\n toScale,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object X-scale.\n * @deprecated Use addObjectScaleXTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleXTween(\n identifier: string,\n toScaleX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleXTween(\n identifier,\n toScaleX,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween an object X-scale.\n * @param identifier Unique id to identify the tween\n * @param toScaleX The target X-scale\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleXTween2(\n identifier: string,\n toScaleX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleXTween(\n identifier,\n toScaleX,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addObjectScaleXTween(\n identifier: string,\n toScaleX: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n const setValue = scaleFromCenterOfObject\n ? (scaleX: float) => {\n const oldX = owner.getCenterXInScene();\n owner.setScaleX(scaleX);\n owner.setCenterXInScene(oldX);\n }\n : (scaleX: float) => owner.setScaleX(scaleX);\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n owner.getScaleX(),\n toScaleX,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object Y-scale.\n * @deprecated Use addObjectScaleYTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleYTween(\n identifier: string,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleYTween(\n identifier,\n toScaleY,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween an object Y-scale.\n * @param identifier Unique id to identify the tween\n * @param toScaleY The target Y-scale\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param scaleFromCenterOfObject Scale the transform from the center of the object (or point that is called center), not the top-left origin\n */\n addObjectScaleYTween2(\n identifier: string,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean\n ) {\n this._addObjectScaleYTween(\n identifier,\n toScaleY,\n easing,\n duration,\n destroyObjectWhenFinished,\n scaleFromCenterOfObject,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addObjectScaleYTween(\n identifier: string,\n toScaleY: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n scaleFromCenterOfObject: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isScalable(owner)) return;\n\n const setValue = scaleFromCenterOfObject\n ? (scaleY: float) => {\n const oldY = owner.getCenterYInScene();\n owner.setScaleY(scaleY);\n owner.setCenterYInScene(oldY);\n }\n : (scaleY: float) => owner.setScaleY(scaleY);\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n owner.getScaleY(),\n toScaleY,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object opacity.\n * @deprecated Use addObjectOpacityTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toOpacity The target opacity\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectOpacityTween(\n identifier: string,\n toOpacity: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectOpacityTween(\n identifier,\n toOpacity,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object opacity.\n * @param identifier Unique id to identify the tween\n * @param toOpacity The target opacity\n * @param easing Easing function identifier\n * @param duration Duration in second\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectOpacityTween2(\n identifier: string,\n toOpacity: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectOpacityTween(\n identifier,\n toOpacity,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectOpacityTween(\n identifier: string,\n toOpacity: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const owner = this.owner;\n if (!isOpaque(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n owner.getOpacity(),\n toOpacity,\n (value: float) => owner.setOpacity(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a numeric object effect property.\n * @param effectBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toValue The targeted value\n * @param effectName Effect name\n * @param propertyName Property name\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addNumberEffectPropertyTween(\n effectBehavior: any,\n identifier: string,\n toValue: float,\n effectName: string,\n propertyName: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const effect = this.owner.getRendererEffects()[effectName];\n if (!effect) {\n logger.error(\n `The object \"${this.owner.name}\" doesn't have any effect called \"${effectName}\"`\n );\n }\n this._tweens.addSimpleTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n effect ? effect.getDoubleParameter(propertyName) : 0,\n toValue,\n (value: float) => {\n if (effect) {\n effect.updateDoubleParameter(propertyName, value);\n }\n },\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a color object effect property.\n * @param effectBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toColorStr The target RGB color (format \"128;200;255\" with values between 0 and 255 for red, green and blue)\n * @param effectName Effect name\n * @param propertyName Property name\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addColorEffectPropertyTween(\n effectBehavior: any,\n identifier: string,\n toColorStr: string,\n effectName: string,\n propertyName: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n const effect = this.owner.getRendererEffects()[effectName];\n if (!effect) {\n logger.error(\n `The object \"${this.owner.name}\" doesn't have any effect called \"${effectName}\"`\n );\n }\n const rgbFromColor = gdjs.hexNumberToRGB(\n effect ? effect.getColorParameter(propertyName) : 0\n );\n const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr);\n\n this._tweens.addMultiTween(\n identifier,\n this.owner,\n duration,\n easing,\n linearInterpolation,\n gdjs.evtTools.tween.rgbToHsl(\n rgbFromColor.r,\n rgbFromColor.g,\n rgbFromColor.b\n ),\n gdjs.evtTools.tween.rgbToHsl(\n rgbToColor[0],\n rgbToColor[1],\n rgbToColor[2]\n ),\n ([hue, saturation, lightness]) => {\n if (effect) {\n const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb(\n hue,\n saturation,\n lightness\n );\n effect.updateColorParameter(\n propertyName,\n gdjs.rgbToHexNumber(\n rgbFromHslColor[0],\n rgbFromHslColor[1],\n rgbFromHslColor[2]\n )\n );\n }\n },\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object color.\n * @deprecated Use addObjectColorTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toColorStr The target RGB color (format \"128;200;255\" with values between 0 and 255 for red, green and blue)\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param useHSLColorTransition Tween using HSL color mappings, rather than direct RGB line\n */\n addObjectColorTween(\n identifier: string,\n toColorStr: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n useHSLColorTransition: boolean\n ) {\n this._addObjectColorTween(\n identifier,\n toColorStr,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n useHSLColorTransition,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object color.\n * @param identifier Unique id to identify the tween\n * @param toColorStr The target RGB color (format \"128;200;255\" with values between 0 and 255 for red, green and blue)\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n * @param useHSLColorTransition Tween using HSL color mappings, rather than direct RGB line\n */\n addObjectColorTween2(\n identifier: string,\n toColorStr: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n useHSLColorTransition: boolean = true\n ) {\n this._addObjectColorTween(\n identifier,\n toColorStr,\n easing,\n duration,\n destroyObjectWhenFinished,\n useHSLColorTransition,\n this.owner\n );\n }\n\n private _addObjectColorTween(\n identifier: string,\n toColorStr: string,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n useHSLColorTransition: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const owner = this.owner;\n if (!isColorable(owner)) {\n return;\n }\n\n const rgbFromColor: float[] = gdjs.rgbOrHexToRGBColor(owner.getColor());\n const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr);\n\n let initialValue;\n let targetedValue;\n let setValue;\n if (useHSLColorTransition) {\n initialValue = gdjs.evtTools.tween.rgbToHsl(\n rgbFromColor[0],\n rgbFromColor[1],\n rgbFromColor[2]\n );\n targetedValue = gdjs.evtTools.tween.rgbToHsl(\n rgbToColor[0],\n rgbToColor[1],\n rgbToColor[2]\n );\n setValue = ([hue, saturation, lightness]) => {\n const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb(\n hue,\n saturation,\n lightness\n );\n owner.setColor(\n Math.floor(rgbFromHslColor[0]) +\n ';' +\n Math.floor(rgbFromHslColor[1]) +\n ';' +\n Math.floor(rgbFromHslColor[2])\n );\n };\n } else {\n initialValue = rgbFromColor;\n targetedValue = rgbToColor;\n setValue = ([red, green, blue]) => {\n owner.setColor(\n Math.floor(red) + ';' + Math.floor(green) + ';' + Math.floor(blue)\n );\n };\n }\n\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n initialValue,\n targetedValue,\n setValue,\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object HSL color, with the \"to\" color given using HSL (H: any number, S and L: 0-100).\n * @deprecated Use addObjectColorHSLTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toHue The target hue, or the same as the from color's hue if blank\n * @param animateHue include hue in calculations, as can't set this to -1 as default to ignore\n * @param toSaturation The target saturation, or the same as the from color's saturation if blank\n * @param toLightness The target lightness, or the same as the from color's lightness if blank\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectColorHSLTween(\n identifier: string,\n toHue: number,\n animateHue: boolean,\n toSaturation: number,\n toLightness: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectColorHSLTween(\n identifier,\n toHue,\n animateHue,\n toSaturation,\n toLightness,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object HSL color, with the \"to\" color given using HSL (H: any number, S and L: 0-100).\n * @param identifier Unique id to identify the tween\n * @param toHue The target hue, or the same as the from color's hue if blank\n * @param animateHue include hue in calculations, as can't set this to -1 as default to ignore\n * @param toSaturation The target saturation, or the same as the from color's saturation if blank\n * @param toLightness The target lightness, or the same as the from color's lightness if blank\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectColorHSLTween2(\n identifier: string,\n toHue: number,\n animateHue: boolean,\n toSaturation: number,\n toLightness: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectColorHSLTween(\n identifier,\n toHue,\n animateHue,\n toSaturation,\n toLightness,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectColorHSLTween(\n identifier: string,\n toHue: number,\n animateHue: boolean,\n toSaturation: number,\n toLightness: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n if (!isColorable(this.owner)) return;\n const owner = this.owner;\n\n const rgbFromColor: string[] = owner.getColor().split(';');\n if (rgbFromColor.length < 3) return;\n const hslFromColor = gdjs.evtTools.tween.rgbToHsl(\n parseFloat(rgbFromColor[0]),\n parseFloat(rgbFromColor[1]),\n parseFloat(rgbFromColor[2])\n );\n\n const toH = animateHue ? toHue : hslFromColor[0];\n const toS =\n -1 === toSaturation\n ? hslFromColor[1]\n : Math.min(Math.max(toSaturation, 0), 100);\n const toL =\n -1 === toLightness\n ? hslFromColor[2]\n : Math.min(Math.max(toLightness, 0), 100);\n\n this._tweens.addMultiTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n\n hslFromColor,\n [toH, toS, toL],\n ([hue, saturation, lightness]) => {\n const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb(\n hue,\n saturation,\n lightness\n );\n\n owner.setColor(\n Math.floor(rgbFromHslColor[0]) +\n ';' +\n Math.floor(rgbFromHslColor[1]) +\n ';' +\n Math.floor(rgbFromHslColor[2])\n );\n },\n\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween a text object character size.\n * @deprecated Use addTextObjectCharacterSizeTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toSize The target character size\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addTextObjectCharacterSizeTween(\n identifier: string,\n toSize: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addTextObjectCharacterSizeTween(\n identifier,\n toSize,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene(),\n linearInterpolation\n );\n }\n\n /**\n * Tween a text object character size.\n * @param identifier Unique id to identify the tween\n * @param toSize The target character size\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addTextObjectCharacterSizeTween2(\n identifier: string,\n toSize: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addTextObjectCharacterSizeTween(\n identifier,\n toSize,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner,\n exponentialInterpolation\n );\n }\n\n private _addTextObjectCharacterSizeTween(\n identifier: string,\n toSize: number,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource,\n interpolation: gdjs.evtTools.tween.Interpolation\n ) {\n const owner = this.owner;\n if (!isCharacterScalable(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n interpolation,\n owner.getCharacterSize(),\n toSize,\n (value: float) => owner.setCharacterSize(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object width.\n * @deprecated Use addObjectWidthTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toWidth The target width\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectWidthTween(\n identifier: string,\n toWidth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectWidthTween(\n identifier,\n toWidth,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object width.\n * @param identifier Unique id to identify the tween\n * @param toWidth The target width\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectWidthTween2(\n identifier: string,\n toWidth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectWidthTween(\n identifier,\n toWidth,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectWidthTween(\n identifier: string,\n toWidth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getWidth(),\n toWidth,\n (value: float) => this.owner.setWidth(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object height.\n * @deprecated Use addObjectHeightTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toHeight The target height\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectHeightTween(\n identifier: string,\n toHeight: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectHeightTween(\n identifier,\n toHeight,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object height.\n * @param identifier Unique id to identify the tween\n * @param toHeight The target height\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectHeightTween2(\n identifier: string,\n toHeight: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectHeightTween(\n identifier,\n toHeight,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectHeightTween(\n identifier: string,\n toHeight: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n this.owner.getHeight(),\n toHeight,\n (value: float) => this.owner.setHeight(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween an object depth.\n * @deprecated Use addObjectDepthTween2 instead.\n * @param identifier Unique id to identify the tween\n * @param toDepth The target depth\n * @param easing Easing function identifier\n * @param duration Duration in milliseconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectDepthTween(\n identifier: string,\n toDepth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectDepthTween(\n identifier,\n toDepth,\n easing,\n duration / 1000,\n destroyObjectWhenFinished,\n this.owner.getRuntimeScene()\n );\n }\n\n /**\n * Tween an object depth.\n * @param object3DBehavior Only used by events can be set to null\n * @param identifier Unique id to identify the tween\n * @param toDepth The target depth\n * @param easing Easing function identifier\n * @param duration Duration in seconds\n * @param destroyObjectWhenFinished Destroy this object when the tween ends\n */\n addObjectDepthTween2(\n object3DBehavior: any,\n identifier: string,\n toDepth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean\n ) {\n this._addObjectDepthTween(\n identifier,\n toDepth,\n easing,\n duration,\n destroyObjectWhenFinished,\n this.owner\n );\n }\n\n private _addObjectDepthTween(\n identifier: string,\n toDepth: float,\n easing: string,\n duration: float,\n destroyObjectWhenFinished: boolean,\n timeSource: gdjs.evtTools.tween.TimeSource\n ) {\n const { owner } = this;\n if (!is3D(owner)) return;\n\n this._tweens.addSimpleTween(\n identifier,\n timeSource,\n duration,\n easing,\n linearInterpolation,\n owner.getDepth(),\n toDepth,\n (value: float) => owner.setDepth(value),\n destroyObjectWhenFinished ? () => this._deleteFromScene() : null\n );\n }\n\n /**\n * Tween is playing.\n * @param identifier Unique id to identify the tween\n */\n isPlaying(identifier: string): boolean {\n return this._tweens.isPlaying(identifier);\n }\n\n /**\n * Tween exists.\n * @param identifier Unique id to identify the tween\n * @returns The tween exists\n */\n exists(identifier: string): boolean {\n return this._tweens.exists(identifier);\n }\n\n /**\n * Tween has finished.\n * @param identifier Unique id to identify the tween\n */\n hasFinished(identifier: string): boolean {\n return this._tweens.hasFinished(identifier);\n }\n\n /**\n * Pause a tween.\n * @param identifier Unique id to identify the tween\n */\n pauseTween(identifier: string) {\n if (this._isActive) {\n this._tweens.pauseTween(identifier);\n }\n }\n\n /**\n * Stop a tween.\n * @param identifier Unique id to identify the tween\n * @param jumpToDest Move to destination\n */\n stopTween(identifier: string, jumpToDest: boolean) {\n if (this._isActive) {\n this._tweens.stopTween(identifier, jumpToDest);\n }\n }\n\n /**\n * Resume a tween.\n * @param identifier Unique id to identify the tween\n */\n resumeTween(identifier: string) {\n if (this._isActive) {\n this._tweens.resumeTween(identifier);\n }\n }\n\n /**\n * Remove a tween.\n * @param identifier Unique id to identify the tween\n */\n removeTween(identifier: string) {\n this._tweens.removeTween(identifier);\n }\n\n /**\n * Get tween progress.\n * @param identifier Unique id to identify the tween\n * @returns Progress of playing tween animation (between 0.0 and 1.0)\n */\n getProgress(identifier: string): float {\n return this._tweens.getProgress(identifier);\n }\n\n /**\n * Get tween value.\n *\n * It returns 0 for tweens with several values.\n *\n * @param identifier Unique id to identify the tween\n * @returns Value of playing tween animation\n */\n getValue(identifier: string): float {\n return this._tweens.getValue(identifier);\n }\n\n onDeActivate() {\n this._isActive = false;\n }\n\n onActivate() {\n this._isActive = true;\n }\n }\n gdjs.registerBehavior('Tween::TweenBehavior', gdjs.TweenRuntimeBehavior);\n}\n"],
|
|
5
5
|
"mappings": "AAIA,GAAU,MAAV,UAAU,EAAV,CACE,KAAM,GAAS,GAAI,GAAK,OAAO,SAW/B,WACE,EAC8C,CAC9C,MAEE,GAAO,WAEP,EAAO,WAEP,EAAO,WAEP,EAAO,UAIX,WACE,EACoD,CAEpD,MAAO,GAAO,YAAc,EAAO,WAGrC,WACE,EACmD,CAEnD,MAAO,GAAO,MAAQ,EAAO,KAG/B,WAAqB,EAAkD,CAErE,MAAO,GAAO,UAAY,EAAO,SAGnC,WACE,EAC8B,CAE9B,MAAO,GAAO,kBAAoB,EAAO,iBAG3C,KAAM,GAAsB,EAAK,SAAS,OAAO,KAC3C,EACJ,EAAK,SAAS,OAAO,yBAEhB,eAAmC,GAAK,eAAgB,CAS7D,YACE,EACA,EACA,EACA,CACA,MAAM,EAAmB,EAAc,GAbjC,aAAU,GAAI,GAAK,SAAS,MAAM,aAClC,eAAqB,GAe7B,uBACE,EACA,EACS,CAET,MAAO,GAGT,gBAAgB,EAAwD,CACtE,KAAK,QAAQ,OAGP,kBAAmB,CACzB,KAAK,MAAM,gBAAgB,KAAK,MAAM,wBAoBxC,iBACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,eACX,EACA,KAAK,MAAM,kBACX,EAAW,IACX,EACA,EACA,EACA,EACA,AAAC,GAAiB,EAAS,UAAU,GACrC,EAA4B,IAAM,KAAK,mBAAqB,MAchE,kBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,kBACH,EACA,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAaf,kBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,kBACH,EACA,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,kBACN,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,AAAI,EAAS,YAAc,UAG3B,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,EAAS,WACT,EACA,AAAC,GAAiB,EAAS,UAAU,GACrC,EAA4B,IAAM,KAAK,mBAAqB,MAehE,cACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,eACX,EACA,KAAK,MACL,EACA,EACA,EACI,EACA,EACJ,EACA,EACA,AAAC,GAAiB,GAClB,EAA4B,IAAM,KAAK,mBAAqB,MAchE,uBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,wBACH,EACA,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAaf,wBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,wBACH,EACA,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,wBACN,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,cACX,EACA,EACA,EACA,EACA,EACA,CAAC,KAAK,MAAM,OAAQ,KAAK,MAAM,QAC/B,CAAC,EAAK,GACN,CAAC,CAAC,EAAG,KAAO,KAAK,MAAM,YAAY,EAAG,GACtC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,wBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,yBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAYf,yBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,yBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,yBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,KAAK,MAAM,OACX,EACA,AAAC,GAAiB,KAAK,MAAM,KAAK,GAClC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,wBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,yBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAYf,yBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,yBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,yBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,KAAK,MAAM,OACX,EACA,AAAC,GAAiB,KAAK,MAAM,KAAK,GAClC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,wBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,yBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAaf,yBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,yBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,yBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,CAAE,SAAU,KAClB,AAAI,CAAC,EAAK,IAEV,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,EAAM,OACN,EACA,AAAC,GAAiB,EAAM,KAAK,GAC7B,EAA4B,IAAM,KAAK,mBAAqB,MAahE,oBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAYf,qBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,qBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,KAAK,MAAM,WACX,EACA,AAAC,GAAiB,KAAK,MAAM,SAAS,GACtC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,wBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,CAAE,SAAU,KAClB,AAAI,CAAC,EAAK,IAEV,KAAK,QAAQ,eACX,EACA,KAAK,MACL,EACA,EACA,EACA,EAAM,eACN,EACA,AAAC,GAAiB,EAAM,aAAa,GACrC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,wBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,CAAE,SAAU,KAClB,AAAI,CAAC,EAAK,IAEV,KAAK,QAAQ,eACX,EACA,KAAK,MACL,EACA,EACA,EACA,EAAM,eACN,EACA,AAAC,GAAiB,EAAM,aAAa,GACrC,EAA4B,IAAM,KAAK,mBAAqB,MAehE,oBACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EACA,EAAW,IACX,EACA,EACA,KAAK,MAAM,kBACX,GAeJ,qBACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EACA,EACA,EACA,EACA,KAAK,MACL,GAII,qBACN,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,GAAQ,KAAK,MACnB,GAAI,CAAC,EAAW,GAAQ,OAExB,AAAI,EAAW,GAAG,GAAW,GACzB,EAAW,GAAG,GAAW,GAE7B,KAAM,GAAW,EACb,CAAC,CAAC,EAAQ,KAAqB,CAC7B,KAAM,GAAO,EAAM,oBACb,EAAO,EAAM,oBACnB,EAAM,UAAU,GAChB,EAAM,UAAU,GAChB,EAAM,yBAAyB,EAAM,IAEvC,CAAC,CAAC,EAAQ,KAAqB,CAC7B,EAAM,UAAU,GAChB,EAAM,UAAU,IAGtB,KAAK,QAAQ,cACX,EACA,EACA,EACA,EACA,EACA,CAAC,EAAM,YAAa,EAAM,aAC1B,CAAC,EAAU,GACX,EACA,EAA4B,IAAM,KAAK,mBAAqB,MAahE,qBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,sBACH,EACA,EACA,EACA,EACA,EACA,EACA,KAAK,MACL,GAEF,KAAM,GAAQ,KAAK,MACnB,GAAI,CAAC,EAAW,GAAQ,OAKxB,KAAM,GAAU,EAAK,GAAS,EAAQ,KAEhC,EAAW,EACb,AAAC,GAAiB,CAChB,KAAM,GAAO,EAAM,oBACb,EAAO,EAAM,oBACb,EAAO,EAAU,EAAQ,oBAAsB,EACrD,EAAM,SAAS,GACf,EAAM,kBAAkB,GACxB,EAAM,kBAAkB,GACpB,GACF,EAAQ,kBAAkB,IAG9B,AAAC,GAAiB,EAAM,SAAS,GAErC,KAAK,QAAQ,eACX,EACA,KAAK,MACL,EACA,EACA,EACA,EAAM,WACN,EACA,EACA,EAA4B,IAAM,KAAK,mBAAqB,MAchE,qBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,sBACH,EACA,EACA,EACA,EAAW,IACX,EACA,EACA,KAAK,MAAM,kBACX,GAaJ,sBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,sBACH,EACA,EACA,EACA,EACA,EACA,EACA,KAAK,MACL,GAII,sBACN,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,GAAQ,KAAK,MACnB,GAAI,CAAC,EAAW,GAAQ,OAExB,KAAM,GAAW,EACb,AAAC,GAAkB,CACjB,KAAM,GAAO,EAAM,oBACnB,EAAM,UAAU,GAChB,EAAM,kBAAkB,IAE1B,AAAC,GAAkB,EAAM,UAAU,GAEvC,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,EAAM,YACN,EACA,EACA,EAA4B,IAAM,KAAK,mBAAqB,MAchE,qBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,sBACH,EACA,EACA,EACA,EAAW,IACX,EACA,EACA,KAAK,MAAM,kBACX,GAaJ,sBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,sBACH,EACA,EACA,EACA,EACA,EACA,EACA,KAAK,MACL,GAII,sBACN,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,GAAQ,KAAK,MACnB,GAAI,CAAC,EAAW,GAAQ,OAExB,KAAM,GAAW,EACb,AAAC,GAAkB,CACjB,KAAM,GAAO,EAAM,oBACnB,EAAM,UAAU,GAChB,EAAM,kBAAkB,IAE1B,AAAC,GAAkB,EAAM,UAAU,GAEvC,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,EAAM,YACN,EACA,EACA,EAA4B,IAAM,KAAK,mBAAqB,MAahE,sBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,uBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAYf,uBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,uBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,uBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,GAAQ,KAAK,MACnB,AAAI,CAAC,EAAS,IAEd,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,EAAM,aACN,EACA,AAAC,GAAiB,EAAM,WAAW,GACnC,EAA4B,IAAM,KAAK,mBAAqB,MAehE,6BAC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AC,EAAK,EAAY,KAAe,CAChC,KAAM,GAAkB,EAAK,SAAS,MAAM,SAC1C,EACA,EACA,GAGF,EAAM,SACJ,KAAK,MAAM,EAAgB,IACzB,IACA,KAAK,MAAM,EAAgB,IAC3B,IACA,KAAK,MAAM,EAAgB,MAIjC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,gCACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,iCACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,kBACX,GAYJ,iCACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,iCACH,EACA,EACA,EACA,EACA,EACA,KAAK,MACL,GAII,iCACN,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,GAAQ,KAAK,MACnB,AAAI,CAAC,EAAoB,IAEzB,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,EAAM,mBACN,EACA,AAAC,GAAiB,EAAM,iBAAiB,GACzC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,oBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAYf,qBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,qBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,KAAK,MAAM,WACX,EACA,AAAC,GAAiB,KAAK,MAAM,SAAS,GACtC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,qBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,sBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAYf,sBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,sBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,sBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,KAAK,MAAM,YACX,EACA,AAAC,GAAiB,KAAK,MAAM,UAAU,GACvC,EAA4B,IAAM,KAAK,mBAAqB,MAahE,oBACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EAAW,IACX,EACA,KAAK,MAAM,mBAaf,qBACE,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,qBACH,EACA,EACA,EACA,EACA,EACA,KAAK,OAID,qBACN,EACA,EACA,EACA,EACA,EACA,EACA,CACA,KAAM,CAAE,SAAU,KAClB,AAAI,CAAC,EAAK,IAEV,KAAK,QAAQ,eACX,EACA,EACA,EACA,EACA,EACA,EAAM,WACN,EACA,AAAC,GAAiB,EAAM,SAAS,GACjC,EAA4B,IAAM,KAAK,mBAAqB,MAQhE,UAAU,EAA6B,CACrC,MAAO,MAAK,QAAQ,UAAU,GAQhC,OAAO,EAA6B,CAClC,MAAO,MAAK,QAAQ,OAAO,GAO7B,YAAY,EAA6B,CACvC,MAAO,MAAK,QAAQ,YAAY,GAOlC,WAAW,EAAoB,CAC7B,AAAI,KAAK,WACP,KAAK,QAAQ,WAAW,GAS5B,UAAU,EAAoB,EAAqB,CACjD,AAAI,KAAK,WACP,KAAK,QAAQ,UAAU,EAAY,GAQvC,YAAY,EAAoB,CAC9B,AAAI,KAAK,WACP,KAAK,QAAQ,YAAY,GAQ7B,YAAY,EAAoB,CAC9B,KAAK,QAAQ,YAAY,GAQ3B,YAAY,EAA2B,CACrC,MAAO,MAAK,QAAQ,YAAY,GAWlC,SAAS,EAA2B,CAClC,MAAO,MAAK,QAAQ,SAAS,GAG/B,cAAe,CACb,KAAK,UAAY,GAGnB,YAAa,CACX,KAAK,UAAY,IAxxDd,EAAM,uBA2xDb,EAAK,iBAAiB,uBAAwB,EAAK,wBAp1D3C",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -611,7 +611,8 @@ module.exports = {
|
|
|
611
611
|
that._pixiObject.texture.off('error', this);
|
|
612
612
|
if (this._wasDestroyed) return;
|
|
613
613
|
|
|
614
|
-
that._pixiObject.texture =
|
|
614
|
+
that._pixiObject.texture =
|
|
615
|
+
that._pixiResourcesLoader.getInvalidPIXITexture();
|
|
615
616
|
});
|
|
616
617
|
}
|
|
617
618
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/Video/videoruntimeobject-pixi-renderer.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('Video object PIXI renderer');\n\n /**\n * The PIXI.js renderer for the VideoRuntimeObject.\n */\n export class VideoRuntimeObjectPixiRenderer {\n _object: gdjs.VideoRuntimeObject;\n\n // Load (or reset) the video\n _pixiObject: any;\n _textureWasValid: boolean = false;\n\n /**\n * @param runtimeObject The object to render\n * @param instanceContainer The gdjs.RuntimeScene in which the object is\n */\n constructor(\n runtimeObject: gdjs.VideoRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._object = runtimeObject;\n this._pixiObject = new PIXI.Sprite(\n instanceContainer\n .getGame()\n .getImageManager()\n .getPIXIVideoTexture(this._object._videoResource)\n );\n\n // Will be set to true when video texture is loaded.\n instanceContainer\n .getLayer('')\n .getRenderer()\n .addRendererObject(this._pixiObject, runtimeObject.getZOrder());\n\n // Set the anchor in the center, so that the object rotates around\n // its center\n this._pixiObject.anchor.x = 0.5;\n this._pixiObject.anchor.y = 0.5;\n this.updatePosition();\n this.updateAngle();\n this.updateOpacity();\n this.updateVolume();\n this.updateLoop();\n }\n\n getRendererObject() {\n return this._pixiObject;\n }\n\n /**\n * To be called when the object is removed from the scene: will stop the video\n * (goes back to beginning).\n */\n onDestroy() {\n this.stop();\n this._pixiObject.destroy(false);\n }\n\n ensureUpToDate() {\n // Make sure that the video is repositioned after the texture was loaded\n // (as width and height will change).\n if (\n !this._textureWasValid &&\n this._pixiObject.texture &&\n this._pixiObject.texture.valid\n ) {\n this.updatePosition();\n this._textureWasValid = true;\n }\n }\n\n updatePosition(): void {\n this._pixiObject.position.x = this._object.x + this._pixiObject.width / 2;\n this._pixiObject.position.y =\n this._object.y + this._pixiObject.height / 2;\n }\n\n updateLoop(): void {\n this._pixiObject._texture.baseTexture.resource.source.loop
|
|
5
|
-
"mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,CACE,KAAM,GAAS,GAAI,GAAK,OAAO,8BAKxB,OAAqC,CAW1C,YACE,EACA,EACA,CATF,sBAA4B,GAU1B,KAAK,QAAU,EACf,KAAK,YAAc,GAAI,MAAK,OAC1B,EACG,UACA,kBACA,oBAAoB,KAAK,QAAQ,iBAItC,EACG,SAAS,IACT,cACA,kBAAkB,KAAK,YAAa,EAAc,aAIrD,KAAK,YAAY,OAAO,EAAI,GAC5B,KAAK,YAAY,OAAO,EAAI,GAC5B,KAAK,iBACL,KAAK,cACL,KAAK,gBACL,KAAK,eACL,KAAK,aAGP,mBAAoB,CAClB,MAAO,MAAK,YAOd,WAAY,CACV,KAAK,OACL,KAAK,YAAY,QAAQ,IAG3B,gBAAiB,CAGf,AACE,CAAC,KAAK,kBACN,KAAK,YAAY,SACjB,KAAK,YAAY,QAAQ,OAEzB,MAAK,iBACL,KAAK,iBAAmB,IAI5B,gBAAuB,CACrB,KAAK,YAAY,SAAS,EAAI,KAAK,QAAQ,EAAI,KAAK,YAAY,MAAQ,EACxE,KAAK,YAAY,SAAS,EACxB,KAAK,QAAQ,EAAI,KAAK,YAAY,OAAS,EAG/C,YAAmB,CACjB,KAAK,YAAY,SAAS,YAAY,SAAS,OAAO,
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('Video object PIXI renderer');\n\n /**\n * The PIXI.js renderer for the VideoRuntimeObject.\n */\n export class VideoRuntimeObjectPixiRenderer {\n _object: gdjs.VideoRuntimeObject;\n\n // Load (or reset) the video\n _pixiObject: any;\n _textureWasValid: boolean = false;\n\n /**\n * @param runtimeObject The object to render\n * @param instanceContainer The gdjs.RuntimeScene in which the object is\n */\n constructor(\n runtimeObject: gdjs.VideoRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._object = runtimeObject;\n this._pixiObject = new PIXI.Sprite(\n instanceContainer\n .getGame()\n .getImageManager()\n .getPIXIVideoTexture(this._object._videoResource)\n );\n\n // Will be set to true when video texture is loaded.\n instanceContainer\n .getLayer('')\n .getRenderer()\n .addRendererObject(this._pixiObject, runtimeObject.getZOrder());\n\n // Set the anchor in the center, so that the object rotates around\n // its center\n this._pixiObject.anchor.x = 0.5;\n this._pixiObject.anchor.y = 0.5;\n this.updatePosition();\n this.updateAngle();\n this.updateOpacity();\n this.updateVolume();\n this.updateLoop();\n }\n\n getRendererObject() {\n return this._pixiObject;\n }\n\n /**\n * To be called when the object is removed from the scene: will stop the video\n * (goes back to beginning).\n */\n onDestroy() {\n this.stop();\n this._pixiObject.destroy(false);\n }\n\n ensureUpToDate() {\n // Make sure that the video is repositioned after the texture was loaded\n // (as width and height will change).\n if (\n !this._textureWasValid &&\n this._pixiObject.texture &&\n this._pixiObject.texture.valid\n ) {\n this.updatePosition();\n this._textureWasValid = true;\n }\n }\n\n updatePosition(): void {\n this._pixiObject.position.x = this._object.x + this._pixiObject.width / 2;\n this._pixiObject.position.y =\n this._object.y + this._pixiObject.height / 2;\n }\n\n updateLoop(): void {\n this._pixiObject._texture.baseTexture.resource.source.loop =\n this._object._loop;\n }\n\n updateVolume(): void {\n this._pixiObject._texture.baseTexture.resource.source.volume =\n this._object._volume / 100;\n }\n\n updateAngle(): void {\n this._pixiObject.rotation = gdjs.toRad(this._object.angle);\n }\n\n updateOpacity(): void {\n this._pixiObject.alpha = this._object._opacity / 255;\n }\n\n getWidth(): float {\n return this._pixiObject.width;\n }\n\n getHeight(): float {\n return this._pixiObject.height;\n }\n\n /**\n * Set the rendered video width\n * @param width The new width, in pixels.\n */\n setWidth(width: float): void {\n this._pixiObject.width = width;\n\n // Position needs to be updated, as position in the center of the PIXI Sprite.\n this.updatePosition();\n }\n\n /**\n * Set the rendered video height\n * @param height The new height, in pixels.\n */\n setHeight(height: float): void {\n this._pixiObject.height = height;\n\n // Position needs to be updated, as position in the center of the PIXI Sprite.\n this.updatePosition();\n }\n\n /**\n * Get the internal HTMLVideoElement used for the video source.\n * @returns The video element, if any.\n */\n _getHTMLVideoElementSource(): HTMLVideoElement | null {\n if (\n !this._pixiObject.texture ||\n !this._pixiObject.texture.baseTexture.resource.source\n ) {\n return null;\n }\n const source = this._pixiObject.texture.baseTexture.resource.source;\n if (!(source instanceof HTMLVideoElement)) {\n return null;\n }\n return source;\n }\n\n /**\n * Start the video\n */\n play() {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n const promise = source.play();\n if (promise !== undefined) {\n // Autoplay started\n promise\n .then(() => {})\n .catch(() => {\n // Autoplay was prevented.\n logger.warn(\n 'The video did not start because: video is invalid or no interaction with the game has been captured before (this is blocked by the navigator: https://goo.gl/xX8pDD)'\n );\n });\n }\n }\n\n /**\n * Pause the video\n */\n pause() {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n source.pause();\n }\n\n /**\n * Stops the video and comes back to first frame.\n */\n stop() {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n source.pause();\n source.currentTime = 0;\n }\n\n // Autoplay was prevented.\n /**\n * Set the loop on video in renderer\n * @param enable true to loop the video\n */\n setLoop(enable: boolean): void {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n source.loop = enable;\n }\n\n /**\n * Set or unset mute on the video.\n * @param enable true to mute\n */\n setMute(enable: boolean): void {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n this._pixiObject._texture.baseTexture.resource.source.muted = enable;\n }\n\n /**\n * Return true if the video is muted.\n */\n isMuted(): boolean {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return false;\n }\n return source.muted;\n }\n\n /**\n * Set the current time of the video.\n */\n setCurrentTime(number): void {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n source.currentTime = number;\n }\n\n /**\n * Set the volume of the video, between 0 and 1.\n * @param volume The new volume.\n */\n setVolume(volume: number): void {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n source.volume = volume;\n }\n\n /**\n * Get the volume on video, between 0 and 1.\n */\n getVolume() {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return 0;\n }\n return source.volume;\n }\n\n /**\n * Return true if the video is playing\n */\n isPlayed(): boolean {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return false;\n }\n return !source.paused && !source.ended;\n }\n\n /**\n * Return true if the video is looping\n */\n isLooped(): boolean {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return false;\n }\n return source.loop;\n }\n\n /**\n * Get the current time of the playback.\n */\n getCurrentTime(): float {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return 0;\n }\n return source.currentTime;\n }\n\n /**\n * Get the duration of the video.\n */\n getDuration() {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return 0;\n }\n return source.duration;\n }\n\n /**\n * Return true if the video has ended.\n */\n isEnded(): boolean {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return false;\n }\n return source.ended;\n }\n\n /**\n * Set the playback speed (1 = 100%)\n */\n setPlaybackSpeed(playbackRate): void {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return;\n }\n source.playbackRate = playbackRate;\n }\n\n /**\n * Return the playback speed (1 = 100%)\n */\n getPlaybackSpeed() {\n const source = this._getHTMLVideoElementSource();\n if (!source) {\n return 0;\n }\n return source.playbackRate;\n }\n }\n\n export const VideoRuntimeObjectRenderer = VideoRuntimeObjectPixiRenderer;\n export type VideoRuntimeObjectRenderer = VideoRuntimeObjectPixiRenderer;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/Video/videoruntimeobject.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n /** The initial properties for {@link gdjs.VideoRuntimeObject} */\n export type VideoObjectDataType = {\n /** The base parameters of the video */\n content: {\n /** The opacity of the video */\n opacity: number;\n /** Does the video loops itself? */\n loop: boolean;\n /** The volume of the video */\n volume: number;\n /** Name of the resource corresponding to the video */\n videoResource: string;\n };\n };\n\n export type VideoObjectData = ObjectData & VideoObjectDataType;\n\n export type VideoNetworkSyncDataType = {\n op: float;\n wid: float;\n hei: float;\n // We don't sync volume, as it's probably a user setting?\n pla: boolean;\n loop: boolean;\n ct: float;\n ps: number;\n };\n\n export type VideoNetworkSyncData = ObjectNetworkSyncData &\n VideoNetworkSyncDataType;\n\n /**\n * An object displaying a video on screen.\n *\n * For the same video resource, only one video is being created in memory (\n * as a HTMLVideoElement). This means that two objects displaying the same\n * video will have the same state for this video (paused/playing, current time,\n * volume, etc...).\n */\n export class VideoRuntimeObject\n extends gdjs.RuntimeObject\n implements gdjs.OpacityHandler {\n _opacity: float;\n _loop: boolean;\n _volume: float;\n _videoResource: string;\n\n // Use a boolean to track if the video was paused because we\n // navigated to another scene, and so should resume if we're back.\n _pausedAsScenePaused: boolean = false;\n _renderer: gdjs.VideoRuntimeObjectRenderer;\n _playbackSpeed: any;\n\n /**\n * @param instanceContainer The scene the object belongs to.\n * @param videoObjectData The data defining the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n videoObjectData: VideoObjectData\n ) {\n super(instanceContainer, videoObjectData);\n this._opacity = videoObjectData.content.opacity;\n this._loop = videoObjectData.content.loop;\n this._volume = videoObjectData.content.volume;\n this._videoResource = videoObjectData.content.videoResource;\n this._renderer = new gdjs.VideoRuntimeObjectRenderer(\n this,\n instanceContainer\n );\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: VideoObjectData,\n newObjectData: VideoObjectData\n ): boolean {\n if (oldObjectData.content.opacity !== newObjectData.content.opacity) {\n this.setOpacity(newObjectData.content.opacity);\n }\n if (oldObjectData.content.loop !== newObjectData.content.loop) {\n this.setLoop(newObjectData.content.loop);\n }\n if (oldObjectData.content.volume !== newObjectData.content.volume) {\n this.setVolume(newObjectData.content.volume);\n }\n if (\n oldObjectData.content.videoResource !==\n newObjectData.content.videoResource\n ) {\n return false;\n }\n return true;\n }\n\n getNetworkSyncData(): VideoNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n op: this._opacity,\n wid: this.getWidth(),\n hei: this.getHeight(),\n pla: this.isPlayed(),\n loop: this.isLooped(),\n ct: this.getCurrentTime(),\n ps: this.getPlaybackSpeed(),\n };\n }\n\n updateFromNetworkSyncData(syncData: VideoNetworkSyncData): void {\n super.updateFromNetworkSyncData(syncData);\n\n if (this._opacity !== undefined && this._opacity && syncData.op) {\n this.setOpacity(syncData.op);\n }\n if (this.getWidth() !== undefined && this.getWidth() !== syncData.wid) {\n this.setWidth(syncData.wid);\n }\n if (this.getHeight() !== undefined && this.getHeight() !== syncData.hei) {\n this.setHeight(syncData.hei);\n }\n if (syncData.pla !== undefined && this.isPlayed() !== syncData.pla) {\n syncData.pla ? this.play() : this.pause();\n }\n if (syncData.loop !== undefined && this.isLooped() !== syncData.loop) {\n this.setLoop(syncData.loop);\n }\n // We don't update the current time too regularly, only if it's off by a lot.\n if (\n syncData.ct !== undefined &&\n Math.abs(this.getCurrentTime() - syncData.ct) > 3 // More than 3 seconds off\n ) {\n this.setCurrentTime(syncData.ct);\n }\n if (\n syncData.ps !== undefined &&\n this.getPlaybackSpeed() !== syncData.ps\n ) {\n this.setPlaybackSpeed(syncData.ps);\n }\n }\n\n /**\n * Initialize the extra parameters that could be set for an instance.\n * @param initialInstanceData The initial instance data\n */\n extraInitializationFromInitialInstance(initialInstanceData: InstanceData) {\n if (initialInstanceData.customSize) {\n this.setWidth(initialInstanceData.width);\n this.setHeight(initialInstanceData.height);\n }\n if (initialInstanceData.opacity !== undefined) {\n this.setOpacity(initialInstanceData.opacity);\n }\n }\n\n onDestroyed(): void {\n super.onDestroyed();\n this._renderer.onDestroy();\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n this._renderer.ensureUpToDate();\n }\n\n /**\n * Set object position on X axis.\n * @param x The new position X of the object.\n */\n setX(x: float): void {\n super.setX(x);\n this._renderer.updatePosition();\n }\n\n /**\n * Set object position on Y axis.\n * @param y The new position Y of the object.\n */\n setY(y: float): void {\n super.setY(y);\n this._renderer.updatePosition();\n }\n\n /**\n * Set the angle of the object.\n * @param angle The new angle of the object.\n */\n setAngle(angle: float): void {\n super.setAngle(angle);\n this._renderer.updateAngle();\n }\n\n /**\n * Set object opacity.\n * @param opacity The new opacity of the object (0-255).\n */\n setOpacity(opacity: float): void {\n this._opacity = opacity;\n this._renderer.updateOpacity();\n }\n\n /**\n * Get object opacity.\n * @returns The current opacity\n */\n getOpacity(): number {\n return this._opacity;\n }\n\n /**\n * Set the width of the video.\n * @param width The new width in pixels.\n */\n setWidth(width: float): void {\n if (this._renderer.getWidth() === width) return;\n\n this._renderer.setWidth(width);\n this.invalidateHitboxes();\n }\n\n /**\n * Set the height of the video.\n * @param height The new height in pixels.\n */\n setHeight(height: float): void {\n if (this._renderer.getHeight() === height) return;\n\n this._renderer.setHeight(height);\n this.invalidateHitboxes();\n }\n\n /**\n * Get the width of the video object.\n * @returns The current width of the object\n */\n getWidth(): float {\n return this._renderer.getWidth();\n }\n\n /**\n * Get the height of the video object.\n * @returns The current height of the object\n */\n getHeight(): float {\n return this._renderer.getHeight();\n }\n\n /**\n * Play the video.\n */\n play(): void {\n this._renderer.play();\n }\n\n /**\n * Pause the video.\n */\n pause(): void {\n this._renderer.pause();\n }\n\n /**\n * Set the state looped of the video.\n * @param enable true to loop the video\n */\n setLoop(enable: boolean): void {\n this._renderer.setLoop(enable);\n }\n\n /**\n * Set the state muted of the video.\n * @param enable The new state.\n */\n mute(enable: boolean) {\n this._renderer.setMute(enable);\n }\n\n /**\n * Return the state muted of video object.\n * @returns Is the video muted?\n */\n isMuted(): boolean {\n return this._renderer.isMuted();\n }\n\n /**\n * Set the volume of the video object.\n * @param volume The new volume, between 0 and 100.\n */\n setVolume(volume: number): void {\n this._volume =\n gdjs.evtTools.common.clamp(\n gdjs.evtTools.common.normalize(volume, 0, 100),\n 0,\n 1\n ) * 100;\n this._renderer.updateVolume();\n }\n\n /**\n * Get the volume of the video object.\n * @returns The current video's volume, between 0 and 100.\n */\n getVolume(): number {\n return (\n gdjs.evtTools.common.normalize(this._renderer.getVolume(), 0, 1) * 100\n );\n }\n\n /**\n * Check if the video is being played.\n * @returns Is the video being played?\n */\n isPlayed(): boolean {\n return this._renderer.isPlayed();\n }\n\n /**\n * Check if the video is paused.\n * @returns Is the video being paused?\n */\n isPaused(): boolean {\n return !this._renderer.isPlayed();\n }\n\n /**\n * Check if the video is looping.\n * @returns Is the video looping?\n */\n isLooped(): boolean {\n return this._renderer.isLooped();\n }\n\n /**\n * Return the total time of the video.\n * @returns The duration of the video\n */\n getDuration(): number {\n return this._renderer.getDuration();\n }\n\n /**\n * Check if the video has ended.\n * @returns Has the video ended?\n */\n isEnded(): boolean {\n return this._renderer.isEnded();\n }\n\n /**\n * Set the new time of the video object.\n * @param time The new time.\n */\n setCurrentTime(time: float): void {\n this._renderer.setCurrentTime(time);\n }\n\n /**\n * Get the current time of the video object.\n * @returns The current time of the video\n */\n getCurrentTime(): float {\n return this._renderer.getCurrentTime();\n }\n\n /**\n * Set the new playback speed of the video object.\n * @param playbackSpeed The new playback speed.\n */\n setPlaybackSpeed(playbackSpeed: number): void {\n this._playbackSpeed = gdjs.evtTools.common.clamp(playbackSpeed, 0.5, 2);\n this._renderer.setPlaybackSpeed(this._playbackSpeed);\n }\n\n /**\n * Get the playback speed of the video object.\n * @returns The current playback speed of the video.\n */\n getPlaybackSpeed(): number {\n return this._renderer.getPlaybackSpeed();\n }\n }\n gdjs.registerObject('Video::VideoObject', gdjs.VideoRuntimeObject);\n\n /**\n * When a scene is unloaded, pause any video being run.\n * TODO: Investigate how to dispose the video source?\n */\n gdjs.registerRuntimeSceneUnloadedCallback(function (runtimeScene) {\n // Manually find all the gdjs.VideoRuntimeObject living on the scene,\n // and pause them.\n const instances = runtimeScene.getAdhocListOfAllInstances();\n for (let i = 0; i < instances.length; ++i) {\n const obj = instances[i];\n if (obj instanceof gdjs.VideoRuntimeObject) {\n if (obj.isPlayed()) {\n obj.pause();\n }\n }\n }\n });\n\n /**\n * When a scene is paused, pause any video being run.\n */\n gdjs.registerRuntimeScenePausedCallback(function (runtimeScene) {\n // Manually find all the gdjs.VideoRuntimeObject living on the scene,\n // and pause them.\n const instances = runtimeScene.getAdhocListOfAllInstances();\n for (let i = 0; i < instances.length; ++i) {\n const obj = instances[i];\n if (obj instanceof gdjs.VideoRuntimeObject) {\n if (obj.isPlayed()) {\n obj.pause();\n obj._pausedAsScenePaused = true;\n }\n }\n }\n });\n\n // Flag it to be started again when scene is resumed.\n\n /**\n * When a scene is resumed, resume any video previously paused.\n */\n gdjs.registerRuntimeSceneResumedCallback(function (runtimeScene) {\n // Manually find all the gdjs.VideoRuntimeObject living on the scene,\n // and play them if they have been previously paused.\n const instances = runtimeScene.getAdhocListOfAllInstances();\n for (let i = 0; i < instances.length; ++i) {\n const obj = instances[i];\n if (obj instanceof gdjs.VideoRuntimeObject) {\n if (obj._pausedAsScenePaused) {\n obj.play();\n }\n }\n }\n });\n}\n"],
|
|
5
|
-
"mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,CAwCS,eACG,GAAK,
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n /** The initial properties for {@link gdjs.VideoRuntimeObject} */\n export type VideoObjectDataType = {\n /** The base parameters of the video */\n content: {\n /** The opacity of the video */\n opacity: number;\n /** Does the video loops itself? */\n loop: boolean;\n /** The volume of the video */\n volume: number;\n /** Name of the resource corresponding to the video */\n videoResource: string;\n };\n };\n\n export type VideoObjectData = ObjectData & VideoObjectDataType;\n\n export type VideoNetworkSyncDataType = {\n op: float;\n wid: float;\n hei: float;\n // We don't sync volume, as it's probably a user setting?\n pla: boolean;\n loop: boolean;\n ct: float;\n ps: number;\n };\n\n export type VideoNetworkSyncData = ObjectNetworkSyncData &\n VideoNetworkSyncDataType;\n\n /**\n * An object displaying a video on screen.\n *\n * For the same video resource, only one video is being created in memory (\n * as a HTMLVideoElement). This means that two objects displaying the same\n * video will have the same state for this video (paused/playing, current time,\n * volume, etc...).\n */\n export class VideoRuntimeObject\n extends gdjs.RuntimeObject\n implements gdjs.OpacityHandler\n {\n _opacity: float;\n _loop: boolean;\n _volume: float;\n _videoResource: string;\n\n // Use a boolean to track if the video was paused because we\n // navigated to another scene, and so should resume if we're back.\n _pausedAsScenePaused: boolean = false;\n _renderer: gdjs.VideoRuntimeObjectRenderer;\n _playbackSpeed: any;\n\n /**\n * @param instanceContainer The scene the object belongs to.\n * @param videoObjectData The data defining the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n videoObjectData: VideoObjectData\n ) {\n super(instanceContainer, videoObjectData);\n this._opacity = videoObjectData.content.opacity;\n this._loop = videoObjectData.content.loop;\n this._volume = videoObjectData.content.volume;\n this._videoResource = videoObjectData.content.videoResource;\n this._renderer = new gdjs.VideoRuntimeObjectRenderer(\n this,\n instanceContainer\n );\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: VideoObjectData,\n newObjectData: VideoObjectData\n ): boolean {\n if (oldObjectData.content.opacity !== newObjectData.content.opacity) {\n this.setOpacity(newObjectData.content.opacity);\n }\n if (oldObjectData.content.loop !== newObjectData.content.loop) {\n this.setLoop(newObjectData.content.loop);\n }\n if (oldObjectData.content.volume !== newObjectData.content.volume) {\n this.setVolume(newObjectData.content.volume);\n }\n if (\n oldObjectData.content.videoResource !==\n newObjectData.content.videoResource\n ) {\n return false;\n }\n return true;\n }\n\n getNetworkSyncData(): VideoNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n op: this._opacity,\n wid: this.getWidth(),\n hei: this.getHeight(),\n pla: this.isPlayed(),\n loop: this.isLooped(),\n ct: this.getCurrentTime(),\n ps: this.getPlaybackSpeed(),\n };\n }\n\n updateFromNetworkSyncData(syncData: VideoNetworkSyncData): void {\n super.updateFromNetworkSyncData(syncData);\n\n if (this._opacity !== undefined && this._opacity && syncData.op) {\n this.setOpacity(syncData.op);\n }\n if (this.getWidth() !== undefined && this.getWidth() !== syncData.wid) {\n this.setWidth(syncData.wid);\n }\n if (this.getHeight() !== undefined && this.getHeight() !== syncData.hei) {\n this.setHeight(syncData.hei);\n }\n if (syncData.pla !== undefined && this.isPlayed() !== syncData.pla) {\n syncData.pla ? this.play() : this.pause();\n }\n if (syncData.loop !== undefined && this.isLooped() !== syncData.loop) {\n this.setLoop(syncData.loop);\n }\n // We don't update the current time too regularly, only if it's off by a lot.\n if (\n syncData.ct !== undefined &&\n Math.abs(this.getCurrentTime() - syncData.ct) > 3 // More than 3 seconds off\n ) {\n this.setCurrentTime(syncData.ct);\n }\n if (\n syncData.ps !== undefined &&\n this.getPlaybackSpeed() !== syncData.ps\n ) {\n this.setPlaybackSpeed(syncData.ps);\n }\n }\n\n /**\n * Initialize the extra parameters that could be set for an instance.\n * @param initialInstanceData The initial instance data\n */\n extraInitializationFromInitialInstance(initialInstanceData: InstanceData) {\n if (initialInstanceData.customSize) {\n this.setWidth(initialInstanceData.width);\n this.setHeight(initialInstanceData.height);\n }\n if (initialInstanceData.opacity !== undefined) {\n this.setOpacity(initialInstanceData.opacity);\n }\n }\n\n onDestroyed(): void {\n super.onDestroyed();\n this._renderer.onDestroy();\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n this._renderer.ensureUpToDate();\n }\n\n /**\n * Set object position on X axis.\n * @param x The new position X of the object.\n */\n setX(x: float): void {\n super.setX(x);\n this._renderer.updatePosition();\n }\n\n /**\n * Set object position on Y axis.\n * @param y The new position Y of the object.\n */\n setY(y: float): void {\n super.setY(y);\n this._renderer.updatePosition();\n }\n\n /**\n * Set the angle of the object.\n * @param angle The new angle of the object.\n */\n setAngle(angle: float): void {\n super.setAngle(angle);\n this._renderer.updateAngle();\n }\n\n /**\n * Set object opacity.\n * @param opacity The new opacity of the object (0-255).\n */\n setOpacity(opacity: float): void {\n this._opacity = opacity;\n this._renderer.updateOpacity();\n }\n\n /**\n * Get object opacity.\n * @returns The current opacity\n */\n getOpacity(): number {\n return this._opacity;\n }\n\n /**\n * Set the width of the video.\n * @param width The new width in pixels.\n */\n setWidth(width: float): void {\n if (this._renderer.getWidth() === width) return;\n\n this._renderer.setWidth(width);\n this.invalidateHitboxes();\n }\n\n /**\n * Set the height of the video.\n * @param height The new height in pixels.\n */\n setHeight(height: float): void {\n if (this._renderer.getHeight() === height) return;\n\n this._renderer.setHeight(height);\n this.invalidateHitboxes();\n }\n\n /**\n * Get the width of the video object.\n * @returns The current width of the object\n */\n getWidth(): float {\n return this._renderer.getWidth();\n }\n\n /**\n * Get the height of the video object.\n * @returns The current height of the object\n */\n getHeight(): float {\n return this._renderer.getHeight();\n }\n\n /**\n * Play the video.\n */\n play(): void {\n this._renderer.play();\n }\n\n /**\n * Pause the video.\n */\n pause(): void {\n this._renderer.pause();\n }\n\n /**\n * Set the state looped of the video.\n * @param enable true to loop the video\n */\n setLoop(enable: boolean): void {\n this._renderer.setLoop(enable);\n }\n\n /**\n * Set the state muted of the video.\n * @param enable The new state.\n */\n mute(enable: boolean) {\n this._renderer.setMute(enable);\n }\n\n /**\n * Return the state muted of video object.\n * @returns Is the video muted?\n */\n isMuted(): boolean {\n return this._renderer.isMuted();\n }\n\n /**\n * Set the volume of the video object.\n * @param volume The new volume, between 0 and 100.\n */\n setVolume(volume: number): void {\n this._volume =\n gdjs.evtTools.common.clamp(\n gdjs.evtTools.common.normalize(volume, 0, 100),\n 0,\n 1\n ) * 100;\n this._renderer.updateVolume();\n }\n\n /**\n * Get the volume of the video object.\n * @returns The current video's volume, between 0 and 100.\n */\n getVolume(): number {\n return (\n gdjs.evtTools.common.normalize(this._renderer.getVolume(), 0, 1) * 100\n );\n }\n\n /**\n * Check if the video is being played.\n * @returns Is the video being played?\n */\n isPlayed(): boolean {\n return this._renderer.isPlayed();\n }\n\n /**\n * Check if the video is paused.\n * @returns Is the video being paused?\n */\n isPaused(): boolean {\n return !this._renderer.isPlayed();\n }\n\n /**\n * Check if the video is looping.\n * @returns Is the video looping?\n */\n isLooped(): boolean {\n return this._renderer.isLooped();\n }\n\n /**\n * Return the total time of the video.\n * @returns The duration of the video\n */\n getDuration(): number {\n return this._renderer.getDuration();\n }\n\n /**\n * Check if the video has ended.\n * @returns Has the video ended?\n */\n isEnded(): boolean {\n return this._renderer.isEnded();\n }\n\n /**\n * Set the new time of the video object.\n * @param time The new time.\n */\n setCurrentTime(time: float): void {\n this._renderer.setCurrentTime(time);\n }\n\n /**\n * Get the current time of the video object.\n * @returns The current time of the video\n */\n getCurrentTime(): float {\n return this._renderer.getCurrentTime();\n }\n\n /**\n * Set the new playback speed of the video object.\n * @param playbackSpeed The new playback speed.\n */\n setPlaybackSpeed(playbackSpeed: number): void {\n this._playbackSpeed = gdjs.evtTools.common.clamp(playbackSpeed, 0.5, 2);\n this._renderer.setPlaybackSpeed(this._playbackSpeed);\n }\n\n /**\n * Get the playback speed of the video object.\n * @returns The current playback speed of the video.\n */\n getPlaybackSpeed(): number {\n return this._renderer.getPlaybackSpeed();\n }\n }\n gdjs.registerObject('Video::VideoObject', gdjs.VideoRuntimeObject);\n\n /**\n * When a scene is unloaded, pause any video being run.\n * TODO: Investigate how to dispose the video source?\n */\n gdjs.registerRuntimeSceneUnloadedCallback(function (runtimeScene) {\n // Manually find all the gdjs.VideoRuntimeObject living on the scene,\n // and pause them.\n const instances = runtimeScene.getAdhocListOfAllInstances();\n for (let i = 0; i < instances.length; ++i) {\n const obj = instances[i];\n if (obj instanceof gdjs.VideoRuntimeObject) {\n if (obj.isPlayed()) {\n obj.pause();\n }\n }\n }\n });\n\n /**\n * When a scene is paused, pause any video being run.\n */\n gdjs.registerRuntimeScenePausedCallback(function (runtimeScene) {\n // Manually find all the gdjs.VideoRuntimeObject living on the scene,\n // and pause them.\n const instances = runtimeScene.getAdhocListOfAllInstances();\n for (let i = 0; i < instances.length; ++i) {\n const obj = instances[i];\n if (obj instanceof gdjs.VideoRuntimeObject) {\n if (obj.isPlayed()) {\n obj.pause();\n obj._pausedAsScenePaused = true;\n }\n }\n }\n });\n\n // Flag it to be started again when scene is resumed.\n\n /**\n * When a scene is resumed, resume any video previously paused.\n */\n gdjs.registerRuntimeSceneResumedCallback(function (runtimeScene) {\n // Manually find all the gdjs.VideoRuntimeObject living on the scene,\n // and play them if they have been previously paused.\n const instances = runtimeScene.getAdhocListOfAllInstances();\n for (let i = 0; i < instances.length; ++i) {\n const obj = instances[i];\n if (obj instanceof gdjs.VideoRuntimeObject) {\n if (obj._pausedAsScenePaused) {\n obj.play();\n }\n }\n }\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
var gdjs;(function(d){const E=new d.Logger("InAppTutorialMessage"),r="20px",C="data:image/png;base64,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";function s(B,e,...i){const o=document.createElement(B);return Object.keys(e).forEach(l=>{if(l==="style")for(const[f,P]of Object.entries(e.style))o.style[f]=P;else l==="onClick"?o.addEventListener("click",e[l]):o.setAttribute(l,""+e[l])}),o.append(...i),o}const c={container:{position:"absolute",zIndex:"1",display:"flex"},avatarContainer:{display:"flex",boxShadow:"rgba(43, 19, 19, 0.2) 0px 2px 4px -1px, rgba(0, 0, 0, 0.14) 0px 4px 5px 0px, rgba(0, 0, 0, 0.12) 0px 1px 10px 0px",borderRadius:"30px",cursor:"pointer"},messageContainer:{position:"absolute",padding:"10px 12px",minWidth:"180px",borderRadius:"8px",backgroundColor:"rgb(250, 250, 250)",boxShadow:"rgba(43, 19, 19, 0.2) 0px 2px 4px -1px, rgba(0, 0, 0, 0.14) 0px 4px 5px 0px, rgba(0, 0, 0, 0.12) 0px 1px 10px 0px",fontFamily:"'Fira Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, 'Helvetica Neue', Helvetica, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",fontSize:"14px",lineHeight:"20px",letterSpacing:"0.01em",color:"rgb(73, 73, 82)"}};let w;(function(Q){const B="in-app-tutorial-container";let e=null,i=null,o=!1;const l=async()=>{if(o)return;(await Promise.all([new FontFace("Fira Sans","url(https://fonts.gstatic.com/s/firasans/v17/va9E4kDNxMZdWfMOD5Vvl4jLazX3dA.woff2) format('woff2')",{variant:"normal",weight:"normal",unicodeRange:"U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD",display:"swap"}).load(),new FontFace("Fira Sans","url(https://fonts.gstatic.com/s/firasans/v17/va9B4kDNxMZdWfMOD5VnLK3eRhf6Xl7Glw.woff2) format('woff2')",{variant:"normal",weight:"bold",unicodeRange:"U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD",display:"swap"}).load()])).forEach(A=>{document.fonts.add(A)}),o=!0},f=()=>{i||(i=document.createElement("style"),i.textContent=`
|
|
2
|
+
#${B} p {
|
|
3
|
+
margin-block: 0; /* To remove any browser built-in style */
|
|
4
|
+
}
|
|
5
|
+
`,document.head.appendChild(i))},P=a=>{const A=a.getRenderer().getDomElementContainer();return A||(E.error("No DOM element container found."),null)},p=a=>{const A=a.toLowerCase().includes("right")?"right":"left",g=a.toLowerCase().includes("top")?"top":a.toLowerCase().includes("middle")?"middle":"bottom",t={},n={};return A==="left"?(t.left=r,n.left=g==="top"?"calc(100% + 10px)":"0px"):(t.right=r,n.right=g==="top"?"calc(100% + 10px)":"0px"),g==="top"?(t.top=r,n.top="0px"):g==="middle"?(t.top="50%",n.transform="translateY(calc(-100% - 10px))"):(t.bottom=r,n.transform="translateY(calc(-100% - 10px))"),{containerPositionStyle:t,messageContainerPositionStyle:n}};Q.displayInAppTutorialMessage=(a,A,g)=>{const t=P(a);if(!t||e&&(t.removeChild(e),e=null,!A))return;const n=document.createElement("div");n.innerHTML=nmd(A);const{containerPositionStyle:x,messageContainerPositionStyle:u}=p(g);l(),f(),e=s("div",{id:B,style:{...c.container,...x}},s("div",{style:c.avatarContainer},s("div",{style:{...c.messageContainer,...u}},n),s("img",{width:60,height:60,alt:"GDevelop mascot red hero",src:C}))),t.appendChild(e)}})(w=d.inAppTutorialMessage||(d.inAppTutorialMessage={}))})(gdjs||(gdjs={}));
|
|
6
|
+
//# sourceMappingURL=InAppTutorialMessage.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../GDevelop/GDJS/Runtime/InAppTutorialMessage.tsx"],
|
|
4
|
+
"sourcesContent": ["/*\n * GDevelop JS Platform\n * Copyright 2013-2025 Florian Rival (Florian.Rival@gmail.com). All rights reserved.\n * This project is released under the MIT License.\n */\nnamespace gdjs {\n declare var nmd: any;\n const logger = new gdjs.Logger('InAppTutorialMessage');\n const padding = '20px';\n const redHeroImage =\n 'data:image/png;base64,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';\n\n /** A minimal utility to define DOM elements. */\n function h<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: {\n style?: Partial<CSSStyleDeclaration>;\n onClick?: () => void;\n },\n ...nodes: (HTMLElement | string)[]\n ): HTMLElement {\n const node = document.createElement(tag);\n Object.keys(attrs).forEach((key) => {\n if (key === 'style') {\n for (const [styleName, value] of Object.entries(attrs.style!)) {\n node.style[styleName] = value;\n }\n } else if (key === 'onClick') {\n node.addEventListener('click', attrs[key]!);\n } else {\n node.setAttribute(key, '' + attrs[key]);\n }\n });\n\n node.append(...nodes);\n return node;\n }\n\n const styles = {\n container: {\n position: 'absolute',\n zIndex: '1',\n display: 'flex',\n },\n avatarContainer: {\n display: 'flex',\n boxShadow:\n 'rgba(43, 19, 19, 0.2) 0px 2px 4px -1px, rgba(0, 0, 0, 0.14) 0px 4px 5px 0px, rgba(0, 0, 0, 0.12) 0px 1px 10px 0px',\n borderRadius: '30px',\n cursor: 'pointer',\n },\n messageContainer: {\n position: 'absolute',\n padding: '10px 12px',\n minWidth: '180px',\n borderRadius: '8px',\n backgroundColor: 'rgb(250, 250, 250)',\n boxShadow:\n 'rgba(43, 19, 19, 0.2) 0px 2px 4px -1px, rgba(0, 0, 0, 0.14) 0px 4px 5px 0px, rgba(0, 0, 0, 0.12) 0px 1px 10px 0px',\n fontFamily:\n \"'Fira Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, 'Helvetica Neue', Helvetica, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'\",\n fontSize: '14px',\n lineHeight: '20px',\n letterSpacing: '0.01em',\n color: 'rgb(73, 73, 82)',\n },\n };\n\n type AbsolutePositionStyle = {\n top?: string;\n bottom?: string;\n left?: string;\n right?: string;\n transform?: string;\n };\n\n export namespace inAppTutorialMessage {\n const containerId = 'in-app-tutorial-container';\n\n let _container: HTMLElement | null = null;\n let _styleSheet: HTMLStyleElement | null = null;\n let _areFontsLoaded = false;\n\n const _loadFonts = async () => {\n if (_areFontsLoaded) return;\n\n const fontFaces = await Promise.all([\n new FontFace(\n 'Fira Sans',\n \"url(https://fonts.gstatic.com/s/firasans/v17/va9E4kDNxMZdWfMOD5Vvl4jLazX3dA.woff2) format('woff2')\",\n {\n variant: 'normal',\n weight: 'normal',\n unicodeRange:\n 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n display: 'swap',\n }\n ).load(),\n new FontFace(\n 'Fira Sans',\n \"url(https://fonts.gstatic.com/s/firasans/v17/va9B4kDNxMZdWfMOD5VnLK3eRhf6Xl7Glw.woff2) format('woff2')\",\n {\n variant: 'normal',\n weight: 'bold',\n unicodeRange:\n 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n display: 'swap',\n }\n ).load(),\n ]);\n fontFaces.forEach((fontFace) => {\n document.fonts.add(fontFace);\n });\n _areFontsLoaded = true;\n };\n\n const _loadStyleSheet = () => {\n if (_styleSheet) return;\n\n _styleSheet = document.createElement('style');\n _styleSheet.textContent = `\n #${containerId} p {\n margin-block: 0; /* To remove any browser built-in style */\n }\n `;\n document.head.appendChild(_styleSheet);\n };\n\n const getDomElementContainer = (\n runtimeGame: gdjs.RuntimeGame\n ): HTMLDivElement | null => {\n // Find the DOM element container.\n const domElementContainer = runtimeGame\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n logger.error('No DOM element container found.');\n return null;\n }\n return domElementContainer;\n };\n\n const _getPositioningStyle = (position: string) => {\n const leftOrRight = position.toLowerCase().includes('right')\n ? 'right'\n : 'left';\n const topOrMiddleOrBottom = position.toLowerCase().includes('top')\n ? 'top'\n : position.toLowerCase().includes('middle')\n ? 'middle'\n : 'bottom';\n\n const containerPositionStyle: AbsolutePositionStyle = {};\n const messageContainerPositionStyle: AbsolutePositionStyle = {};\n\n if (leftOrRight === 'left') {\n containerPositionStyle.left = padding;\n messageContainerPositionStyle.left =\n topOrMiddleOrBottom === 'top' ? 'calc(100% + 10px)' : '0px';\n } else {\n containerPositionStyle.right = padding;\n messageContainerPositionStyle.right =\n topOrMiddleOrBottom === 'top' ? 'calc(100% + 10px)' : '0px';\n }\n if (topOrMiddleOrBottom === 'top') {\n containerPositionStyle.top = padding;\n messageContainerPositionStyle.top = '0px';\n } else if (topOrMiddleOrBottom === 'middle') {\n containerPositionStyle.top = '50%';\n messageContainerPositionStyle.transform =\n 'translateY(calc(-100% - 10px))';\n } else {\n containerPositionStyle.bottom = padding;\n messageContainerPositionStyle.transform =\n 'translateY(calc(-100% - 10px))';\n }\n return { containerPositionStyle, messageContainerPositionStyle };\n };\n\n export const displayInAppTutorialMessage = (\n runtimeGame: gdjs.RuntimeGame,\n /**\n * When undefined, removes the current message.\n */\n message: string | undefined,\n position: string\n ) => {\n const domElementContainer = getDomElementContainer(runtimeGame);\n if (!domElementContainer) {\n return;\n }\n\n if (_container) {\n domElementContainer.removeChild(_container);\n _container = null;\n if (!message) return;\n }\n\n const messageContent = document.createElement('div');\n messageContent.innerHTML = nmd(message);\n\n const {\n containerPositionStyle,\n messageContainerPositionStyle,\n } = _getPositioningStyle(position);\n\n _loadFonts();\n _loadStyleSheet();\n _container = (\n <div\n id={containerId}\n style={{ ...styles.container, ...containerPositionStyle }}\n >\n <div style={styles.avatarContainer}>\n <div\n style={{\n ...styles.messageContainer,\n ...messageContainerPositionStyle,\n }}\n >\n {messageContent}\n </div>\n <img\n width={60}\n height={60}\n alt=\"GDevelop mascot red hero\"\n src={redHeroImage}\n />\n </div>\n </div>\n );\n // @ts-ignore - TS doesn't acknowledge the assignation above that excludes\n // the possibility that _container can be null.\n domElementContainer.appendChild(_container);\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "AAKA,GAAU,MAAV,UAAU,EAAV,CAEE,KAAM,GAAS,GAAI,GAAK,OAAO,wBACzB,EAAU,OACV,EACJ,yrgBAGF,WACE,EACA,KAIG,EACU,CACb,KAAM,GAAO,SAAS,cAAc,GACpC,cAAO,KAAK,GAAO,QAAQ,AAAC,GAAQ,CAClC,GAAI,IAAQ,QACV,SAAW,CAAC,EAAW,IAAU,QAAO,QAAQ,EAAM,OACpD,EAAK,MAAM,GAAa,MAErB,AAAI,KAAQ,UACjB,EAAK,iBAAiB,QAAS,EAAM,IAErC,EAAK,aAAa,EAAK,GAAK,EAAM,MAItC,EAAK,OAAO,GAAG,GACR,EAGT,KAAM,GAAS,CACb,UAAW,CACT,SAAU,WACV,OAAQ,IACR,QAAS,QAEX,gBAAiB,CACf,QAAS,OACT,UACE,oHACF,aAAc,OACd,OAAQ,WAEV,iBAAkB,CAChB,SAAU,WACV,QAAS,YACT,SAAU,QACV,aAAc,MACd,gBAAiB,qBACjB,UACE,oHACF,WACE,6LACF,SAAU,OACV,WAAY,OACZ,cAAe,SACf,MAAO,oBAYJ,GAAU,GAAV,UAAU,EAAV,CACL,KAAM,GAAc,4BAEpB,GAAI,GAAiC,KACjC,EAAuC,KACvC,EAAkB,GAEtB,KAAM,GAAa,SAAY,CAC7B,GAAI,EAAiB,OA0BrB,AAxBkB,MAAM,SAAQ,IAAI,CAClC,GAAI,UACF,YACA,qGACA,CACE,QAAS,SACT,OAAQ,SACR,aACE,6KACF,QAAS,SAEX,OACF,GAAI,UACF,YACA,yGACA,CACE,QAAS,SACT,OAAQ,OACR,aACE,6KACF,QAAS,SAEX,UAEM,QAAQ,AAAC,GAAa,CAC9B,SAAS,MAAM,IAAI,KAErB,EAAkB,IAGd,EAAkB,IAAM,CAC5B,AAAI,GAEJ,GAAc,SAAS,cAAc,SACrC,EAAY,YAAc;AAAA,WACrB;AAAA;AAAA;AAAA,QAIL,SAAS,KAAK,YAAY,KAGtB,EAAyB,AAC7B,GAC0B,CAE1B,KAAM,GAAsB,EACzB,cACA,yBACH,MAAK,IACH,GAAO,MAAM,mCACN,OAKL,EAAuB,AAAC,GAAqB,CACjD,KAAM,GAAc,EAAS,cAAc,SAAS,SAChD,QACA,OACE,EAAsB,EAAS,cAAc,SAAS,OACxD,MACA,EAAS,cAAc,SAAS,UAChC,SACA,SAEE,EAAgD,GAChD,EAAuD,GAE7D,MAAI,KAAgB,OAClB,GAAuB,KAAO,EAC9B,EAA8B,KAC5B,IAAwB,MAAQ,oBAAsB,OAExD,GAAuB,MAAQ,EAC/B,EAA8B,MAC5B,IAAwB,MAAQ,oBAAsB,OAE1D,AAAI,IAAwB,MAC1B,GAAuB,IAAM,EAC7B,EAA8B,IAAM,OAC/B,AAAI,IAAwB,SACjC,GAAuB,IAAM,MAC7B,EAA8B,UAC5B,kCAEF,GAAuB,OAAS,EAChC,EAA8B,UAC5B,kCAEG,CAAE,yBAAwB,kCAG5B,AAAM,8BAA8B,CACzC,EAIA,EACA,IACG,CACH,KAAM,GAAsB,EAAuB,GAKnD,GAJI,CAAC,GAID,GACF,GAAoB,YAAY,GAChC,EAAa,KACT,CAAC,GAAS,OAGhB,KAAM,GAAiB,SAAS,cAAc,OAC9C,EAAe,UAAY,IAAI,GAE/B,KAAM,CACJ,yBACA,iCACE,EAAqB,GAEzB,IACA,IACA,EACE,EAAC,MAAD,CACE,GAAI,EACJ,MAAO,IAAK,EAAO,aAAc,IAEjC,EAAC,MAAD,CAAK,MAAO,EAAO,iBACjB,EAAC,MAAD,CACE,MAAO,IACF,EAAO,oBACP,IAGJ,GAEH,EAAC,MAAD,CACE,MAAO,GACP,OAAQ,GACR,IAAI,2BACJ,IAAK,MAOb,EAAoB,YAAY,MA7JnB,yDAvET",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|