Есть ли в любом случае изменить путь BLOB-объекта из URL.createObjectURL - PullRequest
0 голосов
/ 19 февраля 2020

Я использую модуль GMS1.4 HTML5 и сейчас пытаюсь импортировать в него спрайт-изображения. Проблема в том, что я не хочу сохранять его в локальном каталоге, и поскольку есть встроенная функция, которая позволяет добавлять спрайт с URL-адреса, о котором я думал, просто используя BLOB-объект для выполнения работы, так что временный спрайт стирается из памяти после того, как пользователь завершил игру.

Проблема 1.4 в изолированной программной среде, поэтому все URL-ссылки и ссылки указывают на локальное хранилище. вместо

blob:http://mysite.co/85cad96e-e44e-a1f9-db97a96ed3fe

он будет предварительно настроен следующим образом

http://mysite.co/html5game/blob:http://mysite/85cad96e-e44e-a1f9-db97a96ed3fe

Я только предполагаю, что это связано с природой GMS для песочницы, и, похоже, нет способа его отключить. , Моя следующая идея заключается в том, что, поскольку он хочет быть упрямым в использовании каталога песочницы, я просто создал большой двоичный объект в этой папке. Можно ли создать по пути и URL.createObjectURL?

1 Ответ

0 голосов
/ 23 февраля 2020

Вы можете адаптировать подход, основанный на том, что я сделал для «Разрешить URI данных» , чтобы также разрешать URI BLOB-объектов. Выдержка следует,

GML:

#define gmcallback_AllowDataURI
if (AllowDataURI()) {
    AllowDataURI(sprite_add("", 1, 0, 0, 0, 0));
}

JS:

function AllowDataURI() {
    var p0 = "\\s*\\(\\s*";
    var p1 = "\\s*\\)\\s*";
    var eq = "\\s*=\\s*";
    var id = "\\w+";
    //
    var init_js = window.gml_Script_gmcallback_AllowDataURI.toString();
    var sprite_add_js = window[
        /\bAllowDataURI\s*\(\s*(\w+)/.exec(init_js)[1] // AllowDataURI(sprite_add(...
    ].toString();
    var sprite_add_url = /function\s*\w*\s*\((\w+)/g.exec(sprite_add_js)[1];
    var sprite_add_url2 = new RegExp(
        "("+id+")"+eq+sprite_add_url+"\\b", // `sprite_add_url2 = sprite_add_url`
    "g").exec(sprite_add_js);
    sprite_add_url2 = sprite_add_url2 ? sprite_add_url2[1] : sprite_add_url;
    //
    var image_add_js = window[new RegExp(
        id+eq+"("+id+")"+p0+sprite_add_url2+p1, // `_ = image_add(sprite_add_url2)`
    "g").exec(sprite_add_js)[1]].toString();
    var image_add_url = /function\s*\w*\s*\((\w+)/g.exec(image_add_js)[1];
    //
    var url_proc = new RegExp(
        id+eq+"("+id+")"+p0+image_add_url+p1, // `_ = url_proc(image_add_url)`
    "g").exec(image_add_js)[1];
    window[url_proc] = (function() {
        var f = window[url_proc];
        return function(url) {
            if (url.substring(0, 5) == "data:") return url;
            if (url.substring(0, 5) == "blob:") return url; // new!
            return f.apply(this, arguments);
        };
    })();
    //
    return false;
}
...