浏览代码

Converted car tutorial.
Working on better js loader with callbacks for customization.

Mikael Säker 8 年之前
父节点
当前提交
0068ed1ee7
共有 100 个文件被更改,包括 691 次插入0 次删除
  1. 1 0
      docs/assets/car/archive_files.json
  2. 二进制
      docs/assets/car/game.darc0
  3. 19 0
      docs/assets/car/game.projectc0
  4. 二进制
      docs/assets/defold_sound.swf
  5. 0 0
      docs/assets/dmengine.js
  6. 639 0
      docs/assets/dmloader.js
  7. 二进制
      docs/assets/examples-project.zip
  8. 1 0
      docs/assets/examples/archive_files.json
  9. 二进制
      docs/assets/examples/game.darc0
  10. 二进制
      docs/assets/examples/game.darc1
  11. 31 0
      docs/assets/examples/game.projectc0
  12. 二进制
      docs/assets/getting-started-assets.zip
  13. 二进制
      docs/assets/getting-started-assets/BoogalooOne-Regular.ttf
  14. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee01.png
  15. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee02.png
  16. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee03.png
  17. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee04.png
  18. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee05.png
  19. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee06.png
  20. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee07.png
  21. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee08.png
  22. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee09.png
  23. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee10.png
  24. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee11.png
  25. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee12.png
  26. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee13.png
  27. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee14.png
  28. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee15.png
  29. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee16.png
  30. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee17.png
  31. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee18.png
  32. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee19.png
  33. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee20.png
  34. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee21.png
  35. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee22.png
  36. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee23.png
  37. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee24.png
  38. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot01.png
  39. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot02.png
  40. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot03.png
  41. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot04.png
  42. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot05.png
  43. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot06.png
  44. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot07.png
  45. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot08.png
  46. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot09.png
  47. 二进制
      docs/assets/getting-started-assets/extras/bee/Bee_shot10.png
  48. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting01.png
  49. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting02.png
  50. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting03.png
  51. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting04.png
  52. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting05.png
  53. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting06.png
  54. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting07.png
  55. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting08.png
  56. 二进制
      docs/assets/getting-started-assets/extras/bee/Sting09.png
  57. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri01.png
  58. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri02.png
  59. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri03.png
  60. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri04.png
  61. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri05.png
  62. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri06.png
  63. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri07.png
  64. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri08.png
  65. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri09.png
  66. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri10.png
  67. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri11.png
  68. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri12.png
  69. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri13.png
  70. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri14.png
  71. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri15.png
  72. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri16.png
  73. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri17.png
  74. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri18.png
  75. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri19.png
  76. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri20.png
  77. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri21.png
  78. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri22.png
  79. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri23.png
  80. 二进制
      docs/assets/getting-started-assets/extras/colibri/colibri24.png
  81. 二进制
      docs/assets/getting-started-assets/extras/items/bubble.png
  82. 二进制
      docs/assets/getting-started-assets/extras/items/bubble_magnet.png
  83. 二进制
      docs/assets/getting-started-assets/extras/items/bubble_rocket.png
  84. 二进制
      docs/assets/getting-started-assets/extras/items/coin.png
  85. 二进制
      docs/assets/getting-started-assets/extras/items/heart.png
  86. 二进制
      docs/assets/getting-started-assets/extras/key/key_00.png
  87. 二进制
      docs/assets/getting-started-assets/extras/key/key_01.png
  88. 二进制
      docs/assets/getting-started-assets/extras/key/key_02.png
  89. 二进制
      docs/assets/getting-started-assets/extras/key/key_03.png
  90. 二进制
      docs/assets/getting-started-assets/extras/key/key_04.png
  91. 二进制
      docs/assets/getting-started-assets/extras/key/key_05.png
  92. 二进制
      docs/assets/getting-started-assets/extras/key/key_06.png
  93. 二进制
      docs/assets/getting-started-assets/extras/key/key_07.png
  94. 二进制
      docs/assets/getting-started-assets/extras/key/key_08.png
  95. 二进制
      docs/assets/getting-started-assets/extras/key/key_09.png
  96. 二进制
      docs/assets/getting-started-assets/extras/key/key_10.png
  97. 二进制
      docs/assets/getting-started-assets/extras/key/key_11.png
  98. 二进制
      docs/assets/getting-started-assets/extras/key/key_12.png
  99. 二进制
      docs/assets/getting-started-assets/hero-images/ArmL01.png
  100. 二进制
      docs/assets/getting-started-assets/hero-images/ArmL02.png

