mirror of
https://github.com/4ian/GDevelop.git
synced 2026-10-12 02:01:17 +00:00
Fix memory leak leading to a crash in the editor when having a BB Text in the scene.
* Also fix similar smaller memory leak when using other features. Don't show the rest in changelog: This avoids calling new gd.PropertyDescriptor every time properties of an object/behavior are accessed, which would result in these gd.PropertyDescriptor to be never destroyed. This would fill up the memory, especially quickly with the BB Text object as properties are queried to render the instances on screen. "getOrCreate" is now exposed for the map of properties, which is cleaner and memory leak free.
This commit is contained in:
@@ -20,7 +20,10 @@ import { type ObjectsRenderingService, type ObjectsEditorService } from '../JsEx
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
createExtension: function(_/*: (string) => string */, gd/*: libGDevelop */) {
|
||||
createExtension: function (
|
||||
_ /*: (string) => string */,
|
||||
gd /*: libGDevelop */
|
||||
) {
|
||||
const extension = new gd.PlatformExtension();
|
||||
extension
|
||||
.setExtensionInformation(
|
||||
@@ -36,7 +39,7 @@ module.exports = {
|
||||
|
||||
var objectBBText = new gd.ObjectJsImplementation();
|
||||
// $FlowExpectedError
|
||||
objectBBText.updateProperty = function(
|
||||
objectBBText.updateProperty = function (
|
||||
objectContent,
|
||||
propertyName,
|
||||
newValue
|
||||
@@ -53,68 +56,60 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError
|
||||
objectBBText.getProperties = function(objectContent) {
|
||||
var objectProperties = new gd.MapStringPropertyDescriptor();
|
||||
objectBBText.getProperties = function (objectContent) {
|
||||
const objectProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
objectProperties.set(
|
||||
'text',
|
||||
new gd.PropertyDescriptor(objectContent.text)
|
||||
.setType('textarea')
|
||||
.setLabel(_('BBCode text'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('text')
|
||||
.setValue(objectContent.text)
|
||||
.setType('textarea')
|
||||
.setLabel(_('BBCode text'));
|
||||
|
||||
objectProperties.set(
|
||||
'color',
|
||||
new gd.PropertyDescriptor(objectContent.color)
|
||||
.setType('color')
|
||||
.setLabel(_('Base color'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('color')
|
||||
.setValue(objectContent.color)
|
||||
.setType('color')
|
||||
.setLabel(_('Base color'));
|
||||
|
||||
objectProperties.set(
|
||||
'opacity',
|
||||
new gd.PropertyDescriptor(objectContent.opacity.toString())
|
||||
.setType('number')
|
||||
.setLabel(_('Opacity (0-255)'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('opacity')
|
||||
.setValue(objectContent.opacity.toString())
|
||||
.setType('number')
|
||||
.setLabel(_('Opacity (0-255)'));
|
||||
|
||||
objectProperties.set(
|
||||
'fontSize',
|
||||
new gd.PropertyDescriptor(objectContent.fontSize.toString())
|
||||
.setType('number')
|
||||
.setLabel(_('Base size'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('fontSize')
|
||||
.setValue(objectContent.fontSize.toString())
|
||||
.setType('number')
|
||||
.setLabel(_('Base size'));
|
||||
|
||||
objectProperties.set(
|
||||
'align',
|
||||
new gd.PropertyDescriptor(objectContent.align)
|
||||
.setType('choice')
|
||||
.addExtraInfo('left')
|
||||
.addExtraInfo('center')
|
||||
.addExtraInfo('right')
|
||||
.setLabel(_('Base alignment'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('align')
|
||||
.setValue(objectContent.align)
|
||||
.setType('choice')
|
||||
.addExtraInfo('left')
|
||||
.addExtraInfo('center')
|
||||
.addExtraInfo('right')
|
||||
.setLabel(_('Base alignment'));
|
||||
|
||||
objectProperties.set(
|
||||
'fontFamily',
|
||||
new gd.PropertyDescriptor(objectContent.fontFamily)
|
||||
.setType('resource')
|
||||
.addExtraInfo('font')
|
||||
.setLabel(_('Base font family'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('fontFamily')
|
||||
.setValue(objectContent.fontFamily)
|
||||
.setType('resource')
|
||||
.addExtraInfo('font')
|
||||
.setLabel(_('Base font family'));
|
||||
|
||||
objectProperties.set(
|
||||
'wordWrap',
|
||||
new gd.PropertyDescriptor(objectContent.wordWrap ? 'true' : 'false')
|
||||
.setType('boolean')
|
||||
.setLabel(_('Word wrapping'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('wordWrap')
|
||||
.setValue(objectContent.wordWrap ? 'true' : 'false')
|
||||
.setType('boolean')
|
||||
.setLabel(_('Word wrapping'));
|
||||
|
||||
objectProperties.set(
|
||||
'visible',
|
||||
new gd.PropertyDescriptor(objectContent.visible ? 'true' : 'false')
|
||||
.setType('boolean')
|
||||
.setLabel(_('Visible on start'))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('visible')
|
||||
.setValue(objectContent.visible ? 'true' : 'false')
|
||||
.setType('boolean')
|
||||
.setLabel(_('Visible on start'));
|
||||
|
||||
return objectProperties;
|
||||
};
|
||||
@@ -133,7 +128,7 @@ module.exports = {
|
||||
);
|
||||
|
||||
// $FlowExpectedError
|
||||
objectBBText.updateInitialInstanceProperty = function(
|
||||
objectBBText.updateInitialInstanceProperty = function (
|
||||
objectContent,
|
||||
instance,
|
||||
propertyName,
|
||||
@@ -144,7 +139,7 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError
|
||||
objectBBText.getInitialInstanceProperties = function(
|
||||
objectBBText.getInitialInstanceProperties = function (
|
||||
content,
|
||||
instance,
|
||||
project,
|
||||
@@ -175,7 +170,7 @@ module.exports = {
|
||||
* Useful for setting multiple generic properties.
|
||||
*/
|
||||
const addSettersAndGettersToObject = (gdObject, properties, objectName) => {
|
||||
properties.forEach(property => {
|
||||
properties.forEach((property) => {
|
||||
const parameterType =
|
||||
property.type === 'boolean' ? 'yesorno' : property.type;
|
||||
|
||||
@@ -407,7 +402,10 @@ module.exports = {
|
||||
* But it is recommended to create tests for the behaviors/objects properties you created
|
||||
* to avoid mistakes.
|
||||
*/
|
||||
runExtensionSanityTests: function(gd /*: libGDevelop */, extension /*: gdPlatformExtension*/) {
|
||||
runExtensionSanityTests: function (
|
||||
gd /*: libGDevelop */,
|
||||
extension /*: gdPlatformExtension*/
|
||||
) {
|
||||
return [];
|
||||
},
|
||||
/**
|
||||
@@ -415,7 +413,9 @@ module.exports = {
|
||||
*
|
||||
* ℹ️ Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
|
||||
*/
|
||||
registerEditorConfigurations: function(objectsEditorService /*: ObjectsEditorService */) {
|
||||
registerEditorConfigurations: function (
|
||||
objectsEditorService /*: ObjectsEditorService */
|
||||
) {
|
||||
objectsEditorService.registerEditorConfiguration(
|
||||
'BBText::BBText',
|
||||
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor({
|
||||
@@ -428,7 +428,9 @@ module.exports = {
|
||||
*
|
||||
* ℹ️ Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
|
||||
*/
|
||||
registerInstanceRenderers: function(objectsRenderingService /*: ObjectsRenderingService */) {
|
||||
registerInstanceRenderers: function (
|
||||
objectsRenderingService /*: ObjectsRenderingService */
|
||||
) {
|
||||
const RenderedInstance = objectsRenderingService.RenderedInstance;
|
||||
const PIXI = objectsRenderingService.PIXI;
|
||||
const MultiStyleText = objectsRenderingService.requireModule(
|
||||
@@ -487,7 +489,7 @@ module.exports = {
|
||||
/**
|
||||
* Return the path to the thumbnail of the specified object.
|
||||
*/
|
||||
RenderedBBTextInstance.getThumbnail = function(
|
||||
RenderedBBTextInstance.getThumbnail = function (
|
||||
project,
|
||||
resourcesLoader,
|
||||
object
|
||||
@@ -498,7 +500,7 @@ module.exports = {
|
||||
/**
|
||||
* This is called to update the PIXI object on the scene editor
|
||||
*/
|
||||
RenderedBBTextInstance.prototype.update = function() {
|
||||
RenderedBBTextInstance.prototype.update = function () {
|
||||
const rawText = this._associatedObject
|
||||
.getProperties(this.project)
|
||||
.get('text')
|
||||
@@ -535,11 +537,11 @@ module.exports = {
|
||||
|
||||
this._pixiResourcesLoader
|
||||
.loadFontFamily(this._project, fontResourceName)
|
||||
.then(fontFamily => {
|
||||
.then((fontFamily) => {
|
||||
// Once the font is loaded, we can use the given fontFamily.
|
||||
this._pixiObject.textStyles.default.fontFamily = fontFamily;
|
||||
})
|
||||
.catch(err => {
|
||||
.catch((err) => {
|
||||
// Ignore errors
|
||||
console.warn('Unable to load font family', err);
|
||||
});
|
||||
@@ -586,14 +588,14 @@ module.exports = {
|
||||
/**
|
||||
* Return the width of the instance, when it's not resized.
|
||||
*/
|
||||
RenderedBBTextInstance.prototype.getDefaultWidth = function() {
|
||||
RenderedBBTextInstance.prototype.getDefaultWidth = function () {
|
||||
return this._pixiObject.width;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the height of the instance, when it's not resized.
|
||||
*/
|
||||
RenderedBBTextInstance.prototype.getDefaultHeight = function() {
|
||||
RenderedBBTextInstance.prototype.getDefaultHeight = function () {
|
||||
return this._pixiObject.height;
|
||||
};
|
||||
|
||||
|
||||
+785
-926
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,10 @@ import { type ObjectsRenderingService, type ObjectsEditorService } from '../JsEx
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
createExtension: function(_/*: (string) => string */, gd/*: libGDevelop */) {
|
||||
createExtension: function (
|
||||
_ /*: (string) => string */,
|
||||
gd /*: libGDevelop */
|
||||
) {
|
||||
const extension = new gd.PlatformExtension();
|
||||
extension.setExtensionInformation(
|
||||
'MyDummyExtension',
|
||||
@@ -31,7 +34,7 @@ module.exports = {
|
||||
);
|
||||
|
||||
// Declare effects:
|
||||
const dumyEffect = extension
|
||||
const dummyEffect = extension
|
||||
.addEffect('DummyEffect')
|
||||
.setFullName(_('Dummy effect example'))
|
||||
.setDescription(
|
||||
@@ -40,37 +43,33 @@ module.exports = {
|
||||
)
|
||||
)
|
||||
.addIncludeFile('Extensions/ExampleJsExtension/dummyeffect.js');
|
||||
const dumyEffectProperties = dumyEffect.getProperties();
|
||||
dumyEffectProperties.set(
|
||||
'opacity',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '1')
|
||||
.setLabel(_('Opacity of the effect (between 0 and 1)'))
|
||||
.setType('number')
|
||||
.setDescription(_('This is an optional description.'))
|
||||
);
|
||||
dumyEffectProperties.set(
|
||||
'someImage',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '')
|
||||
.setLabel(
|
||||
_("Image resource (won't be used, just for demonstration purpose)")
|
||||
)
|
||||
.setType('resource')
|
||||
.addExtraInfo('image')
|
||||
);
|
||||
dumyEffectProperties.set(
|
||||
'someColor',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '#0022FF')
|
||||
.setLabel(_("Color (won't be used, just for demonstration purpose)"))
|
||||
.setType('color')
|
||||
.setDescription(_('Another optional description.'))
|
||||
);
|
||||
dumyEffectProperties.set(
|
||||
'someBoolean',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ 'true')
|
||||
.setLabel(_('Some setting to enable or not for the effect'))
|
||||
.setType('boolean')
|
||||
.setDescription(_('And some *optional* description.'))
|
||||
);
|
||||
const dummyEffectProperties = dummyEffect.getProperties();
|
||||
dummyEffectProperties
|
||||
.getOrCreate('opacity')
|
||||
.setValue('1')
|
||||
.setLabel(_('Opacity of the effect (between 0 and 1)'))
|
||||
.setType('number')
|
||||
.setDescription(_('This is an optional description.'));
|
||||
dummyEffectProperties
|
||||
.getOrCreate('someImage')
|
||||
.setValue('')
|
||||
.setLabel(
|
||||
_("Image resource (won't be used, just for demonstration purpose)")
|
||||
)
|
||||
.setType('resource')
|
||||
.addExtraInfo('image');
|
||||
dummyEffectProperties
|
||||
.getOrCreate('someColor')
|
||||
.setValue('#0022FF')
|
||||
.setLabel(_("Color (won't be used, just for demonstration purpose)"))
|
||||
.setType('color')
|
||||
.setDescription(_('Another optional description.'));
|
||||
dummyEffectProperties
|
||||
.getOrCreate('someBoolean')
|
||||
.setValue('true')
|
||||
.setLabel(_('Some setting to enable or not for the effect'))
|
||||
.setType('boolean')
|
||||
.setDescription(_('And some *optional* description.'));
|
||||
|
||||
// Declare conditions, actions or expressions:
|
||||
extension
|
||||
@@ -126,7 +125,7 @@ module.exports = {
|
||||
// saved/loaded to JSON.
|
||||
var dummyBehavior = new gd.BehaviorJsImplementation();
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
dummyBehavior.updateProperty = function(
|
||||
dummyBehavior.updateProperty = function (
|
||||
behaviorContent,
|
||||
propertyName,
|
||||
newValue
|
||||
@@ -143,26 +142,23 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
dummyBehavior.getProperties = function(behaviorContent) {
|
||||
dummyBehavior.getProperties = function (behaviorContent) {
|
||||
var behaviorProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
behaviorProperties.set(
|
||||
'My first property',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getStringAttribute('property1')
|
||||
)
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'My other property',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorProperties
|
||||
.getOrCreate('My first property')
|
||||
.setValue(behaviorContent.getStringAttribute('property1'));
|
||||
behaviorProperties
|
||||
.getOrCreate('My other property')
|
||||
.setValue(
|
||||
behaviorContent.getBoolAttribute('property2') ? 'true' : 'false'
|
||||
).setType('Boolean')
|
||||
);
|
||||
)
|
||||
.setType('Boolean');
|
||||
|
||||
return behaviorProperties;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
dummyBehavior.initializeContent = function(behaviorContent) {
|
||||
dummyBehavior.initializeContent = function (behaviorContent) {
|
||||
behaviorContent.setStringAttribute('property1', 'Initial value 1');
|
||||
behaviorContent.setBoolAttribute('property2', true);
|
||||
};
|
||||
@@ -190,7 +186,7 @@ module.exports = {
|
||||
// that are called to get and set the properties of the shared data.
|
||||
var dummyBehaviorWithSharedData = new gd.BehaviorJsImplementation();
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
dummyBehaviorWithSharedData.updateProperty = function(
|
||||
dummyBehaviorWithSharedData.updateProperty = function (
|
||||
behaviorContent,
|
||||
propertyName,
|
||||
newValue
|
||||
@@ -203,26 +199,23 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
dummyBehaviorWithSharedData.getProperties = function(behaviorContent) {
|
||||
dummyBehaviorWithSharedData.getProperties = function (behaviorContent) {
|
||||
var behaviorProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
behaviorProperties.set(
|
||||
'My behavior property',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getStringAttribute('property1')
|
||||
)
|
||||
);
|
||||
behaviorProperties
|
||||
.getOrCreate('My behavior property')
|
||||
.setValue(behaviorContent.getStringAttribute('property1'));
|
||||
|
||||
return behaviorProperties;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
dummyBehaviorWithSharedData.initializeContent = function(behaviorContent) {
|
||||
dummyBehaviorWithSharedData.initializeContent = function (behaviorContent) {
|
||||
behaviorContent.setStringAttribute('property1', 'Initial value 1');
|
||||
};
|
||||
|
||||
var sharedData = new gd.BehaviorSharedDataJsImplementation();
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
sharedData.updateProperty = function(
|
||||
sharedData.updateProperty = function (
|
||||
sharedContent,
|
||||
propertyName,
|
||||
newValue
|
||||
@@ -235,20 +228,17 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
sharedData.getProperties = function(sharedContent) {
|
||||
sharedData.getProperties = function (sharedContent) {
|
||||
var sharedProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
sharedProperties.set(
|
||||
'My shared property',
|
||||
new gd.PropertyDescriptor(
|
||||
sharedContent.getStringAttribute('sharedProperty1')
|
||||
)
|
||||
);
|
||||
sharedProperties
|
||||
.getOrCreate('My shared property')
|
||||
.setValue(sharedContent.getStringAttribute('sharedProperty1'));
|
||||
|
||||
return sharedProperties;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
sharedData.initializeContent = function(behaviorContent) {
|
||||
sharedData.initializeContent = function (behaviorContent) {
|
||||
behaviorContent.setStringAttribute(
|
||||
'sharedProperty1',
|
||||
'Initial shared value 1'
|
||||
@@ -283,7 +273,7 @@ module.exports = {
|
||||
// saved/loaded to JSON.
|
||||
var dummyObject = new gd.ObjectJsImplementation();
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
dummyObject.updateProperty = function(
|
||||
dummyObject.updateProperty = function (
|
||||
objectContent,
|
||||
propertyName,
|
||||
newValue
|
||||
@@ -308,34 +298,28 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
dummyObject.getProperties = function(objectContent) {
|
||||
dummyObject.getProperties = function (objectContent) {
|
||||
var objectProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
objectProperties.set(
|
||||
'My first property',
|
||||
new gd.PropertyDescriptor(objectContent.property1)
|
||||
);
|
||||
objectProperties.set(
|
||||
'My other property',
|
||||
new gd.PropertyDescriptor(
|
||||
objectContent.property2 ? 'true' : 'false'
|
||||
).setType('boolean')
|
||||
);
|
||||
objectProperties.set(
|
||||
'My third property',
|
||||
new gd.PropertyDescriptor(objectContent.property3.toString()).setType(
|
||||
'number'
|
||||
)
|
||||
);
|
||||
objectProperties.set(
|
||||
'myImage',
|
||||
new gd.PropertyDescriptor(objectContent.myImage)
|
||||
.setType('resource')
|
||||
.addExtraInfo('image')
|
||||
.setLabel(
|
||||
_("Image resource (won't be shown, just for demonstration purpose)")
|
||||
)
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('My first property')
|
||||
.setValue(objectContent.property1);
|
||||
objectProperties
|
||||
.getOrCreate('My other property')
|
||||
.setValue(objectContent.property2 ? 'true' : 'false')
|
||||
.setType('boolean');
|
||||
objectProperties
|
||||
.getOrCreate('My third property')
|
||||
.setValue(objectContent.property3.toString())
|
||||
.setType('number');
|
||||
objectProperties
|
||||
.getOrCreate('myImage')
|
||||
.setValue(objectContent.myImage)
|
||||
.setType('resource')
|
||||
.addExtraInfo('image')
|
||||
.setLabel(
|
||||
_("Image resource (won't be shown, just for demonstration purpose)")
|
||||
);
|
||||
|
||||
return objectProperties;
|
||||
};
|
||||
@@ -349,7 +333,7 @@ module.exports = {
|
||||
);
|
||||
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
dummyObject.updateInitialInstanceProperty = function(
|
||||
dummyObject.updateInitialInstanceProperty = function (
|
||||
objectContent,
|
||||
instance,
|
||||
propertyName,
|
||||
@@ -369,7 +353,7 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
dummyObject.getInitialInstanceProperties = function(
|
||||
dummyObject.getInitialInstanceProperties = function (
|
||||
content,
|
||||
instance,
|
||||
project,
|
||||
@@ -377,18 +361,13 @@ module.exports = {
|
||||
) {
|
||||
var instanceProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
instanceProperties.set(
|
||||
'My instance property',
|
||||
new gd.PropertyDescriptor(
|
||||
instance.getRawStringProperty('instanceprop1')
|
||||
)
|
||||
);
|
||||
instanceProperties.set(
|
||||
'My other instance property',
|
||||
new gd.PropertyDescriptor(
|
||||
instance.getRawFloatProperty('instanceprop2').toString()
|
||||
).setType('number')
|
||||
);
|
||||
instanceProperties
|
||||
.getOrCreate('My instance property')
|
||||
.setValue(instance.getRawStringProperty('instanceprop1'));
|
||||
instanceProperties
|
||||
.getOrCreate('My other instance property')
|
||||
.setValue(instance.getRawFloatProperty('instanceprop2').toString())
|
||||
.setType('number');
|
||||
|
||||
return instanceProperties;
|
||||
};
|
||||
@@ -436,7 +415,10 @@ module.exports = {
|
||||
* But it is recommended to create tests for the behaviors/objects properties you created
|
||||
* to avoid mistakes.
|
||||
*/
|
||||
runExtensionSanityTests: function(gd /*: libGDevelop */, extension /*: gdPlatformExtension*/) {
|
||||
runExtensionSanityTests: function (
|
||||
gd /*: libGDevelop */,
|
||||
extension /*: gdPlatformExtension*/
|
||||
) {
|
||||
const dummyBehavior = extension
|
||||
.getBehaviorMetadata('MyDummyExtension::DummyBehavior')
|
||||
.get();
|
||||
@@ -461,7 +443,9 @@ module.exports = {
|
||||
*
|
||||
* ℹ️ Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
|
||||
*/
|
||||
registerEditorConfigurations: function(objectsEditorService /*: ObjectsEditorService */) {
|
||||
registerEditorConfigurations: function (
|
||||
objectsEditorService /*: ObjectsEditorService */
|
||||
) {
|
||||
objectsEditorService.registerEditorConfiguration(
|
||||
'MyDummyExtension::DummyObject',
|
||||
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor({
|
||||
@@ -474,7 +458,9 @@ module.exports = {
|
||||
*
|
||||
* ℹ️ Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
|
||||
*/
|
||||
registerInstanceRenderers: function(objectsRenderingService /*: ObjectsRenderingService */) {
|
||||
registerInstanceRenderers: function (
|
||||
objectsRenderingService /*: ObjectsRenderingService */
|
||||
) {
|
||||
const RenderedInstance = objectsRenderingService.RenderedInstance;
|
||||
const PIXI = objectsRenderingService.PIXI;
|
||||
|
||||
@@ -519,7 +505,7 @@ module.exports = {
|
||||
/**
|
||||
* Return the path to the thumbnail of the specified object.
|
||||
*/
|
||||
RenderedDummyObjectInstance.getThumbnail = function(
|
||||
RenderedDummyObjectInstance.getThumbnail = function (
|
||||
project,
|
||||
resourcesLoader,
|
||||
object
|
||||
@@ -530,7 +516,7 @@ module.exports = {
|
||||
/**
|
||||
* This is called to update the PIXI object on the scene editor
|
||||
*/
|
||||
RenderedDummyObjectInstance.prototype.update = function() {
|
||||
RenderedDummyObjectInstance.prototype.update = function () {
|
||||
// Read a property from the object
|
||||
const property1Value = this._associatedObject
|
||||
.getProperties(this.project)
|
||||
@@ -553,14 +539,14 @@ module.exports = {
|
||||
/**
|
||||
* Return the width of the instance, when it's not resized.
|
||||
*/
|
||||
RenderedDummyObjectInstance.prototype.getDefaultWidth = function() {
|
||||
RenderedDummyObjectInstance.prototype.getDefaultWidth = function () {
|
||||
return this._pixiObject.width;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the height of the instance, when it's not resized.
|
||||
*/
|
||||
RenderedDummyObjectInstance.prototype.getDefaultHeight = function() {
|
||||
RenderedDummyObjectInstance.prototype.getDefaultHeight = function () {
|
||||
return this._pixiObject.height;
|
||||
};
|
||||
|
||||
|
||||
@@ -20,7 +20,10 @@ import { type ObjectsRenderingService, type ObjectsEditorService } from '../JsEx
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
createExtension: function(_/*: (string) => string */, gd/*: libGDevelop */) {
|
||||
createExtension: function (
|
||||
_ /*: (string) => string */,
|
||||
gd /*: libGDevelop */
|
||||
) {
|
||||
const extension = new gd.PlatformExtension();
|
||||
extension.setExtensionInformation(
|
||||
'Physics2',
|
||||
@@ -32,7 +35,7 @@ module.exports = {
|
||||
|
||||
var physics2Behavior = new gd.BehaviorJsImplementation();
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
physics2Behavior.updateProperty = function(
|
||||
physics2Behavior.updateProperty = function (
|
||||
behaviorContent,
|
||||
propertyName,
|
||||
newValue
|
||||
@@ -46,7 +49,9 @@ module.exports = {
|
||||
return true;
|
||||
}
|
||||
if (propertyName === 'fixedRotation') {
|
||||
behaviorContent.getChild('fixedRotation').setBoolValue(newValue === '1');
|
||||
behaviorContent
|
||||
.getChild('fixedRotation')
|
||||
.setBoolValue(newValue === '1');
|
||||
return true;
|
||||
}
|
||||
if (propertyName === 'canSleep') {
|
||||
@@ -92,7 +97,9 @@ module.exports = {
|
||||
return true;
|
||||
}
|
||||
if (propertyName === 'density') {
|
||||
behaviorContent.getChild('density').setDoubleValue(parseFloat(newValue));
|
||||
behaviorContent
|
||||
.getChild('density')
|
||||
.setDoubleValue(parseFloat(newValue));
|
||||
return true;
|
||||
}
|
||||
if (propertyName === 'friction') {
|
||||
@@ -135,175 +142,167 @@ module.exports = {
|
||||
}
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
physics2Behavior.getProperties = function(behaviorContent) {
|
||||
physics2Behavior.getProperties = function (behaviorContent) {
|
||||
var behaviorProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
behaviorProperties.set(
|
||||
'bodyType',
|
||||
new gd.PropertyDescriptor(behaviorContent.getChild('bodyType').getStringValue())
|
||||
.setType('Choice')
|
||||
.setLabel('Type')
|
||||
.addExtraInfo('Static')
|
||||
.addExtraInfo('Dynamic')
|
||||
.addExtraInfo('Kinematic')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'bullet',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorProperties
|
||||
.getOrCreate('bodyType')
|
||||
.setValue(behaviorContent.getChild('bodyType').getStringValue())
|
||||
.setType('Choice')
|
||||
.setLabel('Type')
|
||||
.addExtraInfo('Static')
|
||||
.addExtraInfo('Dynamic')
|
||||
.addExtraInfo('Kinematic');
|
||||
behaviorProperties
|
||||
.getOrCreate('bullet')
|
||||
.setValue(
|
||||
behaviorContent.getChild('bullet').getBoolValue() ? 'true' : 'false'
|
||||
)
|
||||
.setType('Boolean')
|
||||
.setLabel('Bullet')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'fixedRotation',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getChild('fixedRotation').getBoolValue() ? 'true' : 'false'
|
||||
.setType('Boolean')
|
||||
.setLabel('Bullet');
|
||||
behaviorProperties
|
||||
.getOrCreate('fixedRotation')
|
||||
.setValue(
|
||||
behaviorContent.getChild('fixedRotation').getBoolValue()
|
||||
? 'true'
|
||||
: 'false'
|
||||
)
|
||||
.setType('Boolean')
|
||||
.setLabel('Fixed Rotation')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'canSleep',
|
||||
new gd.PropertyDescriptor(
|
||||
.setType('Boolean')
|
||||
.setLabel('Fixed Rotation');
|
||||
behaviorProperties
|
||||
.getOrCreate('canSleep')
|
||||
.setValue(
|
||||
behaviorContent.getChild('canSleep').getBoolValue() ? 'true' : 'false'
|
||||
)
|
||||
.setType('Boolean')
|
||||
.setLabel('Can Sleep')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'shape',
|
||||
new gd.PropertyDescriptor(behaviorContent.getChild('shape').getStringValue())
|
||||
.setType('Choice')
|
||||
.setLabel('Shape')
|
||||
.addExtraInfo('Box')
|
||||
.addExtraInfo('Circle')
|
||||
.addExtraInfo('Edge')
|
||||
.addExtraInfo('Polygon')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'shapeDimensionA',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getChild('shapeDimensionA').getDoubleValue().toString(10)
|
||||
.setType('Boolean')
|
||||
.setLabel('Can Sleep');
|
||||
behaviorProperties
|
||||
.getOrCreate('shape')
|
||||
.setValue(behaviorContent.getChild('shape').getStringValue())
|
||||
.setType('Choice')
|
||||
.setLabel('Shape')
|
||||
.addExtraInfo('Box')
|
||||
.addExtraInfo('Circle')
|
||||
.addExtraInfo('Edge')
|
||||
.addExtraInfo('Polygon');
|
||||
behaviorProperties
|
||||
.getOrCreate('shapeDimensionA')
|
||||
.setValue(
|
||||
behaviorContent
|
||||
.getChild('shapeDimensionA')
|
||||
.getDoubleValue()
|
||||
.toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Shape Dimension A')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'shapeDimensionB',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getChild('shapeDimensionB').getDoubleValue().toString(10)
|
||||
.setType('Number')
|
||||
.setLabel('Shape Dimension A');
|
||||
behaviorProperties
|
||||
.getOrCreate('shapeDimensionB')
|
||||
.setValue(
|
||||
behaviorContent
|
||||
.getChild('shapeDimensionB')
|
||||
.getDoubleValue()
|
||||
.toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Shape Dimension B')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'shapeOffsetX',
|
||||
new gd.PropertyDescriptor(
|
||||
.setType('Number')
|
||||
.setLabel('Shape Dimension B');
|
||||
behaviorProperties
|
||||
.getOrCreate('shapeOffsetX')
|
||||
.setValue(
|
||||
behaviorContent.getChild('shapeOffsetX').getDoubleValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Shape Offset X')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'shapeOffsetY',
|
||||
new gd.PropertyDescriptor(
|
||||
.setType('Number')
|
||||
.setLabel('Shape Offset X');
|
||||
behaviorProperties
|
||||
.getOrCreate('shapeOffsetY')
|
||||
.setValue(
|
||||
behaviorContent.getChild('shapeOffsetY').getDoubleValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Shape Offset Y')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'polygonOrigin',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.hasChild('polygonOrigin') ?
|
||||
behaviorContent.getChild('polygonOrigin').getStringValue() :
|
||||
'Center'
|
||||
.setType('Number')
|
||||
.setLabel('Shape Offset Y');
|
||||
behaviorProperties
|
||||
.getOrCreate('polygonOrigin')
|
||||
.setValue(
|
||||
behaviorContent.hasChild('polygonOrigin')
|
||||
? behaviorContent.getChild('polygonOrigin').getStringValue()
|
||||
: 'Center'
|
||||
)
|
||||
.setType('Choice')
|
||||
.setLabel('Polygon Origin')
|
||||
.addExtraInfo('Center')
|
||||
.addExtraInfo('Origin')
|
||||
.addExtraInfo('TopLeft')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'vertices',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.hasChild('vertices') ?
|
||||
gd.Serializer.toJSON(behaviorContent.getChild('vertices')) :
|
||||
'[]'
|
||||
).setLabel('Vertices')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'density',
|
||||
new gd.PropertyDescriptor(
|
||||
.setType('Choice')
|
||||
.setLabel('Polygon Origin')
|
||||
.addExtraInfo('Center')
|
||||
.addExtraInfo('Origin')
|
||||
.addExtraInfo('TopLeft');
|
||||
behaviorProperties
|
||||
.getOrCreate('vertices')
|
||||
.setValue(
|
||||
behaviorContent.hasChild('vertices')
|
||||
? gd.Serializer.toJSON(behaviorContent.getChild('vertices'))
|
||||
: '[]'
|
||||
)
|
||||
.setLabel('Vertices');
|
||||
behaviorProperties
|
||||
.getOrCreate('density')
|
||||
.setValue(
|
||||
behaviorContent.getChild('density').getDoubleValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Density')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'friction',
|
||||
new gd.PropertyDescriptor(
|
||||
.setType('Number')
|
||||
.setLabel('Density');
|
||||
behaviorProperties
|
||||
.getOrCreate('friction')
|
||||
.setValue(
|
||||
behaviorContent.getChild('friction').getDoubleValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Friction')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'restitution',
|
||||
new gd.PropertyDescriptor(
|
||||
.setType('Number')
|
||||
.setLabel('Friction');
|
||||
behaviorProperties
|
||||
.getOrCreate('restitution')
|
||||
.setValue(
|
||||
behaviorContent.getChild('restitution').getDoubleValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Restitution')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'linearDamping',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getChild('linearDamping').getDoubleValue().toString(10)
|
||||
.setType('Number')
|
||||
.setLabel('Restitution');
|
||||
behaviorProperties
|
||||
.getOrCreate('linearDamping')
|
||||
.setValue(
|
||||
behaviorContent
|
||||
.getChild('linearDamping')
|
||||
.getDoubleValue()
|
||||
.toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Linear Damping')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'angularDamping',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getChild('angularDamping').getDoubleValue().toString(10)
|
||||
.setType('Number')
|
||||
.setLabel('Linear Damping');
|
||||
behaviorProperties
|
||||
.getOrCreate('angularDamping')
|
||||
.setValue(
|
||||
behaviorContent
|
||||
.getChild('angularDamping')
|
||||
.getDoubleValue()
|
||||
.toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Angular Damping')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'gravityScale',
|
||||
new gd.PropertyDescriptor(
|
||||
.setType('Number')
|
||||
.setLabel('Angular Damping');
|
||||
behaviorProperties
|
||||
.getOrCreate('gravityScale')
|
||||
.setValue(
|
||||
behaviorContent.getChild('gravityScale').getDoubleValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Gravity Scale')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'layers',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getChild('layers').getIntValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Layers')
|
||||
);
|
||||
behaviorProperties.set(
|
||||
'masks',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getChild('masks').getIntValue().toString(10)
|
||||
)
|
||||
.setType('Number')
|
||||
.setLabel('Masks')
|
||||
);
|
||||
.setType('Number')
|
||||
.setLabel('Gravity Scale');
|
||||
behaviorProperties
|
||||
.getOrCreate('layers')
|
||||
.setValue(behaviorContent.getChild('layers').getIntValue().toString(10))
|
||||
.setType('Number')
|
||||
.setLabel('Layers');
|
||||
behaviorProperties
|
||||
.getOrCreate('masks')
|
||||
.setValue(behaviorContent.getChild('masks').getIntValue().toString(10))
|
||||
.setType('Number')
|
||||
.setLabel('Masks');
|
||||
|
||||
return behaviorProperties;
|
||||
};
|
||||
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
physics2Behavior.initializeContent = function(behaviorContent) {
|
||||
physics2Behavior.initializeContent = function (behaviorContent) {
|
||||
behaviorContent.addChild('bodyType').setStringValue('Dynamic');
|
||||
behaviorContent.addChild('bullet').setBoolValue(false);
|
||||
behaviorContent.addChild('fixedRotation').setBoolValue(false);
|
||||
@@ -327,7 +326,7 @@ module.exports = {
|
||||
|
||||
var sharedData = new gd.BehaviorSharedDataJsImplementation();
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
sharedData.updateProperty = function(
|
||||
sharedData.updateProperty = function (
|
||||
sharedContent,
|
||||
propertyName,
|
||||
newValue
|
||||
@@ -360,43 +359,43 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
sharedData.getProperties = function(sharedContent) {
|
||||
sharedData.getProperties = function (sharedContent) {
|
||||
var sharedProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
sharedProperties.set(
|
||||
'gravityX',
|
||||
new gd.PropertyDescriptor(
|
||||
sharedProperties
|
||||
.getOrCreate('gravityX')
|
||||
.setValue(
|
||||
sharedContent.getChild('gravityX').getDoubleValue().toString(10)
|
||||
).setType('Number')
|
||||
);
|
||||
sharedProperties.set(
|
||||
'gravityY',
|
||||
new gd.PropertyDescriptor(
|
||||
)
|
||||
.setType('Number');
|
||||
sharedProperties
|
||||
.getOrCreate('gravityY')
|
||||
.setValue(
|
||||
sharedContent.getChild('gravityY').getDoubleValue().toString(10)
|
||||
).setType('Number')
|
||||
);
|
||||
sharedProperties.set(
|
||||
'scaleX',
|
||||
new gd.PropertyDescriptor(
|
||||
)
|
||||
.setType('Number');
|
||||
sharedProperties
|
||||
.getOrCreate('scaleX')
|
||||
.setValue(
|
||||
sharedContent.getChild('scaleX').getDoubleValue().toString(10)
|
||||
).setType('Number')
|
||||
);
|
||||
sharedProperties.set(
|
||||
'scaleY',
|
||||
new gd.PropertyDescriptor(
|
||||
)
|
||||
.setType('Number');
|
||||
sharedProperties
|
||||
.getOrCreate('scaleY')
|
||||
.setValue(
|
||||
sharedContent.getChild('scaleY').getDoubleValue().toString(10)
|
||||
).setType('Number')
|
||||
);
|
||||
)
|
||||
.setType('Number');
|
||||
|
||||
return sharedProperties;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
|
||||
sharedData.initializeContent = function(behaviorContent) {
|
||||
behaviorContent.addChild("gravityX").setDoubleValue(0);
|
||||
behaviorContent.addChild("gravityY").setDoubleValue(9.8);
|
||||
behaviorContent.addChild("scaleX").setDoubleValue(100);
|
||||
behaviorContent.addChild("scaleY").setDoubleValue(100);
|
||||
}
|
||||
sharedData.initializeContent = function (behaviorContent) {
|
||||
behaviorContent.addChild('gravityX').setDoubleValue(0);
|
||||
behaviorContent.addChild('gravityY').setDoubleValue(9.8);
|
||||
behaviorContent.addChild('scaleX').setDoubleValue(100);
|
||||
behaviorContent.addChild('scaleY').setDoubleValue(100);
|
||||
};
|
||||
|
||||
var aut = extension
|
||||
// extension
|
||||
@@ -429,7 +428,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getGravityX');
|
||||
|
||||
@@ -458,7 +457,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getGravityY');
|
||||
|
||||
@@ -504,7 +503,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getTimeScale');
|
||||
|
||||
@@ -768,7 +767,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setShapeScale')
|
||||
.setGetter('getShapeScale');
|
||||
@@ -785,7 +784,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getDensity');
|
||||
|
||||
@@ -803,7 +802,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDensity')
|
||||
.setGetter('getDensity');
|
||||
@@ -833,7 +832,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getFriction');
|
||||
|
||||
@@ -851,7 +850,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setFriction')
|
||||
.setGetter('getFriction');
|
||||
@@ -881,7 +880,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getRestitution');
|
||||
|
||||
@@ -899,7 +898,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRestitution')
|
||||
.setGetter('getRestitution');
|
||||
@@ -929,7 +928,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getLinearDamping');
|
||||
|
||||
@@ -947,7 +946,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setLinearDamping')
|
||||
.setGetter('getLinearDamping');
|
||||
@@ -977,7 +976,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getAngularDamping');
|
||||
|
||||
@@ -995,7 +994,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setAngularDamping')
|
||||
.setGetter('getAngularDamping');
|
||||
@@ -1025,7 +1024,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getGravityScale');
|
||||
|
||||
@@ -1043,7 +1042,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setGravityScale')
|
||||
.setGetter('getGravityScale');
|
||||
@@ -1147,7 +1146,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getLinearVelocityX');
|
||||
|
||||
@@ -1163,7 +1162,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setLinearVelocityX')
|
||||
.setGetter('getLinearVelocityX');
|
||||
@@ -1193,7 +1192,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getLinearVelocityY');
|
||||
|
||||
@@ -1209,7 +1208,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setLinearVelocityY')
|
||||
.setGetter('getLinearVelocityY');
|
||||
@@ -1239,7 +1238,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getLinearVelocityLength');
|
||||
|
||||
@@ -1268,7 +1267,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getAngularVelocity');
|
||||
|
||||
@@ -1284,7 +1283,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setAngularVelocity')
|
||||
.setGetter('getAngularVelocity');
|
||||
@@ -1597,7 +1596,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getJointReactionForce');
|
||||
|
||||
@@ -1628,7 +1627,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('getJointReactionTorque');
|
||||
|
||||
@@ -1732,7 +1731,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDistanceJointLength')
|
||||
.setGetter('getDistanceJointLength');
|
||||
@@ -1764,7 +1763,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDistanceJointFrequency')
|
||||
.setGetter('getDistanceJointFrequency');
|
||||
@@ -1796,7 +1795,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDistanceJointDampingRatio')
|
||||
.setGetter('getDistanceJointDampingRatio');
|
||||
@@ -2091,7 +2090,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRevoluteJointMotorSpeed')
|
||||
.setGetter('getRevoluteJointMotorSpeed');
|
||||
@@ -2123,7 +2122,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRevoluteJointMaxMotorTorque')
|
||||
.setGetter('getRevoluteJointMaxMotorTorque');
|
||||
@@ -2403,7 +2402,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setPrismaticJointMotorSpeed')
|
||||
.setGetter('getPrismaticJointMotorSpeed');
|
||||
@@ -2435,7 +2434,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setPrismaticJointMaxMotorForce')
|
||||
.setGetter('getPrismaticJointMaxMotorForce');
|
||||
@@ -2705,7 +2704,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setGearJointRatio')
|
||||
.setGetter('getGearJointRatio');
|
||||
@@ -2830,7 +2829,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMouseJointMaxForce')
|
||||
.setGetter('getMouseJointMaxForce');
|
||||
@@ -2862,7 +2861,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMouseJointFrequency')
|
||||
.setGetter('getMouseJointFrequency');
|
||||
@@ -2894,7 +2893,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMouseJointDampingRatio')
|
||||
.setGetter('getMouseJointDampingRatio');
|
||||
@@ -3063,7 +3062,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointMotorSpeed')
|
||||
.setGetter('getWheelJointMotorSpeed');
|
||||
@@ -3095,7 +3094,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointMaxMotorTorque')
|
||||
.setGetter('getWheelJointMaxMotorTorque');
|
||||
@@ -3141,7 +3140,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointFrequency')
|
||||
.setGetter('getWheelJointFrequency');
|
||||
@@ -3173,7 +3172,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointDampingRatio')
|
||||
.setGetter('getWheelJointDampingRatio');
|
||||
@@ -3269,7 +3268,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWeldJointFrequency')
|
||||
.setGetter('getWeldJointFrequency');
|
||||
@@ -3301,7 +3300,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWeldJointDampingRatio')
|
||||
.setGetter('getWeldJointDampingRatio');
|
||||
@@ -3376,7 +3375,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRopeJointMaxLength')
|
||||
.setGetter('getRopeJointMaxLength');
|
||||
@@ -3444,7 +3443,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setFrictionJointMaxForce')
|
||||
.setGetter('getFrictionJointMaxForce');
|
||||
@@ -3476,7 +3475,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setFrictionJointMaxTorque')
|
||||
.setGetter('getFrictionJointMaxTorque');
|
||||
@@ -3593,7 +3592,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointAngularOffset')
|
||||
.setGetter('getMotorJointAngularOffset');
|
||||
@@ -3625,7 +3624,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointMaxForce')
|
||||
.setGetter('getMotorJointMaxForce');
|
||||
@@ -3657,7 +3656,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointMaxTorque')
|
||||
.setGetter('getMotorJointMaxTorque');
|
||||
@@ -3689,7 +3688,7 @@ module.exports = {
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.addParameter('expression', _('Joint ID'))
|
||||
.useStandardOperatorParameters("number")
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointCorrectionFactor')
|
||||
.setGetter('getMotorJointCorrectionFactor');
|
||||
@@ -3730,7 +3729,10 @@ module.exports = {
|
||||
return extension;
|
||||
},
|
||||
|
||||
runExtensionSanityTests: function(gd /*: libGDevelop */, extension /*: gdPlatformExtension*/) {
|
||||
runExtensionSanityTests: function (
|
||||
gd /*: libGDevelop */,
|
||||
extension /*: gdPlatformExtension*/
|
||||
) {
|
||||
return [];
|
||||
},
|
||||
};
|
||||
|
||||
+290
-284
@@ -20,38 +20,41 @@ import { type ObjectsRenderingService, type ObjectsEditorService } from '../JsEx
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
createExtension: function(_/*: (string) => string */, gd/*: libGDevelop */) {
|
||||
createExtension: function (
|
||||
_ /*: (string) => string */,
|
||||
gd /*: libGDevelop */
|
||||
) {
|
||||
const extension = new gd.PlatformExtension();
|
||||
extension
|
||||
.setExtensionInformation(
|
||||
"Video",
|
||||
"Video",
|
||||
_("Display a video on the scene."),
|
||||
"Aurélien Vivet",
|
||||
"Open source (MIT License)"
|
||||
'Video',
|
||||
'Video',
|
||||
_('Display a video on the scene.'),
|
||||
'Aurélien Vivet',
|
||||
'Open source (MIT License)'
|
||||
)
|
||||
.setExtensionHelpPath("/objects/video");
|
||||
.setExtensionHelpPath('/objects/video');
|
||||
|
||||
var videoObject = new gd.ObjectJsImplementation();
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
videoObject.updateProperty = function(
|
||||
videoObject.updateProperty = function (
|
||||
objectContent,
|
||||
propertyName,
|
||||
newValue
|
||||
) {
|
||||
if (propertyName === "Opacity") {
|
||||
if (propertyName === 'Opacity') {
|
||||
objectContent.opacity = parseFloat(newValue);
|
||||
return true;
|
||||
}
|
||||
if (propertyName === "Looped") {
|
||||
objectContent.loop = newValue === "1";
|
||||
if (propertyName === 'Looped') {
|
||||
objectContent.loop = newValue === '1';
|
||||
return true;
|
||||
}
|
||||
if (propertyName === "Volume") {
|
||||
if (propertyName === 'Volume') {
|
||||
objectContent.volume = parseFloat(newValue);
|
||||
return true;
|
||||
}
|
||||
if (propertyName === "videoResource") {
|
||||
if (propertyName === 'videoResource') {
|
||||
objectContent.videoResource = newValue;
|
||||
return true;
|
||||
}
|
||||
@@ -59,34 +62,30 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
videoObject.getProperties = function(objectContent) {
|
||||
videoObject.getProperties = function (objectContent) {
|
||||
var objectProperties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
objectProperties.set(
|
||||
"Opacity",
|
||||
new gd.PropertyDescriptor(objectContent.opacity.toString())
|
||||
.setType("number")
|
||||
.setLabel(_("Video opacity (0-255)"))
|
||||
);
|
||||
objectProperties.set(
|
||||
"Looped",
|
||||
new gd.PropertyDescriptor(objectContent.loop ? "true" : "false")
|
||||
.setType("boolean")
|
||||
.setLabel(_("Loop the video"))
|
||||
);
|
||||
objectProperties.set(
|
||||
"Volume",
|
||||
new gd.PropertyDescriptor(objectContent.volume.toString())
|
||||
.setType("number")
|
||||
.setLabel(_("Video volume (0-100)"))
|
||||
);
|
||||
objectProperties.set(
|
||||
"videoResource",
|
||||
new gd.PropertyDescriptor(objectContent.videoResource)
|
||||
.setType("resource")
|
||||
.addExtraInfo("video")
|
||||
.setLabel(_("Video resource"))
|
||||
);
|
||||
objectProperties
|
||||
.getOrCreate('Opacity')
|
||||
.setValue(objectContent.opacity.toString())
|
||||
.setType('number')
|
||||
.setLabel(_('Video opacity (0-255)'));
|
||||
objectProperties
|
||||
.getOrCreate('Looped')
|
||||
.setValue(objectContent.loop ? 'true' : 'false')
|
||||
.setType('boolean')
|
||||
.setLabel(_('Loop the video'));
|
||||
objectProperties
|
||||
.getOrCreate('Volume')
|
||||
.setValue(objectContent.volume.toString())
|
||||
.setType('number')
|
||||
.setLabel(_('Video volume (0-100)'));
|
||||
objectProperties
|
||||
.getOrCreate('videoResource')
|
||||
.setValue(objectContent.videoResource)
|
||||
.setType('resource')
|
||||
.addExtraInfo('video')
|
||||
.setLabel(_('Video resource'));
|
||||
|
||||
return objectProperties;
|
||||
};
|
||||
@@ -95,12 +94,12 @@ module.exports = {
|
||||
opacity: 255,
|
||||
loop: false,
|
||||
volume: 100,
|
||||
videoResource: ""
|
||||
videoResource: '',
|
||||
})
|
||||
);
|
||||
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
videoObject.updateInitialInstanceProperty = function(
|
||||
videoObject.updateInitialInstanceProperty = function (
|
||||
objectContent,
|
||||
instance,
|
||||
propertyName,
|
||||
@@ -111,7 +110,7 @@ module.exports = {
|
||||
return false;
|
||||
};
|
||||
// $FlowExpectedError - ignore Flow warning as we're creating an object
|
||||
videoObject.getInitialInstanceProperties = function(
|
||||
videoObject.getInitialInstanceProperties = function (
|
||||
content,
|
||||
instance,
|
||||
project,
|
||||
@@ -123,352 +122,352 @@ module.exports = {
|
||||
|
||||
const object = extension
|
||||
.addObject(
|
||||
"VideoObject",
|
||||
_("Video"),
|
||||
_("Displays a video."),
|
||||
"JsPlatform/Extensions/videoicon32.png",
|
||||
'VideoObject',
|
||||
_('Video'),
|
||||
_('Displays a video.'),
|
||||
'JsPlatform/Extensions/videoicon32.png',
|
||||
videoObject
|
||||
)
|
||||
.setIncludeFile("Extensions/Video/videoruntimeobject.js")
|
||||
.addIncludeFile("Extensions/Video/videoruntimeobject-pixi-renderer.js")
|
||||
.addIncludeFile("Extensions/Video/videoruntimeobject-cocos-renderer.js");
|
||||
.setIncludeFile('Extensions/Video/videoruntimeobject.js')
|
||||
.addIncludeFile('Extensions/Video/videoruntimeobject-pixi-renderer.js')
|
||||
.addIncludeFile('Extensions/Video/videoruntimeobject-cocos-renderer.js');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"Play",
|
||||
_("Play a video"),
|
||||
'Play',
|
||||
_('Play a video'),
|
||||
_(
|
||||
"Play a video (recommended file format is MPEG4, with H264 video codec and AAC audio codec)."
|
||||
'Play a video (recommended file format is MPEG4, with H264 video codec and AAC audio codec).'
|
||||
),
|
||||
_("Play the video of _PARAM0_"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
_('Play the video of _PARAM0_'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("play");
|
||||
.setFunctionName('play');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"Pause",
|
||||
_("Pause a video"),
|
||||
_("Pause the specified video."),
|
||||
_("Pause video _PARAM0_"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Pause',
|
||||
_('Pause a video'),
|
||||
_('Pause the specified video.'),
|
||||
_('Pause video _PARAM0_'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("pause");
|
||||
.setFunctionName('pause');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"Loop",
|
||||
_("Loop a video"),
|
||||
_("Loop the specified video."),
|
||||
_("Loop video of _PARAM0_: _PARAM1_"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Loop',
|
||||
_('Loop a video'),
|
||||
_('Loop the specified video.'),
|
||||
_('Loop video of _PARAM0_: _PARAM1_'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter("yesorno", _("Activate loop"), "", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.addParameter('yesorno', _('Activate loop'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setLoop");
|
||||
.setFunctionName('setLoop');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"Mute",
|
||||
_("Mute a video"),
|
||||
_("Mute, or unmute, the specified video."),
|
||||
_("Mute video of _PARAM0_: _PARAM1_"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Mute',
|
||||
_('Mute a video'),
|
||||
_('Mute, or unmute, the specified video.'),
|
||||
_('Mute video of _PARAM0_: _PARAM1_'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter("yesorno", _("Activate mute"), "", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.addParameter('yesorno', _('Activate mute'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("mute");
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"SetTime",
|
||||
_("Set time"),
|
||||
_("Set the time of the video object in seconds"),
|
||||
_("the time"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setCurrentTime")
|
||||
.setGetter("getCurrentTime");
|
||||
.setFunctionName('mute');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"SetVolume",
|
||||
_("Set volume"),
|
||||
'SetTime',
|
||||
_('Set time'),
|
||||
_('Set the time of the video object in seconds'),
|
||||
_('the time'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setCurrentTime')
|
||||
.setGetter('getCurrentTime');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
'SetVolume',
|
||||
_('Set volume'),
|
||||
_(
|
||||
"Set the volume of the video object, between 0 (muted) and 100 (maximum)."
|
||||
'Set the volume of the video object, between 0 (muted) and 100 (maximum).'
|
||||
),
|
||||
_("the volume"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
_('the volume'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setVolume")
|
||||
.setGetter("getVolume");
|
||||
.setFunctionName('setVolume')
|
||||
.setGetter('getVolume');
|
||||
|
||||
object
|
||||
.addExpression(
|
||||
"Volume",
|
||||
_("Get the volume"),
|
||||
'Volume',
|
||||
_('Get the volume'),
|
||||
_(
|
||||
"Get the volume of a video object, between 0 (muted) and 100 (maximum)."
|
||||
'Get the volume of a video object, between 0 (muted) and 100 (maximum).'
|
||||
),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Object"), "VideoObject", false)
|
||||
.addParameter('object', _('Object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getVolume");
|
||||
.setFunctionName('getVolume');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"Play",
|
||||
_("Is played"),
|
||||
_("Check if a video is played."),
|
||||
_("_PARAM0_ is played"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Play',
|
||||
_('Is played'),
|
||||
_('Check if a video is played.'),
|
||||
_('_PARAM0_ is played'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("isPlayed");
|
||||
.setFunctionName('isPlayed');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"Pause",
|
||||
_("Is paused"),
|
||||
_("Check if the video is paused."),
|
||||
_("_PARAM0_ is paused"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Pause',
|
||||
_('Is paused'),
|
||||
_('Check if the video is paused.'),
|
||||
_('_PARAM0_ is paused'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("isPaused");
|
||||
.setFunctionName('isPaused');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"Loop",
|
||||
_("Is looped"),
|
||||
_("Check if the video is looped."),
|
||||
_("_PARAM0_ is looped"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Loop',
|
||||
_('Is looped'),
|
||||
_('Check if the video is looped.'),
|
||||
_('_PARAM0_ is looped'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("isLooped");
|
||||
.setFunctionName('isLooped');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"Volume",
|
||||
_("Volume"),
|
||||
_("Compare the current volume of a video object."),
|
||||
_("the volume"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Volume',
|
||||
_('Volume'),
|
||||
_('Compare the current volume of a video object.'),
|
||||
_('the volume'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getVolume");
|
||||
.setFunctionName('getVolume');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"Mute",
|
||||
_("Is muted"),
|
||||
_("Check if a video is muted."),
|
||||
_("_PARAM0_ is muted"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Mute',
|
||||
_('Is muted'),
|
||||
_('Check if a video is muted.'),
|
||||
_('_PARAM0_ is muted'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("isMuted");
|
||||
.setFunctionName('isMuted');
|
||||
|
||||
object
|
||||
.addExpression(
|
||||
"CurrentTime",
|
||||
_("Get current time"),
|
||||
_("Return the current time of a video object (in seconds)."),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'CurrentTime',
|
||||
_('Get current time'),
|
||||
_('Return the current time of a video object (in seconds).'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Object"), "VideoObject", false)
|
||||
.addParameter('object', _('Object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getCurrentTime");
|
||||
.setFunctionName('getCurrentTime');
|
||||
|
||||
object
|
||||
.addExpression(
|
||||
"Duration",
|
||||
_("Get the duration"),
|
||||
_("Return the duration of a video object (in seconds)."),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Duration',
|
||||
_('Get the duration'),
|
||||
_('Return the duration of a video object (in seconds).'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Object"), "VideoObject", false)
|
||||
.addParameter('object', _('Object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getDuration");
|
||||
.setFunctionName('getDuration');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"Duration",
|
||||
_("Duration"),
|
||||
_("Compare the duration of a video object"),
|
||||
_("the duration (in seconds)"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Duration',
|
||||
_('Duration'),
|
||||
_('Compare the duration of a video object'),
|
||||
_('the duration (in seconds)'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getDuration");
|
||||
.setFunctionName('getDuration');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"CurrentTime",
|
||||
_("Current time"),
|
||||
_("Compare the current time of a video object"),
|
||||
_("the current time (in seconds)"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'CurrentTime',
|
||||
_('Current time'),
|
||||
_('Compare the current time of a video object'),
|
||||
_('the current time (in seconds)'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getCurrentTime");
|
||||
.setFunctionName('getCurrentTime');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"Ended",
|
||||
_("Is ended"),
|
||||
_("Check if a video is ended"),
|
||||
_("_PARAM0_ is ended"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Ended',
|
||||
_('Is ended'),
|
||||
_('Check if a video is ended'),
|
||||
_('_PARAM0_ is ended'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("isEnded");
|
||||
.setFunctionName('isEnded');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"SetOpacity",
|
||||
_("Set opacity"),
|
||||
'SetOpacity',
|
||||
_('Set opacity'),
|
||||
_(
|
||||
"Set opacity of the specified video object, between 0 (fully transparent) and 255 (opaque)."
|
||||
'Set opacity of the specified video object, between 0 (fully transparent) and 255 (opaque).'
|
||||
),
|
||||
_("the opacity"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
_('the opacity'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setOpacity")
|
||||
.setGetter("getOpacity");
|
||||
.setFunctionName('setOpacity')
|
||||
.setGetter('getOpacity');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"GetOpacity",
|
||||
_("Opacity"),
|
||||
_("Compare the opacity of a video object"),
|
||||
_("the opacity"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'GetOpacity',
|
||||
_('Opacity'),
|
||||
_('Compare the opacity of a video object'),
|
||||
_('the opacity'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getOpacity");
|
||||
.setFunctionName('getOpacity');
|
||||
|
||||
object
|
||||
.addExpression(
|
||||
"Opacity",
|
||||
_("Get current opacity"),
|
||||
_("Return the opacity of a video object"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'Opacity',
|
||||
_('Get current opacity'),
|
||||
_('Return the opacity of a video object'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Object"), "VideoObject", false)
|
||||
.addParameter('object', _('Object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getOpacity");
|
||||
.setFunctionName('getOpacity');
|
||||
|
||||
object
|
||||
.addAction(
|
||||
"SetPlaybackSpeed",
|
||||
_("Set playback speed"),
|
||||
'SetPlaybackSpeed',
|
||||
_('Set playback speed'),
|
||||
_(
|
||||
"Set playback speed of the specified video object, (1 = the default speed, >1 = faster and <1 = slower)."
|
||||
'Set playback speed of the specified video object, (1 = the default speed, >1 = faster and <1 = slower).'
|
||||
),
|
||||
_("the playback speed"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
_('the playback speed'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setPlaybackSpeed")
|
||||
.setGetter("getPlaybackSpeed");
|
||||
.setFunctionName('setPlaybackSpeed')
|
||||
.setGetter('getPlaybackSpeed');
|
||||
|
||||
object
|
||||
.addCondition(
|
||||
"GetPlaybackSpeed",
|
||||
_("Playback speed "),
|
||||
_("Compare the playback speed of a video object"),
|
||||
_("the playback speed"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'GetPlaybackSpeed',
|
||||
_('Playback speed '),
|
||||
_('Compare the playback speed of a video object'),
|
||||
_('the playback speed'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon24.png',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.useStandardRelationalOperatorParameters("number")
|
||||
.addParameter('object', _('Video object'), 'VideoObject', false)
|
||||
.useStandardRelationalOperatorParameters('number')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getPlaybackSpeed");
|
||||
.setFunctionName('getPlaybackSpeed');
|
||||
|
||||
object
|
||||
.addExpression(
|
||||
"PlaybackSpeed",
|
||||
_("Get current playback speed"),
|
||||
_("Return the playback speed of a video object"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
'PlaybackSpeed',
|
||||
_('Get current playback speed'),
|
||||
_('Return the playback speed of a video object'),
|
||||
'',
|
||||
'JsPlatform/Extensions/videoicon16.png'
|
||||
)
|
||||
.addParameter("object", _("Object"), "VideoObject", false)
|
||||
.addParameter('object', _('Object'), 'VideoObject', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("getPlaybackSpeed");
|
||||
.setFunctionName('getPlaybackSpeed');
|
||||
|
||||
return extension;
|
||||
},
|
||||
@@ -482,7 +481,10 @@ module.exports = {
|
||||
* But it is recommended to create tests for the behaviors/objects properties you created
|
||||
* to avoid mistakes.
|
||||
*/
|
||||
runExtensionSanityTests: function(gd /*: libGDevelop */, extension /*: gdPlatformExtension*/) {
|
||||
runExtensionSanityTests: function (
|
||||
gd /*: libGDevelop */,
|
||||
extension /*: gdPlatformExtension*/
|
||||
) {
|
||||
return [];
|
||||
},
|
||||
/**
|
||||
@@ -491,11 +493,13 @@ module.exports = {
|
||||
* ℹ️ Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
|
||||
*/
|
||||
|
||||
registerEditorConfigurations: function(objectsEditorService /*: ObjectsEditorService */) {
|
||||
registerEditorConfigurations: function (
|
||||
objectsEditorService /*: ObjectsEditorService */
|
||||
) {
|
||||
objectsEditorService.registerEditorConfiguration(
|
||||
"Video::VideoObject",
|
||||
'Video::VideoObject',
|
||||
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor({
|
||||
helpPagePath: "/objects/video"
|
||||
helpPagePath: '/objects/video',
|
||||
})
|
||||
);
|
||||
},
|
||||
@@ -504,7 +508,9 @@ module.exports = {
|
||||
*
|
||||
* ℹ️ Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
|
||||
*/
|
||||
registerInstanceRenderers: function(objectsRenderingService /*: ObjectsRenderingService */) {
|
||||
registerInstanceRenderers: function (
|
||||
objectsRenderingService /*: ObjectsRenderingService */
|
||||
) {
|
||||
const RenderedInstance = objectsRenderingService.RenderedInstance;
|
||||
const PIXI = objectsRenderingService.PIXI;
|
||||
|
||||
@@ -549,19 +555,19 @@ module.exports = {
|
||||
/**
|
||||
* Return the path to the thumbnail of the specified object.
|
||||
*/
|
||||
RenderedVideoObjectInstance.getThumbnail = function(
|
||||
RenderedVideoObjectInstance.getThumbnail = function (
|
||||
project,
|
||||
resourcesLoader,
|
||||
object
|
||||
) {
|
||||
return "JsPlatform/Extensions/videoicon24.png";
|
||||
return 'JsPlatform/Extensions/videoicon24.png';
|
||||
};
|
||||
|
||||
RenderedVideoObjectInstance.prototype._getVideoTexture = function() {
|
||||
RenderedVideoObjectInstance.prototype._getVideoTexture = function () {
|
||||
// Get the video resource to use
|
||||
const videoResource = this._associatedObject
|
||||
.getProperties(this.project)
|
||||
.get("videoResource")
|
||||
.get('videoResource')
|
||||
.getValue();
|
||||
|
||||
// This returns a VideoTexture with autoPlay set to false
|
||||
@@ -574,11 +580,11 @@ module.exports = {
|
||||
/**
|
||||
* This is called to update the PIXI object on the scene editor
|
||||
*/
|
||||
RenderedVideoObjectInstance.prototype.update = function() {
|
||||
RenderedVideoObjectInstance.prototype.update = function () {
|
||||
// Check if the video resource has changed
|
||||
const videoResource = this._associatedObject
|
||||
.getProperties(this.project)
|
||||
.get("videoResource")
|
||||
.get('videoResource')
|
||||
.getValue();
|
||||
if (videoResource !== this._videoResource) {
|
||||
this._videoResource = videoResource;
|
||||
@@ -589,8 +595,8 @@ module.exports = {
|
||||
|
||||
// Try to display an error texture in case of error, though
|
||||
// for some reason "error" is never called.
|
||||
that._pixiObject.texture.on("error", function() {
|
||||
that._pixiObject.texture.off("error", this);
|
||||
that._pixiObject.texture.on('error', function () {
|
||||
that._pixiObject.texture.off('error', this);
|
||||
that._pixiObject.texture = that._pixiResourcesLoader.getInvalidPIXITexture();
|
||||
});
|
||||
}
|
||||
@@ -599,7 +605,7 @@ module.exports = {
|
||||
// Update opacity
|
||||
const opacity = this._associatedObject
|
||||
.getProperties(this.project)
|
||||
.get("Opacity")
|
||||
.get('Opacity')
|
||||
.getValue();
|
||||
this._pixiObject.alpha = opacity / 255;
|
||||
|
||||
@@ -621,14 +627,14 @@ module.exports = {
|
||||
/**
|
||||
* Return the width of the instance, when it's not resized.
|
||||
*/
|
||||
RenderedVideoObjectInstance.prototype.getDefaultWidth = function() {
|
||||
RenderedVideoObjectInstance.prototype.getDefaultWidth = function () {
|
||||
return this._pixiObject.width;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the height of the instance, when it's not resized.
|
||||
*/
|
||||
RenderedVideoObjectInstance.prototype.getDefaultHeight = function() {
|
||||
RenderedVideoObjectInstance.prototype.getDefaultHeight = function () {
|
||||
return this._pixiObject.height;
|
||||
};
|
||||
|
||||
@@ -636,8 +642,8 @@ module.exports = {
|
||||
// because the video is never really played.
|
||||
|
||||
objectsRenderingService.registerInstanceRenderer(
|
||||
"Video::VideoObject",
|
||||
'Video::VideoObject',
|
||||
RenderedVideoObjectInstance
|
||||
);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -656,6 +656,7 @@ NamedPropertyDescriptor implements PropertyDescriptor;
|
||||
interface MapStringPropertyDescriptor {
|
||||
void MapStringPropertyDescriptor();
|
||||
|
||||
[Ref] PropertyDescriptor MAP_getOrCreate([Const] DOMString name);
|
||||
[Ref] PropertyDescriptor MAP_get([Const] DOMString name);
|
||||
void MAP_set([Const] DOMString name, [Const, Ref] PropertyDescriptor prop);
|
||||
boolean MAP_has([Const] DOMString name);
|
||||
|
||||
@@ -445,7 +445,8 @@ typedef ExtensionAndMetadata<ExpressionMetadata> ExtensionAndExpressionMetadata;
|
||||
|
||||
#define WRAPPED_at(a) at(a).get()
|
||||
|
||||
#define MAP_get(a) find(a)->second
|
||||
#define MAP_getOrCreate(key) operator[](key)
|
||||
#define MAP_get(key) find(key)->second
|
||||
#define MAP_set(key, value) [key] = value
|
||||
#define MAP_has(key) find(key) != self->end()
|
||||
|
||||
|
||||
@@ -1143,18 +1143,11 @@ describe('libGD.js', function() {
|
||||
mySharedData.getProperties = function(behaviorContent) {
|
||||
var properties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
properties.set(
|
||||
'My first property',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getStringAttribute('property1')
|
||||
)
|
||||
);
|
||||
properties.set(
|
||||
'My other property',
|
||||
new gd.PropertyDescriptor(
|
||||
behaviorContent.getBoolAttribute('property2') ? '1' : '0'
|
||||
).setType('Boolean')
|
||||
);
|
||||
properties.getOrCreate('My first property')
|
||||
.setValue(behaviorContent.getStringAttribute('property1'));
|
||||
properties.getOrCreate('My other property')
|
||||
.setValue(behaviorContent.getBoolAttribute('property2') ? '1' : '0')
|
||||
.setType('Boolean');
|
||||
|
||||
return properties;
|
||||
};
|
||||
@@ -1248,6 +1241,7 @@ describe('libGD.js', function() {
|
||||
property1.setValue('123');
|
||||
expect(list.getAt(0).getLabel()).toBe('Property 1');
|
||||
expect(list.getAt(0).getValue()).toBe('123');
|
||||
list.delete();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1256,7 +1250,11 @@ describe('libGD.js', function() {
|
||||
var properties = new gd.MapStringPropertyDescriptor();
|
||||
expect(properties.has('Property0')).toBe(false);
|
||||
|
||||
properties.set('Property1', new gd.PropertyDescriptor('Hello Property1'));
|
||||
// Ensure the "set" method works (though in practice, prefer "getOrCreate")
|
||||
const property1 = new gd.PropertyDescriptor('Hello Property1');
|
||||
properties.set('Property1', property1);
|
||||
property1.delete();
|
||||
|
||||
expect(properties.get('Property1').getValue()).toBe('Hello Property1');
|
||||
expect(properties.get('Property1').getType()).toBe('string');
|
||||
properties.get('Property1').setValue('Hello modified Property1');
|
||||
@@ -1266,13 +1264,14 @@ describe('libGD.js', function() {
|
||||
expect(properties.keys().toJSArray()).not.toContain('Property0');
|
||||
expect(properties.keys().toJSArray()).toContain('Property1');
|
||||
|
||||
properties.set(
|
||||
'Property0',
|
||||
new gd.PropertyDescriptor('Hello Property0')
|
||||
.setType('another type')
|
||||
.addExtraInfo('Info1')
|
||||
.addExtraInfo('Info3')
|
||||
);
|
||||
// Ensure the "getOrCreate" method works
|
||||
expect(properties.has('Property0')).toBe(false);
|
||||
properties.getOrCreate('Property0')
|
||||
.setValue('Hello Property0')
|
||||
.setType('another type')
|
||||
.addExtraInfo('Info1')
|
||||
.addExtraInfo('Info3');
|
||||
expect(properties.has('Property0')).toBe(true);
|
||||
expect(properties.get('Property0').getValue()).toBe('Hello Property0');
|
||||
expect(properties.get('Property0').getType()).toBe('another type');
|
||||
expect(
|
||||
@@ -1297,6 +1296,7 @@ describe('libGD.js', function() {
|
||||
expect(properties.has('Property1')).toBe(true);
|
||||
expect(properties.keys().toJSArray()).toContain('Property0');
|
||||
expect(properties.keys().toJSArray()).toContain('Property1');
|
||||
properties.delete();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1322,18 +1322,16 @@ describe('libGD.js', function() {
|
||||
myBehavior.getProperties = function(behaviorContent) {
|
||||
var properties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
properties.set(
|
||||
'My first property',
|
||||
new gd.PropertyDescriptor(
|
||||
properties
|
||||
.getOrCreate('My first property')
|
||||
.setValue(
|
||||
behaviorContent.getStringAttribute('property1')
|
||||
)
|
||||
);
|
||||
properties.set(
|
||||
'My other property',
|
||||
new gd.PropertyDescriptor(
|
||||
);
|
||||
properties
|
||||
.getOrCreate('My other property')
|
||||
.setValue(
|
||||
behaviorContent.getBoolAttribute('property2') ? '1' : '0'
|
||||
).setType('Boolean')
|
||||
);
|
||||
).setType('Boolean');
|
||||
|
||||
return properties;
|
||||
};
|
||||
@@ -1481,16 +1479,13 @@ describe('libGD.js', function() {
|
||||
myObject.getProperties = function(content) {
|
||||
var properties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
properties.set(
|
||||
'My first property',
|
||||
new gd.PropertyDescriptor(content.property1)
|
||||
);
|
||||
properties.set(
|
||||
'My other property',
|
||||
new gd.PropertyDescriptor(content.property2 ? '1' : '0').setType(
|
||||
'Boolean'
|
||||
)
|
||||
);
|
||||
properties
|
||||
.getOrCreate('My first property')
|
||||
.setValue(content.property1);
|
||||
properties
|
||||
.getOrCreate('My other property')
|
||||
.setValue(content.property2 ? '1' : '0')
|
||||
.setType('Boolean');
|
||||
|
||||
return properties;
|
||||
};
|
||||
@@ -1528,18 +1523,16 @@ describe('libGD.js', function() {
|
||||
) {
|
||||
var properties = new gd.MapStringPropertyDescriptor();
|
||||
|
||||
properties.set(
|
||||
'My instance property',
|
||||
new gd.PropertyDescriptor(
|
||||
properties
|
||||
.getOrCreate('My instance property')
|
||||
.setValue(
|
||||
instance.getRawStringProperty('instanceprop1')
|
||||
)
|
||||
);
|
||||
properties.set(
|
||||
'My other instance property',
|
||||
new gd.PropertyDescriptor(
|
||||
instance.getRawFloatProperty('instanceprop2').toString() //TODO: How to avoid people forgetting toString?
|
||||
).setType('number')
|
||||
);
|
||||
);
|
||||
properties
|
||||
.getOrCreate('My other instance property')
|
||||
.setValue(
|
||||
instance.getRawFloatProperty('instanceprop2').toString()
|
||||
).setType('number');
|
||||
|
||||
return properties;
|
||||
};
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdMapStringPropertyDescriptor {
|
||||
constructor(): void;
|
||||
getOrCreate(name: string): gdPropertyDescriptor;
|
||||
get(name: string): gdPropertyDescriptor;
|
||||
set(name: string, prop: gdPropertyDescriptor): void;
|
||||
has(name: string): boolean;
|
||||
|
||||
@@ -29,12 +29,11 @@ export const makeTestExtensions = (gd: libGDevelop) => {
|
||||
.setDescription('A fake sepia effect')
|
||||
.addIncludeFile('Extensions/Effects/fake-sepia.js');
|
||||
const sepiaProperties = sepiaEffect.getProperties();
|
||||
sepiaProperties.set(
|
||||
'opacity',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '1')
|
||||
.setLabel('Opacity (between 0 and 1)')
|
||||
.setType('number')
|
||||
);
|
||||
sepiaProperties
|
||||
.getOrCreate('opacity')
|
||||
.setValue('1')
|
||||
.setLabel('Opacity (between 0 and 1)')
|
||||
.setType('number');
|
||||
|
||||
const nightEffect = extension
|
||||
.addEffect('FakeNight')
|
||||
@@ -42,18 +41,16 @@ export const makeTestExtensions = (gd: libGDevelop) => {
|
||||
.setDescription('A fake night effect')
|
||||
.addIncludeFile('Extensions/Effects/fake-night.js');
|
||||
const nightProperties = nightEffect.getProperties();
|
||||
nightProperties.set(
|
||||
'intensity',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '1')
|
||||
.setLabel('Intensity (between 0 and 1)')
|
||||
.setType('number')
|
||||
);
|
||||
nightProperties.set(
|
||||
'opacity',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '1')
|
||||
.setLabel('Opacity (between 0 and 1)')
|
||||
.setType('number')
|
||||
);
|
||||
nightProperties
|
||||
.getOrCreate('intensity')
|
||||
.setValue('1')
|
||||
.setLabel('Intensity (between 0 and 1)')
|
||||
.setType('number');
|
||||
nightProperties
|
||||
.getOrCreate('opacity')
|
||||
.setValue('1')
|
||||
.setLabel('Opacity (between 0 and 1)')
|
||||
.setType('number');
|
||||
|
||||
const variousParametersEffect = extension
|
||||
.addEffect('FakeEffectWithVariousParameters')
|
||||
@@ -63,41 +60,37 @@ export const makeTestExtensions = (gd: libGDevelop) => {
|
||||
'Extensions/Effects/fake-effect-with-various-parameters.js'
|
||||
);
|
||||
const variousParametersEffectProperties = variousParametersEffect.getProperties();
|
||||
variousParametersEffectProperties.set(
|
||||
'intensity',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '1')
|
||||
.setLabel('Intensity (between 0 and 1)')
|
||||
.setType('number')
|
||||
.setDescription(
|
||||
'Some interesting description about this intensity parameter that can be used by the effect.'
|
||||
)
|
||||
);
|
||||
variousParametersEffectProperties.set(
|
||||
'someColor',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '1')
|
||||
.setLabel('Some color')
|
||||
.setType('color')
|
||||
.setDescription(
|
||||
'Some interesting description about this color parameter that can be used by the effect.'
|
||||
)
|
||||
);
|
||||
variousParametersEffectProperties.set(
|
||||
'image',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ '')
|
||||
.setLabel('An image resource')
|
||||
.setType('resource')
|
||||
.addExtraInfo('image')
|
||||
.setDescription(
|
||||
'Some interesting description about this image resource that can be used by the effect.'
|
||||
)
|
||||
);
|
||||
variousParametersEffectProperties.set(
|
||||
'someBoolean',
|
||||
new gd.PropertyDescriptor(/* defaultValue= */ 'true')
|
||||
.setLabel('Some setting to enable or not for the effect')
|
||||
.setType('boolean')
|
||||
.setDescription('And some *optional* description.')
|
||||
);
|
||||
variousParametersEffectProperties
|
||||
.getOrCreate('intensity')
|
||||
.setValue('1')
|
||||
.setLabel('Intensity (between 0 and 1)')
|
||||
.setType('number')
|
||||
.setDescription(
|
||||
'Some interesting description about this intensity parameter that can be used by the effect.'
|
||||
);
|
||||
variousParametersEffectProperties
|
||||
.getOrCreate('someColor')
|
||||
.setValue('1')
|
||||
.setLabel('Some color')
|
||||
.setType('color')
|
||||
.setDescription(
|
||||
'Some interesting description about this color parameter that can be used by the effect.'
|
||||
);
|
||||
variousParametersEffectProperties
|
||||
.getOrCreate('image')
|
||||
.setValue('')
|
||||
.setLabel('An image resource')
|
||||
.setType('resource')
|
||||
.addExtraInfo('image')
|
||||
.setDescription(
|
||||
'Some interesting description about this image resource that can be used by the effect.'
|
||||
);
|
||||
variousParametersEffectProperties
|
||||
.getOrCreate('someBoolean')
|
||||
.setValue('true')
|
||||
.setLabel('Some setting to enable or not for the effect')
|
||||
.setType('boolean')
|
||||
.setDescription('And some *optional* description.');
|
||||
|
||||
platform.addNewExtension(extension);
|
||||
extension.delete(); // Release the extension as it was copied inside gd.JsPlatform
|
||||
|
||||
@@ -16,30 +16,27 @@ That's why object and behaviors can have "properties". A property is defined by
|
||||
* You can use them when declaring **an object or behavior** in JavaScript (in `JsExtension.js`). For example, in the case of a Video Object:
|
||||
|
||||
```js
|
||||
videoObject.getProperties = function(objectContent) {
|
||||
videoObject.getProperties = function(objectContent) {
|
||||
var objectProperties = new gd.MapStringPropertyDescriptor();
|
||||
objectProperties.set(
|
||||
"Opacity",
|
||||
new gd.PropertyDescriptor(objectContent.opacity.toString())
|
||||
objectProperties
|
||||
.getOrCreate('opacity')
|
||||
.setValue(objectContent.opacity.toString())
|
||||
.setType("number")
|
||||
.setLabel(_("Video opacity (0-255)"))
|
||||
);
|
||||
objectProperties.set(
|
||||
"Looped",
|
||||
new gd.PropertyDescriptor(objectContent.loop ? "true" : "false")
|
||||
.setLabel(_("Video opacity (0-255)"));
|
||||
objectProperties
|
||||
.getOrCreate('looped')
|
||||
.setValue(objectContent.loop ? "true" : "false")
|
||||
.setType("boolean")
|
||||
.setLabel(_("Loop the video"))
|
||||
);
|
||||
objectProperties.set(
|
||||
"videoResource",
|
||||
new gd.PropertyDescriptor(objectContent.videoResource)
|
||||
.setLabel(_("Loop the video"));
|
||||
objectProperties
|
||||
.getOrCreate('videoResource')
|
||||
.setValue(objectContent.videoResource)
|
||||
.setType("resource")
|
||||
.addExtraInfo("video")
|
||||
.setLabel(_("Video resource"))
|
||||
);
|
||||
.setLabel(_("Video resource"));
|
||||
|
||||
return objectProperties;
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
* Their usage is mostly the same in C++. For example, in the case of a Skeleton Object:
|
||||
@@ -48,13 +45,18 @@ That's why object and behaviors can have "properties". A property is defined by
|
||||
std::map<gd::String, gd::PropertyDescriptor> SkeletonObject::GetProperties(
|
||||
gd::Project& project) const {
|
||||
std::map<gd::String, gd::PropertyDescriptor> properties;
|
||||
properties[_("Skeletal data filename")].SetValue(skeletalDataFilename)
|
||||
.SetType("resource").AddExtraInfo("json");
|
||||
properties[_("Skeletal data filename")]
|
||||
.SetValue(skeletalDataFilename)
|
||||
.SetType("resource")
|
||||
.AddExtraInfo("json");
|
||||
properties[_("Main armature name")].SetValue(rootArmatureName);
|
||||
properties[_("Texture data filename")].SetValue(textureDataFilename)
|
||||
.SetType("resource").AddExtraInfo("json");
|
||||
properties[_("Texture data filename")]
|
||||
.SetValue(textureDataFilename)
|
||||
.SetType("resource")
|
||||
.AddExtraInfo("json");
|
||||
properties[_("Texture")].SetValue(textureName)
|
||||
.SetType("resource").AddExtraInfo("image");
|
||||
.SetType("resource")
|
||||
.AddExtraInfo("image");
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user