Compare commits

..

141 Commits

Author SHA1 Message Date
Florian Rival
2b40f57189 Fix Duration parameter of Vibrate action 2019-01-24 23:12:37 +00:00
Wend1go
fc3f8a945b Add actions for loading/saving files (raw or JSON) to Filesystem (#884) 2019-01-24 22:04:43 +00:00
Florian Rival
ed24871130 Fix crash in profiler when using a lot of nested groups 2019-01-23 22:12:49 +00:00
Florian Rival
e416fb0586 Merge branch 'master' of github.com:4ian/GDevelop 2019-01-23 21:52:45 +00:00
Florian Rival
5778131deb Improve debugger performance 2019-01-23 21:52:31 +00:00
Todor Imreorov
8e81f78596 Remember zoom/grid/window mask state for scenes and external layouts (#892) 2019-01-23 21:23:09 +00:00
Todor Imreorov
1abdcaf0c0 Warn user when renaming resource that it might break objects (#899) 2019-01-23 19:14:24 +00:00
Florian Rival
4af867ba3a Fix expression transforming structure variable to JSON 2019-01-23 17:47:15 +00:00
Todor Imreorov
f75c2297d7 Fix "Locate File" and related menu options after a resource is renamed (#898) 2019-01-22 19:28:47 +01:00
Florian Rival
72c4f88936 Add screen-shake and update downhill-bike-physics-demo example 2019-01-21 16:48:10 +01:00
Florian Rival
34bcfdfee7 Customize the style of markdown rendered text 2019-01-20 20:54:47 +00:00
Florian Rival
7e78d4de5a Display changelog when launching a new version for first time
* Also display changelog in AboutDialog
2019-01-20 20:54:47 +00:00
Bouh
971b7a2322 Prevent renaming elements with an already existing name in Project Manager (#888) 2019-01-19 17:44:07 +00:00
Todor Imreorov
9a95aabc87 Add --disable-update-check option to disable check for updates (#887) 2019-01-19 16:28:38 +00:00
Florian Rival
53dcfa1cbf Fix enabling/disabling alert messages 2019-01-18 17:45:20 +00:00
Florian Rival
0ed7ccfb72 Set shortcut to close project to Ctrl/Cmd+Shift+W 2019-01-17 17:31:15 +00:00
Florian Rival
0fcd5cbbb9 Bump newIDE version 2019-01-17 17:30:48 +00:00
Florian Rival
fb6b959636 Add downhill-bike-physics-demo example 2019-01-14 22:42:26 +00:00
Florian Rival
1d7f0f9f94 Fix Prettier 2019-01-14 21:54:34 +00:00
Florian Rival
4be527c18a Try to prevent any crash by catching any exception when setting window title 2019-01-14 21:47:03 +00:00
Florian Rival
5e770d460d Merge branch 'master' of github.com:4ian/GDevelop 2019-01-14 21:25:31 +00:00
Florian Rival
73daf0e940 Fix Facebook instant games needing a bundle configuration file 2019-01-14 21:25:22 +00:00
Franco Maciel
58d88835c5 Fix initial motors speed in actions of Physics2 behavior (#872) 2019-01-14 21:09:09 +00:00
Florian Rival
0aa66837d4 Fix login dialog not showing on top of export dialog
Fix #868
2019-01-14 11:29:02 +00:00
Florian Rival
11349086c7 Update all remaining examples from old Physics engine to Physics Engine 2.0 2019-01-13 23:36:29 +00:00
Zat
d3d636744e Fix wheel joint argument definitions (#871) 2019-01-13 22:10:50 +00:00
Bouh
5baf2d9735 Fix sentence a FB Instant Game action (#869) 2019-01-13 19:13:04 +00:00
Florian Rival
d0daf0b5a8 Update bouncing-ball-and-rope example with new Physics engine 2019-01-12 17:35:39 +00:00
Florian Rival
21841e0bce Add Ragdoll example 2019-01-12 17:06:35 +00:00
Florian Rival
417ab2ff3d Gray out the deprecated Physics Engine category in InstructionSelector 2019-01-11 20:04:24 +00:00
Florian Rival
caee5fdcc7 Change default name of Physics2 behavior 2019-01-11 19:48:25 +00:00
Florian Rival
1fbd58fa75 Change wording of the old Physics extension 2019-01-11 19:48:25 +00:00
Florian Rival
389deadac5 Also improve flow typing of Debugger Toolbar
Note that the way translations are done might be changed later, but
this is for reference if needed.
2019-01-11 19:48:25 +00:00
Florian Rival
7d52165a82 Add deprecation alert for instructions of old Physics engine 2019-01-11 19:48:25 +00:00
Florian Rival
5e3e7e25fc Fix opening of ExpressionSelector not showing the top with the search field 2019-01-10 08:35:08 +00:00
Florian Rival
56afb11e2c Hide object drop-down list after an object is selected 2019-01-10 08:26:07 +00:00
Florian Rival
b6a0cfef32 Fix linter warning 2019-01-10 08:10:17 +00:00
Florian Rival
37c3a6d38a Add explicit "OK" button in message box to fix issue on Linux
See #856
2019-01-10 08:07:55 +00:00
Zat
30f830589c Add expressions relative to body to Physics2 behavior (#854) 2019-01-09 09:26:31 +00:00
Florian Rival
5f8546c3b9 Avoid crash of the debugger with Particle Emitters
This is done by using _renderer as the name for the renderer property,
with an underscore, which is filtered by the debugger when the game
is dumped.
2019-01-06 22:59:21 +00:00
Zat
4c2997b2d9 Add missing Physics2Behavior expressions (#848) 2019-01-06 20:43:12 +00:00
Franco Maciel
2338b5bfd6 Use AABB to check if cursor is on object (#852) 2019-01-06 20:23:19 +00:00
Franco Maciel
8a07e9b6c5 Prevent crash with repeated and aligned vertices in Physics2 behavior (#850) 2019-01-06 17:26:43 +00:00
Florian Rival
61303c7cf9 Fix Prettier 2019-01-06 00:59:07 +00:00
Florian Rival
43eaf30750 Fix error in Flow typing in recent Flow versions 2019-01-05 19:01:30 +00:00
Florian Rival
db278485fc Improve Flow typing 2019-01-05 18:42:19 +00:00
Florian Rival
3f5b42dc90 Fix tests of InstructionOrExpressionSelector and make them more robust against changes 2019-01-05 18:38:55 +00:00
Florian Rival
cd285b5676 Display icons in the list of instructions or expressions 2019-01-05 18:11:47 +00:00
Franco Maciel
509ac8966e Prevent undefined vertices in Physics2 behaviors (#845) 2019-01-05 17:03:42 +00:00
Florian Rival
bda2a10b5f Improve Flow typing of InstructionOrExpressionSelector 2019-01-05 17:03:11 +00:00
Florian Rival
841e1a66b6 Fix updating shared properties of Physics2 2019-01-05 13:52:18 +00:00
Franco Maciel
3fc588b6e3 Add a new editor (with Polygon support) for Physics2 engine (#825)
* Physics editor and custom polygon support
* Add shape preview
* Dynamic dimension labels in function of the shape
* Add polygon editor
* Preview box, circle and edge
* Prevent invalid properties values
* Add BehaviorsEditorService
2019-01-05 12:28:45 +00:00
Florian Rival
50ebf6e5a2 Add support for creating objects in JS extensions + example 2019-01-05 12:03:24 +00:00
Florian Rival
cbe33d2bd1 Improve/fix mistakes in gdjs.TextRuntimeObject documentation 2019-01-03 22:45:24 +00:00
Florian Rival
8c8c297adb Make mouse button labels more accessible 2019-01-03 21:07:18 +00:00
Florian Rival
a8d927994b Change the mouse button labels in newIDE 2019-01-03 21:07:18 +00:00
Florian Rival
1fb3231f98 Use constants to represents button in the game engine 2019-01-03 21:07:18 +00:00
Bouh
70a58f1bd4 Fix Middle mouse button handling (#841) 2019-01-03 18:34:03 +00:00
Franco Maciel
302bcb718f Fix initial opacity undefined 2019-01-03 13:59:08 +00:00
Florian Rival
857c706f48 Add help link for PanelSprite object editor 2018-12-30 22:55:11 +01:00
Wend1go
5b5f91c1f9 Add example for screenshot extension (#835) 2018-12-30 21:54:15 +01:00
Wend1go
0652e19190 Brighten up Screenshot icons to better fit the dark theme (#834) 2018-12-30 11:34:25 +01:00
Wend1go
5feb4caa31 Add FileSystem extension (special path, file existence and creating directory) (#828) 2018-12-29 20:11:53 +01:00
Florian Rival
1cd5519b93 Fix snapshot tests 2018-12-29 20:08:56 +01:00
Florian Rival
96761c461d Adapt descriptions of storage actions to make clear that no files are written 2018-12-29 18:27:21 +01:00
Florian Rival
1a82663968 Add dismissable alerts to warn/help the user 2018-12-27 18:50:15 +01:00
Florian Rival
9111b56eb3 Add GetAngle/Get(X|Y)Velocity to top-down behavior 2018-12-27 16:53:44 +01:00
Florian Rival
d7f22bcf26 Update isometric-game example 2018-12-27 14:02:05 +01:00
Florian Rival
b9b0ed812d Update Platformer example 2018-12-27 12:03:00 +01:00
Florian Rival
6734644df4 Fix non prettified files 2018-12-27 12:00:51 +01:00
Florian Rival
ddeff6bfae Add shortcut to open Project Manager and focus search field when opening 2018-12-27 11:56:01 +01:00
Florian Rival
8f10eac512 Fix snapshot tests 2018-12-27 11:37:31 +01:00
Florian Rival
162524f779 Automatically close project manager after opening functions 2018-12-27 11:19:32 +01:00
Wend1go
1da347b08b Add Screenshot extension (for games running on Windows/macOS/Linux) (#806)
* Add functionality to take screenshots, when running on Electron.
2018-12-27 11:07:42 +01:00
Florian Rival
01b7f81507 Fix regression on rounding of platformer object X position and skeleton collision 2018-12-26 23:22:10 +01:00
Florian Rival
5a3d2cc2b9 Reduce iterations of polygon benchmark 2018-12-26 23:22:10 +01:00
Florian Rival
cb659eee6d Add pixel-perfect-platform-engine and update other examples 2018-12-26 23:22:10 +01:00
Florian Rival
0f24410a2e Fix platform engine 1-pixel offset bug
* "Bug" is fixed by ignoring edges when doing collision tests for
the platform engine.
* Also add an option to round coordinates and ensure pixel-perfect
alignement of characters on platforms (on by default)
* Also add an optional parameter to ignore edges when
doing a collision test (or when separating objects)
2018-12-26 23:22:10 +01:00
Todor Imreorov
a31ea1475d Add button to choose a new file for a resource in ResourcePropertiesEditor (#822) 2018-12-26 17:55:59 +01:00
Todor Imreorov
0cecf685ca Autoclose project manager when opening an editor (#826) 2018-12-26 14:36:49 +01:00
Florian Rival
f39af51fda Add benchmark for polygon collision test and add test runner for Firefox 2018-12-26 13:45:45 +01:00
Florian Rival
704eaacc7e Enable back all GDJS tests 2018-12-26 12:52:51 +01:00
Florian Rival
1f7bec0ff1 Add option to set scale mode ("sampling") of the game to nearest ("pixel-perfect") 2018-12-25 23:27:09 +01:00
Florian Rival
69ffa45ea9 Fix touch/mouse handling regression 2018-12-25 21:37:11 +01:00
Florian Rival
2558052a61 Fix visual artifacts when rendering rescaled games.
Artifacts where visible on rescaled games, especially when canvas
was small and the game pixel perfect. This was due to changing
Pixi renderer size instead of scaling the canvas.

For a perfect "pixel perfect" rendering, "image-rendering: pixelated"
would be needed on the canvas (to be added as a game settings)
(see for instance: https://gablaxian.com/articles/creating-a-game-with-javascript/scaling-the-canvas)
2018-12-25 18:15:27 +01:00
Florian Rival
abf40200cb Fix prettier for ExamplesInformation.js (auto-generated file) 2018-12-24 19:36:27 +01:00
Florian Rival
2fd4459364 Add 2 example for the new Physics Engine 2018-12-24 18:34:10 +01:00
Florian Rival
2ed9088b58 Fix lint warnings 2018-12-24 18:02:39 +01:00
Florian Rival
f69b9132ad Add test case for JSON array with numbers 2018-12-24 14:02:58 +01:00
Franco Maciel
fb7d3d589d Fix LShift key code (#823) 2018-12-24 13:19:08 +01:00
Franco Maciel
87acba5105 Fix JSON array parser separators (#819) 2018-12-23 19:17:36 +01:00
Franco Maciel
2d314ff51b Add New physics behavior (Physics2) (#775) 2018-12-23 00:15:25 +01:00
Florian Rival
5054678193 Fix functions list rendering and always shown functions in project manager 2018-12-22 23:44:25 +01:00
Todor Imreorov
aaf9d318a9 Add error color to resources with missing files (#818) 2018-12-22 22:52:34 +01:00
Florian Rival
cc92445d4c Update READMEs with more links/information/commands 2018-12-22 16:39:19 +01:00
Florian Rival
1649591442 Add check-format to check non prettified files and add it to TravisCI 2018-12-22 12:09:04 +01:00
Florian Rival
77faff3919 Upgrade Prettier and run Prettier on newIDE/app/src to fix some files 2018-12-22 11:41:50 +01:00
Florian Rival
873280d818 Fix tests after libGD.js update 2018-12-22 00:05:21 +01:00
Florian Rival
238b6a2a09 Fix un/serialization of JSON arrays by gd::Serializer 2018-12-21 21:02:13 +01:00
Florian Rival
98d0d5102e Bump newIDE version 2018-12-20 22:05:25 +00:00
Florian Rival
47818846e7 Fix Jfxr not opening 2018-12-20 21:56:27 +00:00
Florian Rival
8276eda243 Bump newIDE version 2018-12-20 17:51:36 +00:00
Todor Imreorov
ca2e00bd91 Add input for setting FPS for animation playback speed (#814) 2018-12-20 16:08:44 +00:00
Franco Maciel
6177b0197e Don't load AdMob ads if already loading/showing (#817) 2018-12-19 15:20:04 +00:00
Florian Rival
fb65b56cb7 Remove Submit Your Example button from web-app 2018-12-18 08:46:26 +00:00
Todor Imreorov
6f780f79e9 Add field to change time between frames to AnimationPreview (#811) 2018-12-18 08:44:29 +00:00
Florian Rival
d31f0793d5 Set default time between frames to 0.08 2018-12-18 08:14:20 +00:00
Todor Imreorov
88c88ad1eb Add menu item to remove all resources with invalid paths (#812) 2018-12-17 21:25:39 +00:00
Franco Maciel
4202e2672d Add actions to set Sprite size in pixels (#808) 2018-12-17 16:45:47 +00:00
Florian Rival
f29cc503bf Fix version number not properly applied to Android/Cordova builds
Fix #804
2018-12-16 13:58:26 +00:00
Florian Rival
1aa81949ce Fix AdMob extension not loaded in web-app 2018-12-16 12:56:30 +00:00
Florian Rival
4593f09131 Fix empty menu options shown in scene editor context menu 2018-12-16 12:49:47 +00:00
Florian Rival
782ea0e0af Fix right click in CodeEditor that could trigger the event context menu 2018-12-16 12:42:17 +00:00
Florian Rival
8e893e660b Add hint text on ObjectSelector 2018-12-16 12:28:51 +00:00
Florian Rival
384346c54e Fix horizontal scrollbar displayed in events + prettify EventsSheet.css 2018-12-16 12:25:04 +00:00
Florian Rival
df3920cce3 Fix link to help page for mouse action/conditions 2018-12-16 12:17:29 +00:00
Florian Rival
6e9ff4b682 Bump newIDE version 2018-12-11 21:26:07 +00:00
Todor Imreorov
df161c48fd Fix Piskel loading (#795)
Fix #792
2018-12-11 21:21:11 +00:00
Florian Rival
ee6a337e71 Bump the GDJS version used for web-app 2018-12-11 00:23:20 +00:00
Florian Rival
d5146a0c65 Bump newIDE version 2018-12-10 23:37:13 +00:00
Florian Rival
eae4683c4f Add plane-and-clouds and bouncing-ball-and-rope examples 2018-12-10 23:34:28 +00:00
Florian Rival
dec96a2f3a Add condition to check if Facebook Instant Games ads are supported 2018-12-10 23:22:44 +00:00
Florian Rival
9610eeb6e5 Add support for interstitial and reward video in Facebook Instant Games 2018-12-10 23:12:03 +00:00
Todor Imreorov
213cd0a8c7 Add options to locate/open/copy path of a resource in ResourcesList 2018-12-10 20:59:28 +00:00
Todor Imreorov
8a117c1813 Add support for Piskel layers (+scan/remove unused font/audio) (#731)
* Layers are stored as resource metadata (for single frame) or Direction metadata (for more than one frame). If metadata is detected, use it to load the frames with layers
* Add options to scan for fonts and remove unused audio and fonts.
2018-12-05 16:32:10 +00:00
Franco Maciel
73ff10bb1f Fix issue with draggable behavior when object is deleted while dragging (#779) 2018-12-01 15:40:39 +00:00
Franco Maciel
300efbbd5c Update forces pre-events, fixing issues like offsets in positioning (#776) 2018-11-30 19:18:30 +00:00
Florian Rival
2e240643a2 Make access to variables 50% faster 2018-11-28 23:12:07 +00:00
Florian Rival
aa16e90aac Fix potential memory corruption with JsCodeEvent (in GDevelop.js) 2018-11-28 22:15:58 +00:00
Florian Rival
137ffc2b84 Optimize and rename clearing to multiplier in gdjs.Force 2018-11-28 21:41:11 +00:00
Florian Rival
34b460e968 Fix typo 2018-11-28 21:41:11 +00:00
Florian Rival
30cb0bcfb3 Add forceMultiplier parameter type and add specific field for it in parameters 2018-11-28 21:41:11 +00:00
Florian Rival
1b7a667c79 Improve description of opacity and other actions/conditions 2018-11-25 19:55:20 +01:00
Florian Rival
9a4655eefc Improve conditions/actions to explain that opacity is in 0-255 range 2018-11-25 19:48:46 +01:00
Florian Rival
ca9a0d3d37 Prevent time between frames to be set too low or to 0 in SpriteEditor 2018-11-25 19:38:29 +01:00
Florian Rival
10d8d6c4a8 Make explicit when scene variables are being used in conditions/actions 2018-11-25 19:24:30 +01:00
Florian Rival
a7f4da8e40 Merge branch 'master' of github.com:4ian/GDevelop 2018-11-25 14:21:21 +01:00
Wend1go
40b3c688d1 Add 400% zoom option to scene editor (#768)
Ideal for pixelart games with 16x16px sprites
2018-11-25 14:15:52 +01:00
Florian Rival
fc340b9477 Add ColorExpressionField 2018-11-23 17:59:39 +00:00
Florian Rival
cc810b3e9f Fix empty icons in Cordova config.xml resulting in build failure 2018-11-21 22:25:06 +00:00
Florian Rival
7d165660a5 Fix rendering of ShapePainterRuntimeObject with absolute coordinates when far from camera
Fix #750
2018-11-21 00:31:37 +00:00
646 changed files with 120578 additions and 24088 deletions

View File

@@ -69,6 +69,7 @@ script:
- cd newIDE/app
- npm test
- npm run flow
- npm run check-format
- cd ../..
#GDJS game engine tests, disabled on Travis CI because ChromeHeadless can't be started.
#See them running on Semaphore-CI instead: https://semaphoreci.com/4ian/gd

View File

@@ -97,6 +97,7 @@
// Support for Flowtype:
"javascript.validate.enable": false,
"flow.useNPMPackagedFlow": true,
"flow.useLSP": false, // As we are in a monorepo, see https://github.com/flowtype/flow-for-vscode/issues/301
// Clang format styling (duplicated in scripts/CMakeClangUtils.txt)
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, BinPackParameters: false, BinPackArguments: false}"

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 B

View File

@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_create_folder.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/create_folder16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="-14.99721"
inkscape:cy="14.343353"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<path
style="opacity:1;fill:#80bbdb;fill-opacity:1;fill-rule:nonzero;stroke:#548dad;stroke-width:0.97142506;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 10.44448,1025.9309 c 0.65513,0 1.18165,0.5595 1.18165,1.2556 l 0,1.2733 16.256617,0 c 1.376723,0 2.484776,1.1774 2.484776,2.6403 l 0,13.0531 c 0,1.4629 -1.108053,2.6403 -2.484776,2.6403 l -23.7654964,0 c -1.3767228,0 -2.4847757,-1.1774 -2.4847757,-2.6403 l 0,-10.7551 0,-2.298 0,-3.9136 c 0,-0.6961 0.5265186,-1.2556 1.1816486,-1.2556 z"
id="rect4901"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscssssssccsss" />
<path
style="opacity:1;fill:#5fa1c7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 2.1084458,1031.4784 0,0.7321 0,11.4039 c 0,1.5514 1.0713447,2.7998 2.4024592,2.7998 l 22.978188,0 c 1.331114,0 2.40246,-1.2484 2.40246,-2.7998 l 0,-12.136 -27.7831072,0 z"
id="path4919"
inkscape:connector-curvature="0" />
<path
sodipodi:type="star"
style="opacity:1;fill:#d9db30;fill-opacity:1;fill-rule:nonzero;stroke:#bec021;stroke-width:1.38540256;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4939"
sodipodi:sides="5"
sodipodi:cx="24.252151"
sodipodi:cy="1028.8562"
sodipodi:r1="7.8899426"
sodipodi:r2="3.9449718"
sodipodi:arg1="0.79249024"
sodipodi:arg2="1.4208088"
inkscape:flatsided="false"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 29.791477,1034.4747 -4.949845,-1.7178 -4.221206,3.1037 0.104117,-5.2384 -4.256247,-3.0555 5.014193,-1.5197 1.590701,-4.9922 2.994825,4.2992 5.239353,-0.03 -3.163289,4.1767 z"
inkscape:transform-center-x="0.36431952"
inkscape:transform-center-y="-0.39846334" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

View File

@@ -0,0 +1,206 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_file_delete.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_file_delete32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="56.026486"
inkscape:cy="-2.8092946"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px"
inkscape:snap-grids="false">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4225"
transform="matrix(1.1128183,0,0,1.1128183,55.344213,-128.05315)">
<path
id="rect4177"
transform="translate(-9.5367432e-7,1020.3622)"
d="m -43.681641,13.882812 c -0.563451,0 -1.017578,0.452174 -1.017578,1.015626 l 0,22.210937 c 0,0.563451 0.454127,1.015625 1.017578,1.015625 l 16.652344,0 c 0.563451,0 1.017578,-0.452174 1.017578,-1.015625 l 0,-15.246094 -6.05664,-7.980469 -11.613282,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m -31.837816,1034.2449 0,7.043 c 0,0.3498 0.283047,0.6328 0.632812,0.6328 l 5.19336,0 -5.826172,-7.6758 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<rect
style="opacity:1;fill:#a6a6a6;fill-opacity:1;fill-rule:nonzero;stroke:#5a5a5a;stroke-width:0.99999934;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4158"
width="8.9121208"
height="8.7162371"
x="10.293939"
y="1038.0229" />
<rect
style="opacity:1;fill:#a6a6a6;fill-opacity:1;fill-rule:nonzero;stroke:#5a5a5a;stroke-width:0.99999934;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4160"
width="8.9631233"
height="2.6948419"
x="-516.44586"
y="897.6803"
inkscape:transform-center-x="-3.1829089"
inkscape:transform-center-y="-3.4427076"
transform="matrix(0.86246101,-0.50612351,0.50612351,0.86246101,0,0)" />
<rect
y="1044.6921"
x="8.1238213"
height="1.985044"
width="2.0916421"
id="rect4162"
style="opacity:1;fill:#a6a6a6;fill-opacity:1;fill-rule:nonzero;stroke:#5a5a5a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 B

View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_file.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_file16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="-51.539982"
inkscape:cy="23.000437"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4225"
transform="matrix(1.1128183,0,0,1.1128183,55.344213,-128.05315)">
<path
id="rect4177"
transform="translate(-9.5367432e-7,1020.3622)"
d="m -43.681641,13.882812 c -0.563451,0 -1.017578,0.452174 -1.017578,1.015626 l 0,22.210937 c 0,0.563451 0.454127,1.015625 1.017578,1.015625 l 16.652344,0 c 0.563451,0 1.017578,-0.452174 1.017578,-1.015625 l 0,-15.246094 -6.05664,-7.980469 -11.613282,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m -31.837816,1034.2449 0,7.043 c 0,0.3498 0.283047,0.6328 0.632812,0.6328 l 5.19336,0 -5.826172,-7.6758 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 B

View File

@@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_folder.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_folder16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="3.5385856"
inkscape:cy="13.013876"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<path
style="opacity:1;fill:#80bbdb;fill-opacity:1;fill-rule:nonzero;stroke:#548dad;stroke-width:0.97142506;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 10.44448,1025.9309 c 0.65513,0 1.18165,0.5595 1.18165,1.2556 l 0,1.2733 16.256617,0 c 1.376723,0 2.484776,1.1774 2.484776,2.6403 l 0,13.0531 c 0,1.4629 -1.108053,2.6403 -2.484776,2.6403 l -23.7654964,0 c -1.3767228,0 -2.4847757,-1.1774 -2.4847757,-2.6403 l 0,-10.7551 0,-2.298 0,-3.9136 c 0,-0.6961 0.5265186,-1.2556 1.1816486,-1.2556 z"
id="rect4901"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscssssssccsss" />
<path
style="opacity:1;fill:#5fa1c7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 2.1084458,1031.4784 0,0.7321 0,11.4039 c 0,1.5514 1.0713447,2.7998 2.4024592,2.7998 l 22.978188,0 c 1.331114,0 2.40246,-1.2484 2.40246,-2.7998 l 0,-12.136 -27.7831072,0 z"
id="path4919"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

View File

@@ -0,0 +1,203 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_load_file.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_load_file16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="-15.256846"
inkscape:cy="-4.5327826"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4206">
<path
id="rect4177"
d="m 6.7344825,1022.8736 c -0.6270186,0 -1.1323794,0.5032 -1.1323794,1.1303 l 0,24.7167 c 0,0.627 0.5053608,1.1302 1.1323794,1.1302 l 18.5310335,0 c 0.627018,0 1.132379,-0.5032 1.132379,-1.1302 l 0,-16.9661 -6.73994,-8.8809 -12.9234725,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m 19.914509,1022.8735 0,7.8376 c 0,0.3892 0.31498,0.7042 0.704204,0.7042 l 5.779267,0 -6.483471,-8.5418 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
id="g4202"
transform="translate(-0.22767735,0)">
<ellipse
style="opacity:1;fill:#d4d68c;fill-opacity:1;fill-rule:nonzero;stroke:#c8cb6c;stroke-width:0.69685775;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4194"
cx="16.227676"
cy="1044.2556"
rx="7.8167491"
ry="1.7860432" />
<ellipse
ry="0.47607893"
rx="3.9621422"
cy="1044.1664"
cx="16.227676"
id="ellipse4198"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.45964342;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="fill:#368fac;fill-opacity:1;fill-rule:evenodd;stroke:#2b7188;stroke-width:0.81720334;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.999999,1032.9608 -4.451864,5.7416 2.225932,0 0,5.1577 4.451864,0 0,-5.1577 2.225932,0 z"
id="path4210"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,189 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_path_exists.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_path_exists16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="3.5385856"
inkscape:cy="13.013876"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<path
style="opacity:1;fill:#80bbdb;fill-opacity:1;fill-rule:nonzero;stroke:#548dad;stroke-width:0.97142506;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 10.44448,1025.9309 c 0.65513,0 1.18165,0.5595 1.18165,1.2556 l 0,1.2733 16.256617,0 c 1.376723,0 2.484776,1.1774 2.484776,2.6403 l 0,13.0531 c 0,1.4629 -1.108053,2.6403 -2.484776,2.6403 l -23.7654964,0 c -1.3767228,0 -2.4847757,-1.1774 -2.4847757,-2.6403 l 0,-10.7551 0,-2.298 0,-3.9136 c 0,-0.6961 0.5265186,-1.2556 1.1816486,-1.2556 z"
id="rect4901"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscssssssccsss" />
<path
style="opacity:1;fill:#5fa1c7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 2.1084458,1031.4784 0,0.7321 0,11.4039 c 0,1.5514 1.0713447,2.7998 2.4024592,2.7998 l 22.978188,0 c 1.331114,0 2.40246,-1.2484 2.40246,-2.7998 l 0,-12.136 -27.7831072,0 z"
id="path4919"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:33.25431824px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#9b80db;fill-opacity:1;stroke:#6e6f5e;stroke-width:1.19503343;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="5.8434677"
y="1048.4673"
id="text4229"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4231"
x="5.8434677"
y="1048.4673"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, ';fill:#9b80db;fill-opacity:1;stroke:#6e6f5e;stroke-width:1.19503343;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">?</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,203 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_save_file.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_save_file32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="30.546725"
inkscape:cy="-3.8184969"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4206">
<path
id="rect4177"
d="m 6.7344825,1022.8736 c -0.6270186,0 -1.1323794,0.5032 -1.1323794,1.1303 l 0,24.7167 c 0,0.627 0.5053608,1.1302 1.1323794,1.1302 l 18.5310335,0 c 0.627018,0 1.132379,-0.5032 1.132379,-1.1302 l 0,-16.9661 -6.73994,-8.8809 -12.9234725,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m 19.914509,1022.8735 0,7.8376 c 0,0.3892 0.31498,0.7042 0.704204,0.7042 l 5.779267,0 -6.483471,-8.5418 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
id="g4202"
transform="translate(-0.22767735,0)">
<ellipse
style="opacity:1;fill:#d4d68c;fill-opacity:1;fill-rule:nonzero;stroke:#c8cb6c;stroke-width:0.69685775;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4194"
cx="16.227676"
cy="1044.2556"
rx="7.8167491"
ry="1.7860432" />
<ellipse
ry="0.47607893"
rx="3.9621422"
cy="1044.1664"
cx="16.227676"
id="ellipse4198"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.45964342;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="fill:#6aac36;fill-opacity:1;fill-rule:evenodd;stroke:#54882b;stroke-width:0.81720334;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.999999,1043.6019 -4.451864,-5.7416 2.225932,0 0,-5.1577 4.451864,0 0,5.1577 2.225932,0 z"
id="path4210"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 899 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 898 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="take_screenshot.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/take_screenshot16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6933"
is_visible="true"
pattern="m -9.5367432e-7,1025.3622 c 0,-2.76 2.23999995367432,-5 4.99999995367432,-5 2.76,0 5,2.24 5,5 0,2.76 -2.24,5 -5,5 -2.76,0 -4.99999995367432,-2.24 -4.99999995367432,-5 z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313709"
inkscape:cx="0.48062283"
inkscape:cy="15.066705"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#535353;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4139"
width="31.889814"
height="20.333548"
x="0.055091862"
y="1026.1954"
ry="2.8092401" />
<circle
style="opacity:1;fill:#8c8c8c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4208"
cx="15.999999"
cy="1038.0809"
r="6.34375" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4210"
width="5.0598979"
height="5.2740483"
x="2.8781402"
y="1028.0603"
ry="2.6370242" />
<rect
style="opacity:1;fill:#535353;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4212"
width="11.124999"
height="4.3597975"
x="19.03125"
y="1023.6198"
ry="1.2027028" />
<rect
ry="0.59375"
y="1024.6122"
x="20.748579"
height="2.375"
width="7.6903405"
id="rect4214"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<circle
r="4.75"
cy="1038.0809"
cx="15.999999"
id="circle4216"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -257,7 +257,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddAction("PlaySound",
_("Play a sound"),
_("Play a sound."),
_("Play the sound _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_)"),
_("Play the sound _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_"),
_("Audio"),
"res/actions/son24.png",
"res/actions/son.png")
@@ -276,7 +276,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddAction("PlayMusic",
_("Play a music file"),
_("Play a music file."),
_("Play the music _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_)"),
_("Play the music _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_"),
_("Audio"),
"res/actions/music24.png",
"res/actions/music.png")

View File

@@ -176,27 +176,28 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddCodeOnlyParameter("currentScene", "")
.MarkAsAdvanced();
obj.AddAction("AddForceXY",
_("Add a force"),
_("Add a force to an object. The object will move according to "
"all of the forces it has."),
_("Add to _PARAM0_ a force of _PARAM1_ p/s on X axis and "
"_PARAM2_ p/s on Y axis"),
_("Movement"),
"res/actions/force24.png",
"res/actions/force.png")
obj.AddAction(
"AddForceXY",
_("Add a force"),
_("Add a force to an object. The object will move according to "
"all of the forces it has."),
_("Add to _PARAM0_ _PARAM3_ force of _PARAM1_ p/s on X axis and "
"_PARAM2_ p/s on Y axis"),
_("Movement"),
"res/actions/force24.png",
"res/actions/force.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Speed on X axis (in pixels per second)"))
.AddParameter("expression", _("Speed on Y axis (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"));
.AddParameter("forceMultiplier", _("Force multiplier"));
obj.AddAction("AddForceAL",
_("Add a force (angle)"),
_("Add a force to an object. The object will move according to "
"all of the forces it has. This action creates the force "
"using the specified angle and length."),
_("Add to _PARAM0_ a force, angle: _PARAM1_ degrees and "
_("Add to _PARAM0_ _PARAM3_ force, angle: _PARAM1_ degrees and "
"length: _PARAM2_ pixels"),
_("Movement"),
"res/actions/force24.png",
@@ -205,14 +206,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction(
"AddForceVersPos",
_("Add a force to move toward a position"),
_("Add a force to an object to make it move toward a position."),
_("Move _PARAM0_ to _PARAM1_;_PARAM2_ with a force of _PARAM3_ "
_("Move _PARAM0_ to _PARAM1_;_PARAM2_ with _PARAM4_ force of _PARAM3_ "
"pixels"),
_("Movement"),
"res/actions/force24.png",
@@ -222,7 +223,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("X position"))
.AddParameter("expression", _("Y position"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction(
@@ -243,13 +244,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("Y position of the center"))
.AddParameter("expression", _("Speed (in Degrees per seconds)"))
.AddParameter("expression", _("Distance (in pixels)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.SetHidden();
obj.AddAction("Arreter",
_("Stop the object"),
_("Stop the object by deleting all of its forces."),
_("Stop the object _PARAM0_"),
_("Stop object _PARAM0_"),
_("Movement"),
"res/actions/arreter24.png",
"res/actions/arreter.png")
@@ -272,7 +273,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddAction("ChangePlan",
_("Z order"),
_("Modify the Z-order of an object"),
_("Do _PARAM1__PARAM2_ to z-Order of _PARAM0_"),
_("Do _PARAM1__PARAM2_ to Z-order of _PARAM0_"),
_("Z order"),
"res/actions/planicon24.png",
"res/actions/planicon.png")
@@ -551,18 +552,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("yesorno", _("Activate?"))
.MarkAsAdvanced();
obj.AddAction("AddForceVers",
_("Add a force to move toward an object"),
_("Add a force to an object to make it move toward another."),
_("Move _PARAM0_ to _PARAM1_ with a force of _PARAM2_ pixels"),
_("Movement"),
"res/actions/forceVers24.png",
"res/actions/forceVers.png")
obj.AddAction(
"AddForceVers",
_("Add a force to move toward an object"),
_("Add a force to an object to make it move toward another."),
_("Move _PARAM0_ to _PARAM1_ with _PARAM3_ force of _PARAM2_ pixels"),
_("Movement"),
"res/actions/forceVers24.png",
"res/actions/forceVers.png")
.AddParameter("object", _("Object"))
.AddParameter("objectPtr", _("Target Object"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction(
@@ -582,7 +584,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectPtr", _("Rotate around this object"))
.AddParameter("expression", _("Speed (in degrees per second)"))
.AddParameter("expression", _("Distance (in pixels)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction("MettreAutour",
@@ -640,6 +642,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectList", _("Objects"))
.AddParameter("yesorno",
_("Ignore objects that are touching each other on their "
"edges, but are not overlapping (default: no)"),
"",
true)
.SetDefaultValue("no")
.MarkAsSimple();
obj.AddCondition("CollisionPoint",
@@ -654,13 +662,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("Y position of the point"))
.MarkAsSimple();
obj.AddCondition("ObjectTimer",
_("Value of a timer"),
_("Test the elapsed time of a timer."),
_("The timer _PARAM1_ of _PARAM0_ is greater than _PARAM2_ seconds"),
_("Timers"),
"res/conditions/timer24.png",
"res/conditions/timer.png")
obj.AddCondition(
"ObjectTimer",
_("Value of a timer"),
_("Test the elapsed time of a timer."),
_("The timer _PARAM1_ of _PARAM0_ is greater than _PARAM2_ seconds"),
_("Timers"),
"res/conditions/timer24.png",
"res/conditions/timer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("expression", _("Time in seconds"));
@@ -863,10 +872,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectvar", _("Variable"));
obj.AddExpression("ObjectTimerElapsedTime",
_("Timer value"),
_("Value of a timer"),
_("Timers"),
"res/actions/time.png")
_("Timer value"),
_("Value of a timer"),
_("Timers"),
"res/actions/time.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"));
@@ -1046,6 +1055,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectList", _("Object"))
.AddParameter("objectList", _("Object"))
.AddCodeOnlyParameter("conditionInverted", "")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("yesorno",
_("Ignore objects that are touching each other on their "
"edges, but are not overlapping (default: no)"),
"",
true)
.SetDefaultValue("no")
.MarkAsSimple();
extension

View File

@@ -13,9 +13,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
gd::PlatformExtension& extension) {
extension
.SetExtensionInformation("BuiltinFile",
_("Storage and files"),
_("Storage"),
_("Built-in extension providing functions "
"to store data and manipulate files."),
"to store data."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/storage");
@@ -26,55 +26,55 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"GroupExists",
_("Existence of a group"),
_("Check if an element (example : PlayerState/CurrentLevel) exists "
"in the file.\nSpaces are forbidden in element names."),
_("_PARAM1_ exists in file _PARAM0_"),
"in the stored data.\nSpaces are forbidden in element names."),
_("_PARAM1_ exists in storage _PARAM0_"),
_("Storage"),
"res/conditions/fichier24.png",
"res/conditions/fichier.png")
.AddParameter("file", _("Filename"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.MarkAsAdvanced();
extension
.AddAction(
"LoadFile",
_("Load a structured file in memory"),
_("This action loads the structured file in memory, so you can write "
"and read it.\nYou can open and write without using this action, "
"but it will be slower.\nIf you use this action, do not forget to "
"unload the file from memory.\n\nFor the native platform, the file "
"format is XML."),
_("Load structured file _PARAM0_ in memory"),
_("Load a storage in memory"),
_("This action loads the specified storage in memory, so you can "
"write and read it.\nYou can open and write without using this "
"action, but it will be slower.\nIf you use this action, do not "
"forget to unload the storage from memory."),
_("Load storage _PARAM0_ in memory"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.MarkAsAdvanced();
extension
.AddAction("UnloadFile",
_("Close a structured file"),
_("This action closes the structured file previously loaded "
_("Close a storage"),
_("This action closes the structured data previously loaded "
"in memory, saving all changes made."),
_("Close structured file _PARAM0_"),
_("Close structured data _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.MarkAsAdvanced();
extension
.AddAction("EcrireFichierExp",
_("Write a value"),
_("Write the result of the expression in the file, in the "
"specified element.\nSpecify the structure leading to the "
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of file _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddAction(
"EcrireFichierExp",
_("Write a value"),
_("Write the result of the expression in the stored data, in the "
"specified element.\nSpecify the structure leading to the "
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of storage _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddParameter("expression", _("Expression"));
@@ -82,14 +82,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
.AddAction(
"EcrireFichierTxt",
_("Write a text"),
_("Write the text in the file, in the specified element.\nSpecify "
_("Write the text in the specified storage, in the specified "
"element.\nSpecify "
"the structure leading to the element using / (example : "
"Root/Level/Current)\nSpaces are forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of file _PARAM0_"),
_("Write _PARAM2_ in _PARAM1_ of storage _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddParameter("string", _("Text"));
@@ -101,11 +102,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"variable.\nSpecify the structure leading to the element using / "
"(example : Root/Level/Current)\nSpaces are forbidden in element "
"names."),
_("Read _PARAM1_ from file _PARAM0_ and store value in _PARAM3_"),
_("Read _PARAM1_ from storage _PARAM0_ and store value in _PARAM3_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("scenevar", _("Scene variables"));
@@ -118,11 +119,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"variable.\nSpecify the structure leading to the element using / "
"(example : Root/Level/Current)\nSpaces are forbidden in element "
"names."),
_("Read _PARAM1_ from file _PARAM0_ and store as text in _PARAM3_"),
_("Read _PARAM1_ from storage _PARAM0_ and store as text in "
"_PARAM3_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("scenevar", _("Scene variables"));
@@ -131,36 +133,37 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
.AddAction("DeleteGroupFichier",
_("Delete an element"),
_("This action deletes the specified element from the "
"structured file.\nSpecify the structure leading to the "
"specified storage.\nSpecify the structure leading to the "
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Delete _PARAM1_ from the file _PARAM0_"),
_("Delete _PARAM1_ from storage _PARAM0_"),
_("Storage"),
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("file", _("Filename"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.MarkAsAdvanced();
extension
.AddAction("DeleteFichier",
_("Delete a file"),
_("Delete the file."),
_("Delete the file _PARAM0_"),
_("Files"),
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("file", _("Filename"));
.AddAction(
"DeleteFichier",
_("Clear a storage"),
_("Clear the specified storage, removing all data saved in it."),
_("Delete storage _PARAM0_"),
_("Storage"),
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("string", _("Storage name"));
extension
.AddCondition("FileExists",
_("A file exists"),
_("Test if the file exists."),
_("File _PARAM0_ exists"),
_("Files"),
_("A storage exists"),
_("Test if the specified storage exists."),
_("Storage _PARAM0_ exists"),
_("Storage"),
"res/conditions/fichier24.png",
"res/conditions/fichier.png")
.AddParameter("file", _("Filename"))
.AddParameter("string", _("Storage name"))
.MarkAsAdvanced();
extension

View File

@@ -18,7 +18,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Built-in extension that enables the use of a mouse"),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/events/mouse-touch");
.SetExtensionHelpPath("/all-features/mouse-touch");
#if defined(GD_IDE_ONLY)
extension

View File

@@ -15,7 +15,7 @@ using namespace std;
namespace gd {
Direction::Direction() : loop(false), timeBetweenFrame(1) {}
Direction::Direction() : loop(false), timeBetweenFrame(0.08) {}
Direction::~Direction(){};

View File

@@ -17,7 +17,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
extension
.SetExtensionInformation("Sprite",
_("Sprite"),
_("Sprite are animated object which can be used for most elements of a game."),
_("Sprite are animated object which can be used "
"for most elements of a game."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/objects/sprite");
@@ -30,8 +31,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
#if defined(GD_IDE_ONLY)
obj.AddAction("Opacity",
_("Change object's opacity"),
_("Change the opacity of an object."),
_("Change Sprite opacity"),
_("Change the opacity of a Sprite. 0 is fully transparent, 255 "
"is opaque (default)."),
_("Do _PARAM1__PARAM2_ to the opacity of _PARAM0_"),
_("Visibility"),
"res/actions/opacity24.png",
@@ -39,7 +41,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("operator", _("Modification's sign"))
.AddParameter("expression", _("Value"))
.AddParameter("expression", _("Value (between 0 and 255)"))
.MarkAsSimple()
.SetManipulatedType("number");
@@ -198,6 +200,34 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.MarkAsAdvanced()
.SetManipulatedType("number");
obj.AddAction("ChangeWidth",
_("Width"),
_("Change the width of a Sprite object."),
_("Do _PARAM1__PARAM2_ to the width of _PARAM0_"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("operator", _("Modification's sign"))
.AddParameter("expression", _("Value"))
.MarkAsAdvanced()
.SetManipulatedType("number");
obj.AddAction("ChangeHeight",
_("Height"),
_("Change the height of a Sprite object."),
_("Do _PARAM1__PARAM2_ to the height of _PARAM0_"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("operator", _("Modification's sign"))
.AddParameter("expression", _("Value"))
.MarkAsAdvanced()
.SetManipulatedType("number");
obj.AddCondition(
"Animation",
_("Current animation"),
@@ -309,8 +339,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
obj.AddCondition("Opacity",
_("Opacity"),
_("Compare the opacity of an object, between 0 (fully "
"transparent) to 255 (opaque)"),
_("Compare the opacity of a Sprite, between 0 (fully "
"transparent) to 255 (opaque)."),
_("The opacity of _PARAM0_ is _PARAM1__PARAM2_"),
_("Visibility"),
"res/conditions/opacity24.png",

View File

@@ -23,9 +23,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
#if defined(GD_IDE_ONLY)
extension
.AddCondition("VarScene",
_("Value of a variable"),
_("Value of a scene variable"),
_("Compare the value of a scene variable."),
_("Variable _PARAM0_ is _PARAM1__PARAM2_"),
_("Scene variable _PARAM0_ is _PARAM1__PARAM2_"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -36,9 +36,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("VarSceneTxt",
_("Text of a variable"),
_("Text of a scene variable"),
_("Compare the text of a scene variable."),
_("The text of variable _PARAM0_ is _PARAM1__PARAM2_"),
_("The text of scene variable _PARAM0_ is _PARAM1__PARAM2_"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -51,8 +51,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddCondition(
"VariableChildExists",
_("Child existence"),
_("Return true if the specified child of the variable exists."),
_("Child _PARAM1_ of variable _PARAM0_ exists"),
_("Return true if the specified child of the scene variable exists."),
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
_("Variables/Structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -76,8 +76,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("VarSceneDef",
_("Test if a scene variable is defined"),
_("Test if the scene variable exist."),
_("Variable _PARAM0_ is defined"),
_("Test if the scene variable exists."),
_("Scene variable _PARAM0_ is defined"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -129,9 +129,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("ModVarScene",
_("Value of a variable"),
_("Value of a scene variable"),
_("Modify the value of a scene variable."),
_("Do _PARAM1__PARAM2_ to variable _PARAM0_"),
_("Do _PARAM1__PARAM2_ to scene variable _PARAM0_"),
_("Variables"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -142,9 +142,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("ModVarSceneTxt",
_("String of a variable"),
_("String of a scene variable"),
_("Modify the text of a scene variable."),
_("Do _PARAM1__PARAM2_ to the text of variable _PARAM0_"),
_("Do _PARAM1__PARAM2_ to the text of scene variable _PARAM0_"),
_("Variables"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -185,8 +185,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("VariableRemoveChild",
_("Remove a child"),
_("Remove a child from a variable."),
_("Remove child _PARAM1_ from variable _PARAM0_"),
_("Remove a child from a scene variable."),
_("Remove child _PARAM1_ from scene variable _PARAM0_"),
_("Variables/Structure"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -208,9 +208,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("VariableClearChildren",
_("Clear variable"),
_("Remove all the children from the variable."),
_("Clear children from variable _PARAM0_"),
_("Clear scene variable"),
_("Remove all the children from the scene variable."),
_("Clear children from scene variable _PARAM0_"),
_("Variables/Structure"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -230,7 +230,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("GlobalVariableChildCount",
_("Global variable number of children"),
_("Number of children of a global variable"),
_("Get the number of children of a global variable"),
_("Variables"),
"res/actions/var.png")
@@ -238,7 +238,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("VariableChildCount",
_("Scene variable number of children"),
_("Number of children of a scene variable"),
_("Get the number of children of a scene variable"),
_("Variables"),
"res/actions/var.png")
@@ -246,15 +246,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("Variable",
_("Scene variables"),
_("Scene variables"),
_("Value of a scene variable"),
_("Value of a scene variable"),
_("Variables"),
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
extension
.AddStrExpression("VariableString",
_("Scene variables"),
_("Text of a scene variable"),
_("Text of a scene variable"),
_("Variables"),
"res/actions/var.png")
@@ -262,15 +262,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("GlobalVariable",
_("Global variables"),
_("Global variable"),
_("Value of a global variable"),
_("Value of a global variable"),
_("Variables"),
"res/actions/var.png")
.AddParameter("globalvar", _("Name of the global variable"));
extension
.AddStrExpression("GlobalVariableString",
_("Global variables"),
_("Text of a global variable"),
_("Text of a global variable"),
_("Variables"),
"res/actions/var.png")

View File

@@ -54,17 +54,19 @@ class GD_CORE_API ParameterMetadata {
/**
* \brief Return the name of the parameter.
*
*
* Name is optional, and won't be filled for most parameters of extensions.
* It is useful when generating a function from events, where parameters must be named.
* It is useful when generating a function from events, where parameters must
* be named.
*/
const gd::String &GetName() const { return name; }
/**
* \brief Set the name of the parameter.
*
*
* Name is optional, and won't be filled for most parameters of extensions.
* It is useful when generating a function from events, where parameters must be named.
* It is useful when generating a function from events, where parameters must
* be named.
*/
ParameterMetadata &SetName(const gd::String &name_) {
name = name_;
@@ -159,7 +161,8 @@ class GD_CORE_API ParameterMetadata {
static bool IsExpression(const gd::String &type,
const gd::String &parameterType) {
if (type == "number") {
return parameterType == "expression" || parameterType == "camera";
return parameterType == "expression" || parameterType == "camera" ||
parameterType == "forceMultiplier";
} else if (type == "string") {
return parameterType == "string" || parameterType == "layer" ||
parameterType == "color" || parameterType == "file" ||
@@ -174,12 +177,12 @@ class GD_CORE_API ParameterMetadata {
/**
* \brief Serialize the ParameterMetadata to the specified element
*/
void SerializeTo(gd::SerializerElement& element) const;
void SerializeTo(gd::SerializerElement &element) const;
/**
* \brief Load the ParameterMetadata from the specified element
*/
void UnserializeFrom(const gd::SerializerElement& element);
void UnserializeFrom(const gd::SerializerElement &element);
///@}
// TODO: Deprecated public fields. Any direct using should be moved to
@@ -193,8 +196,9 @@ class GD_CORE_API ParameterMetadata {
///< i.e. must not be shown in editor
gd::String defaultValue; ///< Used as a default value in editor or if an
///< optional parameter is empty.
private:
gd::String name; ///< The name of the parameter to be used in code generation. Optional.
private:
gd::String name; ///< The name of the parameter to be used in code
///< generation. Optional.
};
/**
@@ -219,9 +223,7 @@ class GD_CORE_API InstructionMetadata {
const gd::String &GetDescription() const { return description; }
const gd::String &GetSentence() const { return sentence; }
const gd::String &GetGroup() const { return group; }
ParameterMetadata &GetParameter(size_t i) {
return parameters[i];
}
ParameterMetadata &GetParameter(size_t i) { return parameters[i]; }
const ParameterMetadata &GetParameter(size_t i) const {
return parameters[i];
}

View File

@@ -19,7 +19,7 @@ class GD_CORE_API PropertyDescriptor {
* value. \param propertyValue The value of the property.
*/
PropertyDescriptor(gd::String propertyValue)
: currentValue(propertyValue), type("string") {}
: currentValue(propertyValue), type("string"), label("") {}
/**
* \brief Empty constructor creating an empty property to be displayed.
@@ -51,6 +51,14 @@ class GD_CORE_API PropertyDescriptor {
return *this;
}
/**
* \brief Change the label displayed in the property grid.
*/
PropertyDescriptor& SetLabel(gd::String label_) {
label = label_;
return *this;
}
/**
* \brief Add an information about the property.
* \note The information are arbitrary and are interpreted by the class
@@ -65,6 +73,7 @@ class GD_CORE_API PropertyDescriptor {
const gd::String& GetValue() const { return currentValue; }
const gd::String& GetType() const { return type; }
const gd::String& GetLabel() const { return label; }
const std::vector<gd::String>& GetExtraInfo() const {
return extraInformation;
}
@@ -74,6 +83,7 @@ class GD_CORE_API PropertyDescriptor {
gd::String
type; ///< The type of the property. This is arbitrary and interpreted by
///< the class responsible for updating the property grid.
gd::String label; //< The user-friendly property name
std::vector<gd::String>
extraInformation; ///< Can be used to store for example the available
///< choices, if a property is a displayed as a combo

View File

@@ -22,8 +22,8 @@
#include "GDCore/IDE/PlatformManager.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/IDE/wxTools/SafeYield.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/ChangesNotifier.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/ExternalLayout.h"
#include "GDCore/Project/ImageManager.h"
@@ -73,6 +73,7 @@ Project::Project()
maxFPS(60),
minFPS(10),
verticalSync(false),
scaleMode("linear"),
sizeOnStartupMode("adaptWidth"),
imageManager(std::make_shared<ImageManager>())
#if defined(GD_IDE_ONLY)
@@ -636,6 +637,7 @@ void Project::UnserializeFrom(const SerializerElement& element) {
propElement.GetChild("minFPS", 0, "FPSmin").GetValue().GetInt());
SetVerticalSyncActivatedByDefault(
propElement.GetChild("verticalSync").GetValue().GetBool());
SetScaleMode(propElement.GetStringAttribute("scaleMode", "linear"));
SetSizeOnStartupMode(propElement.GetStringAttribute("sizeOnStartupMode", ""));
#if defined(GD_IDE_ONLY)
SetAuthor(propElement.GetChild("author", 0, "Auteur").GetValue().GetString());
@@ -913,6 +915,7 @@ void Project::SerializeTo(SerializerElement& element) const {
propElement.AddChild("minFPS").SetValue(GetMinimumFPS());
propElement.AddChild("verticalSync")
.SetValue(IsVerticalSynchronizationEnabledByDefault());
propElement.SetAttribute("scaleMode", scaleMode);
propElement.SetAttribute("sizeOnStartupMode", sizeOnStartupMode);
propElement.SetAttribute("projectFile", gameFile);
propElement.SetAttribute("folderProject", folderProject);
@@ -1006,9 +1009,9 @@ gd::String Project::GetBadObjectNameWarning() {
}
void Project::ExposeResources(gd::ArbitraryResourceWorker& worker) {
// See also gd::WholeProjectRefactorer::ExposeProjectEvents for a method that traverse the whole
// project (this time for events).
// Ideally, this method could be moved outside of gd::Project.
// See also gd::WholeProjectRefactorer::ExposeProjectEvents for a method that
// traverse the whole project (this time for events). Ideally, this method
// could be moved outside of gd::Project.
// Add project resources
worker.ExposeResources(&GetResourcesManager());
@@ -1033,7 +1036,8 @@ void Project::ExposeResources(gd::ArbitraryResourceWorker& worker) {
// Add events functions extensions resources
for (std::size_t e = 0; e < GetEventsFunctionsExtensionsCount(); e++) {
auto& eventsFunctionsExtension = GetEventsFunctionsExtension(e);
for (auto&& eventsFunction : eventsFunctionsExtension.GetEventsFunctions()) {
for (auto&& eventsFunction :
eventsFunctionsExtension.GetEventsFunctions()) {
LaunchResourceWorkerOnEvents(*this, eventsFunction->GetEvents(), worker);
}
}
@@ -1248,6 +1252,7 @@ void Project::Init(const gd::Project& game) {
maxFPS = game.maxFPS;
minFPS = game.minFPS;
verticalSync = game.verticalSync;
scaleMode = game.scaleMode;
sizeOnStartupMode = game.sizeOnStartupMode;
#if defined(GD_IDE_ONLY)

View File

@@ -125,7 +125,7 @@ class GD_CORE_API Project : public ObjectsContainer {
adMobAppId = adMobAppId_;
};
/**
/**
* \brief Get the project AdMob application ID.
*/
const gd::String& GetAdMobAppId() const { return adMobAppId; }
@@ -268,6 +268,16 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
void SetVerticalSyncActivatedByDefault(bool enable) { verticalSync = enable; }
/**
* Return the scale mode used by the game (usually "linear" or "nearest").
*/
const gd::String& GetScaleMode() const { return scaleMode; }
/**
* Set the scale mode used by the game (usually "linear" or "nearest").
*/
void SetScaleMode(const gd::String& scaleMode_) { scaleMode = scaleMode_; }
/**
* Return a reference to the vector containing the names of extensions used by
* the project.
@@ -816,7 +826,7 @@ class GD_CORE_API Project : public ObjectsContainer {
* resources, sometimes update their filename or any other work or resources.
*
* See WholeProjectRefactorer for the same thing for events.
*
*
* \see WholeProjectRefactorer
* \see ArbitraryResourceWorker
*/
@@ -948,6 +958,7 @@ class GD_CORE_API Project : public ObjectsContainer {
unsigned int minFPS; ///< Minimum Frame Per Seconds ( slow down game if FPS
///< are below this number )
bool verticalSync; ///< If true, must activate vertical synchronization.
gd::String scaleMode;
gd::String
sizeOnStartupMode; ///< How to adapt the game size to the screen. Can be
///< "adaptWidth", "adaptHeight" or empty
@@ -976,7 +987,7 @@ class GD_CORE_API Project : public ObjectsContainer {
gd::String packageName; ///< Game package name
gd::String orientation; ///< Lock game orientation (on mobile devices).
///< "default", "landscape" or "portrait".
gd::String adMobAppId; ///< AdMob application ID.
gd::String adMobAppId; ///< AdMob application ID.
bool
folderProject; ///< True if folder project, false if single file project.
gd::String gameFile; ///< File of the game

View File

@@ -193,7 +193,7 @@ gd::String ValueToJSON(const SerializerValue& val) {
gd::String Serializer::ToJSON(const SerializerElement& element) {
if (element.IsValueUndefined()) {
if (!element.ConsideredAsArrayOf().empty()) {
if (element.ConsideredAsArray()) {
// Store the element as an array in JSON:
gd::String str = "[";
bool firstChild = true;
@@ -201,7 +201,9 @@ gd::String Serializer::ToJSON(const SerializerElement& element) {
if (element.GetAllAttributes().size() > 0) {
std::cout
<< "WARNING: A SerializerElement is considered as an array of "
<< element.ConsideredAsArrayOf()
<< (element.ConsideredAsArrayOf().empty()
? "[unnamed elements]"
: element.ConsideredAsArrayOf())
<< " but has attributes. These attributes won't be saved!"
<< std::endl;
}
@@ -215,9 +217,11 @@ gd::String Serializer::ToJSON(const SerializerElement& element) {
if (children[i].first != element.ConsideredAsArrayOf()) {
std::cout
<< "WARNING: A SerializerElement is considered as an array of "
<< element.ConsideredAsArrayOf() << " but has a children called "
<< children[i].first << ". This children won't be saved!"
<< std::endl;
<< (element.ConsideredAsArrayOf().empty()
? "[unnamed elements]"
: element.ConsideredAsArrayOf())
<< " but has a child called \"" << children[i].first
<< "\". This child won't be saved!" << std::endl;
continue;
}
@@ -422,6 +426,7 @@ size_t ParseJSONObject(const std::string& jsonStr,
return pos + 1;
} else if (jsonStr[pos] == '[') // Array
{
element.ConsiderAsArray();
unsigned int index = 0;
while (index == 0 || jsonStr[pos] == ',') {
pos++;
@@ -456,7 +461,7 @@ size_t ParseJSONObject(const std::string& jsonStr,
{
std::string str;
size_t endPos = pos;
const std::string separators = " \n,}";
const std::string separators = " \n,}]";
while (endPos < jsonStr.length() &&
separators.find_first_of(jsonStr[endPos]) == std::string::npos) {
endPos++;

View File

@@ -6,10 +6,10 @@ namespace gd {
SerializerElement SerializerElement::nullElement;
SerializerElement::SerializerElement() : valueUndefined(true) {}
SerializerElement::SerializerElement() : valueUndefined(true), isArray(false) {}
SerializerElement::SerializerElement(const SerializerValue& value)
: valueUndefined(false), elementValue(value) {}
: valueUndefined(false), elementValue(value), isArray(false) {}
SerializerElement::~SerializerElement() {}

View File

@@ -23,7 +23,7 @@ namespace gd {
class GD_CORE_API SerializerElement {
public:
SerializerElement();
SerializerElement(const SerializerValue & value);
SerializerElement(const SerializerValue &value);
virtual ~SerializerElement();
/** \name Value
@@ -178,18 +178,37 @@ class GD_CORE_API SerializerElement {
* Methods related to the children elements
*/
///@{
/**
* \brief Consider that the element is an array of elements, without specific
* name for the children element.
*
* When serialized to a format accepting arrays (like JSON), the element will
* be serialized to an array.
*/
void ConsiderAsArray() const { isArray = true; };
/**
* \brief Check if the element is considered as an array containing its
* children.
*
* As possible, this should be serialized to an array (possible JSON, but not
* in XML).
*/
bool ConsideredAsArray() const { return isArray; };
/**
* \brief Consider that the element is an array for elements with the given
* name.
*
* In this case, no child with a different name should be added. When
* serialized to format accepting arrays, the element will be serialized to an
* array.
* serialized to a format accepting arrays (like JSON), the element will be
* serialized to an array.
*
* \param name The name of the children.
*/
void ConsiderAsArrayOf(const gd::String &name,
const gd::String &deprecatedName = "") const {
ConsiderAsArray();
arrayOf = name;
deprecatedArrayOf = deprecatedName;
};
@@ -261,8 +280,10 @@ class GD_CORE_API SerializerElement {
std::map<gd::String, SerializerValue> attributes;
std::vector<std::pair<gd::String, std::shared_ptr<SerializerElement> > >
children;
mutable gd::String arrayOf;
mutable gd::String deprecatedArrayOf;
mutable bool isArray; ///< true if element is considered as an array
mutable gd::String arrayOf; ///< The name of the children (was useful for XML
///< parsed elements).
mutable gd::String deprecatedArrayOf; ///< Alternate name for children
};
} // namespace gd

View File

@@ -1,21 +1,26 @@
GDevelop Core
=================
# GDevelop Core (library to create, manipulate and export games)
This is the core library used to build platforms, extensions, tools for GDevelop. The IDE is also based on classes and tools offered by this library.
This is the core library used to handle games, build platforms, extensions and tools for GDevelop. The editor is based on classes and tools offered by this library.
Getting started
---------------
GDevelop Core is a portable C++ library, compiled to be used in JavaScript in the editor.
## 1) Getting started 🤓
First, take a look at the *Readme.md* at the root of the repository and the [developer documentation](http://4ian.github.io/GD-Documentation/).
Contributing
------------
## 2) How to contribute 😎
Any contribution is welcome! Whether you want to submit a bug report, a feature request
or any pull request so as to add a nice feature, do not hesitate to get in touch.
* Check the [the **roadmap** for ideas and features planned](https://trello.com/b/qf0lM7k8/gdevelop-roadmap).
* Follow the [Development](https://github.com/4ian/GDevelop/tree/master/newIDE#development) section of the README to set up GDevelop and start modifying either **the editor** or **[the game engine/extensions](https://github.com/4ian/GDevelop/tree/master/newIDE#development-of-the-game-engine-or-extensions)**.
* To submit your changes, you have first to create a Fork on GitHub (use the Fork button on the top right), then [create a Pull Request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/).
License
-------
GDevelop Core is distributed under the MIT license: See license.txt for
GDevelop Core is distributed under the MIT license: see license.txt for
more information.

View File

@@ -65,6 +65,44 @@ TEST_CASE("Serializer", "[common]") {
REQUIRE(json == originalJSON);
}
SECTION("Idempotency of unserializing and serializing again") {
auto unserializeAndSerializeToJSON = [](const gd::String& originalJSON) {
SerializerElement element = Serializer::FromJSON(originalJSON);
return Serializer::ToJSON(element);
};
SECTION("Strings and numbers") {
gd::String test1 = "\"\"";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 = "123.455";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
}
SECTION("Objects") {
gd::String test1 = "{}";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 = "{\"a\": 1}";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
gd::String test3 = "{\"a\": 1,\"b\": {\"c\": 2}}";
REQUIRE(unserializeAndSerializeToJSON(test3) == test3);
}
SECTION("Arrays") {
gd::String test1 = "[]";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 = "[1,2]";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
}
SECTION("Mixed") {
gd::String test1 =
"{\"hello\": {\"world\": [{},[],3,\"4\"],\"world2\": [-1,\"-2\","
"{\"-3\": [-4]}]}}";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 =
"{\"hello\": {\"world\": [{},[],3,4],\"world2\": [-1,\"-2\","
"{\"-3\": [-4]}]}}";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
}
}
SECTION("Splitter") {
SECTION("Split elements") {
// Create some elements

View File

@@ -14,348 +14,348 @@ module.exports = {
createExtension: function(t, gd) {
const extension = new gd.PlatformExtension();
extension.setExtensionInformation(
"AdMob",
t("AdMob"),
'AdMob',
t('AdMob'),
t(
"Allow the game to display AdMob banner, interstitial and reward video ads"
'Allow the game to display AdMob banner, interstitial and reward video ads'
),
"Franco Maciel",
"MIT"
'Franco Maciel',
'MIT'
);
// Banner
extension
.addCondition(
"BannerLoading",
t("Banner loading"),
t("Check if a banner is currently loading."),
t("Banner is loading"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'BannerLoading',
t('Banner loading'),
t('Check if a banner is currently loading.'),
t('Banner is loading'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isBannerLoading");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isBannerLoading');
extension
.addCondition(
"BannerReady",
t("Banner ready"),
t("Check if a banner is ready to be displayed."),
t("Banner is ready"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'BannerReady',
t('Banner ready'),
t('Check if a banner is ready to be displayed.'),
t('Banner is ready'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isBannerReady");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isBannerReady');
extension
.addCondition(
"BannerShowing",
t("Banner showing"),
t("Check if there is a banner being displayed."),
t("Banner is showing"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'BannerShowing',
t('Banner showing'),
t('Check if there is a banner being displayed.'),
t('Banner is showing'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isBannerShowing");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isBannerShowing');
extension
.addCondition(
"BannerExists",
t("Banner exists"),
t("Check if there is a banner in memory (visible or hidden)."),
t("Banner exists"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'BannerExists',
t('Banner exists'),
t('Check if there is a banner in memory (visible or hidden).'),
t('Banner exists'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.existBanner");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.existBanner');
extension
.addAction(
"LoadBanner",
t("Load banner"),
'LoadBanner',
t('Load banner'),
t(
"Start loading a banner, you can display it automatically when finish loading.\nIf test mode is set to true a test banner will be displayed."
'Start loading a banner, you can display it automatically when finish loading.\nIf test mode is set to true a test banner will be displayed.'
),
t(
"Load banner (at top: _PARAM2_, overlap: _PARAM3_, show on load: _PARAM4_, test mode: _PARAM5_)"
'Load banner (at top: _PARAM2_, overlap: _PARAM3_, show on load: _PARAM4_, test mode: _PARAM5_)'
),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter("string", t("Android banner ID"), "", false)
.addParameter("string", t("iOS banner ID"), "", false)
.addParameter('string', t('Android banner ID'), '', false)
.addParameter('string', t('iOS banner ID'), '', false)
.addParameter(
"yesorno",
t("Display at top? (bottom otherwise)"),
"",
'yesorno',
t('Display at top? (bottom otherwise)'),
'',
false
)
.setDefaultValue("false")
.addParameter("yesorno", t("Overlap webview?"), "", false)
.setDefaultValue("true")
.addParameter("yesorno", t("Display on load complete?"), "", false)
.setDefaultValue("true")
.addParameter("yesorno", t("Test mode?"), "", false)
.setDefaultValue("true")
.setDefaultValue('false')
.addParameter('yesorno', t('Overlap webview?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Display on load complete?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Test mode?'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.loadBanner");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.loadBanner');
extension
.addAction(
"ShowBanner",
t("Show banner"),
t("Show the banner, will work only when the banner is fully loaded."),
t("Show banner"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'ShowBanner',
t('Show banner'),
t('Show the banner, will work only when the banner is fully loaded.'),
t('Show banner'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.showBanner");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.showBanner');
extension
.addAction(
"HideBanner",
t("Hide banner"),
'HideBanner',
t('Hide banner'),
t(
"Hide the banner. You can show it again with the corresponding action."
'Hide the banner. You can show it again with the corresponding action.'
),
t("Hide banner"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('Hide banner'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.hideBanner");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.hideBanner');
extension
.addAction(
"RemoveBanner",
t("Remove banner"),
'RemoveBanner',
t('Remove banner'),
t(
"Remove the banner. You have to load another banner to show it again."
'Remove the banner. You have to load another banner to show it again.'
),
t("Remove banner"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('Remove banner'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.removeBanner");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.removeBanner');
// Interstitial
extension
.addCondition(
"InterstitialLoading",
t("Interstitial loading"),
t("Check if an interstitial is currently loading."),
t("Interstitial is loading"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'InterstitialLoading',
t('Interstitial loading'),
t('Check if an interstitial is currently loading.'),
t('Interstitial is loading'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isInterstitialLoading");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isInterstitialLoading');
extension
.addCondition(
"InterstitialReady",
t("Interstitial ready"),
t("Check if an interstitial is ready to be displayed."),
t("Interstitial is ready"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'InterstitialReady',
t('Interstitial ready'),
t('Check if an interstitial is ready to be displayed.'),
t('Interstitial is ready'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isInterstitialReady");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isInterstitialReady');
extension
.addCondition(
"InterstitialShowing",
t("Interstitial showing"),
t("Check if there is an interstitial being displayed."),
t("Interstitial is showing"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'InterstitialShowing',
t('Interstitial showing'),
t('Check if there is an interstitial being displayed.'),
t('Interstitial is showing'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isInterstitialShowing");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isInterstitialShowing');
extension
.addAction(
"LoadInterstitial",
t("Load interstitial"),
'LoadInterstitial',
t('Load interstitial'),
t(
"Start loading an interstitial, you can display it automatically when finish loading.\nIf test mode is set to true a test interstitial will be displayed."
'Start loading an interstitial, you can display it automatically when finish loading.\nIf test mode is set to true a test interstitial will be displayed.'
),
t("Load interstitial (show on load: _PARAM2_, test mode: _PARAM3_)"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('Load interstitial (show on load: _PARAM2_, test mode: _PARAM3_)'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter("string", t("Android interstitial ID"), "", false)
.addParameter("string", t("iOS interstitial ID"), "", false)
.addParameter("yesorno", t("Display on load complete?"), "", false)
.setDefaultValue("true")
.addParameter("yesorno", t("Test mode?"), "", false)
.setDefaultValue("true")
.addParameter('string', t('Android interstitial ID'), '', false)
.addParameter('string', t('iOS interstitial ID'), '', false)
.addParameter('yesorno', t('Display on load complete?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Test mode?'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.loadInterstitial");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.loadInterstitial');
extension
.addAction(
"ShowInterstitial",
t("Show interstitial"),
'ShowInterstitial',
t('Show interstitial'),
t(
"Show the interstitial, will work only when the interstitial is fully loaded."
'Show the interstitial, will work only when the interstitial is fully loaded.'
),
t("Show interstitial"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('Show interstitial'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.showInterstitial");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.showInterstitial');
// Reward video
extension
.addCondition(
"VideoLoading",
t("Video loading"),
t("Check if a reward video is currently loading."),
t("Reward video is loading"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'VideoLoading',
t('Video loading'),
t('Check if a reward video is currently loading.'),
t('Reward video is loading'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isVideoLoading");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isVideoLoading');
extension
.addCondition(
"VideoReady",
t("Video ready"),
t("Check if a reward video is ready to be displayed."),
t("Reward video is ready"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'VideoReady',
t('Video ready'),
t('Check if a reward video is ready to be displayed.'),
t('Reward video is ready'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isVideoReady");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isVideoReady');
extension
.addCondition(
"VideoShowing",
t("Video showing"),
t("Check if there is a reward video being displayed."),
t("Reward video is showing"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'VideoShowing',
t('Video showing'),
t('Check if there is a reward video being displayed.'),
t('Reward video is showing'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.isVideoShowing");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isVideoShowing');
extension
.addCondition(
"VideoReward",
t("Video reward"),
'VideoReward',
t('Video reward'),
t(
"Check if there is a video reward.\nYou can mark it as non-claimed yet, so you can check this reward in other events."
'Check if there is a video reward.\nYou can mark it as non-claimed yet, so you can check this reward in other events.'
),
t("Video reward given"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('Video reward given'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter("yesorno", t("Mark as claimed"), "", false)
.setDefaultValue("true")
.addParameter('yesorno', t('Mark as claimed'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.existVideoReward");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.existVideoReward');
extension
.addAction(
"LoadVideo",
t("Load video"),
'LoadVideo',
t('Load video'),
t(
"Start loading a reward video, you can display it automatically when finish loading.\nIf test mode is set to true a test video will be displayed."
'Start loading a reward video, you can display it automatically when finish loading.\nIf test mode is set to true a test video will be displayed.'
),
t("Load reward video (show on load: _PARAM2_, test mode: _PARAM3_)"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('Load reward video (show on load: _PARAM2_, test mode: _PARAM3_)'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter("string", t("Android reward video ID"), "", false)
.addParameter("string", t("iOS reward video ID"), "", false)
.addParameter("yesorno", t("Display on load complete?"), "", false)
.setDefaultValue("true")
.addParameter("yesorno", t("Test mode?"), "", false)
.setDefaultValue("true")
.addParameter('string', t('Android reward video ID'), '', false)
.addParameter('string', t('iOS reward video ID'), '', false)
.addParameter('yesorno', t('Display on load complete?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Test mode?'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.loadVideo");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.loadVideo');
extension
.addAction(
"ShowVideo",
t("Show video"),
'ShowVideo',
t('Show video'),
t(
"Show the reward video, will work only when the video is fully loaded."
'Show the reward video, will work only when the video is fully loaded.'
),
t("Show reward video"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
t('Show reward video'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.showVideo");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.showVideo');
extension
.addAction(
"ClaimReward",
t("Claim reward"),
t("Mark the video reward as claimed."),
t("Claim video reward"),
t("AdMob"),
"JsPlatform/Extensions/admobicon24.png",
"JsPlatform/Extensions/admobicon16.png"
'ClaimReward',
t('Claim reward'),
t('Mark the video reward as claimed.'),
t('Claim video reward'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile("Extensions/AdMob/admobtools.js")
.setFunctionName("gdjs.adMob.claimVideoReward");
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.claimVideoReward');
return extension;
},
runExtensionSanityTests: function(gd, extension) {
return [];
}
},
};

View File

@@ -19,16 +19,16 @@ gdjs.adMob = {
videoLoading: false,
videoReady: false,
videoShowing: false,
videoReward: false
videoReward: false,
};
gdjs.adMob._getPlatformName = function() {
if (/(android)/i.test(navigator.userAgent)) {
return "android";
return 'android';
} else if (/(ipod|iphone|ipad)/i.test(navigator.userAgent)) {
return "ios";
return 'ios';
} else {
return "windowsPhone";
return 'windowsPhone';
}
};
@@ -78,14 +78,21 @@ gdjs.adMob.loadBanner = function(
displayOnLoading,
testMode
) {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
if (
gdjs.adMob.bannerLoading ||
gdjs.adMob.bannerReady ||
gdjs.adMob.bannerExists
)
return;
admob.banner.config({
id: gdjs.adMob._getPlatformName() === "android" ? androidID : iosID, // Support Android & iOS
id: gdjs.adMob._getPlatformName() === 'android' ? androidID : iosID, // Support Android & iOS
bannerAtTop: atTop,
overlap: overlap,
autoShow: displayOnLoading,
isTesting: testMode
isTesting: testMode,
});
admob.banner.prepare();
@@ -99,7 +106,7 @@ gdjs.adMob.loadBanner = function(
};
gdjs.adMob.showBanner = function() {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
// This block is needed because the banner event listeners bug
if (gdjs.adMob.bannerReady) {
@@ -113,7 +120,7 @@ gdjs.adMob.showBanner = function() {
};
gdjs.adMob.hideBanner = function() {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
if (gdjs.adMob.bannerExists) gdjs.adMob.bannerShowing = false;
@@ -121,7 +128,7 @@ gdjs.adMob.hideBanner = function() {
};
gdjs.adMob.removeBanner = function() {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
// These lines are needed because the banner event listeners bug
gdjs.adMob.bannerExists = false;
@@ -149,12 +156,19 @@ gdjs.adMob.loadInterstitial = function(
displayOnLoading,
testMode
) {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
if (
gdjs.adMob.interstitialLoading ||
gdjs.adMob.interstitialReady ||
gdjs.adMob.interstitialShowing
)
return;
admob.interstitial.config({
id: gdjs.adMob._getPlatformName() === "android" ? androidID : iosID, // Support Android & iOS
id: gdjs.adMob._getPlatformName() === 'android' ? androidID : iosID, // Support Android & iOS
autoShow: displayOnLoading,
isTesting: testMode
isTesting: testMode,
});
admob.interstitial.prepare();
@@ -163,7 +177,7 @@ gdjs.adMob.loadInterstitial = function(
};
gdjs.adMob.showInterstitial = function() {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
admob.interstitial.show();
};
@@ -189,12 +203,19 @@ gdjs.adMob.existVideoReward = function(markAsClaimed) {
};
gdjs.adMob.loadVideo = function(androidID, iosID, displayOnLoading, testMode) {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
if (
gdjs.adMob.videoLoading ||
gdjs.adMob.videoReady ||
gdjs.adMob.videoShowing
)
return;
admob.rewardvideo.config({
id: gdjs.adMob._getPlatformName() === "android" ? androidID : iosID, // Support Android & iOS
id: gdjs.adMob._getPlatformName() === 'android' ? androidID : iosID, // Support Android & iOS
autoShow: displayOnLoading,
isTesting: testMode
isTesting: testMode,
});
admob.rewardvideo.prepare();
@@ -203,7 +224,7 @@ gdjs.adMob.loadVideo = function(androidID, iosID, displayOnLoading, testMode) {
};
gdjs.adMob.showVideo = function() {
if (typeof admob === "undefined") return;
if (typeof admob === 'undefined') return;
admob.rewardvideo.show();
};
@@ -214,7 +235,7 @@ gdjs.adMob.claimVideoReward = function() {
// Banner event listeners
document.addEventListener(
"admob.banner.events.LOAD",
'admob.banner.events.LOAD',
function() {
gdjs.adMob.bannerReady = true;
gdjs.adMob.bannerLoading = false;
@@ -223,7 +244,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.banner.events.LOAD_FAIL",
'admob.banner.events.LOAD_FAIL',
function() {
gdjs.adMob.bannerLoading = false;
},
@@ -254,7 +275,7 @@ document.addEventListener(
// Interstitial event listeners
document.addEventListener(
"admob.interstitial.events.LOAD",
'admob.interstitial.events.LOAD',
function() {
gdjs.adMob.interstitialReady = true;
gdjs.adMob.interstitialLoading = false;
@@ -263,7 +284,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.interstitial.events.LOAD_FAIL",
'admob.interstitial.events.LOAD_FAIL',
function() {
gdjs.adMob.interstitialLoading = false;
},
@@ -271,7 +292,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.interstitial.events.OPEN",
'admob.interstitial.events.OPEN',
function() {
gdjs.adMob.interstitialShowing = true;
gdjs.adMob.interstitialReady = false;
@@ -280,7 +301,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.interstitial.events.CLOSE",
'admob.interstitial.events.CLOSE',
function() {
gdjs.adMob.interstitialShowing = false;
},
@@ -289,7 +310,7 @@ document.addEventListener(
// Reward video event listeners
document.addEventListener(
"admob.rewardvideo.events.LOAD",
'admob.rewardvideo.events.LOAD',
function() {
gdjs.adMob.videoReady = true;
gdjs.adMob.videoLoading = false;
@@ -298,7 +319,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.rewardvideo.events.LOAD_FAIL",
'admob.rewardvideo.events.LOAD_FAIL',
function() {
gdjs.adMob.videoLoading = false;
},
@@ -306,7 +327,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.rewardvideo.events.OPEN",
'admob.rewardvideo.events.OPEN',
function() {
gdjs.adMob.videoShowing = true;
gdjs.adMob.videoReady = false;
@@ -315,7 +336,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.rewardvideo.events.CLOSE",
'admob.rewardvideo.events.CLOSE',
function() {
gdjs.adMob.videoShowing = false;
},
@@ -323,7 +344,7 @@ document.addEventListener(
);
document.addEventListener(
"admob.rewardvideo.events.REWARD",
'admob.rewardvideo.events.REWARD',
function() {
gdjs.adMob.videoReward = true;
},

View File

@@ -45,9 +45,6 @@ gdjs.AnchorRuntimeBehavior.prototype.onActivate = function() {
};
gdjs.AnchorRuntimeBehavior.prototype.doStepPreEvents = function(runtimeScene) {
};
gdjs.AnchorRuntimeBehavior.prototype.doStepPostEvents = function(runtimeScene) {
var game = runtimeScene.getGame();
var rendererWidth = game.getRenderer().getCurrentWidth();
var rendererHeight = game.getRenderer().getCurrentHeight();
@@ -160,3 +157,6 @@ gdjs.AnchorRuntimeBehavior.prototype.doStepPostEvents = function(runtimeScene) {
this.owner.setY(topLeftCoord[1] + this.owner.getY() - this.owner.getDrawableY());
}
};
gdjs.AnchorRuntimeBehavior.prototype.doStepPostEvents = function(runtimeScene) {
};

View File

@@ -24,7 +24,7 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
_("Destroy when outside of the screen"),
_("DestroyOutside"),
_("Automatically destroy the object when it goes "
"outside of the screen's borders"),
"outside of the screen's borders."),
"",
"CppPlatform/Extensions/destroyoutsideicon.png",
"DestroyOutsideBehavior",

View File

@@ -33,7 +33,7 @@ module.exports = {
"JsPlatform/Extensions/vibration_start24.png",
"JsPlatform/Extensions/vibration_start32.png"
)
.addParameter("number", t("Duration"), "", false)
.addParameter("expression", t("Duration"), "", false)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/DeviceVibration/devicevibrationtools.js"

View File

@@ -22,7 +22,7 @@ void DeclareDraggableBehaviorExtension(gd::PlatformExtension& extension) {
extension.AddBehavior("Draggable",
_("Draggable object"),
_("Draggable"),
_("Allows objects to be moved using the mouse."),
_("Allows objects to be moved using the mouse (or touch)."),
"",
"CppPlatform/Extensions/draggableicon.png",
"DraggableBehavior",

View File

@@ -29,6 +29,10 @@ gdjs.DraggableRuntimeBehavior.prototype.onDeActivate = function() {
this._endDrag();
};
gdjs.DraggableRuntimeBehavior.prototype.ownerRemovedFromScene = function() {
this.onDeActivate();
};
gdjs.DraggableRuntimeBehavior.prototype._endDrag = function() {
if ( this._dragged && this._mouse ) gdjs.DraggableRuntimeBehavior.mouseDraggingSomething = false;
if ( this._dragged && this._touchId !== null ) gdjs.DraggableRuntimeBehavior.touchDraggingSomething[this._touchId] = false;

View File

@@ -21,11 +21,11 @@ describe('gdjs.DraggableRuntimeBehavior', function() {
//Drag'n'drop
runtimeScene.renderAndStep();
runtimeGame.getInputManager().onMouseMove(450, 500);
runtimeGame.getInputManager().onMouseButtonPressed(0);
runtimeGame.getInputManager().onMouseButtonPressed(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep();
runtimeGame.getInputManager().onMouseMove(750, 600);
runtimeScene.renderAndStep();
runtimeGame.getInputManager().onMouseButtonReleased(0);
runtimeGame.getInputManager().onMouseButtonReleased(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep();
expect(object.getX()).to.be(750);
@@ -40,11 +40,11 @@ describe('gdjs.DraggableRuntimeBehavior', function() {
//Start dragging again
runtimeGame.getInputManager().onMouseMove(750, 600);
runtimeGame.getInputManager().onMouseButtonPressed(0);
runtimeGame.getInputManager().onMouseButtonPressed(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep();
runtimeGame.getInputManager().onMouseMove(850, 700);
runtimeScene.renderAndStep();
runtimeGame.getInputManager().onMouseButtonReleased(0);
runtimeGame.getInputManager().onMouseButtonReleased(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep();
expect(object.getX()).to.be(850);

View File

@@ -262,7 +262,7 @@ module.exports = {
};
dummyObject.setRawJSONContent(
JSON.stringify({
property1: "Initial value",
property1: "Hello world",
property2: true,
property3: 123
})
@@ -311,13 +311,18 @@ module.exports = {
return instanceProperties;
};
extension.addObject(
"DummyObject",
t("Dummy object for testing"),
t("This dummy object does nothing"),
"CppPlatform/Extensions/topdownmovementicon.png",
dummyObject
);
extension
.addObject(
"DummyObject",
t("Dummy object for testing"),
t("This dummy object does nothing"),
"CppPlatform/Extensions/topdownmovementicon.png",
dummyObject
)
.setIncludeFile("Extensions/ExampleJsExtension/dummyruntimeobject.js")
.addIncludeFile(
"Extensions/ExampleJsExtension/dummyruntimeobject-pixi-renderer.js"
);
return extension;
},
@@ -325,10 +330,10 @@ module.exports = {
* You can optionally add sanity tests that will check the basic working
* of your extension behaviors/objects by instanciating behaviors/objects
* and setting the property to a given value.
*
*
* If you don't have any tests, you can simply return an empty array like this:
* `runExtensionSanityTests: function(gd, extension) { return []; }`
*
*
* But it is recommended to create tests for the behaviors/objects properties you created
* to avoid mistakes.
*/
@@ -351,5 +356,116 @@ module.exports = {
"Testing value"
)
];
},
/**
* Register editors for objects.
*
* Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
*/
registerEditorConfigurations: function(objectsEditorService) {
objectsEditorService.registerEditorConfiguration(
"MyDummyExtension::DummyObject",
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor()
);
},
/**
* Register renderers for instance of objects on the scene editor.
*
* Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change.
*/
registerInstanceRenderers: function(objectsRenderingService) {
const RenderedInstance = objectsRenderingService.RenderedInstance;
const PIXI = objectsRenderingService.PIXI;
/**
* Renderer for instances of DummyObject inside the IDE.
*
* @extends RenderedInstance
* @class RenderedDummyObjectInstance
* @constructor
*/
function RenderedDummyObjectInstance(
project,
layout,
instance,
associatedObject,
pixiContainer,
pixiResourcesLoader
) {
RenderedInstance.call(
this,
project,
layout,
instance,
associatedObject,
pixiContainer,
pixiResourcesLoader
);
//Setup the PIXI object:
this._pixiObject = new PIXI.Text("This is a dummy object", {
align: "left"
});
this._pixiObject.anchor.x = 0.5;
this._pixiObject.anchor.y = 0.5;
this._pixiContainer.addChild(this._pixiObject);
this.update();
}
RenderedDummyObjectInstance.prototype = Object.create(
RenderedInstance.prototype
);
/**
* Return the path to the thumbnail of the specified object.
*/
RenderedDummyObjectInstance.getThumbnail = function(
project,
resourcesLoader,
object
) {
return "CppPlatform/Extensions/texticon24.png";
};
/**
* This is called to update the PIXI object on the scene editor
*/
RenderedDummyObjectInstance.prototype.update = function() {
// Read a property from the object
const property1Value = this._associatedObject
.getProperties(this.project)
.get("My first property")
.getValue();
this._pixiObject.text = property1Value;
// Read position and angle from the instance
this._pixiObject.position.x =
this._instance.getX() + this._pixiObject.width / 2;
this._pixiObject.position.y =
this._instance.getY() + this._pixiObject.height / 2;
this._pixiObject.rotation = RenderedInstance.toRad(
this._instance.getAngle()
);
// Custom size can be read in instance.getCustomWidth() and
// instance.getCustomHeight()
};
/**
* Return the width of the instance, when it's not resized.
*/
RenderedDummyObjectInstance.prototype.getDefaultWidth = function() {
return this._pixiObject.width;
};
/**
* Return the height of the instance, when it's not resized.
*/
RenderedDummyObjectInstance.prototype.getDefaultHeight = function() {
return this._pixiObject.height;
};
objectsRenderingService.registerInstanceRenderer(
"MyDummyExtension::DummyObject",
RenderedDummyObjectInstance
);
}
};

View File

@@ -0,0 +1,60 @@
/**
* The PIXI.js renderer for the DummyRuntimeObject.
*
* @class DummyRuntimeObjectPixiRenderer
* @constructor
* @param {gdjs.DummyRuntimeObject} runtimeObject The object to render
* @param {gdjs.RuntimeScene} runtimeScene The gdjs.RuntimeScene in which the object is
*/
gdjs.DummyRuntimeObjectPixiRenderer = function(runtimeObject, runtimeScene)
{
this._object = runtimeObject; // Keep a reference to the object to read from it later.
// Here we're going to create a dummy text as an example.
if ( this._text === undefined ) {
this._text = new PIXI.Text(runtimeObject.getText(), {align:"left"});
}
// You can also create a PIXI sprite or other PIXI object
// this._imageManager = runtimeScene.getGame().getImageManager();
// if ( this._sprite === undefined )
// this._sprite = new PIXI.Sprite(this._imageManager.getInvalidPIXITexture());
this._text.anchor.x = 0.5;
this._text.anchor.y = 0.5;
runtimeScene.getLayer("").getRenderer().addRendererObject(this._text, runtimeObject.getZOrder());
this.updatePosition();
};
gdjs.DummyRuntimeObjectRenderer = gdjs.DummyRuntimeObjectPixiRenderer; //Register the class to let the engine use it.
gdjs.DummyRuntimeObjectPixiRenderer.prototype.getRendererObject = function() {
// Mandatory, return the internal PIXI object used for your object:
return this._text;
};
gdjs.DummyRuntimeObjectPixiRenderer.prototype.ensureUpToDate = function() {
this.updatePosition();
};
gdjs.DummyRuntimeObjectPixiRenderer.prototype.updatePosition = function() {
this._text.position.x = this._object.x+this._text.width/2;
this._text.position.y = this._object.y+this._text.height/2;
};
gdjs.DummyRuntimeObjectPixiRenderer.prototype.updateAngle = function() {
this._text.rotation = gdjs.toRad(this._object.angle);
};
gdjs.DummyRuntimeObjectPixiRenderer.prototype.updateOpacity = function() {
this._text.alpha = this._object.opacity / 255;
};
gdjs.DummyRuntimeObjectPixiRenderer.prototype.getWidth = function() {
return this._text.width;
};
gdjs.DummyRuntimeObjectPixiRenderer.prototype.getHeight = function() {
return this._text.height;
};

View File

@@ -0,0 +1,108 @@
/**
* A dummy object doing showing a text on screen
*
* @memberof gdjs
* @class DummyRuntimeObject
* @extends RuntimeObject
*/
gdjs.DummyRuntimeObject = function(runtimeScene, objectData) {
// Always call the base gdjs.RuntimeObject constructor.
gdjs.RuntimeObject.call(this, runtimeScene, objectData);
// Load any required data from the object properties.
this._property1 = objectData.content.property1;
// Create the renderer (see dummyruntimeobject-pixi-renderer.js)
if (this._renderer)
gdjs.DummyRuntimeObjectRenderer.call(this._renderer, this, runtimeScene);
else this._renderer = new gdjs.DummyRuntimeObjectRenderer(this, runtimeScene);
};
gdjs.DummyRuntimeObject.prototype = Object.create(gdjs.RuntimeObject.prototype);
gdjs.DummyRuntimeObject.thisIsARuntimeObjectConstructor =
"MyDummyExtension::DummyObject"; //Replace by your extension + object name.
gdjs.DummyRuntimeObject.prototype.getRendererObject = function() {
return this._renderer.getRendererObject();
};
/**
* Called once during the game loop, before events and rendering.
* @param {gdjs.RuntimeScene} runtimeScene The gdjs.RuntimeScene the object belongs to.
*/
gdjs.DummyRuntimeObject.prototype.update = function(runtimeScene) {
// This is an example: typically you want to make sure the renderer
// is up to date with the object.
this._renderer.ensureUpToDate();
};
/**
* Initialize the extra parameters that could be set for an instance.
* @private
*/
gdjs.DummyRuntimeObject.prototype.extraInitializationFromInitialInstance = function(
initialInstanceData
) {
// For example:
// this.setSomething(initialInstanceData.something);
};
/**
* Update the object position.
* @private
*/
gdjs.DummyRuntimeObject.prototype._updatePosition = function() {
// This is an example: typically you want to tell the renderer to update
// the position of the object.
this._renderer.updatePosition();
};
/**
* Set object position on X axis.
*/
gdjs.DummyRuntimeObject.prototype.setX = function(x) {
gdjs.RuntimeObject.prototype.setX.call(this, x); // Always call the parent method first.
this._updatePosition();
};
/**
* Set object position on Y axis.
*/
gdjs.DummyRuntimeObject.prototype.setY = function(y) {
gdjs.RuntimeObject.prototype.setY.call(this, y); // Always call the parent method first.
this._updatePosition();
};
/**
* Set the angle of the object.
* @param {number} angle The new angle of the object
*/
gdjs.DummyRuntimeObject.prototype.setAngle = function(angle) {
gdjs.RuntimeObject.prototype.setAngle.call(this, angle); // Always call the parent method first.
this._renderer.updateAngle(); // Tell the renderer to update the rendered object
};
/**
* Set object opacity.
*/
gdjs.DummyRuntimeObject.prototype.setOpacity = function(opacity) {
if (opacity < 0) opacity = 0;
if (opacity > 255) opacity = 255;
this.opacity = opacity;
this._renderer.updateOpacity(); // Tell the renderer to update the rendered object
};
/**
* Get object opacity.
*/
gdjs.DummyRuntimeObject.prototype.getOpacity = function() {
return this.opacity;
};
/**
* Get the text that must be displayed by the dummy object.
*/
gdjs.DummyRuntimeObject.prototype.getText = function() {
return this._property1;
};

View File

@@ -33,7 +33,7 @@ module.exports = {
"Save the content of the given variable in the player data, stored on Facebook Instant Games servers"
),
t(
"Save the content of _PARAM1_ in key _PARAM1_ of player data (store success message in _PARAM2_ or error in _PARAM3_)"
"Save the content of _PARAM1_ in key _PARAM0_ of player data (store success message in _PARAM2_ or error in _PARAM3_)"
),
t("Facebook Instant Games/Player data"),
"JsPlatform/Extensions/facebookicon24.png",
@@ -183,6 +183,154 @@ module.exports = {
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.getPlayerEntry");
extension
.addCondition(
"AreAdsSupported",
t("Check if ads are supported"),
t("Check if showind ads is supported on this device (only mobile phones can show ads)"),
t("Ads can be shown on this device"),
t("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/FacebookInstantGames/facebookinstantgamestools.js"
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.areAdsSupported");
extension
.addCondition(
"IsInterstitialAdReady",
t("Is the interstitial ad ready"),
t("Check if the interstitial ad requested from Facebook is loaded and ready to be shown."),
t("The interstitial ad is loaded and ready to be shown"),
t("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/FacebookInstantGames/facebookinstantgamestools.js"
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.isInterstitialAdReady");
extension
.addAction(
"LoadInterstitialAd",
t("Load and prepare an interstitial ad"),
t("Request and load an interstitial ad from Facebook, so that it is ready to be shown."),
t("Request and load an interstitial ad from Facebook (ad placement id: _PARAM0_, error in _PARAM1_)"),
t("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
)
.addParameter(
"string",
t("The Ad Placement id (can be found while setting up the ad on Facebook)"),
"",
false
)
.addParameter(
"scenevar",
t("Variable where to error message (optional, if an error occurs)"),
"",
true
)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/FacebookInstantGames/facebookinstantgamestools.js"
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.loadInterstitialAd");
extension
.addAction(
"ShowInterstitialAd",
t("Show the loaded interstitial ad"),
t("Show the interstitial ad previously loaded in memory. This won't work if you did not load the interstitial before."),
t("Show the interstitial ad previously loaded in memory (if any error, store it in _PARAM0_)"),
t("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
)
.addParameter(
"scenevar",
t("Variable where to error message (optional, if an error occurs)"),
"",
true
)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/FacebookInstantGames/facebookinstantgamestools.js"
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.showInterstitialAd");
extension
.addCondition(
"IsRewardedVideoReady",
t("Is the rewarded video ready"),
t("Check if the rewarded video requested from Facebook is loaded and ready to be shown."),
t("The rewarded video is loaded and ready to be shown"),
t("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/FacebookInstantGames/facebookinstantgamestools.js"
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.isRewardedVideoReady");
extension
.addAction(
"LoadRewardedVideo",
t("Load and prepare a rewarded video"),
t("Request and load a rewarded video from Facebook, so that it is ready to be shown."),
t("Request and load a rewarded video from Facebook (ad placement id: _PARAM0_, error in _PARAM1_)"),
t("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
)
.addParameter(
"string",
t("The Ad Placement id (can be found while setting up the ad on Facebook)"),
"",
false
)
.addParameter(
"scenevar",
t("Variable where to error message (optional, if an error occurs)"),
"",
true
)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/FacebookInstantGames/facebookinstantgamestools.js"
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.loadRewardedVideo");
extension
.addAction(
"ShowRewardedVideo",
t("Show the loaded rewarded video"),
t("Show the rewarded video previously loaded in memory. This won't work if you did not load the video before."),
t("Show the rewarded video previously loaded in memory (if any error, store it in _PARAM0_)"),
t("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
)
.addParameter(
"scenevar",
t("Variable where to error message (optional, if an error occurs)"),
"",
true
)
.getCodeExtraInformation()
.setIncludeFile(
"Extensions/FacebookInstantGames/facebookinstantgamestools.js"
)
.setFunctionName("gdjs.evtTools.facebookInstantGames.showRewardedVideo");
extension
.addStrExpression(
"PlayerId",

View File

@@ -4,7 +4,24 @@
* @static
* @private
*/
gdjs.evtTools.facebookInstantGames = {};
gdjs.evtTools.facebookInstantGames = {
_preloadedInterstitial: null,
_preloadedInterstitialLoading: false,
_preloadedInterstitialLoaded: false,
_preloadedRewardedVideo: null,
_preloadedRewardedVideoLoading: false,
_preloadedRewardedVideoLoaded: false
};
gdjs.evtTools.facebookInstantGames.areAdsSupported = function() {
if (typeof FBInstant === "undefined") return false;
var supportedAPIs = FBInstant.getSupportedAPIs();
return (
supportedAPIs.indexOf("getInterstitialAdAsync") !== -1 &&
supportedAPIs.indexOf("getRewardedVideoAsync") !== -1
);
};
gdjs.evtTools.facebookInstantGames.getPlayerId = function() {
if (typeof FBInstant === "undefined") return "";
@@ -102,7 +119,9 @@ gdjs.evtTools.facebookInstantGames.getPlayerEntry = function(
})
.then(function(entry) {
rankVariable.setNumber(entry.getRank() === null ? -1 : entry.getRank());
scoreVariable.setNumber(entry.getScore() === null ? -1 : entry.getScore());
scoreVariable.setNumber(
entry.getScore() === null ? -1 : entry.getScore()
);
gdjs.evtTools.network.jsonToVariableStructure(
entry.getExtraData(),
extraDataVariable
@@ -113,9 +132,123 @@ gdjs.evtTools.facebookInstantGames.getPlayerEntry = function(
});
};
if (typeof FBInstant === "undefined" && typeof window !== "undefined") {
console.log("Creating a mocked version of Facebook Instant Games");
gdjs.evtTools.facebookInstantGames.loadInterstitialAd = function(
adPlacementId,
errorVariable
) {
if (typeof FBInstant === "undefined") return;
if (
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoading ||
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoaded
)
return;
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoading = true;
FBInstant.getInterstitialAdAsync(adPlacementId)
.then(function(interstitial) {
gdjs.evtTools.facebookInstantGames._preloadedInterstitial = interstitial;
return interstitial.loadAsync();
})
.then(function() {
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoading = false;
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoaded = true;
console.info("Facebook Instant Games interstitial preloaded.");
})
.catch(function(err) {
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoading = false;
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoaded = false;
console.error("Interstitial failed to preload: " + err.message);
errorVariable.setString(error.message || "Unknown error");
});
};
gdjs.evtTools.facebookInstantGames.showInterstitialAd = function(
errorVariable
) {
if (typeof FBInstant === "undefined") return;
if (!gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoaded) return;
gdjs.evtTools.facebookInstantGames._preloadedInterstitial
.showAsync()
.then(function() {
console.info("Facebook Instant Games interstitial shown.");
})
.catch(function(err) {
console.error("Interstitial failed to show: " + err.message);
errorVariable.setString(error.message || "Unknown error");
})
.then(function() {
gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoaded = false;
});
};
gdjs.evtTools.facebookInstantGames.isInterstitialAdReady = function() {
return gdjs.evtTools.facebookInstantGames._preloadedInterstitialLoaded;
};
gdjs.evtTools.facebookInstantGames.loadRewardedVideo = function(
adPlacementId,
errorVariable
) {
if (typeof FBInstant === "undefined") return;
if (
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoading ||
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoaded
)
return;
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoading = true;
FBInstant.getRewardedVideoAsync(adPlacementId)
.then(function(rewardedVideo) {
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideo = rewardedVideo;
return rewardedVideo.loadAsync();
})
.then(function() {
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoading = false;
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoaded = true;
console.info("Facebook Instant Games rewarded video preloaded.");
})
.catch(function(err) {
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoading = false;
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoaded = false;
console.error("Rewarded video failed to preload: " + err.message);
errorVariable.setString(error.message || "Unknown error");
});
};
gdjs.evtTools.facebookInstantGames.showRewardedVideo = function(errorVariable) {
if (typeof FBInstant === "undefined") return;
if (!gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoaded) return;
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideo
.showAsync()
.then(function() {
console.info("Facebook Instant Games rewarded video shown.");
})
.catch(function(err) {
console.error("Rewarded video failed to show: " + err.message);
errorVariable.setString(error.message || "Unknown error");
})
.then(function() {
gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoaded = false;
});
};
gdjs.evtTools.facebookInstantGames.isRewardedVideoReady = function() {
return gdjs.evtTools.facebookInstantGames._preloadedRewardedVideoLoaded;
};
if (typeof FBInstant === "undefined" && typeof window !== "undefined") {
console.log("Creating a mocked version of Facebook Instant Games.");
/**
* A mocked Leaderboard, part of the mock of FBInstant.
* @class MockedLeaderboard
*/
function MockedLeaderboard() {
this._playerScore = null;
this._playerRank = null;
@@ -147,6 +280,49 @@ if (typeof FBInstant === "undefined" && typeof window !== "undefined") {
});
};
/**
* A mocked RewardedVideo, part of the mock of FBInstant.
* @class RewardedVideo
*/
function MockedRewardedVideo() {
this._isLoaded = false;
}
MockedRewardedVideo.prototype.loadAsync = function() {
this._isLoaded = true;
return Promise.resolve();
};
MockedRewardedVideo.prototype.showAsync = function() {
if (this._isLoaded) {
console.info(
"In a real Instant Game, a video reward should have been shown to the user."
);
return Promise.resolve();
}
return Promise.reject(new Error("Rewarded video is not loaded."));
};
/**
* A mocked MockedInterstitial, part of the mock of FBInstant.
* @class MockedInterstitial
*/
function MockedInterstitial() {
this._isLoaded = false;
}
MockedInterstitial.prototype.loadAsync = function() {
this._isLoaded = true;
return Promise.resolve();
};
MockedInterstitial.prototype.showAsync = function() {
if (this._isLoaded) {
console.info(
"In a real Instant Game, an interstitial should have been shown to the user."
);
return Promise.resolve();
}
return Promise.reject(new Error("Interstitial is not loaded."));
};
var supportedAPIs = [];
var FBInstantMock = {
_mockedPlayerData: {},
_mockedLeaderboards: {},
@@ -176,8 +352,30 @@ if (typeof FBInstant === "undefined" && typeof window !== "undefined") {
new MockedLeaderboard();
resolve(FBInstantMock._mockedLeaderboards[leaderboardName]);
});
},
getInterstitialAdAsync: function() {
return Promise.resolve(new MockedInterstitial());
},
getRewardedVideoAsync: function() {
return Promise.resolve(new MockedRewardedVideo());
},
getSupportedAPIs: function() {
return supportedAPIs;
}
};
// Retrieve the name of the supported APIs in our mock.
for (var property in FBInstantMock) {
if (typeof FBInstantMock[property] == "object") {
for (var subProperty in FBInstantMock[property]) {
if (typeof FBInstantMock[property][subProperty] == "function") {
supportedAPIs.push(property + "." + subProperty);
}
}
} else if (typeof FBInstantMock[property] == "function") {
supportedAPIs.push(property);
}
}
window.FBInstant = FBInstantMock;
}

View File

@@ -0,0 +1,420 @@
/**
* This is a declaration of an extension for GDevelop 5.
*
* Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change
* to this extension file or to any other *.js file that you reference inside.
*
* The file must be named "JsExtension.js", otherwise GDevelop won't load it.
* ⚠️ If you make a change and the extension is not loaded, open the developer console
* and search for any errors.
*
* More information on https://github.com/4ian/GDevelop/blob/master/newIDE/README-extensions.md
*/
module.exports = {
createExtension: function(t, gd) {
const extension = new gd.PlatformExtension();
extension
.setExtensionInformation(
'FileSystem',
t('Filesystem'),
t('Access the filesystem of the operating system.'),
'Matthias Meike',
'Open source (MIT License)'
)
.setExtensionHelpPath('/all-features/filesystem');
extension
.addCondition(
'PathExists',
t('File or directory exists'),
t('Check if the file or directory exists.'),
t('The path _PARAM0_ exists'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_path_exists24.png',
'JsPlatform/Extensions/filesystem_path_exists32.png'
)
.addParameter('string', t('Path to file or directory'), '', false)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.pathExists');
extension
.addAction(
'MakeDirectory',
t('Create a directory'),
t('Create a new directory at the specified path.'),
t('Create directory _PARAM0_'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_create_folder24.png',
'JsPlatform/Extensions/filesystem_create_folder32.png'
)
.addParameter('string', t('Directory'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.makeDirectory');
extension
.addAction(
'SaveStringToFileSync',
t('Save a text into a file'),
t(
'Save a text into a file. Only use this on small files to avoid any lag or freeze during the the game execution.'
),
t('Save _PARAM0_ into file _PARAM1_'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file24.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('string', t('String (text)'), '', false)
.addParameter('string', t('Save path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.saveStringToFile');
extension
.addAction(
'SaveStringToFileAsync',
t('Save a text into a file (Async)'),
t(
"Save a text into a file asynchronously. Use this for large files to avoid any lag or freeze during game execution. The 'result' variable gets updated when the operation has finished."
),
t('Save _PARAM0_ into file _PARAM1_'),
t('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file24.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('string', t('String (text)'), '', false)
.addParameter('string', t('Save path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.saveStringToFileAsync');
extension
.addAction(
'SaveVariableToJSONFileSync',
t('Save a scene variable into a JSON file'),
t(
'Save a scene variable (including, for structure, all the children) into a file in JSON format. Only use this on small files to avoid any lag or freeze during the the game execution.'
),
t('Save scene variable _PARAM0_ into file PARAM1 as JSON'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file24.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', t('Scene variable'), '', false)
.addParameter('string', t('Save path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.saveVariableToJSONFile');
extension
.addAction(
'SaveVariableToJSONFileAsync',
t('Save a scene variable into a JSON file (Async)'),
t(
"Save the scene variable (including, for structures, all the children) into a file in JSON format, asynchronously. Use this for large files to avoid any lag or freeze during game execution. The 'result' variable gets updated when the operation has finished."
),
t('Save scene variable _PARAM0_ into file PARAM1 as JSON'),
t('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file24.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', t('Scene variable'), '', false)
.addParameter('string', t('Save path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.saveVariableToJSONFileAsync');
extension
.addAction(
'LoadStringFromFileAsync',
t('Load a text from a file (Async)'),
t(
"Load a text from a file, asynchronously. Use this for large files to avoid any lag or freeze during game execution. The content of the file will be available in the scene variable after a small delay (usually a few milliseconds). The 'result' variable gets updated when the operation has finished."
),
t('Load text from _PARAM1_ into scene variable _PARAM0_ (Async)'),
t('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_load_file24.png',
'JsPlatform/Extensions/filesystem_load_file32.png'
)
.addParameter('scenevar', t('Scene variable'), '', false)
.addParameter('string', t('Load path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.loadStringFromFileAsync');
extension
.addAction(
'LoadStringFromFileSync',
t('Load a text from a file'),
t(
'Load a text from a file. Only use this on small files to avoid any lag or freeze during the the game execution.'
),
t('Load text from _PARAM1_ into scene variable _PARAM0_'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_load_file24.png',
'JsPlatform/Extensions/filesystem_load_file32.png'
)
.addParameter('scenevar', t('Scene variable'), '', false)
.addParameter('string', t('Load path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.loadStringFromFile');
extension
.addAction(
'LoadVariableFromJSONFileSync',
t('Load a scene variable from a JSON file'),
t(
'Load a JSON formatted text from a file and convert it to a scene variable (potentially a structure variable with children). Only use this on small files to avoid any lag or freeze during the the game execution.'
),
t('Load JSON from _PARAM1_ into scene variable _PARAM0_'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file24.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', t('Scene variable'), '', false)
.addParameter('string', t('Load path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.loadVariableFromJSONFile');
extension
.addAction(
'LoadVariableFromJSONFileAsync',
t('Load a scene variable from a JSON file (Async)'),
t(
"Load a JSON formatted text from a file and convert it to a scene variable (potentially a structure variable with children), asynchronously. Use this for large files to avoid any lag or freeze during game execution. The content of the file will be available as a scene variable after a small delay (usually a few milliseconds). The 'result' variable gets updated when the operation has finished."
),
t('Load JSON from _PARAM1_ into scene variable _PARAM0_'),
t('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file24.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', t('Scene variable'), '', false)
.addParameter('string', t('Load path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.loadVariableFromJSONFileAsync');
extension
.addAction(
'DeleteFile',
t('Delete a file'),
t('Delete a file from the filesystem.'),
t('Delete the file _PARAM0_'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_delete_file24.png',
'JsPlatform/Extensions/filesystem_delete_file32.png'
)
.addParameter('string', t('File path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.deleteFile');
extension
.addAction(
'DeleteFileAsync',
t('Delete a file (Async)'),
t('Delete a file from the filesystem asyncrounouse.'),
t('Delete the file _PARAM0_'),
t('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_delete_file24.png',
'JsPlatform/Extensions/filesystem_delete_file32.png'
)
.addParameter('string', t('File path'), '', false)
.addParameter(
'scenevar',
t(
"(Optional) Variable to store the result. 'ok': task was successful, 'error': an error occured."
),
'',
true
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.deleteFileAsync');
extension
.addStrExpression(
'DesktopPath',
t('Desktop folder'),
t('Get the path to the desktop folder.'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getDesktopPath');
extension
.addStrExpression(
'DocumentsPath',
t('Documents folder'),
t('Get the path to the documents folder.'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getDocumentsPath');
extension
.addStrExpression(
'PicturesPath',
t('Pictures folder'),
t('Get the path to the pictures folder.'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getPicturesPath');
extension
.addStrExpression(
'ExecutablePath',
t('This games executable folder'),
t('Get the path to this games executable folder.'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getExecutablePath');
extension
.addStrExpression(
'UserdataPath',
t('Userdata folder (For application settings)'),
t('Get the path to userdata folder. (For application settings)'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getUserdataPath');
extension
.addStrExpression(
'TempPath',
t('Temp folder'),
t('Get the path to temp folder.'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getTempPath');
extension
.addStrExpression(
'PathDelimiter',
t('Path delimiter'),
t('Get the operating system agnostic path delimiter.'),
t('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getPathDelimiter');
return extension;
},
runExtensionSanityTests: function(gd, extension) {
return [];
},
};

View File

@@ -0,0 +1,442 @@
/**
* @memberof gdjs
* @class fileSystem
* @static
* @private
*/
gdjs.fileSystem = {};
/**
* Get the path to 'Desktop' folder.
* @param {gdjs.RuntimeScene} runtimeScene The current scene
* @return {string} The path to the desktop folder
*/
gdjs.fileSystem.getDesktopPath = function(runtimeScene) {
const electron = runtimeScene
.getGame()
.getRenderer()
.getElectron();
if (electron) {
return electron.remote.app.getPath('desktop') || '';
} else {
return '';
}
};
/**
* Get the path to 'Documents' folder.
* @param {gdjs.RuntimeScene} runtimeScene The current scene
* @return {string} The path to the documents folder
*/
gdjs.fileSystem.getDocumentsPath = function(runtimeScene) {
const electron = runtimeScene
.getGame()
.getRenderer()
.getElectron();
if (electron) {
return electron.remote.app.getPath('documents') || '';
} else {
return '';
}
};
/**
* Get the path to 'Pictures' folder.
* @param {gdjs.RuntimeScene} runtimeScene The current scene
* @return {string} The path to the pictures folder
*/
gdjs.fileSystem.getPicturesPath = function(runtimeScene) {
const electron = runtimeScene
.getGame()
.getRenderer()
.getElectron();
if (electron) {
return electron.remote.app.getPath('pictures') || '';
} else {
return '';
}
};
/**
* Get the path to this application 'Executable' folder.
* @param {gdjs.RuntimeScene} runtimeScene The current scene
* @return {string} The path to this applications executable folder
*/
gdjs.fileSystem.getExecutablePath = function(runtimeScene) {
const electron = runtimeScene
.getGame()
.getRenderer()
.getElectron();
if (electron) {
return electron.remote.app.getPath('exe') || '';
} else {
return '';
}
};
/**
* Get the path to 'UserData' folder.
* @param {gdjs.RuntimeScene} runtimeScene The current scene
* @return {string} The path to userdata folder
*/
gdjs.fileSystem.getUserdataPath = function(runtimeScene) {
const electron = runtimeScene
.getGame()
.getRenderer()
.getElectron();
if (electron) {
return electron.remote.app.getPath('userData') || '';
} else {
return '';
}
};
/**
* Get the path to 'Temp' folder.
* @param {gdjs.RuntimeScene} runtimeScene The current scene
* @return {string} The path to temp folder
*/
gdjs.fileSystem.getTempPath = function(runtimeScene) {
const electron = runtimeScene
.getGame()
.getRenderer()
.getElectron();
if (electron) {
return electron.remote.app.getPath('temp') || '';
} else {
return '';
}
};
/**
* Get the path delimiter specific to the operating system.
* @return {string} The path delimiter
*/
gdjs.fileSystem.getPathDelimiter = function() {
const path = typeof require !== 'undefined' ? require('path') : null;
if (path) {
return path.sep || '/';
} else {
return '/';
}
};
/**
* Create a new directory at the given path.
* @param {string} directory The path to create a new directory
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.makeDirectory = function(directory, resultVar) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
let result = 'error';
if (fileSystem) {
try {
fileSystem.mkdirSync(directory);
result = 'ok';
} catch (err) {
console.error(
"Unable to create directory at: '" + directory + "': ",
err
);
}
}
resultVar.setString(result);
};
/**
* Save a string into a file, asynchronously.
* @param {string} text The string to be saved
* @param {string} savePath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.saveStringToFileAsync = function(text, savePath, resultVar) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
if (fileSystem) {
fileSystem.writeFile(savePath, text, 'utf8', err => {
resultVar.setString('ok');
if (err) {
console.error(
"Unable to save the text to path: '" + savePath + "': ",
err
);
resultVar.setString('error');
}
});
}
};
/**
* Save a string into a file.
* @param {string} text The string to be saved
* @param {string} savePath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.saveStringToFile = function(text, savePath, resultVar) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
let result = 'error';
if (fileSystem) {
try {
fileSystem.writeFileSync(savePath, text, 'utf8');
result = 'ok';
} catch (err) {
console.error(
"Unable to save the text to path: '" + savePath + "': ",
err
);
}
}
resultVar.setString(result);
};
/**
* Save a variable into a file in JSON format.
* @param {gdjs.Variable} variable The variable to be saved
* @param {string} savePath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.saveVariableToJSONFile = function(
variable,
savePath,
resultVar
) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
const network = gdjs.evtTools.network;
let result = 'error';
if (fileSystem && network) {
try {
fileSystem.writeFileSync(
savePath,
network.variableStructureToJSON(variable),
'utf8'
);
result = 'ok';
} catch (err) {
console.error(
"Unable to save the variable to path: '" + savePath + "': ",
err
);
}
}
resultVar.setString(result);
};
/**
* Save a variable into a file in JSON format, asynchronously.
* @param {string} text The variable to be saved
* @param {string} savePath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.saveVariableToJSONFileAsync = function(
variable,
savePath,
resultVar
) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
const network = gdjs.evtTools.network;
if (fileSystem && network) {
fileSystem.writeFile(
savePath,
network.variableStructureToJSON(variable),
'utf8',
err => {
resultVar.setString('ok');
if (err) {
console.error(
"Unable to save the variable to path: '" + savePath + "': ",
err
);
resultVar.setString('error');
}
}
);
}
};
/**
* Load a string from a file into a scene variable.
* @param {gdjs.Variable} stringVar Variable where to store the content
* @param {string} loadPath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.loadStringFromFile = function(stringVar, loadPath, resultVar) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
let result = 'error';
if (fileSystem) {
try {
const data = fileSystem.readFileSync(loadPath, 'utf8');
if (data) {
stringVar.setString(data);
result = 'ok';
}
} catch (err) {
console.error(
"Unable to load the file at path: '" + loadPath + "': ",
err
);
}
}
resultVar.setString(result);
};
/**
* Load a JSON file and convert it into a variable.
* @param {gdjs.Variable} variable Variable to store the variable
* @param {string} loadPath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.loadVariableFromJSONFile = function(
variable,
loadPath,
resultVar
) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
const network = gdjs.evtTools.network;
let result = 'error';
if (fileSystem && network) {
try {
const data = fileSystem.readFileSync(loadPath, 'utf8');
if (data) {
network.jsonToVariableStructure(data, variable);
result = 'ok';
}
} catch (err) {
console.error(
"Unable to load variable from the file at path: '" + loadPath + "': ",
err
);
}
}
resultVar.setString(result);
};
/**
* Load a JSON file and convert it into a variable, asynchronously.
* @param {gdjs.Variable} variable Variable to store the variable
* @param {string} loadPath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.loadVariableFromJSONFileAsync = function(
variable,
loadPath,
resultVar
) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
const network = gdjs.evtTools.network;
if (fileSystem && network) {
fileSystem.readFile(loadPath, 'utf8', (err, data) => {
if (data) {
network.jsonToVariableStructure(data, variable);
resultVar.setString('ok');
}
if (err) {
console.error(
"Unable to load variable from the file at path: '" + loadPath + "': ",
err
);
resultVar.setString('error');
}
});
}
};
/**
* Load a string from a file into a scene variable, asynchronously.
* @param {gdjs.Variable} stringVar Variable where to store the content
* @param {string} loadPath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.loadStringFromFileAsync = function(
stringVar,
loadPath,
resultVar
) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
if (fileSystem) {
fileSystem.readFile(loadPath, 'utf8', (err, data) => {
if (data) {
stringVar.setString(data);
resultVar.setString('ok');
}
if (err) {
console.error(
"Unable to load the file at path: '" + loadPath + "': ",
err
);
resultVar.setString('error');
}
});
}
};
/**
* Delete a file from the filesystem.
* @param {string} filePath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.deleteFile = function(filePath, resultVar) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
let result = 'error';
if (fileSystem) {
try {
fileSystem.unlinkSync(filePath);
result = 'ok';
} catch (err) {
console.error("Unable to delete the file: '" + filePath + "': ", err);
result = 'error';
}
}
resultVar.setString(result);
};
/**
* Delete a file from the filesystem, asynchronously.
* @param {string} filePath Path to the file
* @param {gdjs.Variable} resultVar The variable where to store the result of the operation
*/
gdjs.fileSystem.deleteFileAsync = function(filePath, resultVar) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
if (fileSystem) {
fileSystem.unlink(filePath, err => {
resultVar.setString('ok');
if (err) {
console.error("Unable to delete the file: '" + filePath + "': ", err);
resultVar.setString('error');
}
});
}
};
/**
* Check if the file or directory exists.
* @param {string} filePath The path to the file or directory
* @return {boolean} true if fhe file or directory exists
*/
gdjs.fileSystem.pathExists = function(filePath) {
const fileSystem = typeof require !== 'undefined' ? require('fs') : null;
if (fileSystem) {
return fileSystem.existsSync(filePath);
} else {
return false;
}
};

View File

@@ -9,7 +9,7 @@ This project is released under the MIT License.
gdjs.ParticleEmitterObject = function(runtimeScene, objectData){
gdjs.RuntimeObject.call(this, runtimeScene, objectData);
this.renderer = new gdjs.ParticleEmitterObjectRenderer(runtimeScene, this, objectData);
this._renderer = new gdjs.ParticleEmitterObjectRenderer(runtimeScene, this, objectData);
this.singleAngle = objectData.emissionEditionSimpleMode;
this.angleA = objectData.emitterAngleA;
@@ -71,64 +71,64 @@ gdjs.ParticleEmitterObject.prototype.setAngle = function(angle){
};
gdjs.ParticleEmitterObject.prototype.getRendererObject = function(){
return this.renderer.getRendererObject();
return this._renderer.getRendererObject();
};
gdjs.ParticleEmitterObject.prototype.update = function(runtimeScene){
if(this._posDirty){
this.renderer.setPosition(this.getX(), this.getY());
this._renderer.setPosition(this.getX(), this.getY());
}
if(this._angleDirty){
var angle = this.getAngle();
if(this.singleAngle) this.renderer.setAngle(this.angle - this.angleB/2.0, this.angle + this.angleB/2.0);
else this.renderer.setAngle(this.angle + this.angleA, this.angle + this.angleB);
if(this.singleAngle) this._renderer.setAngle(this.angle - this.angleB/2.0, this.angle + this.angleB/2.0);
else this._renderer.setAngle(this.angle + this.angleA, this.angle + this.angleB);
}
if(this._forceDirty){
this.renderer.setForce(this.forceMin, this.forceMax);
this._renderer.setForce(this.forceMin, this.forceMax);
}
if(this._zoneRadiusDirty){
this.renderer.setZoneRadius(this.zoneRadius);
this._renderer.setZoneRadius(this.zoneRadius);
}
if(this._lifeTimeDirty){
this.renderer.setLifeTime(this.lifeTimeMin, this.lifeTimeMax);
this._renderer.setLifeTime(this.lifeTimeMin, this.lifeTimeMax);
}
if(this._gravityDirty){
this.renderer.setGravity(this.gravityX, this.gravityY);
this._renderer.setGravity(this.gravityX, this.gravityY);
}
if(this._colorDirty){
this.renderer.setColor(this.colorR1, this.colorG1, this.colorB1,
this._renderer.setColor(this.colorR1, this.colorG1, this.colorB1,
this.colorR2, this.colorG2, this.colorB2);
}
if(this._sizeDirty && this.sizeParam === "Mutable"){
this.renderer.setSize(this.size1, this.size2);
this._renderer.setSize(this.size1, this.size2);
}
if(this._alphaDirty){
this.renderer.setAlpha(this.alpha1, this.alpha2);
this._renderer.setAlpha(this.alpha1, this.alpha2);
}
if(this._flowDirty){
this.renderer.setFlow(this.flow, this.tank);
this._renderer.setFlow(this.flow, this.tank);
}
if(this._textureDirty){
this.renderer.setTexture(this.texture, runtimeScene);
this._renderer.setTexture(this.texture, runtimeScene);
}
this._posDirty = this._angleDirty = this._forceDirty = this._zoneRadiusDirty = false;
this._lifeTimeDirty = this._gravityDirty = this._colorDirty = this._sizeDirty = false;
this._alphaDirty = this._flowDirty = this._textureDirty = false;
this.renderer.update(this.getElapsedTime(runtimeScene)/1000.0);
this._renderer.update(this.getElapsedTime(runtimeScene)/1000.0);
if(this.tank > 0 && this.renderer.getTotalParticleCount() > this.tank){
this.renderer.stop();
if(this.tank > 0 && this._renderer.getTotalParticleCount() > this.tank){
this._renderer.stop();
}
if(this.renderer.hasStarted() && this.renderer.getParticleCount() === 0 && this.destroyWhenNoParticles){
if(this._renderer.hasStarted() && this._renderer.getParticleCount() === 0 && this.destroyWhenNoParticles){
this.deleteFromScene(runtimeScene);
}
};
gdjs.ParticleEmitterObject.prototype.onDeletedFromScene = function(runtimeScene){
this.renderer.destroy();
this._renderer.destroy();
gdjs.RuntimeObject.prototype.onDeletedFromScene.call(this, runtimeScene);
};
@@ -446,11 +446,11 @@ gdjs.ParticleEmitterObject.prototype.setParticleAlpha2 = function(alpha){
};
gdjs.ParticleEmitterObject.prototype.noMoreParticles = function(){
this.renderer.stop();
this._renderer.stop();
};
gdjs.ParticleEmitterObject.prototype.recreateParticleSystem = function(){
this.renderer.recreate();
this._renderer.recreate();
};
gdjs.ParticleEmitterObject.prototype.getFlow = function(){
@@ -478,7 +478,7 @@ gdjs.ParticleEmitterObject.prototype.getTexture = function(){
gdjs.ParticleEmitterObject.prototype.setTexture = function(texture, runtimeScene){
if(this.texture !== texture){
if(this.renderer.isTextureValid(texture, runtimeScene)){
if(this._renderer.isTextureValid(texture, runtimeScene)){
this.texture = texture;
this._textureDirty = true;
}

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More