+ 1 - 0
docs/assets/car/archive_files.json

@@ -0,0 +1 @@
+{"content":[{"name":"game.projectc","size":228,"pieces":[{"name":"game.projectc0","offset":0}]},{"name":"game.darc","size":22996,"pieces":[{"name":"game.darc0","offset":0}]}]}

二进制
docs/assets/car/game.darc0


+ 19 - 0
docs/assets/car/game.projectc0

@@ -0,0 +1,19 @@
+[project]
+title = Getting started
+
+[bootstrap]
+main_collection = /main/main.collectionc
+
+[input]
+game_binding = /input/game.input_bindingc
+
+[display]
+width = 1280
+height = 720
+
+[physics]
+scale = 0.02
+
+[script]
+shared_state = 1
+

二进制
docs/assets/defold_sound.swf


文件差异内容过多而无法显示
+ 0 - 0
docs/assets/dmengine.js


+ 639 - 0
docs/assets/dmloader.js

@@ -0,0 +1,639 @@
+/* ********************************************************************* */
+/* Load and combine data that is split into archives                     */
+/* ********************************************************************* */
+
+var Combine = {
+    _targets: [],
+    _targetIndex: 0,
+    // target: build target
+    //  name: intended filepath of built object
+    //  size: expected size of built object.
+    //  data: combined data
+    //  downloaded: total amount of data downloaded
+    //  pieces: array of name, offset and data objects
+    //  numExpectedFiles: total number of files expected in description
+    //  lastRequestedPiece: index of last data file requested (strictly ascending)
+    //  totalLoadedPieces: counts the number of data files received
+
+    //MAX_CONCURRENT_XHR: 6,    // remove comment if throttling of XHR is desired.
+
+    isCompleted: false,       // status of process
+
+    _onCombineCompleted: [],    // signature: name, data.
+    _onAllTargetsBuilt:[],      // signature: void
+    _onDownloadProgress: [],    // signature: downloaded, total
+
+    _totalDownloadBytes: 0,
+    _archiveLocationFilter: function(path) { return "split" + path; },
+
+    addProgressListener: function(callback) {
+        if (typeof callback !== 'function') {
+            throw "Invalid callback registration";
+        }
+        this._onDownloadProgress.push(callback);
+    },
+
+    addCombineCompletedListener: function(callback) {
+        if (typeof callback !== 'function') {
+            throw "Invalid callback registration";
+        }
+        this._onCombineCompleted.push(callback);
+    },
+
+    addAllTargetsBuiltListener: function(callback) {
+        if (typeof callback !== 'function') {
+            throw "Invalid callback registration";
+        }
+        this._onAllTargetsBuilt.push(callback);
+    },
+
+    // descriptUrl: location of text file describing files to be preloaded
+    process: function(descriptUrl) {
+        var xhr = new XMLHttpRequest();
+        xhr.open('GET', descriptUrl);
+        xhr.responseType = 'text';
+        xhr.onload = function(evt) {
+            Combine.onReceiveDescription(xhr);
+        };
+        xhr.send(null);
+    },
+
+    cleanUp: function() {
+        this._targets =  [];
+        this._targetIndex = 0;
+        this.isCompleted = false;
+        this._onCombineCompleted = [];
+        this._onAllTargetsBuilt = [];
+        this._onDownloadProgress = [];
+
+        this._totalDownloadBytes = 0;
+    },
+
+    onReceiveDescription: function(xhr) {
+        var json = JSON.parse(xhr.responseText);
+        this._targets = json.content;
+        this._totalDownloadBytes = 0;
+
+        var targets = this._targets;
+        for(var i=0; i<targets.length; ++i) {
+            this._totalDownloadBytes += targets[i].size;
+        }
+        this.requestContent();
+    },
+
+    requestContent: function() {
+        var target = this._targets[this._targetIndex];
+        if (1 < target.pieces.length) {
+            target.data = new Uint8Array(target.size);
+        }
+        var limit = target.pieces.length;
+        if (typeof this.MAX_CONCURRENT_XHR !== 'undefined') {
+            limit = Math.min(limit, this.MAX_CONCURRENT_XHR);
+        }
+        for (var i=0; i<limit; ++i) {
+            this.requestPiece(target, i);
+        }
+    },
+
+    requestPiece: function(target, index) {
+        if (index <  target.lastRequestedPiece) {
+            throw "Request out of order";
+        }
+
+        target.lastRequestedPiece = index;
+        target.progress = {};
+
+        var item = target.pieces[index];
+        var xhr = new XMLHttpRequest();
+        xhr.open('GET', this._archiveLocationFilter('/' + item.name), true);
+        xhr.responseType = 'arraybuffer';
+        xhr.onprogress = function(evt) {
+           target.progress[item.name] = {total: 0, downloaded: 0};
+            if (evt.total && evt.lengthComputable) {
+                target.progress[item.name].total = evt.total;
+            }
+            if (evt.loaded && evt.lengthComputable) {
+                target.progress[item.name].downloaded = evt.loaded;
+                Combine.updateProgress(target);
+            }
+        };
+        xhr.onload = function(evt) {
+            item.data = new Uint8Array(xhr.response);
+            item.dataLength = item.data.length;
+            target.progress[item.name].total = item.dataLength;
+            target.progress[item.name].downloaded = item.dataLength;
+            Combine.copyData(target, item);
+            Combine.onPieceLoaded(target, item);
+            Combine.updateProgress(target);
+            item.data = undefined;
+        };
+        xhr.send(null);
+    },
+
+    updateProgress: function(target) {
+        var total_downloaded = 0;
+        for (var p in target.progress) {
+            total_downloaded += target.progress[p].downloaded;
+        }
+        for(i = 0; i<this._onDownloadProgress.length; ++i) {
+            this._onDownloadProgress[i](total_downloaded, this._totalDownloadBytes);
+        }
+    },
+
+    copyData: function(target, item) {
+        if (1 == target.pieces.length) {
+            target.data = item.data;
+        } else {
+            var start = item.offset;
+            var end = start + item.data.length;
+            if (0 > start) {
+                throw "Buffer underflow";
+            }
+            if (end > target.data.length) {
+                throw "Buffer overflow";
+            }
+            target.data.set(item.data, item.offset);
+        }
+    },
+
+    onPieceLoaded: function(target, item) {
+        if (typeof target.totalLoadedPieces === 'undefined') {
+            target.totalLoadedPieces = 0;
+        }
+        ++target.totalLoadedPieces;
+        if (target.totalLoadedPieces == target.pieces.length) {
+            this.finalizeTarget(target);
+            ++this._targetIndex;
+            for (var i=0; i<this._onCombineCompleted.length; ++i) {
+                this._onCombineCompleted[i](target.name, target.data);
+            }
+            if (this._targetIndex < this._targets.length) {
+                this.requestContent();
+            } else {
+                this.isCompleted = true;
+                for (i=0; i<this._onAllTargetsBuilt.length; ++i) {
+                    this._onAllTargetsBuilt[i]();
+                }
+            }
+        } else {
+            var next = target.lastRequestedPiece + 1;
+            if (next < target.pieces.length) {
+                this.requestPiece(target, next);
+            }
+        }
+    },
+
+    finalizeTarget: function(target) {
+        var actualSize = 0;
+        for (var i=0;i<target.pieces.length; ++i) {
+            actualSize += target.pieces[i].dataLength;
+        }
+        if (actualSize != target.size) {
+            throw "Unexpected data size";
+        }
+
+        if (1 < target.pieces.length) {
+            var output = target.data;
+            var pieces = target.pieces;
+            for (i=0; i<pieces.length; ++i) {
+                var item = pieces[i];
+                // Bounds check
+                var start = item.offset;
+                var end = start + item.dataLength;
+                if (0 < i) {
+                    var previous = pieces[i - 1];
+                    if (previous.offset + previous.dataLength > start) {
+                        throw "Segment underflow";
+                    }
+                }
+                if (pieces.length - 2 > i) {
+                    var next = pieces[i + 1];
+                    if (end > next.offset) {
+                        throw "Segment overflow";
+                    }
+                }
+            }
+        }
+    }
+};
+
+/* ********************************************************************* */
+/* Default splash and progress visualisation                             */
+/* ********************************************************************* */
+
+var DefaultProgress = {
+    progress_id: "_defold-progress",
+    bar_id: "_defold-progress-bar",
+
+    start : function (canvas) {
+        /* Insert default progress bar below canvas */
+        var div = '<div id="' + Progress.progress_id + '">' +
+                    '<div id="' + Progress.bar_id + '">' +
+                    '</div></div>';
+        canvas.insertAdjacentHTML('afterend', div);
+        Progress.bar = document.getElementById(Progress.bar_id);
+        Progress.progress = document.getElementById(Progress.progress_id);
+        Progress.progress.style.width = '100%';
+        Progress.bar.style.width = '50%';
+        Progress.bar.style.background_color = 'red';
+     },
+
+    progress: function (bytes_loaded, bytes_total, status) {
+        var percentage = bytes_loaded / bytes_total * 100;
+/
+ //       Progress.bar.style.width = percentage + "%";
+
+//        text = (typeof text === 'undefined') ? Math.round(percentage) + "%" : text;
+//        Progress.bar.innerText = text;
+    },
+
+    done: function (canvas) {
+        if (Progress.progress.parentElement !== null) {
+            Progress.progress.parentElement.removeChild(Progress.progress);
+        }
+    }
+};
+
+/* ********************************************************************* */
+/* Default input override                                                */
+/* ********************************************************************* */
+
+var CanvasInput = {
+    arrowKeysHandler : function(e) {
+        switch(e.keyCode) {
+            case 37: case 38: case 39:  case 40: // Arrow keys
+            case 32: e.preventDefault(); e.stopPropagation(); // Space
+            default: break; // do not block other keys
+        }
+    },
+
+    onFocusIn : function(e) {
+        window.addEventListener("keydown", CanvasInput.arrowKeysHandler, false);
+    },
+
+    onFocusOut: function(e) {
+        window.removeEventListener("keydown", CanvasInput.arrowKeysHandler, false);
+    },
+
+    addToCanvas : function(canvas) {
+        canvas.addEventListener("focus", CanvasInput.onFocusIn, false);
+        canvas.addEventListener("blur", CanvasInput.onFocusOut, false);
+        canvas.focus();
+        CanvasInput.onFocusIn();
+    }
+};
+
+/* ********************************************************************* */
+/* Module is Emscripten namespace                                        */
+/* ********************************************************************* */
+
+var Module = {
+    noInitialRun: true,
+
+    _filesToPreload: [],
+    _archiveLoaded: false,
+    _preLoadDone: false,
+    _waitingForArchive: false,
+
+    // Persistent storage
+    persistentStorage: true,
+    _syncInProgress: false,
+    _syncNeeded: false,
+    _syncInitial: false,
+    _syncMaxTries: 3,
+    _syncTries: 0,
+
+    print: function(text) { console.log(text); },
+    printErr: function(text) { console.error(text); },
+
+    setStatus: function(text) { console.log(text); },
+
+    prepareErrorObject: function (err, url, line, column, errObj) {
+        line = typeof line == "undefined" ? 0 : line;
+        column = typeof column == "undefined" ? 0 : column;
+        url = typeof url == "undefined" ? "" : url;
+        var errorLine = url + ":" + line + ":" + column;
+
+        var error = errObj || (typeof window.event != "undefined" ? window.event.error : "" ) || err || "Undefined Error";
+        var message = "";
+        var stack = "";
+        var backtrace = "";
+
+        if (typeof error == "object" && typeof error.stack != "undefined" && typeof error.message != "undefined") {
+            stack = String(error.stack);
+            message = String(error.message);
+        } else {
+            stack = String(error).split("\n");
+            message = stack.shift();
+            stack = stack.join("\n");
+        }
+        stack = stack || errorLine;
+
+        var callLine = /at (\S+:\d*$)/.exec(message);
+        if (callLine) {
+            message = message.replace(/(at \S+:\d*$)/, "");
+            stack = callLine[1] + "\n" + stack;
+        }
+
+        message = message.replace(/(abort\(.+\)) at .+/, "$1");
+        stack = stack.replace(/\?{1}\S+(:\d+:\d+)/g, "$1");
+        stack = stack.replace(/ *at (\S+)$/gm, "@$1");
+        stack = stack.replace(/ *at (\S+)(?: \[as \S+\])? +\((.+)\)/g, "$1@$2");
+        stack = stack.replace(/^((?:Object|Array)\.)/gm, "");
+        stack = stack.split("\n");
+
+        return { stack:stack, message:message };
+    },
+
+    hasWebGLSupport: function() {
+        var webgl_support = false;
+        try {
+            var canvas = document.createElement("canvas");
+            var gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
+            if (gl && gl instanceof WebGLRenderingContext) {
+                webgl_support = true;
+            }
+        } catch (error) {
+            console.log("An error occurred while detecting WebGL support: " + error);
+            webgl_support = false;
+        }
+
+        return webgl_support;
+    },
+
+    /**
+    * Module.runApp - Starts the application given a canvas element id
+    *
+    * 'extra_params' is an optional object that can have the following fields:
+    *
+    *     'splash_image':
+    *         Path to an image that should be used as a background image for
+    *         the canvas element.
+    *
+    *     'archive_location_filter':
+    *         Filter function that will run for each archive path.
+    *
+    *     'unsupported_webgl_callback':
+    *         Function that is called if WebGL is not supported.
+    *
+    *     'engine_arguments':
+    *         List of arguments (strings) that will be passed to the engine.
+    *
+    *     'persistent_storage':
+    *         Boolean toggling the usage of persistent storage.
+    *
+    *     'custom_heap_size':
+    *         Number of bytes specifying the memory heap size.
+    *
+    *
+    *
+    **/
+    runApp: function(app_canvas_id, extra_params) {
+        app_canvas_id = (typeof app_canvas_id === 'undefined') ?  'canvas' : app_canvas_id;
+
+        var params = {
+            splash_image: undefined,
+            archive_location_filter: function(path) { return 'split' + path; },
+            unsupported_webgl_callback: undefined,
+            engine_arguments: [],
+            persistent_storage: true,
+            custom_heap_size: undefined,
+            load_start: DefaultProgress.start,
+            load_progress: DefaultProgress.progress,
+            load_done: DefaultProgress.done
+        };
+
+        for (var k in extra_params) {
+            if (extra_params.hasOwnProperty(k)) {
+                params[k] = extra_params[k];
+            }
+        }
+
+        Module.canvas = document.getElementById(app_canvas_id);
+        if (typeof params["splash_image"] !== 'undefined') {
+            Module.canvas.style.background = 'no-repeat center url("' + params["splash_image"] + '")';
+        }
+        Module.arguments = params["engine_arguments"];
+        Module.persistentStorage = params["persistent_storage"];
+        Module["TOTAL_MEMORY"] = params["custom_heap_size"];
+
+        if (Module.hasWebGLSupport()) {
+            // Override game keys
+            CanvasInput.addToCanvas(Module.canvas);
+
+            // Load Facebook API
+            var fb = document.createElement('script');
+            fb.type = 'text/javascript';
+            fb.src = '//connect.facebook.net/en_US/sdk.js';
+            document.head.appendChild(fb);
+
+            // Add progress
+            params.load_start(Module.canvas);
+
+            // Load and assemble archive
+            Combine.addCombineCompletedListener(Module.onArchiveFileLoaded);
+            Combine.addAllTargetsBuiltListener(Module.onArchiveLoaded);
+            Combine.addProgressListener(Module.onArchiveLoadProgress);
+            Combine._archiveLocationFilter = params["archive_location_filter"];
+            Combine.process(Combine._archiveLocationFilter('/archive_files.json'));
+        } else {
+            params.load_start(Module.canvas);
+            params.load_progress(0, 0, "Unable to start game, WebGL not supported");
+            Module.setStatus = function(text) {
+                if (text) Module.printErr('[missing WebGL] ' + text);
+            };
+
+            if (typeof params["unsupported_webgl_callback"] === "function") {
+                params["unsupported_webgl_callback"]();
+            }
+        }
+    },
+
+    /* Simulate app loading etc for frontend testing */
+    testApp: function(app_canvas_id, extra_params) {
+        app_canvas_id = (typeof app_canvas_id === 'undefined') ?  'canvas' : app_canvas_id;
+
+        var params = {
+            splash_image: undefined,
+            archive_location_filter: function(path) { return 'split' + path; },
+            unsupported_webgl_callback: undefined,
+            engine_arguments: [],
+            persistent_storage: true,
+            custom_heap_size: undefined,
+            load_start: DefaultProgress.start,
+            load_progress: DefaultProgress.progress,
+            load_done: DefaultProgress.done
+        };
+        for (var k in extra_params) {
+            if (extra_params.hasOwnProperty(k)) {
+                params[k] = extra_params[k];
+            }
+        }
+        Module.canvas = document.getElementById(app_canvas_id);
+        // Add progress
+        params.load_start(Module.canvas);
+
+
+    },
+
+    onArchiveLoadProgress: function(downloaded, total) {
+        params.load_progress(downloaded, total);
+    },
+
+    onArchiveFileLoaded: function(name, data) {
+        Module._filesToPreload.push({path: name, data: data});
+    },
+
+    onArchiveLoaded: function() {
+        Combine.cleanUp();
+        Module._archiveLoaded = true;
+
+        Progress.updateProgress(100, "Starting...");
+        params.load_progress(downloaded, total);
+
+        if (Module._waitingForArchive) {
+            Module._preloadAndCallMain();
+        }
+    },
+
+    toggleFullscreen: function() {
+        if (GLFW.isFullscreen) {
+            GLFW.cancelFullScreen();
+        } else {
+            GLFW.requestFullScreen();
+        }
+    },
+
+    preSync: function(done) {
+        // Initial persistent sync before main is called
+        FS.syncfs(true, function(err) {
+            if(err) {
+                Module._syncTries += 1;
+                console.error("FS syncfs error: " + err);
+                if (Module._syncMaxTries > Module._syncTries) {
+                    Module.preSync(done);
+                } else {
+                    Module._syncInitial = true;
+                    done();
+                }
+            } else {
+                Module._syncInitial = true;
+                if (done !== undefined) {
+                    done();
+                }
+            }
+        });
+    },
+
+    preloadAll: function() {
+        if (Module._preLoadDone) {
+            return;
+        }
+        for (var i = 0; i < Module._filesToPreload.length; ++i) {
+            var item = Module._filesToPreload[i];
+            FS.createPreloadedFile("", item.path, item.data, true, true);
+        }
+        Module._preLoadDone = true;
+    },
+
+    // Tries to do a MEM->IDB sync
+    // It will flag that another one is needed if there is already one sync running.
+    persistentSync: function() {
+
+        // Need to wait for the initial sync to finish since it
+        // will call close on all its file streams which will trigger
+        // new persistentSync for each.
+        if (Module._syncInitial) {
+            if (Module._syncInProgress) {
+                Module._syncNeeded = true;
+            } else {
+                Module._startSyncFS();
+            }
+        }
+    },
+
+    preInit: [function() {
+        /* Mount filesystem on preinit */
+        var dir = DMSYS.GetUserPersistentDataRoot();
+        FS.mkdir(dir);
+
+        // If IndexedDB is supported we mount the persistent data root as IDBFS,
+        // then try to do a IDB->MEM sync before we start the engine to get
+        // previously saved data before boot.
+        window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
+        if (Module.persistentStorage && window.indexedDB) {
+            FS.mount(IDBFS, {}, dir);
+
+            // Patch FS.close so it will try to sync MEM->IDB
+            var _close = FS.close; FS.close = function(stream) { var r = _close(stream); Module.persistentSync(); return r; }
+
+            // Sync IDB->MEM before calling main()
+            Module.preSync(function() {
+                Module._preloadAndCallMain();
+            });
+        } else {
+            Module._preloadAndCallMain();
+        }
+    }],
+
+    preRun: [function() {
+        /* If archive is loaded, preload all its files */
+        if(Module._archiveLoaded) {
+            Module.preloadAll();
+        }
+    }],
+
+    postRun: [function() {
+        if(Module._archiveLoaded) {
+            Progress.removeProgress();
+        }
+    }],
+
+    _preloadAndCallMain: function() {
+        // If the archive isn't loaded,
+        // we will have to wait with calling main.
+        if (!Module._archiveLoaded) {
+            Module._waitingForArchive = true;
+        } else {
+
+            // Need to set heap size before calling main
+            TOTAL_MEMORY = Module["TOTAL_MEMORY"] || TOTAL_MEMORY;
+
+            Module.preloadAll();
+            Progress.removeProgress();
+            Module.callMain(Module.arguments);
+        }
+    },
+
+    // Wrap IDBFS syncfs call with logic to avoid multiple syncs
+    // running at the same time.
+    _startSyncFS: function() {
+        Module._syncInProgress = true;
+
+        if (Module._syncMaxTries > Module._syncTries) {
+            FS.syncfs(false, function(err) {
+                Module._syncInProgress = false;
+
+                if (err) {
+                    console.error("Module._startSyncFS error: " + err);
+                    Module._syncTries += 1;
+                }
+
+                if (Module._syncNeeded) {
+                    Module._syncNeeded = false;
+                    Module._startSyncFS();
+                }
+
+            });
+        }
+    },
+};
+
+window.onerror = function(err, url, line, column, errObj) {
+    var errorObject = Module.prepareErrorObject(err, url, line, column, errObj);
+    Module.ccall('JSWriteDump', 'null', ['string'], [JSON.stringify(errorObject.stack)]);
+    Module.setStatus('Exception thrown, see JavaScript console');
+    Module.setStatus = function(text) {
+        if (text) Module.printErr('[post-exception status] ' + text);
+    };
+};

