From d08100cf61cfdd101dc14bc69caac482cbaaceee Mon Sep 17 00:00:00 2001 From: Valerie R Young Date: Fri, 26 Apr 2019 17:42:07 -0400 Subject: [PATCH 1/2] Add example standalone player in vm --- src/playground/playground.sb3 | Bin 0 -> 41928 bytes src/playground/standalone-player.html | 69 ++++++++++++ src/playground/standalone-player.js | 151 ++++++++++++++++++++++++++ webpack.config.js | 1 + 4 files changed, 221 insertions(+) create mode 100644 src/playground/playground.sb3 create mode 100644 src/playground/standalone-player.html create mode 100644 src/playground/standalone-player.js diff --git a/src/playground/playground.sb3 b/src/playground/playground.sb3 new file mode 100644 index 0000000000000000000000000000000000000000..66bee4e30ceea61aca5290a097b7956f39802f08 GIT binary patch literal 41928 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 literal 0 HcmV?d00001 diff --git a/src/playground/standalone-player.html b/src/playground/standalone-player.html new file mode 100644 index 00000000000..30e6c167d86 --- /dev/null +++ b/src/playground/standalone-player.html @@ -0,0 +1,69 @@ + + + + + + + + +
+ + +
+ + + + diff --git a/src/playground/standalone-player.js b/src/playground/standalone-player.js new file mode 100644 index 00000000000..4cb8bf06ba3 --- /dev/null +++ b/src/playground/standalone-player.js @@ -0,0 +1,151 @@ +const AudioEngine = require('scratch-audio'); +const ScratchStorage = require('scratch-storage'); +const ScratchRender = require('scratch-render'); +const ScratchSVGRenderer = require('scratch-svg-renderer'); +const VirtualMachine = require('..'); + +/** + * This file is an example of how to create a standalone, full screen + * minimal scratch player without the editor view. + * This file does not presentally include monitors, which are drawn by the GUI. + */ +const projectGetConfig = function (projectAsset) { + return `https://projects.scratch.mit.edu/${projectAsset.assetId}`; +}; +const assetGetConfig = function (asset) { + return `https://assets.scratch.mit.edu/internalapi/asset/${asset.assetId}.${asset.dataFormat}/get/`; +}; + +window.onload = function () { + + // Get the project id from the hash, or use the default project. + let projectId; + if (window.location.hash) { + projectId = window.location.hash.substring(1); + } + + // Instantiate the VM. + const vm = new VirtualMachine(); + vm.attachV2BitmapAdapter(new ScratchSVGRenderer.BitmapAdapter()); + vm.attachV2SVGAdapter(new ScratchSVGRenderer.SVGRenderer()); + + // Initialize storage + const storage = new ScratchStorage(); + const AssetType = storage.AssetType; + storage.addWebStore([AssetType.Project], projectGetConfig); + storage.addWebStore([AssetType.ImageVector, AssetType.ImageBitmap, AssetType.Sound], assetGetConfig); + + vm.attachStorage(storage); + + // Compatibility mode will set the frame rate to 30 TPS, + // which is the standard for the scratch player. + vm.setCompatibilityMode(true); + + if (!projectId) { + // If no project ID is supplied, load a local project + fetch('./playground.sb3').then(function(response) { + return response.arrayBuffer(); + }).then(function(arrayBuffer) { + vm.loadProject(arrayBuffer); + }); + } + else { + vm.downloadProjectId(projectId); + } + + vm.on('workspaceUpdate', () => { + document.getElementById('overlay').classList.remove('hidden'); + }); + + // Instantiate the renderer and connect it to the VM. + const canvas = document.getElementById('scratch-stage'); + const renderer = new ScratchRender(canvas); + vm.attachRenderer(renderer); + const audioEngine = new AudioEngine(); + vm.attachAudioEngine(audioEngine); + + // Resets size of canvas directly for proper image calcuations + // when the window is resized + const resize = () => { + renderer.resize(canvas.clientWidth, canvas.clientHeight); + }; + window.addEventListener('resize', resize); + + resize(); + + // Start project after green flag clicked and attempt to go + // fullscreen + let attemptFullscreen = Boolean(document.body.requestFullscreen); + document.getElementById('green-flag').addEventListener('click', () => { + document.getElementById('overlay').classList.add('hidden'); + vm.greenFlag(); + if (attemptFullscreen) { + document.body.requestFullscreen(); + attemptFullscreen = false; + } + }); + + // Feed mouse events as VM I/O events. + document.body.addEventListener('mousemove', e => { + const rect = canvas.getBoundingClientRect(); + const coordinates = { + x: e.clientX - rect.left, + y: e.clientY - rect.top, + canvasWidth: rect.width, + canvasHeight: rect.height + }; + vm.postIOData('mouse', coordinates); + }); + canvas.addEventListener('mousedown', e => { + const rect = canvas.getBoundingClientRect(); + const data = { + isDown: true, + x: e.clientX - rect.left, + y: e.clientY - rect.top, + canvasWidth: rect.width, + canvasHeight: rect.height + }; + vm.postIOData('mouse', data); + e.preventDefault(); + }); + canvas.addEventListener('mouseup', e => { + const rect = canvas.getBoundingClientRect(); + const data = { + isDown: false, + x: e.clientX - rect.left, + y: e.clientY - rect.top, + canvasWidth: rect.width, + canvasHeight: rect.height + }; + vm.postIOData('mouse', data); + e.preventDefault(); + }); + + // Feed keyboard events as VM I/O events. + document.body.addEventListener('keydown', e => { + // Don't capture keys intended for Blockly inputs. + if (e.target !== document && e.target !== document.body) { + return; + } + vm.postIOData('keyboard', { + key: e.code, + isDown: true + }); + e.preventDefault(); + }); + document.body.addEventListener('keyup', e => { + // Always capture up events, + // even those that have switched to other targets. + vm.postIOData('keyboard', { + key: e.code, + isDown: false + }); + // E.g., prevent scroll. + if (e.target !== document && e.target !== document.body) { + e.preventDefault(); + } + }); + + // Run threads + vm.start(); +}; diff --git a/webpack.config.js b/webpack.config.js index 9b38815bd61..449c9ffe326 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -88,6 +88,7 @@ module.exports = [ target: 'web', entry: { 'benchmark': './src/playground/benchmark', + 'standalone-player': './src/playground/standalone-player', 'video-sensing-extension-debug': './src/extensions/scratch3_video_sensing/debug' }, output: { From 0cd53ab152923a37a7e4eec6602b25a4e7431b99 Mon Sep 17 00:00:00 2001 From: Valerie R Young Date: Mon, 29 Apr 2019 11:49:35 -0400 Subject: [PATCH 2/2] Satisfy linter --- src/playground/standalone-player.js | 30 +++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/playground/standalone-player.js b/src/playground/standalone-player.js index 4cb8bf06ba3..637e12a5c39 100644 --- a/src/playground/standalone-player.js +++ b/src/playground/standalone-player.js @@ -4,14 +4,22 @@ const ScratchRender = require('scratch-render'); const ScratchSVGRenderer = require('scratch-svg-renderer'); const VirtualMachine = require('..'); +// This file is an example of how to create a standalone, full screen +// minimal scratch player without the editor view. +// This file does not presentally include monitors, which are drawn by the GUI. + /** - * This file is an example of how to create a standalone, full screen - * minimal scratch player without the editor view. - * This file does not presentally include monitors, which are drawn by the GUI. + * @param {Asset} projectAsset - calculate a URL for this asset. + * @returns {string} a URL to download a project file. */ const projectGetConfig = function (projectAsset) { return `https://projects.scratch.mit.edu/${projectAsset.assetId}`; }; + +/** + * @param {Asset} asset - calculate a URL for this asset. + * @returns {string} a URL to download a project asset (PNG, WAV, etc.) + */ const assetGetConfig = function (asset) { return `https://assets.scratch.mit.edu/internalapi/asset/${asset.assetId}.${asset.dataFormat}/get/`; }; @@ -41,16 +49,14 @@ window.onload = function () { // which is the standard for the scratch player. vm.setCompatibilityMode(true); - if (!projectId) { - // If no project ID is supplied, load a local project - fetch('./playground.sb3').then(function(response) { - return response.arrayBuffer(); - }).then(function(arrayBuffer) { - vm.loadProject(arrayBuffer); - }); - } - else { + if (projectId) { vm.downloadProjectId(projectId); + } else { + // If no project ID is supplied, load a local project + fetch('./playground.sb3').then(response => response.arrayBuffer()) + .then(arrayBuffer => { + vm.loadProject(arrayBuffer); + }); } vm.on('workspaceUpdate', () => {