二进制
docs/assets/examples-project.zip


+ 1 - 0
docs/assets/examples/archive_files.json

@@ -0,0 +1 @@
+{"content":[{"name":"game.projectc","size":399,"pieces":[{"name":"game.projectc0","offset":0}]},{"name":"game.darc","size":2382616,"pieces":[{"name":"game.darc0","offset":0},{"name":"game.darc1","offset":2097152}]}]}

二进制
docs/assets/examples/game.darc0


二进制
docs/assets/examples/game.darc1


+ 31 - 0
docs/assets/examples/game.projectc0

@@ -0,0 +1,31 @@
+[project]
+title = Defold examples
+version = 0.1
+
+[bootstrap]
+main_collection = /main/main.collectionc
+render = /render/example.renderc
+
+[input]
+game_binding = /input/game.input_bindingc
+
+[display]
+width = 1024
+height = 768
+
+[physics]
+scale = 0.02
+debug = 0
+gravity_y = -100
+max_collisions = 1024
+max_contacts = 8192
+
+[script]
+shared_state = 1
+
+[factory]
+max_count = 1024
+
+[sprite]
+max_count = 1024
+

二进制
docs/assets/getting-started-assets.zip


二进制
docs/assets/getting-started-assets/BoogalooOne-Regular.ttf


二进制
docs/assets/getting-started-assets/extras/bee/Bee01.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee02.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee03.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee04.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee05.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee06.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee07.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee08.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee09.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee10.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee11.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee12.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee13.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee14.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee15.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee16.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee17.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee18.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee19.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee20.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee21.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee22.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee23.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee24.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot01.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot02.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot03.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot04.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot05.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot06.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot07.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot08.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot09.png


二进制
docs/assets/getting-started-assets/extras/bee/Bee_shot10.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting01.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting02.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting03.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting04.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting05.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting06.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting07.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting08.png


二进制
docs/assets/getting-started-assets/extras/bee/Sting09.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri01.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri02.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri03.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri04.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri05.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri06.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri07.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri08.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri09.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri10.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri11.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri12.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri13.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri14.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri15.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri16.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri17.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri18.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri19.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri20.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri21.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri22.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri23.png


二进制
docs/assets/getting-started-assets/extras/colibri/colibri24.png


二进制
docs/assets/getting-started-assets/extras/items/bubble.png


二进制
docs/assets/getting-started-assets/extras/items/bubble_magnet.png


二进制
docs/assets/getting-started-assets/extras/items/bubble_rocket.png


二进制
docs/assets/getting-started-assets/extras/items/coin.png


二进制
docs/assets/getting-started-assets/extras/items/heart.png


二进制
docs/assets/getting-started-assets/extras/key/key_00.png


二进制
docs/assets/getting-started-assets/extras/key/key_01.png


二进制
docs/assets/getting-started-assets/extras/key/key_02.png


二进制
docs/assets/getting-started-assets/extras/key/key_03.png


二进制
docs/assets/getting-started-assets/extras/key/key_04.png


二进制
docs/assets/getting-started-assets/extras/key/key_05.png


二进制
docs/assets/getting-started-assets/extras/key/key_06.png


二进制
docs/assets/getting-started-assets/extras/key/key_07.png


二进制
docs/assets/getting-started-assets/extras/key/key_08.png


二进制
docs/assets/getting-started-assets/extras/key/key_09.png


二进制
docs/assets/getting-started-assets/extras/key/key_10.png


二进制
docs/assets/getting-started-assets/extras/key/key_11.png


二进制
docs/assets/getting-started-assets/extras/key/key_12.png


二进制
docs/assets/getting-started-assets/hero-images/ArmL01.png


二进制
docs/assets/getting-started-assets/hero-images/ArmL02.png


部分文件因为文件数量过多而无法显示