diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dcde274..e499d7e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,55 @@ jobs: - name: Build and test run: mvn --batch-mode --no-transfer-progress verify + - name: Check shared release metadata + if: runner.os == 'Linux' + uses: actions/checkout@v7 + with: + repository: openpatch/scratch-for-java + path: .validation/library + - name: Set up the catalog toolchain + if: runner.os == 'Linux' + uses: ./.validation/library/.github/actions/setup-maven + - name: Generate reference metadata for the catalog check + if: runner.os == 'Linux' + working-directory: .validation/library + run: mvn --batch-mode --no-transfer-progress -DskipTests prepare-package + - name: Require current offline catalogs + if: runner.os == 'Linux' + run: | + python3 .validation/library/scripts/release-catalogs.py --check --studio . + python3 .validation/library/scripts/release-catalogs.py --archive .validation/examples.zip + python3 scripts/sync-templates.py --artifact .validation/examples.zip --check + + - name: Checkout course activities + if: runner.os == 'Linux' + uses: actions/checkout@v7 + with: + repository: openpatch/hyperbook-informatik + path: .validation/curriculum + - name: Import and validate the complete offline course + if: runner.os == 'Linux' + run: python3 scripts/check-course-pack.py --library .validation/library --curriculum .validation/curriculum + + - name: Checkout the embedded project adapter + if: runner.os == 'Linux' + uses: actions/checkout@v7 + with: + repository: openpatch/online-ide + path: .validation/online-ide + - name: Prepare the browser transfer check + if: runner.os == 'Linux' + uses: actions/setup-node@v4 + with: + node-version: '22' + - name: Continue an edited curriculum project across environments + if: runner.os == 'Linux' + run: | + npm --prefix .validation/online-ide ci + npm --prefix .validation/online-ide run browser:install -- --with-deps + cd .validation/online-ide + node scripts/test-curriculum-transfer.mjs ../curriculum/book/projekte/spielwerkstatt/checkpoints/spielwerkstatt-q-07-testen.json ../.. + - name: OpenGL run smoke (Linux, Xvfb) # A real stage opens a window in a separate JVM and exits via the smoke switch. if: runner.os == 'Linux' diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index e9c64a7..7f2945d 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -42,10 +42,10 @@ jobs: types: msi app-image - name: macos-arm64 os: macos-15 - types: dmg + types: dmg app-image - name: macos-x64 os: macos-15-intel - types: dmg + types: dmg app-image steps: - uses: actions/checkout@v7 @@ -80,8 +80,14 @@ jobs: scripts/package-ide.sh "$type" if [ "$type" = app-image ]; then # the portable build: unzip and run, no admin rights (USB sticks) - (cd target/package && 7z a -tzip "../../dist/scratch4j-studio-${{ matrix.name }}-portable.zip" "Scratch for Java Studio" >/dev/null \ - || zip -qr "../../dist/scratch4j-studio-${{ matrix.name }}-portable.zip" "Scratch for Java Studio") + archive="../../dist/scratch4j-studio-${{ matrix.name }}-portable.zip" + if [ "$RUNNER_OS" = macOS ]; then + (cd target/package && ditto -c -k --sequesterRsrc --keepParent "Scratch for Java Studio.app" "$archive") + elif [ "$RUNNER_OS" = Windows ]; then + (cd target/package && 7z a -tzip "$archive" "Scratch for Java Studio" >/dev/null) + else + (cd target/package && zip -qry "$archive" "Scratch for Java Studio") + fi else cp target/package/*.${type} dist/ 2>/dev/null || true fi @@ -122,16 +128,17 @@ jobs: & $signtool.FullName sign /f $pfx /p $env:WINDOWS_CERTIFICATE_PASSWORD /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 $_.FullName } - - name: Smoke test the packaged runtime (Linux, Xvfb) - if: runner.os == 'Linux' + - name: Start packaged Studio and run offline projects + shell: bash run: | - sudo apt-get install -y xvfb >/dev/null 2>&1 || true - scripts/package-ide.sh app-image - APP="target/package/Scratch for Java Studio" - compgen -G "$APP/lib/app/library/scratch-*-all.jar" >/dev/null - "$APP/lib/runtime/bin/java" --list-modules | grep -q jdk.compiler - test -f "$APP/lib/app/javafx-controls-25-linux.jar" - "$APP/lib/runtime/bin/java" -XX:+AllowEnhancedClassRedefinition -version + if [ "$RUNNER_OS" = Linux ]; then + sudo apt-get install -y xvfb libgl1-mesa-dri + LIBGL_ALWAYS_SOFTWARE=1 xvfb-run -a python3 scripts/smoke-packaged.py "target/package/Scratch for Java Studio" + elif [ "$RUNNER_OS" = macOS ]; then + python3 scripts/smoke-packaged.py "target/package/Scratch for Java Studio.app" + else + python scripts/smoke-packaged.py "target/package/Scratch for Java Studio" + fi - uses: actions/upload-artifact@v7 with: diff --git a/README.md b/README.md index 8ccfe7b..01de30b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Scratch for Java Studio is a desktop IDE for students moving from Scratch to Java. It builds projects with [Scratch for Java](https://github.com/openpatch/scratch-for-java) and keeps them as ordinary Java source files that also work in BlueJ and VS Code. -**Status: 0.1.0-alpha.6 candidate.** The IDE and its +**Status: 0.1.0-alpha.7.** The IDE and its project format may change while we test it with students and teachers. ![Scratch for Java Studio with the code editor and the visual stage designer side by side](docs/screenshot.png) @@ -68,3 +68,30 @@ The IDE is [MIT licensed](LICENSE). Bundled Scratch for Java artwork and sounds come from [Kenney](https://kenney.nl) under CC0. OGG and MP3 support uses replaceable LGPL libraries; RichTextFX, AtlantaFX, Ikonli, and Feather icons retain their respective licenses. + + +## Continue between browser and desktop + +Open a browser workspace JSON or portable project ZIP through the Project menu. +Export a Browser project ZIP to continue in an embedded IDE revision with ZIP +support. Code, assets, flavor and lesson identity travel with the project. NRW +course classes remain ordinary source on desktop and are retained in the browser. + +Use Project > Import course pack for the offline tutorial/Spielwerkstatt pack. +Run > Run behavior checks executes transferred browser test classes with bundled +JUnit, leaving their source unchanged. Scratch imports have a Scratch migration +tab linking timing/unsupported-block tasks to the original block and Java source; +the original .sb3 remains in the project. + +Maintainer checks after `mvn verify`: + +```sh +python3 scripts/check-course-pack.py --library /path/to/scratch-for-java \ + --curriculum /path/to/hyperbook-informatik +python3 scripts/sync-templates.py --artifact /path/to/scratch-catalogs.zip --check +``` + +The course check imports and compiles all 18 projects and runs the score tests. +Use `--libraries /path/to/bundled/library` for a fully offline check. The native +packaging workflow runs `scripts/smoke-packaged.py` on each supported OS. Local +Linux validation uses Xvfb when no display is available. diff --git a/app/pom.xml b/app/pom.xml index 0f0e177..a49e282 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -7,7 +7,7 @@ org.openpatch.scratch4j scratch4j-ide - 0.1.0-alpha.6 + 0.1.0-alpha.7 app diff --git a/core/pom.xml b/core/pom.xml index 0abae46..4ce38b3 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -7,13 +7,19 @@ org.openpatch.scratch4j scratch4j-ide - 0.1.0-alpha.6 + 0.1.0-alpha.7 core Scratch for Java Studio :: core + + + org.junit.platform + junit-platform-console-standalone + 1.11.4 + diff --git a/core/src/main/java/org/openpatch/scratch4j/core/api/ApiIndex.java b/core/src/main/java/org/openpatch/scratch4j/core/api/ApiIndex.java index 66c6c1c..a4ef931 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/api/ApiIndex.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/api/ApiIndex.java @@ -6,17 +6,24 @@ import java.io.InputStream; import java.util.List; import java.util.Optional; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.zip.ZipFile; +import org.openpatch.scratch4j.core.project.ScratchProject; +import org.openpatch.scratch4j.core.project.LibraryCheck; /** * The API index the IDE ships (offline-first): every public library method * with signature, summary, Scratch block and docs URL. Generated from the - * library's sources jar — see {@link ApiIndexGenerator}. + * library's release catalog. {@link ApiIndexGenerator} adapts older sources JARs. */ public final class ApiIndex { private static final String RESOURCE = "/api-index.json"; - private final List methods; + private List methods; + private String libraryVersion = ""; private ApiIndex(List methods) { this.methods = List.copyOf(methods); @@ -24,6 +31,11 @@ private ApiIndex(List methods) { /** Loads the bundled index. */ public static ApiIndex load() { + try (InputStream in = ApiIndex.class.getResourceAsStream("/catalogs/api.json")) { + if (in != null) return catalog(in); + } catch (IOException | RuntimeException e) { + throw new IllegalStateException("Cannot load bundled API catalog", e); + } try (InputStream in = ApiIndex.class.getResourceAsStream(RESOURCE)) { if (in == null) { throw new IllegalStateException("Missing bundled resource " + RESOURCE); @@ -35,6 +47,90 @@ public static ApiIndex load() { } } + private static ApiIndex catalog(InputStream in) throws IOException { + var root = JsonMapper.builder().build().readTree(in); + if (root.path("schemaVersion").asInt() != 1) throw new IOException("Unsupported API catalog"); + List methods = new ArrayList<>(); + for (var entry : root.path("methods")) { + List params = new ArrayList<>(); + entry.path("params").forEach(value -> params.add(value.asText())); + List paramDocs = new ArrayList<>(); + entry.path("paramDocs").forEach(value -> paramDocs.add(value.asText())); + ApiMethod method = new ApiMethod(entry.path("className").asText(), entry.path("methodName").asText(), + entry.path("returnType").asText(), params, entry.path("summary").asText(), + entry.path("scratchblock").isNull() ? null : entry.path("scratchblock").asText(), + "", entry.path("docsUrl").asText(), entry.path("description").asText(), paramDocs, + entry.path("returns").isNull() || entry.path("returns").isMissingNode() ? null : entry.path("returns").asText()); + methods.add(new ApiMethod(method.className(), method.methodName(), method.returnType(), method.params(), + method.summary(), method.scratchblock(), Categories.of(method), method.docsUrl(), + method.description(), method.paramDocs(), method.returns())); + } + if (methods.isEmpty()) throw new IOException("Empty API catalog"); + ApiIndex result = new ApiIndex(methods); + result.libraryVersion = root.path("libraryVersion").asText(); + return result; + } + + /** Select local release metadata for this project, with a sources adapter for older releases. */ + public void useProject(ScratchProject project) throws IOException { + var status = LibraryCheck.status(project, load().libraryVersion); + ApiIndex selected = load(); + if (status.jar() != null) { + try (ZipFile jar = new ZipFile(status.jar().toFile())) { + var entry = jar.getEntry("catalogs/api.json"); + if (entry != null) { + try (InputStream in = jar.getInputStream(entry)) { selected = catalog(in); } + } else if (status.version() == null || !status.version().equals(selected.libraryVersion)) { + Path sources = status.jar().resolveSibling(status.jar().getFileName().toString() + .replaceFirst("(?:-all)?\\.jar$", "-sources.jar")); + if (Files.isRegularFile(sources)) selected = new ApiIndex(ApiIndexGenerator.generate(sources)); + else selected = new ApiIndex(actualMembers(status.jar(), selected.methods())); + selected.libraryVersion = status.version() == null ? "unknown" : status.version(); + } + } + } + methods = selected.methods; + libraryVersion = selected.libraryVersion; + } + + /** No source metadata in a legacy jar: show only signatures that the chosen binary declares. */ + private static List actualMembers(Path jar, List descriptions) throws IOException { + var owners = new java.util.HashMap(); + try (ZipFile archive = new ZipFile(jar.toFile())) { + archive.stream().map(java.util.zip.ZipEntry::getName) + .filter(name -> name.startsWith("org/openpatch/scratch/") && name.endsWith(".class") + && !name.contains("$") && !name.contains("/internal/")) + .forEach(name -> owners.put(name.substring(name.lastIndexOf('/') + 1, name.length() - 6), + name.substring(0, name.length() - 6).replace('/', '.'))); + } + List result = new ArrayList<>(); + try (var loader = new java.net.URLClassLoader(new java.net.URL[] { jar.toUri().toURL() }, + ClassLoader.getPlatformClassLoader())) { + for (ApiMethod method : descriptions) { + String owner = owners.get(method.className()); + if (owner == null) continue; + try { + Class type = Class.forName(owner, false, loader); + java.lang.reflect.Executable[] members = "constructor".equals(method.methodName()) + ? type.getConstructors() : type.getDeclaredMethods(); + for (var member : members) { + if (!java.lang.reflect.Modifier.isPublic(member.getModifiers())) continue; + if (member instanceof java.lang.reflect.Method m && !m.getName().equals(method.methodName())) continue; + List params = java.util.Arrays.stream(member.getParameterTypes()).map(Class::getSimpleName).toList(); + List wanted = method.params().stream().map(p -> p.replaceFirst("\\s+\\w+$", "") + .replaceAll("<.*>", "").replaceAll("\\b(?:\\w+\\.)+(\\w+)", "$1")).toList(); + if (params.equals(wanted)) { result.add(method); break; } + } + } catch (ReflectiveOperationException | LinkageError ignored) { + // Missing optional classes have no usable signature in this project. + } + } + } + return result; + } + + public String libraryVersion() { return libraryVersion; } + public List methods() { return methods; } diff --git a/core/src/main/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndex.java b/core/src/main/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndex.java index c8e74c5..1411593 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndex.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndex.java @@ -22,6 +22,26 @@ public final class BuiltinAssetIndex { private final List sounds; private BuiltinAssetIndex() { + try (var in = BuiltinAssetIndex.class.getResourceAsStream("/catalogs/assets.json")) { + if (in != null) { + var catalog = tools.jackson.databind.json.JsonMapper.builder().build().readTree(in); + if (catalog.path("schemaVersion").asInt() != 1) throw new IllegalStateException("Unsupported asset catalog"); + List loaded = new ArrayList<>(); + for (var image : catalog.path("images")) { + // A development catalog may describe assets newer than Studio's bundled library. + if (!BuiltinAssets.contains(image.path("id").asText())) continue; + loaded.add(new BuiltinImage(image.path("name").asText(), image.path("sheet").asText(), + image.path("sheetPath").asText(), image.path("x").asInt(), image.path("y").asInt(), + image.path("width").asInt(), image.path("height").asInt(), image.path("direction").asDouble(), + image.path("referenceName").asText())); + } + images = List.copyOf(loaded); + List names = new ArrayList<>(); + catalog.path("sounds").forEach(sound -> names.add(sound.path("id").asText())); + sounds = List.copyOf(names); + return; + } + } catch (java.io.IOException e) { throw new java.io.UncheckedIOException(e); } List loaded = new ArrayList<>(); for (BuiltinAssets.Entry e : BuiltinAssets.getEntries()) { loaded.add(new BuiltinImage(e.name, e.sheet, e.sheetPath, e.x, e.y, diff --git a/core/src/main/java/org/openpatch/scratch4j/core/compile/CompilerService.java b/core/src/main/java/org/openpatch/scratch4j/core/compile/CompilerService.java index 683c31c..448a787 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/compile/CompilerService.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/compile/CompilerService.java @@ -31,6 +31,19 @@ public CompileResult compile(List sources, List classpath, Path outD return new CompileResult(true, List.of()); } Files.createDirectories(outDir); + List adapted = new ArrayList<>(); + List actualClasspath = new ArrayList<>(classpath); + boolean teachingTests = false; + for (Path source : sources) { + String contents = Files.readString(source); + teachingTests |= TeachingTests.hasTests(contents); + String code = TeachingTests.adapt(contents); + adapted.add(new javax.tools.SimpleJavaFileObject(source.toAbsolutePath().toUri(), + javax.tools.JavaFileObject.Kind.SOURCE) { + @Override public CharSequence getCharContent(boolean ignoreErrors) { return code; } + }); + } + if (teachingTests) actualClasspath.add(TeachingTests.junitJar()); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); if (compiler == null) { throw new IllegalStateException("No system java compiler; is jdk.compiler present?"); @@ -40,14 +53,14 @@ public CompileResult compile(List sources, List classpath, Path outD boolean success; try (StandardJavaFileManager files = compiler.getStandardFileManager(diagnostics, null, java.nio.charset.StandardCharsets.UTF_8)) { - if (!classpath.isEmpty()) { + if (!actualClasspath.isEmpty()) { files.setLocation(StandardLocation.CLASS_PATH, - classpath.stream().map(Path::toFile).toList()); + actualClasspath.stream().map(Path::toFile).toList()); } success = compiler.getTask(null, files, diagnostics, // -g: line numbers and local variable names for the debugger List.of("-g", "-encoding", "UTF-8", "-d", outDir.toString()), - null, files.getJavaFileObjectsFromPaths(sources)).call(); + null, adapted).call(); } for (javax.tools.Diagnostic d : diagnostics.getDiagnostics()) { mapped.add(CompilerDiagnostic.of(d, messageLocale)); diff --git a/core/src/main/java/org/openpatch/scratch4j/core/compile/TeachingTests.java b/core/src/main/java/org/openpatch/scratch4j/core/compile/TeachingTests.java new file mode 100644 index 0000000..d92f14f --- /dev/null +++ b/core/src/main/java/org/openpatch/scratch4j/core/compile/TeachingTests.java @@ -0,0 +1,26 @@ +package org.openpatch.scratch4j.core.compile; + +import java.nio.file.Path; +import java.nio.file.Files; +import java.io.IOException; +import java.util.regex.Pattern; +import org.openpatch.scratch4j.core.project.NewProject; + +/** Browser annotations are adapted in memory; the student's original source stays intact. */ +public final class TeachingTests { + private TeachingTests() {} + private static final Pattern CLASS_TEST = Pattern.compile("@Test\\s*(?=(?:public\\s+)?class\\b)"); + public static boolean hasTests(String source) { return Pattern.compile("@Test\\b").matcher(source).find(); } + public static String adapt(String source) { + var match = CLASS_TEST.matcher(source); + if (!match.find()) return source; + source = match.replaceAll(result -> result.group().replaceAll("[^\\r\\n]", " ")); + String imports = "import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; "; + var pkg = Pattern.compile("(?m)^\\s*package\\s+[\\w.]+\\s*;").matcher(source); + if (pkg.find()) return source.substring(0, pkg.end()) + " " + imports + source.substring(pkg.end()); + return imports + source; + } + public static Path junitJar() throws IOException { + return NewProject.classpathJar(org.junit.platform.console.ConsoleLauncher.class); + } +} diff --git a/core/src/main/java/org/openpatch/scratch4j/core/project/BundledTemplates.java b/core/src/main/java/org/openpatch/scratch4j/core/project/BundledTemplates.java index 565bca8..1293985 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/project/BundledTemplates.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/project/BundledTemplates.java @@ -21,7 +21,7 @@ public final class BundledTemplates { /** One bundled project. {@code kind} is {@code tutorial} or {@code demo}. */ public record Template(String id, String kind, String title, String startClass, - List files) { + List files, List requiredSheets) { public boolean isTutorial() { return "tutorial".equals(kind); } @@ -57,6 +57,13 @@ public static Template get(String id) { public static Path create(String id, Path parentDir, String name, Path libraryJar) throws IOException { Template template = get(id); + if (libraryJar != null && template.requiredSheets() != null) { + try (var jar = new java.util.zip.ZipFile(libraryJar.toFile())) { + for (String sheet : template.requiredSheets()) if (jar.getEntry("images/" + sheet + ".png") == null) { + throw new IOException("This example needs the " + sheet + " atlas. Update the project's Scratch for Java library."); + } + } + } Path root = parentDir.resolve(name); if (Files.exists(root)) { throw new IOException("Folder already exists: " + root); @@ -84,6 +91,14 @@ public static Path create(String id, Path parentDir, String name, Path libraryJa Files.createDirectories(root.resolve("assets/sounds")); ProjectSettings settings = new ProjectSettings(); settings.startStage = template.startClass(); + try (InputStream catalog = BundledTemplates.class.getResourceAsStream("/catalogs/examples.json")) { + if (catalog != null) { + var release = JsonMapper.builder().build().readTree(catalog); + settings.libraryVersion = release.path("libraryVersion").asText(); + settings.lesson = template.isTutorial() ? template.id().replaceFirst("-100$", "") : "examples"; + settings.checkpoint = "complete"; + } + } settings.save(root); return root; } diff --git a/core/src/main/java/org/openpatch/scratch4j/core/project/PortableProject.java b/core/src/main/java/org/openpatch/scratch4j/core/project/PortableProject.java new file mode 100644 index 0000000..1c79ed3 --- /dev/null +++ b/core/src/main/java/org/openpatch/scratch4j/core/project/PortableProject.java @@ -0,0 +1,140 @@ +package org.openpatch.scratch4j.core.project; + +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.LinkedHashMap; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** Workspace JSON adapter; the destination is published only after a complete import. */ +public final class PortableProject { + private static final JsonMapper JSON = JsonMapper.builder().build(); + private static final long MAX_FILE = 16L * 1024 * 1024; + private static final long MAX_TOTAL = 64L * 1024 * 1024; + private PortableProject() {} + + public static String path(String name) throws IOException { + if (name == null || name.isEmpty() || name.startsWith("/") || name.matches(".*[\\\\:\\x00-\\x1f].*")) { + throw new IOException("Invalid project path: " + name); + } + for (String part : name.split("/", -1)) { + if (part.isEmpty() || part.equals(".") || part.equals("..") || part.endsWith(".") || part.endsWith(" ") + || part.matches("(?i)(con|prn|aux|nul|com[1-9]|lpt[1-9])(\\..*)?")) { + throw new IOException("Invalid project path: " + name); + } + } + return name; + } + + public static Path importWorkspace(Path file, Path parent) throws IOException { + if (Files.size(file) > 96L * 1024 * 1024) throw new IOException("Workspace JSON exceeds 96 MiB"); + try { + JsonNode workspace = JSON.readTree(file.toFile()); + if (workspace.isArray()) { + if (workspace.size() != 1) throw new IOException("Choose a JSON file containing one workspace"); + workspace = workspace.get(0); + } + JsonNode modules = workspace.get("modules"); + JsonNode settings = workspace.get("settings"); + if (modules == null || !modules.isArray() || modules.isEmpty() || modules.size() > 2000 + || settings == null || !"Java".equals(settings.path("language").asText())) { + throw new IOException("Expected a Java workspace with 1–2,000 files"); + } + if (!workspace.path("spritesheetBase64").asText("").isBlank()) { + throw new IOException("Extract the legacy spritesheet into image files before importing. The original JSON is unchanged."); + } + ProjectSettings metadata = settings.has("scratchProject") + ? JSON.treeToValue(settings.get("scratchProject"), ProjectSettings.class) : new ProjectSettings(); + boolean scratch = false; + for (JsonNode library : settings.path("libraries")) { + String id = library.asText(); + if (id.equals("scratch")) scratch = true; + else if (id.equals("nrw")) metadata.flavour = "nrw"; + else throw new IOException("No desktop adapter for browser library: " + id); + } + if (!scratch) throw new IOException("Choose a workspace using the Scratch library"); + if (metadata.version != 1 || metadata.portableVersion != 1) throw new IOException("Unsupported project metadata version"); + if (!java.util.List.of("standard", "nrw").contains(metadata.flavour)) throw new IOException("Unsupported library flavour: " + metadata.flavour); + Map ids = new HashMap<>(); + for (JsonNode module : modules) { + if (module.has("id") && ids.put(module.get("id").asLong(), module) != null) throw new IOException("Duplicate workspace file IDs"); + } + Map contents = new LinkedHashMap<>(); + HashSet names = new HashSet<>(); + long total = 0; + for (JsonNode module : modules) { + if (!module.path("name").isString() || !module.path("text").isString()) throw new IOException("Invalid workspace file"); + String name = module.get("name").asText(); + HashSet seen = new HashSet<>(); + seen.add(module); + JsonNode cursor = module; + while (cursor.hasNonNull("parent_folder_id")) { + cursor = ids.get(cursor.get("parent_folder_id").asLong()); + if (cursor == null || !cursor.path("isFolder").asBoolean() || !seen.add(cursor)) throw new IOException("Invalid folder for " + name); + name = cursor.path("name").asText() + "/" + name; + } + path(name); + if (!names.add(name.toLowerCase(java.util.Locale.ROOT))) throw new IOException("Conflicting project filename: " + name); + if (module.path("isFolder").asBoolean()) { contents.put(name + "/", new byte[0]); continue; } + String text = module.get("text").asText(); + byte[] bytes; + if (text.startsWith("data:")) { + int comma = text.indexOf(','); + if (comma < 0 || !text.substring(0, comma).endsWith(";base64")) throw new IOException("Expected a base64 asset: " + name); + bytes = java.util.Base64.getDecoder().decode(text.substring(comma + 1)); + } else { + if (name.endsWith(".java")) { + if (metadata.desktopFiles == null || !metadata.desktopFiles.contains(name)) text = implicitImports(text, metadata.flavour); + if (metadata.startStage.isBlank() && text.matches("(?s).*\\bvoid\\s+main\\s*\\(.*")) { + metadata.startStage = Path.of(name).getFileName().toString().replaceFirst("\\.java$", ""); + metadata.startFile = name; + } + } + bytes = text.getBytes(StandardCharsets.UTF_8); + } + total += bytes.length; + if (bytes.length > MAX_FILE || total > MAX_TOTAL) throw new IOException("Workspace asset limit exceeded: " + name); + contents.put(name, bytes); + } + if (contents.keySet().stream().noneMatch(name -> name.endsWith(".java"))) throw new IOException("Workspace contains no Java source"); + String base = file.getFileName().toString().replaceFirst("(?i)\\.json$", ""); + Path root = parent.toAbsolutePath().resolve(path(base)); + if (Files.exists(root)) throw new IOException("Folder already exists: " + root); + Files.createDirectories(parent); + Path staging = Files.createTempDirectory(parent, ".scratch4j-import-"); + try { + for (Map.Entry entry : contents.entrySet()) { + Path target = staging.resolve(entry.getKey()); + if (entry.getKey().endsWith("/")) Files.createDirectories(target); + else { Files.createDirectories(target.getParent()); Files.write(target, entry.getValue()); } + } + metadata.sourceEnvironment = "studio"; + metadata.save(staging); + Files.move(staging, root); + } finally { if (Files.exists(staging)) deleteTree(staging); } + return root; + } catch (RuntimeException e) { throw new IOException("Invalid workspace JSON or asset: " + e.getMessage(), e); } + } + + /** Add only missing implicit imports, preserving explicit student imports and package lines. */ + public static String implicitImports(String source, String flavour) { + for (String line : CompactSource.IMPORTS.lines().toList()) { + String type = line.replace("import ", "").replace(";", "").strip(); + if (!type.isEmpty()) source = JavaImports.ensure(source, type); + } + if (!"nrw".equals(flavour)) source = JavaImports.ensure(source, "java.util.*"); + source = JavaImports.ensure(source, "java.util.function.*"); + return source; + } + + public static void deleteTree(Path root) throws IOException { + try (var files = Files.walk(root)) { + for (Path file : files.sorted(java.util.Comparator.reverseOrder()).toList()) Files.deleteIfExists(file); + } + } +} diff --git a/core/src/main/java/org/openpatch/scratch4j/core/project/ProjectSettings.java b/core/src/main/java/org/openpatch/scratch4j/core/project/ProjectSettings.java index 45136e6..01c2653 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/project/ProjectSettings.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/project/ProjectSettings.java @@ -1,6 +1,8 @@ package org.openpatch.scratch4j.core.project; import tools.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; import org.openpatch.scratch4j.core.io.AtomicFiles; import java.io.IOException; @@ -20,6 +22,23 @@ public final class ProjectSettings { private static final JsonMapper MAPPER = JsonMapper.builder().build(); public int version = 1; + public int portableVersion = 1; + public String startFile = ""; + public String libraryVersion = ""; + public String sourceEnvironment = "studio"; + public String lesson = ""; + public String checkpoint = ""; + public java.util.List browserFeatures = new java.util.ArrayList<>(); + public java.util.List externalDependencies = new java.util.ArrayList<>(); + /** Course-provided Java classes replaced by the browser's NRW library, retained as files. */ + public java.util.List desktopFiles = new java.util.ArrayList<>(); + private final java.util.Map extra = new java.util.LinkedHashMap<>(); + + @JsonAnySetter + public void extra(String name, Object value) { extra.put(name, value); } + + @JsonAnyGetter + public java.util.Map extra() { return extra; } /** Simple class name of the stage Run and Export use; empty = auto-detect. */ public String startStage = ""; public String flavour = LibraryFlavour.STANDARD.id(); diff --git a/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Importer.java b/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Importer.java index b6fe9bc..21eabfb 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Importer.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Importer.java @@ -34,8 +34,9 @@ * regions hold the backdrops, stage sounds and every sprite at its position, * direction, size, costume, visibility, rotation style and layer. * - *

Scripts are not converted (they are rebuilt in Java with the block - * palette); the result lists what needs attention. Bitmap costumes are copied + *

Scripts are converted where a faithful Java equivalent is available. + * Migration tasks connect remaining work to original blocks and generated Java. + * Bitmap costumes are copied * (Scratch stores them at {@code bitmapResolution} 2, so sizes are halved), * vector costumes are rendered to PNG at 2x with Batik (the SVG is kept), * and MP3 sounds are converted to WAV by the caller-supplied converter. @@ -94,6 +95,7 @@ public static Result importProject(Path sb3, Path parentDir, String name, Path l ProjectSettings settings = new ProjectSettings(); settings.startStage = result.stageClass(); settings.save(root); + Files.copy(sb3, root.resolve(".scratch4j/original.sb3")); return result; } } @@ -109,6 +111,8 @@ private static final class Importer { "Text", "MyStage", "ScratchValues")); private String globalFields = ""; private boolean needsValues; + private final List tasks = new ArrayList<>(); + private boolean concurrentTargets; Importer(ZipFile zip, Path root, Function mp3ToWav, boolean clones) { this.zip = zip; @@ -123,6 +127,12 @@ private record Costume(String name, String path, double centerX, double centerY, private record SoundFile(String name, String path) {} Result run(JsonNode project) throws IOException { + int flags = 0; + for (JsonNode target : project.path("targets")) for (var entry : target.path("blocks").properties()) { + if (entry.getValue().path("opcode").asText().equals("event_whenflagclicked") + && entry.getValue().path("topLevel").asBoolean(false)) flags++; + } + concurrentTargets = flags > 1; JsonNode stage = null; List sprites = new ArrayList<>(); for (JsonNode target : project.path("targets")) { @@ -251,7 +261,7 @@ private void writeSpriteClass(String className, String scratchName, JsonNode spr Map visible = new java.util.HashMap<>(globals); String fields = declare(sprite, false, className, visible, new HashSet<>()); Sb3Scripts.Output scripts = new Sb3Scripts(sprite, false, "MyStage", visible, classOf) - .withClones(clones).convert(fields); + .withClones(clones).withConcurrentTargets(concurrentTargets).convert(fields); Files.writeString(root.resolve(className + ".java"), classSource(className, "Sprite", "Imported from the Scratch sprite \"" + scratchName.replace("*/", "") + "\".", scripts, setup.toString(), null), @@ -259,8 +269,17 @@ private void writeSpriteClass(String className, String scratchName, JsonNode spr note(scratchName, className, scripts); } - private void note(String owner, String className, Sb3Scripts.Output scripts) { + private void note(String owner, String className, Sb3Scripts.Output scripts) throws IOException { needsValues |= scripts.needsValues(); + String source = Files.readString(root.resolve(className + ".java")); + for (Sb3Scripts.Issue issue : scripts.issues()) { + int offset = source.indexOf(issue.marker()); + int line = offset < 0 ? 1 : (int) source.substring(0, offset).chars().filter(c -> c == '\n').count() + 1; + tasks.add(new ScratchMigration.Task(className + "-" + issue.id(), issue.id(), issue.blockId(), + issue.opcode(), owner, className + ".java", line, issue.message(), + "https://scratch4j.openpatch.org/migration#" + issue.lesson(), issue.original())); + } + ScratchMigration.save(root, tasks); if (scripts.scripts() > 0) { notes.add(owner + ": " + scripts.scripts() + " script(s) converted into " + className + ".java" + (scripts.todos() == 0 ? "" : ", " + scripts.todos() @@ -277,6 +296,11 @@ private String classSource(String className, String base, String comment, StringBuilder sb = new StringBuilder(); sb.append("import java.util.ArrayList;\nimport java.util.List;\nimport org.openpatch.scratch.*;\n\n"); sb.append("// ").append(comment).append('\n'); + String generated = scripts.constructor() + scripts.run() + scripts.methods(); + for (Sb3Scripts.Issue issue : scripts.issues()) if (!generated.contains(issue.marker())) { + sb.append("// ").append(issue.marker()).append("\n// ") + .append(issue.message().replace("\n", " ")).append('\n'); + } if (scripts.scripts() > 0) { sb.append("// Its scripts were converted").append(scripts.todos() == 0 ? "." : "; look for \"TODO Scratch\" for blocks to finish by hand.").append('\n'); @@ -322,8 +346,8 @@ private void writeStageClass(String className, JsonNode stage, String fields, St v.java().substring(v.java().indexOf('.') + 1), true, v.number(), v.list())); } Sb3Scripts.Output scripts = stage == null - ? new Sb3Scripts.Output(globalFields, "", "", "", 0, 0, false) - : new Sb3Scripts(stage, true, className, own, classOf).withClones(clones) + ? new Sb3Scripts.Output(globalFields, "", "", "", 0, 0, false, List.of()) + : new Sb3Scripts(stage, true, className, own, classOf).withClones(clones).withConcurrentTargets(concurrentTargets) .convert(globalFields); Files.writeString(root.resolve(className + ".java"), classSource(className, "Stage", "Imported from Scratch: the stage with its backdrops and sprites.", scripts, setup, diff --git a/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Scripts.java b/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Scripts.java index e1c9ad4..4523bf1 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Scripts.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/project/Sb3Scripts.java @@ -25,7 +25,23 @@ final class Sb3Scripts { /** What one target contributes to its class. */ record Output(String fields, String constructor, String run, String methods, int scripts, - int todos, boolean needsValues) {} + int todos, boolean needsValues, List issues) {} + + record Issue(String id, String blockId, String opcode, String message, String lesson, String original) { + String marker() { return "scratch4j:migration " + id; } + } + + private final List issues = new ArrayList<>(); + + private Issue issue(String blockId, String message, String lesson) { + JsonNode block = blocks.path(blockId); + String id = java.util.UUID.nameUUIDFromBytes((blockId + "|" + message) + .getBytes(java.nio.charset.StandardCharsets.UTF_8)).toString(); + for (Issue existing : issues) if (existing.id().equals(id)) return existing; + Issue issue = new Issue(id, blockId, op(block), message, lesson, block.toString()); + issues.add(issue); + return issue; + } private enum Type { NUM, STR, BOOL, OBJ } @@ -49,6 +65,12 @@ record Variable(String java, boolean global, boolean number, boolean list) {} private boolean clones; /** This target makes or is clones: run() then tells the original and clones apart. */ private boolean usesClones; + private boolean concurrentTargets; + + Sb3Scripts withConcurrentTargets(boolean concurrent) { + this.concurrentTargets = concurrent; + return this; + } /** * {@code variables} maps Scratch variable/list ids to Java names (globals @@ -196,10 +218,31 @@ Output convert(String ownFields) { methods.append(" }\n"); } methods.append(helpers); + List hats = new ArrayList<>(); + for (var entry : blocks.properties()) { + JsonNode block = entry.getValue(); + if (!block.path("topLevel").asBoolean(false) || block.path("shadow").asBoolean(false) + || op(block).equals("procedures_definition")) continue; + hats.add(entry.getKey()); + if (!SUPPORTED_HATS.contains(op(block)) || (stage && op(block).equals("event_whenstageclicked")) + || (!clones && op(block).equals("control_start_as_clone"))) { + issue(entry.getKey(), "This Scratch event needs a Java implementation. Its original script is preserved.", + "unsupported-blocks"); + } + } + if (hats.size() > 1 || concurrentTargets) for (String id : hats) { + issue(id, "Scratch scripts can overlap. Java event handlers and helper calls run in sequence; review shared state and waiting.", + "shared-state"); + } return new Output(ownFields, constructor, run, - methods + (other.length() > 0 ? "\n" + other : ""), scripts, todos, needsValues); + methods + (other.length() > 0 ? "\n" + other : ""), scripts, todos, needsValues, List.copyOf(issues)); } + private static final java.util.Set SUPPORTED_HATS = java.util.Set.of( + "event_whenflagclicked", "event_whenkeypressed", "event_whenthisspriteclicked", + "event_whenstageclicked", "event_whenbroadcastreceived", "event_whenbackdropswitchesto", + "control_start_as_clone"); + /** Statements before a trailing forever run once; the forever body runs every frame. */ /** Statements before a trailing forever run once; the forever body runs every frame. */ private void flagScript(String first, List flags, List forevers) { @@ -431,7 +474,13 @@ private String statement(String id, String indent, List chain, boolean o } if (code == null) { todos++; - return indent + "// TODO Scratch: " + describe(b) + "\n"; + Issue task = issue(id, "Implement this block in Java: " + describe(b), "unsupported-blocks"); + return indent + "// " + task.marker() + "\n" + indent + "// TODO Scratch: " + describe(b) + "\n"; + } + if (code.contains("this block waited;")) { + Issue task = issue(id, "This Scratch block waited before the next block. Continue the sequence using run() and a timer.", + "timing"); + code = "// " + task.marker() + "\n" + indent + code; } return indent + code.replace("\n" + indent + "}", "\n" + indent + "}") + "\n"; } @@ -789,7 +838,14 @@ private Expr reporter(JsonNode b) { break; } todos++; - return new Expr("0 /* TODO Scratch: " + describe(b).replace("*/", "") + " */", Type.NUM); + String marker = ""; + for (var entry : blocks.properties()) if (entry.getValue().equals(b)) { + Issue task = issue(entry.getKey(), "This reporter was replaced with 0. Implement the original expression before using its result.", + "unsupported-blocks"); + marker = task.marker() + "; "; + break; + } + return new Expr("0 /* " + marker + "TODO Scratch: " + describe(b).replace("*/", "") + " */", Type.NUM); } private Expr arithmetic(JsonNode b, String operator) { diff --git a/core/src/main/java/org/openpatch/scratch4j/core/project/ScratchMigration.java b/core/src/main/java/org/openpatch/scratch4j/core/project/ScratchMigration.java new file mode 100644 index 0000000..d80c924 --- /dev/null +++ b/core/src/main/java/org/openpatch/scratch4j/core/project/ScratchMigration.java @@ -0,0 +1,51 @@ +package org.openpatch.scratch4j.core.project; + +import java.nio.file.*; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import tools.jackson.databind.json.JsonMapper; + +/** Reviewable tasks retain the original block and a marker that survives source edits. */ +public final class ScratchMigration { + private ScratchMigration() {} + public record Task(String id, String markerId, String blockId, String opcode, String target, + String javaFile, int line, String message, String lessonUrl, String originalBlock) {} + public record Manifest(int schemaVersion, List tasks) {} + + public static void save(Path root, List tasks) throws IOException { + Path file = root.resolve(".scratch4j/migration.json"); + Files.createDirectories(file.getParent()); + Path temporary = Files.createTempFile(file.getParent(), "migration-", ".tmp"); + try { + Files.writeString(temporary, JsonMapper.builder().build().writerWithDefaultPrettyPrinter() + .writeValueAsString(new Manifest(1, List.copyOf(tasks)))); + try { Files.move(temporary, file, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); } + catch (AtomicMoveNotSupportedException e) { Files.move(temporary, file, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(temporary); } + } + + public static List load(Path root) throws IOException { + Path file = root.resolve(".scratch4j/migration.json"); + if (!Files.isRegularFile(file)) return List.of(); + Manifest manifest; + try { manifest = JsonMapper.builder().build().readValue(file.toFile(), Manifest.class); } + catch (RuntimeException e) { throw new IOException("Invalid Scratch migration tasks", e); } + if (manifest.schemaVersion() != 1 || manifest.tasks() == null) throw new IOException("Unsupported migration schema"); + List tasks = new ArrayList<>(); + for (Task task : manifest.tasks()) { + Path source = root.resolve(task.javaFile()).normalize(); + if (!source.startsWith(root.normalize()) || !task.javaFile().endsWith(".java")) + throw new IOException("Invalid migration source: " + task.javaFile()); + int line = task.line(); + if (Files.isRegularFile(source)) { + String text = Files.readString(source); + int offset = text.indexOf("scratch4j:migration " + task.markerId()); + if (offset >= 0) line = (int) text.substring(0, offset).chars().filter(c -> c == '\n').count() + 1; + } + tasks.add(new Task(task.id(), task.markerId(), task.blockId(), task.opcode(), task.target(), + task.javaFile(), line, task.message(), task.lessonUrl(), task.originalBlock())); + } + return List.copyOf(tasks); + } +} diff --git a/core/src/main/java/org/openpatch/scratch4j/core/project/ScratchProject.java b/core/src/main/java/org/openpatch/scratch4j/core/project/ScratchProject.java index 6016ce0..7207f52 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/project/ScratchProject.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/project/ScratchProject.java @@ -171,7 +171,7 @@ public String startStage() throws IOException { private boolean hasMain(String className) throws IOException { for (Path source : javaSources()) { if (source.getFileName().toString().equals(className + ".java")) { - return Pattern.compile("\\bstatic\\s+void\\s+main\\s*\\(") + return Pattern.compile("\\bvoid\\s+main\\s*\\(") .matcher(Files.readString(source, StandardCharsets.UTF_8)).find(); } } diff --git a/core/src/main/java/org/openpatch/scratch4j/core/region/DesignerRegions.java b/core/src/main/java/org/openpatch/scratch4j/core/region/DesignerRegions.java index 663ccd6..b8a35d7 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/region/DesignerRegions.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/region/DesignerRegions.java @@ -33,7 +33,7 @@ public final class DesignerRegions { private static final String STAGE_NOTE = " (managed by the stage designer)"; private static final Pattern CLASS = Pattern.compile( "(?m)^([ \\t]*)public\\s+class\\s+(\\w+)\\s+extends\\s+(Stage|Sprite|AnimatedSprite|" - + "UISprite|Window)\\b[^{]*\\{[ \\t]*\\n"); + + "UISprite|Window)\\b[^{]*\\{[ \\t]*\\r?\\n"); private DesignerRegions() {} @@ -67,6 +67,16 @@ public static String ensureStage(String source) { * {@code Window}), whatever its direct superclass is. */ public static String ensure(String source, String kind) { + // Work with one line separator so offsets and inserted markers agree on Windows. + // Preserve the original source when no regions are needed, and its CRLF style + // when adding regions to a Windows file. + String normalized = source.replace("\r\n", "\n"); + String updated = ensureNormalized(normalized, kind); + if (updated.equals(normalized)) return source; + return source.contains("\r\n") ? updated.replace("\n", "\r\n") : updated; + } + + private static String ensureNormalized(String source, String kind) { Matcher type = ANY_CLASS.matcher(source); if (!type.find()) { return source; diff --git a/core/src/main/java/org/openpatch/scratch4j/core/region/SpriteLook.java b/core/src/main/java/org/openpatch/scratch4j/core/region/SpriteLook.java index 3798131..32582df 100644 --- a/core/src/main/java/org/openpatch/scratch4j/core/region/SpriteLook.java +++ b/core/src/main/java/org/openpatch/scratch4j/core/region/SpriteLook.java @@ -5,6 +5,7 @@ import com.sun.source.tree.BlockTree; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.ConditionalExpressionTree; import com.sun.source.tree.ExpressionStatementTree; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.IdentifierTree; @@ -235,6 +236,9 @@ private static boolean ints(List a, int from, int to) { static Object eval(ExpressionTree e, Map env) { if (e instanceof LiteralTree lit) return lit.getValue(); if (e instanceof ParenthesizedTree p) return eval(p.getExpression(), env); + if (e instanceof ConditionalExpressionTree c && eval(c.getCondition(), env) instanceof Boolean condition) { + return eval(condition ? c.getTrueExpression() : c.getFalseExpression(), env); + } if (e instanceof IdentifierTree id) return env.get(id.getName().toString()); if (e instanceof MemberSelectTree m && m.getExpression().toString().equals("this")) { return env.get(m.getIdentifier().toString()); diff --git a/core/src/main/resources/api-index.json b/core/src/main/resources/api-index.json index 247f22c..bc0337d 100644 --- a/core/src/main/resources/api-index.json +++ b/core/src/main/resources/api-index.json @@ -1143,6 +1143,19 @@ "paramDocs": ["s: the Sprite object to associate with this Pen"], "returns": null }, + { + "className": "Pen", + "methodName": "constructor", + "returnType": "new Pen", + "params": ["Pen p"], + "summary": "Copies a Pen object.", + "scratchblock": null, + "category": "Operators", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/constructor", + "description": "Copies a Pen object.", + "paramDocs": ["p: Pen object to copy"], + "returns": null + }, { "className": "Pen", "methodName": "down", diff --git a/core/src/main/resources/catalogs/api.json b/core/src/main/resources/catalogs/api.json new file mode 100644 index 0000000..2cf23e7 --- /dev/null +++ b/core/src/main/resources/catalogs/api.json @@ -0,0 +1,17575 @@ +{ + "schemaVersion": 1, + "libraryVersion": "5.8.0", + "browserVersion": "5.8.0-browser.1", + "methods": [ + { + "id": "AnimatedSprite/addAnimation(String,String,int)", + "memberId": "AnimatedSprite/addAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "addAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "int" + ], + "parameterNames": [ + "name", + "pattern", + "frames" + ], + "params": [ + "String name", + "String pattern", + "int frames" + ], + "summary": "Adds an animation to the sprite.", + "description": "Adds an animation to the sprite.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the animation", + "pattern: the pattern (@see String#format) of the file names. The frame\n starts from 1.", + "frames: the number of frames in the animation" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/addAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt eine Animation hinzu. %d im Muster wird durch 1..frames ersetzt, z.B. bunny1_walk%d" + } + } + }, + { + "id": "AnimatedSprite/addAnimation(String,Function,int)", + "memberId": "AnimatedSprite/addAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "addAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.util.function.Function", + "int" + ], + "parameterNames": [ + "name", + "builder", + "frame" + ], + "params": [ + "String name", + "Function builder", + "int frame" + ], + "summary": "Adds an animation to the sprite.", + "description": "Adds an animation to the sprite.\n\nTo add an animation with file names \"walk_1.png\", \"walk_2.png\",\n\"walk_3.png\", you can use the following code:\n\n```java\nsprite.addAnimation(\"walk\", i -> \"walk_\" + i + \".png\", 3);\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of the animation", + "builder: a function that builds the file names for the animation frames", + "frame: the number of frames in the animation. The frame starts from\n 1." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/addAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt eine Animation an; builder liefert zu 1..frames jeweils den Bildpfad" + } + } + }, + { + "id": "AnimatedSprite/addAnimation(String,String,int,int,int)", + "memberId": "AnimatedSprite/addAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "addAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "int", + "int", + "int" + ], + "parameterNames": [ + "name", + "path", + "frames", + "width", + "height" + ], + "params": [ + "String name", + "String path", + "int frames", + "int width", + "int height" + ], + "summary": "Adds an animation to the sprite.", + "description": "Adds an animation to the sprite.\n\nFor an animation sprite sheet, where each frame is of equal width and height,\nyou can use this method to add an animation by specifying the path to the\nsprite sheet, the number of frames, and the dimensions of each frame.\nFor example, for a four-frame animation arranged in a single row, each frame\nbeing 64x64 pixels, you can add the animation using the following code:\n\n```java\nsprite.addAnimation(\"walk\", \"assets/walk.png\", 4, 64, 64);\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of the animation", + "path: the path to the animation frames", + "frames: the number of frames in the animation", + "width: the width of each frame", + "height: the height of each frame" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/addAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zerlegt ein Bild in gleich große Einzelbilder und legt daraus eine Animation an" + } + } + }, + { + "id": "AnimatedSprite/addAnimation(String,String,int,int,int,int)", + "memberId": "AnimatedSprite/addAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "addAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "int", + "int", + "int", + "int" + ], + "parameterNames": [ + "name", + "path", + "frames", + "width", + "height", + "row" + ], + "params": [ + "String name", + "String path", + "int frames", + "int width", + "int height", + "int row" + ], + "summary": "Adds an animation to the sprite.", + "description": "Adds an animation to the sprite.\n\nIf the animation frames are arranged in rows in a sprite sheet, you can use\nthis method to specify which row to use for the animation.\n\nFor example, for a four-frame animation arranged in a single row, you want the second, each frame\nbeing 64x64 pixels, you can add the animation using the following code:\n\n```java\nsprite.addAnimation(\"walk\", \"assets/walk.png\", 4, 64, 64, 2);\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of the animation", + "path: the path to the animation frames", + "frames: the number of frames in the animation", + "width: the width of each frame", + "height: the height of each frame", + "row: the row of the animation frames" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/addAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wie addAnimation(name, imagePath, frames, width, height), beginnt aber in der angegebenen Zeile" + } + } + }, + { + "id": "AnimatedSprite/addAnimation(String,String,int,int,int,int,boolean)", + "memberId": "AnimatedSprite/addAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "addAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "int", + "int", + "int", + "int", + "boolean" + ], + "parameterNames": [ + "name", + "path", + "frames", + "width", + "height", + "column", + "useColumns" + ], + "params": [ + "String name", + "String path", + "int frames", + "int width", + "int height", + "int column", + "boolean useColumns" + ], + "summary": "Adds an animation to the sprite.", + "description": "Adds an animation to the sprite.\n\nIf the animation frames are arranged in either rows or columns in a sprite\nsheet, you can use this method to specify which column or row to use for the\nanimation. Take four frame animation arranged in a single column. Each frame is\n64x64 pixels. You can add the animation using the following code:\n\n```java\nsprite.addAnimation(\"walk\", \"assets/walk.png\", 4, 64, 64, 1, true); // use column 1\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of the animation", + "path: the path to the animation frames", + "frames: the number of frames in the animation", + "width: the width of each frame", + "height: the height of each frame", + "column: the column of the animation frames", + "useColumns: whether to use columns or rows" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/addAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt eine Animation aus einer Spalte des Bildes an" + } + } + }, + { + "id": "AnimatedSprite/clone()", + "memberId": "AnimatedSprite/clone", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "clone", + "static": false, + "returnType": "AnimatedSprite", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Creates a clone of this sprite with the same animations, playing the same\none, and puts it on the stage right behind this sprite. See\n[Sprite.clone()](../Sprite/clone).", + "description": "Creates a clone of this sprite with the same animations, playing the same\none, and puts it on the stage right behind this sprite. See\n[Sprite.clone()](../Sprite/clone).", + "scratchblock": null, + "paramDocs": [], + "returns": "the clone, of the same class as this sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/clone", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Kopie dieser Figur" + } + } + }, + { + "id": "AnimatedSprite/constructor()", + "memberId": "AnimatedSprite/constructor", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "constructor", + "static": false, + "returnType": "AnimatedSprite", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "The AnimatedSprite class represents a sprite that can play animations. It\nextends the Sprite\nclass and provides methods to add animations, play animations, set the\ninterval between animation\nframes, and reset the animation.", + "description": "The AnimatedSprite class represents a sprite that can play animations. It\nextends the Sprite\nclass and provides methods to add animations, play animations, set the\ninterval between animation\nframes, and reset the animation.\n\nExample usage:\n\n```java\nAnimatedSprite sprite = new AnimatedSprite();\nsprite.addCostume(\"idle\", \"assets/idle.png\");\nsprite.addAnimation(\"walk\", \"assets/walk_%d.png\", 4);\nsprite.playAnimation(\"walk\");\n```", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine neue animierte Figur" + } + } + }, + { + "id": "AnimatedSprite/constructor(AnimatedSprite)", + "memberId": "AnimatedSprite/constructor", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "constructor", + "static": false, + "returnType": "AnimatedSprite", + "parameterTypes": [ + "org.openpatch.scratch.AnimatedSprite" + ], + "parameterNames": [ + "animatedSprite" + ], + "params": [ + "AnimatedSprite animatedSprite" + ], + "summary": "The AnimatedSprite class represents a sprite that can play animations. It\nextends the Sprite\nclass and provides methods to add animations, play animations, set the\ninterval between animation\nframes, and reset the animation.", + "description": "The AnimatedSprite class represents a sprite that can play animations. It\nextends the Sprite\nclass and provides methods to add animations, play animations, set the\ninterval between animation\nframes, and reset the animation.\n\nExample usage:\n\n```java\nAnimatedSprite sprite = new AnimatedSprite();\nsprite.addCostume(\"idle\", \"assets/idle.png\");\nsprite.addAnimation(\"walk\", \"assets/walk_%d.png\", 4);\nsprite.playAnimation(\"walk\");\n```", + "scratchblock": null, + "paramDocs": [ + "animatedSprite: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Kopie der angegebenen animierten Figur" + } + } + }, + { + "id": "AnimatedSprite/getAnimationFrame()", + "memberId": "AnimatedSprite/getAnimationFrame", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "getAnimationFrame", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Gets the current animation frame.", + "description": "Gets the current animation frame.", + "scratchblock": null, + "paramDocs": [], + "returns": "the current animation frame", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/getAnimationFrame", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Nummer des aktuellen Einzelbildes zurück" + } + } + }, + { + "id": "AnimatedSprite/getAnimationInterval()", + "memberId": "AnimatedSprite/getAnimationInterval", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "getAnimationInterval", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Gets the interval between animation frames.", + "description": "Gets the interval between animation frames.", + "scratchblock": null, + "paramDocs": [], + "returns": "the interval between animation frames", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/getAnimationInterval", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt zurück, wie viele Millisekunden ein Einzelbild angezeigt wird" + } + } + }, + { + "id": "AnimatedSprite/isAnimationPlayed()", + "memberId": "AnimatedSprite/isAnimationPlayed", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "isAnimationPlayed", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks if the animation is played.", + "description": "Checks if the animation is played.", + "scratchblock": null, + "paramDocs": [], + "returns": "true if the animation is played, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/isAnimationPlayed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn eine mit once gestartete Animation durchgelaufen ist" + } + } + }, + { + "id": "AnimatedSprite/playAnimation(String)", + "memberId": "AnimatedSprite/playAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "playAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Plays the animation with the specified name.", + "description": "Plays the animation with the specified name.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the animation to play" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/playAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Spielt die Animation in einer Schleife ab" + } + } + }, + { + "id": "AnimatedSprite/playAnimation(String,boolean)", + "memberId": "AnimatedSprite/playAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "playAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "boolean" + ], + "parameterNames": [ + "name", + "once" + ], + "params": [ + "String name", + "boolean once" + ], + "summary": "Plays the animation with the specified name.", + "description": "Plays the animation with the specified name.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the animation to play", + "once: whether to play the animation once" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/playAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Spielt die Animation ab; bei once == true nur ein einziges Mal" + } + } + }, + { + "id": "AnimatedSprite/resetAnimation()", + "memberId": "AnimatedSprite/resetAnimation", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "resetAnimation", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Resets the animation. The animation will start from the first frame.", + "description": "Resets the animation. The animation will start from the first frame.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/resetAnimation", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Animation auf das erste Einzelbild zurück" + } + } + }, + { + "id": "AnimatedSprite/setAnimationFrame(int)", + "memberId": "AnimatedSprite/setAnimationFrame", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "setAnimationFrame", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "frame" + ], + "params": [ + "int frame" + ], + "summary": "Sets the current animation frame.", + "description": "Sets the current animation frame.", + "scratchblock": null, + "paramDocs": [ + "frame: the current animation frame" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/setAnimationFrame", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Springt zum Einzelbild mit der angegebenen Nummer" + } + } + }, + { + "id": "AnimatedSprite/setAnimationInterval(int)", + "memberId": "AnimatedSprite/setAnimationInterval", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "setAnimationInterval", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "interval" + ], + "params": [ + "int interval" + ], + "summary": "Sets the interval between animation frames.", + "description": "Sets the interval between animation frames.", + "scratchblock": null, + "paramDocs": [ + "interval: the interval between animation frames" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/setAnimationInterval", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt fest, wie viele Millisekunden ein Einzelbild angezeigt wird" + } + } + }, + { + "id": "AnimatedSprite/toString()", + "memberId": "AnimatedSprite/toString", + "owner": "org.openpatch.scratch.AnimatedSprite", + "className": "AnimatedSprite", + "methodName": "toString", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns which animation is playing and how far into it.", + "description": "Returns which animation is playing and how far into it.", + "scratchblock": null, + "paramDocs": [], + "returns": "the sprite as a text", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/AnimatedSprite/toString", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Figur als Zeichenkette zurück" + } + } + }, + { + "id": "Circle/constructor(double,double,double)", + "memberId": "Circle/constructor", + "owner": "org.openpatch.scratch.Circle", + "className": "Circle", + "methodName": "constructor", + "static": false, + "returnType": "Circle", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "x", + "y", + "radius" + ], + "params": [ + "double x", + "double y", + "double radius" + ], + "summary": "Creates a circle with no specified position or size.", + "description": "Creates a circle with no specified position or size.", + "scratchblock": null, + "paramDocs": [ + "x: the x-coordinate of the circle's center", + "y: the y-coordinate of the circle's center", + "radius: the radius of the circle" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Circle/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen Kreis um (x, y) mit dem angegebenen Radius" + } + } + }, + { + "id": "Clock/getDay()", + "memberId": "Clock/getDay", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getDay", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current day of the month, from 1 to 31.", + "description": "Returns the current day of the month, from 1 to 31.", + "scratchblock": "(current [date v])", + "paramDocs": [], + "returns": "the day of the month", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getDay", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den aktuellen Tag im Monat zurück" + } + } + }, + { + "id": "Clock/getDayOfWeek()", + "memberId": "Clock/getDayOfWeek", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getDayOfWeek", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current day of the week, from 1 for Monday to 7 for Sunday.", + "description": "Returns the current day of the week, from 1 for Monday to 7 for Sunday.", + "scratchblock": "(current [day of week v])", + "paramDocs": [], + "returns": "the day of the week", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getDayOfWeek", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Wochentag zurück (1 = Montag, 7 = Sonntag)" + } + } + }, + { + "id": "Clock/getDaysSince2000()", + "memberId": "Clock/getDaysSince2000", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getDaysSince2000", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the number of days that have passed since the first of January\n2000.", + "description": "Returns the number of days that have passed since the first of January\n2000.", + "scratchblock": "(days since 2000)", + "paramDocs": [], + "returns": "the days since 2000", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getDaysSince2000", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Anzahl der Tage seit dem 1. Januar 2000 zurück" + } + } + }, + { + "id": "Clock/getHour()", + "memberId": "Clock/getHour", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getHour", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current hour, from 0 to 23.", + "description": "Returns the current hour, from 0 to 23.", + "scratchblock": "(current [hour v])", + "paramDocs": [], + "returns": "the hour", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getHour", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die aktuelle Stunde zurück" + } + } + }, + { + "id": "Clock/getMillisecond()", + "memberId": "Clock/getMillisecond", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getMillisecond", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the milliseconds of the current second, from 0 to 999.", + "description": "Returns the milliseconds of the current second, from 0 to 999.", + "scratchblock": null, + "paramDocs": [], + "returns": "the millisecond", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getMillisecond", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die aktuelle Millisekunde zurück" + } + } + }, + { + "id": "Clock/getMinute()", + "memberId": "Clock/getMinute", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getMinute", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current minute, from 0 to 59.", + "description": "Returns the current minute, from 0 to 59.", + "scratchblock": "(current [minute v])", + "paramDocs": [], + "returns": "the minute", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getMinute", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die aktuelle Minute zurück" + } + } + }, + { + "id": "Clock/getMonth()", + "memberId": "Clock/getMonth", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getMonth", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current month, from 1 for January to 12 for December.", + "description": "Returns the current month, from 1 for January to 12 for December.", + "scratchblock": "(current [month v])", + "paramDocs": [], + "returns": "the month", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getMonth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den aktuellen Monat zurück (1 = Januar)" + } + } + }, + { + "id": "Clock/getSecond()", + "memberId": "Clock/getSecond", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getSecond", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current second, from 0 to 59.", + "description": "Returns the current second, from 0 to 59.", + "scratchblock": "(current [second v])", + "paramDocs": [], + "returns": "the second", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getSecond", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die aktuelle Sekunde zurück" + } + } + }, + { + "id": "Clock/getYear()", + "memberId": "Clock/getYear", + "owner": "org.openpatch.scratch.Clock", + "className": "Clock", + "methodName": "getYear", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current year, for example 2026.", + "description": "Returns the current year, for example 2026.", + "scratchblock": "(current [year v])", + "paramDocs": [], + "returns": "the year", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Clock/getYear", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das aktuelle Jahr zurück" + } + } + }, + { + "id": "Color/changeColor(double)", + "memberId": "Color/changeColor", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "changeColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Changes the color accordining to a hue value, which is added to the current hue value. When the\nresulting value is greater than 255 it will be reset. For example: 285 => 30.", + "description": "Changes the color accordining to a hue value, which is added to the current hue value. When the\nresulting value is greater than 255 it will be reset. For example: 285 => 30.", + "scratchblock": null, + "paramDocs": [ + "h: A hue value. Could be any positive or negative number." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/changeColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert den Farbton um den angegebenen Wert" + } + } + }, + { + "id": "Color/constructor()", + "memberId": "Color/constructor", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "constructor", + "static": false, + "returnType": "Color", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Color object with default values.", + "description": "Constructs a new Color object with default values.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt die Farbe Weiß" + } + } + }, + { + "id": "Color/constructor(String)", + "memberId": "Color/constructor", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "constructor", + "static": false, + "returnType": "Color", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "hexCode" + ], + "params": [ + "String hexCode" + ], + "summary": "The Color class represents a color in the Scratch environment. It supports various\nfunctionalities such as setting color values in the RGB and HSB spectrum, changing the color\nbased on a hue value, and converting between RGB and HSB color codes.", + "description": "The Color class represents a color in the Scratch environment. It supports various\nfunctionalities such as setting color values in the RGB and HSB spectrum, changing the color\nbased on a hue value, and converting between RGB and HSB color codes.", + "scratchblock": null, + "paramDocs": [ + "hexCode: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Farbe aus einem Hex-Code, z.B. #ff0000" + } + } + }, + { + "id": "Color/constructor(double)", + "memberId": "Color/constructor", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "constructor", + "static": false, + "returnType": "Color", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Constructs a new Color object with the specified hue value.", + "description": "Constructs a new Color object with the specified hue value.", + "scratchblock": null, + "paramDocs": [ + "h: the hue value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Farbe mit dem angegebenen Farbton (0 bis 255)" + } + } + }, + { + "id": "Color/constructor(double,double,double)", + "memberId": "Color/constructor", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "constructor", + "static": false, + "returnType": "Color", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "double r", + "double g", + "double b" + ], + "summary": "Constructs a new Color object with the specified rgb values.", + "description": "Constructs a new Color object with the specified rgb values.", + "scratchblock": null, + "paramDocs": [ + "r: the red value", + "g: the green value", + "b: the blue value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Farbe aus Rot-, Grün- und Blauanteil (jeweils 0 bis 255)" + } + } + }, + { + "id": "Color/constructor(Color)", + "memberId": "Color/constructor", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "constructor", + "static": false, + "returnType": "Color", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Color c" + ], + "summary": "Copies the received ScratchColor object.", + "description": "Copies the received ScratchColor object.", + "scratchblock": null, + "paramDocs": [ + "c: ScratchColor object to copy" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Kopie der übergebenen Farbe" + } + } + }, + { + "id": "Color/equals(Object)", + "memberId": "Color/equals", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "equals", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "java.lang.Object" + ], + "parameterNames": [ + "other" + ], + "params": [ + "Object other" + ], + "summary": "Two colours are the same when they are the same colour.", + "description": "Two colours are the same when they are the same colour.", + "scratchblock": null, + "paramDocs": [ + "other: the object to compare with" + ], + "returns": "whether both are colours with the same red, green and blue", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/equals", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Prüft, ob es dieselbe Farbe ist" + } + } + }, + { + "id": "Color/get()", + "memberId": "Color/get", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "get", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the color value as a hex code. This is useful for comparing pixels.", + "description": "Get the color value as a hex code. This is useful for comparing pixels.", + "scratchblock": null, + "paramDocs": [], + "returns": "hex code", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/get", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Farbe als ganze Zahl zurück" + } + } + }, + { + "id": "Color/getBlue()", + "memberId": "Color/getBlue", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "getBlue", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the blue value.", + "description": "Get the blue value.", + "scratchblock": null, + "paramDocs": [], + "returns": "blue value [0...255]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/getBlue", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Blauanteil zurück (0 bis 255)" + } + } + }, + { + "id": "Color/getGreen()", + "memberId": "Color/getGreen", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "getGreen", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the green value.", + "description": "Get the green value.", + "scratchblock": null, + "paramDocs": [], + "returns": "green value [0...255]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/getGreen", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Grünanteil zurück (0 bis 255)" + } + } + }, + { + "id": "Color/getH()", + "memberId": "Color/getH", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "getH", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the hue value.", + "description": "Get the hue value.", + "scratchblock": null, + "paramDocs": [], + "returns": "hue value [0...255]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/getH", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Farbton zurück (0 bis 255)" + } + } + }, + { + "id": "Color/getHSB()", + "memberId": "Color/getHSB", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "getHSB", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the color value on the HSB spectrum.", + "description": "Get the color value on the HSB spectrum.", + "scratchblock": null, + "paramDocs": [], + "returns": "hue value [0...255]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/getHSB", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Farbton zurück (0 bis 255)" + } + } + }, + { + "id": "Color/getL()", + "memberId": "Color/getL", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "getL", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the luminosity value.", + "description": "Get the luminosity value.", + "scratchblock": null, + "paramDocs": [], + "returns": "luminosity value [0...255]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/getL", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Helligkeit zurück (0 bis 255)" + } + } + }, + { + "id": "Color/getRed()", + "memberId": "Color/getRed", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "getRed", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the red value.", + "description": "Get the red value.", + "scratchblock": null, + "paramDocs": [], + "returns": "red value [0...255]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/getRed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Rotanteil zurück (0 bis 255)" + } + } + }, + { + "id": "Color/getS()", + "memberId": "Color/getS", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "getS", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the saturation value.", + "description": "Get the saturation value.", + "scratchblock": null, + "paramDocs": [], + "returns": "saturation value [0...255]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/getS", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Sättigung zurück (0 bis 255)" + } + } + }, + { + "id": "Color/hashCode()", + "memberId": "Color/hashCode", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "hashCode", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "", + "description": "", + "scratchblock": null, + "paramDocs": [], + "returns": "a hash consistent with [equals(Object)](equals)", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/hashCode", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Color/setHSB(double)", + "memberId": "Color/setHSB", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "setHSB", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Setting the color value after the HSB spectrum. Saturation and Luminosity are fixed at 255.", + "description": "Setting the color value after the HSB spectrum. Saturation and Luminosity are fixed at 255.", + "scratchblock": null, + "paramDocs": [ + "h: A hue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/setHSB", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Farbton (0 bis 255)" + } + } + }, + { + "id": "Color/setHSB(double,double,double)", + "memberId": "Color/setHSB", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "setHSB", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "h", + "s", + "l" + ], + "params": [ + "double h", + "double s", + "double l" + ], + "summary": "Setting the color value after the HSB spectrum.", + "description": "Setting the color value after the HSB spectrum.", + "scratchblock": null, + "paramDocs": [ + "h: A hue value [0...255]", + "s: A saturation value [0...255]", + "l: A luminosity value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/setHSB", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt Farbton, Sättigung und Helligkeit (jeweils 0 bis 255)" + } + } + }, + { + "id": "Color/setRGB(double,double,double)", + "memberId": "Color/setRGB", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "setRGB", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "double r", + "double g", + "double b" + ], + "summary": "Setting the color value after the RGB spectrum", + "description": "Setting the color value after the RGB spectrum", + "scratchblock": null, + "paramDocs": [ + "r: A red value [0...255]", + "g: A green value [0...255]", + "b: A blue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/setRGB", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt Rot-, Grün- und Blauanteil (jeweils 0 bis 255)" + } + } + }, + { + "id": "Color/toString()", + "memberId": "Color/toString", + "owner": "org.openpatch.scratch.Color", + "className": "Color", + "methodName": "toString", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "The colour written out, so that printing one says something.", + "description": "The colour written out, so that printing one says something.\n\nWithout this a `System.out.println(mySprite.getTint())` printed\n`org.openpatch.scratch.Color@35432107`, which tells you nothing about\nthe colour and is the first thing anyone tries when a tint looks wrong.", + "scratchblock": null, + "paramDocs": [], + "returns": "the colour as `Color[r=255.0, g=128.0, b=0.0]`", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Color/toString", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Farbe als Text aus" + } + } + }, + { + "id": "Ellipse/constructor(double,double,double,double)", + "memberId": "Ellipse/constructor", + "owner": "org.openpatch.scratch.Ellipse", + "className": "Ellipse", + "methodName": "constructor", + "static": false, + "returnType": "Ellipse", + "parameterTypes": [ + "double", + "double", + "double", + "double" + ], + "parameterNames": [ + "x", + "y", + "width", + "height" + ], + "params": [ + "double x", + "double y", + "double width", + "double height" + ], + "summary": "Creates an ellipse with no specified position or size.", + "description": "Creates an ellipse with no specified position or size.", + "scratchblock": null, + "paramDocs": [ + "x: ", + "y: ", + "width: ", + "height: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Ellipse/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Ellipse im angegebenen Rechteck" + } + } + }, + { + "id": "Hitbox/constructor(Shape)", + "memberId": "Hitbox/constructor", + "owner": "org.openpatch.scratch.Hitbox", + "className": "Hitbox", + "methodName": "constructor", + "static": false, + "returnType": "Hitbox", + "parameterTypes": [ + "org.openpatch.scratch.Shape" + ], + "parameterNames": [ + "shape" + ], + "params": [ + "Shape shape" + ], + "summary": "Constructs a hitbox with the specified shape.", + "description": "Constructs a hitbox with the specified shape.", + "scratchblock": null, + "paramDocs": [ + "shape: The shape of the hitbox." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Hitbox/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen Umriss aus einer Form" + } + } + }, + { + "id": "Hitbox/constructor(double[],double[])", + "memberId": "Hitbox/constructor", + "owner": "org.openpatch.scratch.Hitbox", + "className": "Hitbox", + "methodName": "constructor", + "static": false, + "returnType": "Hitbox", + "parameterTypes": [ + "double[]", + "double[]" + ], + "parameterNames": [ + "xPoints", + "yPoints" + ], + "params": [ + "double[] xPoints", + "double[] yPoints" + ], + "summary": "Constructs a hitbox with the specified x and y points.", + "description": "Constructs a hitbox with the specified x and y points.", + "scratchblock": null, + "paramDocs": [ + "xPoints: The x-coordinates of the points.", + "yPoints: The y-coordinates of the points." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Hitbox/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen Umriss aus x- und y-Koordinaten" + } + } + }, + { + "id": "Hitbox/contains(double,double)", + "memberId": "Hitbox/contains", + "owner": "org.openpatch.scratch.Hitbox", + "className": "Hitbox", + "methodName": "contains", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Checks if the hitbox contains a point.", + "description": "Checks if the hitbox contains a point.", + "scratchblock": null, + "paramDocs": [ + "x: The x-coordinate of the point.", + "y: The y-coordinate of the point." + ], + "returns": "`true` if the hitbox contains the point, `false`\n otherwise.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Hitbox/contains", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn der Punkt im Umriss liegt" + } + } + }, + { + "id": "Hitbox/getBounds()", + "memberId": "Hitbox/getBounds", + "owner": "org.openpatch.scratch.Hitbox", + "className": "Hitbox", + "methodName": "getBounds", + "static": false, + "returnType": "Bounds", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the smallest upright rectangle the hitbox fits into.", + "description": "Returns the smallest upright rectangle the hitbox fits into.", + "scratchblock": null, + "paramDocs": [], + "returns": "the bounding box of the hitbox", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Hitbox/getBounds", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das umschließende Rechteck zurück" + } + } + }, + { + "id": "Hitbox/getShape()", + "memberId": "Hitbox/getShape", + "owner": "org.openpatch.scratch.Hitbox", + "className": "Hitbox", + "methodName": "getShape", + "static": false, + "returnType": "Shape", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the shape of the hitbox.", + "description": "Returns the shape of the hitbox.", + "scratchblock": null, + "paramDocs": [], + "returns": "The shape of the hitbox.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Hitbox/getShape", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Umriss als Form zurück" + } + } + }, + { + "id": "Hitbox/intersects(Hitbox)", + "memberId": "Hitbox/intersects", + "owner": "org.openpatch.scratch.Hitbox", + "className": "Hitbox", + "methodName": "intersects", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "org.openpatch.scratch.Hitbox" + ], + "parameterNames": [ + "hitbox" + ], + "params": [ + "Hitbox hitbox" + ], + "summary": "Checks if the hitbox intersects with another hitbox.", + "description": "Checks if the hitbox intersects with another hitbox.", + "scratchblock": null, + "paramDocs": [ + "hitbox: The hitbox to check for intersection." + ], + "returns": "`true` if the hitboxes intersect, `false` otherwise.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Hitbox/intersects", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn sich beide Umrisse überlappen" + } + } + }, + { + "id": "Hitbox/translateAndRotateAndResize(double,double,double,double,double,double)", + "memberId": "Hitbox/translateAndRotateAndResize", + "owner": "org.openpatch.scratch.Hitbox", + "className": "Hitbox", + "methodName": "translateAndRotateAndResize", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double", + "double", + "double", + "double" + ], + "parameterNames": [ + "degrees", + "originX", + "originY", + "translateX", + "translateY", + "size" + ], + "params": [ + "double degrees", + "double originX", + "double originY", + "double translateX", + "double translateY", + "double size" + ], + "summary": "Transforms the shape by scaling, translating, and rotating it.", + "description": "Transforms the shape by scaling, translating, and rotating it.", + "scratchblock": null, + "paramDocs": [ + "degrees: The angle in degrees to rotate the shape.", + "originX: The x-coordinate of the rotation origin.", + "originY: The y-coordinate of the rotation origin.", + "translateX: The x-coordinate to translate the shape.", + "translateY: The y-coordinate to translate the shape.", + "size: The size to scale the shape, where 100.0 represents the\n original size." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Hitbox/translateAndRotateAndResize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Verschiebt, dreht und skaliert den Umriss" + } + } + }, + { + "id": "HtmlColor/constructor()", + "memberId": "HtmlColor/constructor", + "owner": "org.openpatch.scratch.HtmlColor", + "className": "HtmlColor", + "methodName": "constructor", + "static": false, + "returnType": "HtmlColor", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Provides predefined HTML colors as Color objects.", + "description": "Provides predefined HTML colors as Color objects.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/HtmlColor/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine zufällige der benannten Farben zurück" + } + } + }, + { + "id": "HtmlColor/getRandom()", + "memberId": "HtmlColor/getRandom", + "owner": "org.openpatch.scratch.HtmlColor", + "className": "HtmlColor", + "methodName": "getRandom", + "static": true, + "returnType": "Color", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns a random HTML color.", + "description": "Returns a random HTML color.", + "scratchblock": null, + "paramDocs": [], + "returns": "a random Color from the predefined HTML colors", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/HtmlColor/getRandom", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Operators/absOf(int)", + "memberId": "Operators/absOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "absOf", + "static": true, + "returnType": "int", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "x" + ], + "params": [ + "int x" + ], + "summary": "\"abs\" is an abbreviation for \"absolute value.\" The absolute value of a number is its distance\nfrom 0. A simpler way to describe an absolute value is that it makes any number positive. If it\nis negative, it becomes positive, and if it is positive, it stays the same.", + "description": "\"abs\" is an abbreviation for \"absolute value.\" The absolute value of a number is its distance\nfrom 0. A simpler way to describe an absolute value is that it makes any number positive. If it\nis negative, it becomes positive, and if it is positive, it stays the same.", + "scratchblock": null, + "paramDocs": [ + "x: a value" + ], + "returns": "the absolute value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/absOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Betrag zurück" + } + } + }, + { + "id": "Operators/absOf(double)", + "memberId": "Operators/absOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "absOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"abs\" is an abbreviation for \"absolute value.\" The absolute value of a number is its distance\nfrom 0. A simpler way to describe an absolute value is that it makes any number positive. If it\nis negative, it becomes positive, and if it is positive, it stays the same.", + "description": "\"abs\" is an abbreviation for \"absolute value.\" The absolute value of a number is its distance\nfrom 0. A simpler way to describe an absolute value is that it makes any number positive. If it\nis negative, it becomes positive, and if it is positive, it stays the same.", + "scratchblock": "([abs v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the absolute value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/absOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Betrag zurück" + } + } + }, + { + "id": "Operators/acosOf(double)", + "memberId": "Operators/acosOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "acosOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"acos\" is the abbreviation for \"arccosine\" and is also sometimes written as cos\\u22121. When given\nthe ratio (in decimal form) of the length of the adjacent side and hypotenuse of a right\ntriangle, it finds the angle.", + "description": "\"acos\" is the abbreviation for \"arccosine\" and is also sometimes written as cos\\u22121. When given\nthe ratio (in decimal form) of the length of the adjacent side and hypotenuse of a right\ntriangle, it finds the angle.", + "scratchblock": "([acos v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the angle of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/acosOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Arkuskosinus von x, Ergebnis in Grad" + } + } + }, + { + "id": "Operators/asinOf(double)", + "memberId": "Operators/asinOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "asinOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"asin\" is the abbreviation for \"arcsine\" and is also sometimes written as sin\\u22121. When given the\nratio (in decimal form) of the length of the opposite side and hypotenuse of a right triangle,\nit finds the angle.", + "description": "\"asin\" is the abbreviation for \"arcsine\" and is also sometimes written as sin\\u22121. When given the\nratio (in decimal form) of the length of the opposite side and hypotenuse of a right triangle,\nit finds the angle.", + "scratchblock": "([asin v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the angle of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/asinOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Arkussinus von x, Ergebnis in Grad" + } + } + }, + { + "id": "Operators/atanOf(double)", + "memberId": "Operators/atanOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "atanOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"atan\" is the abbreviation for \"arctangent\" and is also sometimes written as tan\\u22121. When given\nthe ratio (in decimal form) of the length of the opposite side and adjacent side of a right\ntriangle, it finds the angle.", + "description": "\"atan\" is the abbreviation for \"arctangent\" and is also sometimes written as tan\\u22121. When given\nthe ratio (in decimal form) of the length of the opposite side and adjacent side of a right\ntriangle, it finds the angle.", + "scratchblock": "([atan v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the angle of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/atanOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Arkustangens von x, Ergebnis in Grad" + } + } + }, + { + "id": "Operators/ceilingOf(double)", + "memberId": "Operators/ceilingOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "ceilingOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "This always rounds the number up to the least whole number greater than or equal to the number.\nFor example, ceiling(3.14) = 4 and ceiling(7.68) = 8.", + "description": "This always rounds the number up to the least whole number greater than or equal to the number.\nFor example, ceiling(3.14) = 4 and ceiling(7.68) = 8.", + "scratchblock": "([ceiling v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the ceiling of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/ceilingOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Rundet auf" + } + } + }, + { + "id": "Operators/constrain(double,double,double)", + "memberId": "Operators/constrain", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "constrain", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "amt", + "low", + "high" + ], + "params": [ + "double amt", + "double low", + "double high" + ], + "summary": "Constrains a value to not exceed a maximum and minimum value.", + "description": "Constrains a value to not exceed a maximum and minimum value.", + "scratchblock": null, + "paramDocs": [ + "amt: the value to constrain", + "low: minimum limit", + "high: maximum limit" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/constrain", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Begrenzt den Wert auf den Bereich zwischen low und high" + } + } + }, + { + "id": "Operators/constrain(int,int,int)", + "memberId": "Operators/constrain", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "constrain", + "static": true, + "returnType": "int", + "parameterTypes": [ + "int", + "int", + "int" + ], + "parameterNames": [ + "amt", + "low", + "high" + ], + "params": [ + "int amt", + "int low", + "int high" + ], + "summary": "Constrains a value to not exceed a maximum and minimum value.", + "description": "Constrains a value to not exceed a maximum and minimum value.", + "scratchblock": null, + "paramDocs": [ + "amt: the value to constrain", + "low: minimum limit", + "high: maximum limit" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/constrain", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Begrenzt den Wert auf den Bereich zwischen low und high" + } + } + }, + { + "id": "Operators/cosOf(double)", + "memberId": "Operators/cosOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "cosOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"cos\" is the abbreviation for \"cosine.\" The cosine of an angle is the ratio between the length\nof the side adjacent (next to) it on the triangle and the length of the hypotenuse. In the\npicture above, the cosine of angle A is equal to side \"adjacent\" divided by side \"hypotenuse\".", + "description": "\"cos\" is the abbreviation for \"cosine.\" The cosine of an angle is the ratio between the length\nof the side adjacent (next to) it on the triangle and the length of the hypotenuse. In the\npicture above, the cosine of angle A is equal to side \"adjacent\" divided by side \"hypotenuse\".", + "scratchblock": "([cos v] of (x))", + "paramDocs": [ + "x: an angle between [0, ..., 360]" + ], + "returns": "the cos of the angle", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/cosOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Kosinus des Winkels x, x in Grad" + } + } + }, + { + "id": "Operators/eToThePowerOf(double)", + "memberId": "Operators/eToThePowerOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "eToThePowerOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"e\" is an abbreviation for \"Euler's number\", which is about 2.718. With the e^ function, e is\nmultiplied by itself the value number of times. For example, if the value is 3, the answer\nwould be e3, or e×e×e, which is about 20.086.", + "description": "\"e\" is an abbreviation for \"Euler's number\", which is about 2.718. With the e^ function, e is\nmultiplied by itself the value number of times. For example, if the value is 3, the answer\nwould be e3, or e×e×e, which is about 20.086.", + "scratchblock": "([e ^ v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "e to the power of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/eToThePowerOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt e hoch x zurück" + } + } + }, + { + "id": "Operators/floorOf(double)", + "memberId": "Operators/floorOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "floorOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "This always rounds the number down to the greatest whole number less than or equal to the\nnumber. For example, floor(1.73) = 1 and floor(-2.74) = -3.", + "description": "This always rounds the number down to the greatest whole number less than or equal to the\nnumber. For example, floor(1.73) = 1 and floor(-2.74) = -3.", + "scratchblock": "([floor v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the floor of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/floorOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Rundet ab" + } + } + }, + { + "id": "Operators/lerp(double,double,double)", + "memberId": "Operators/lerp", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "lerp", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "start", + "stop", + "amt" + ], + "params": [ + "double start", + "double stop", + "double amt" + ], + "summary": "Calculates a number between two numbers at a specific increment. The amt parameter is\nthe amount to interpolate between the two values where 0.0 equal to the first point, 0.1 is\nvery near the first point, 0.5 is half-way in between, etc. The lerp function is convenient for\ncreating motion along a straight path and for drawing dotted lines.", + "description": "Calculates a number between two numbers at a specific increment. The amt parameter is\nthe amount to interpolate between the two values where 0.0 equal to the first point, 0.1 is\nvery near the first point, 0.5 is half-way in between, etc. The lerp function is convenient for\ncreating motion along a straight path and for drawing dotted lines.", + "scratchblock": null, + "paramDocs": [ + "start: first value", + "stop: second value", + "amt: double between 0.0 and 1.0" + ], + "returns": "the interpolated value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/lerp", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Interpoliert linear zwischen start und stop; amt liegt zwischen 0 und 1" + } + } + }, + { + "id": "Operators/lnOf(double)", + "memberId": "Operators/lnOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "lnOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "ln is \"natural log.\" It figures out how many times e would have to be multiplied by itself to\nget the value. For example, if the value was 148.4, the answer would be about 5 because e5\n(e×e×e×e×e) is around 148.4.", + "description": "ln is \"natural log.\" It figures out how many times e would have to be multiplied by itself to\nget the value. For example, if the value was 148.4, the answer would be about 5 because e5\n(e×e×e×e×e) is around 148.4.", + "scratchblock": "([ln v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the ln of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/lnOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Natürlicher Logarithmus von x" + } + } + }, + { + "id": "Operators/logOf(double)", + "memberId": "Operators/logOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "logOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"Log\" is short for \"logarithm.\" The log function figures out how many times 10 must be\nmultiplied by itself to get the value. For example, if the value is 100, the answer is 2\nbecause 10×10 is 100.", + "description": "\"Log\" is short for \"logarithm.\" The log function figures out how many times 10 must be\nmultiplied by itself to get the value. For example, if the value is 100, the answer is 2\nbecause 10×10 is 100.", + "scratchblock": "([log v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the log to base 10 of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/logOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zehnerlogarithmus von x" + } + } + }, + { + "id": "Operators/map(double,double,double,double,double)", + "memberId": "Operators/map", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "map", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "double", + "double", + "double", + "double" + ], + "parameterNames": [ + "value", + "start1", + "stop1", + "start2", + "stop2" + ], + "params": [ + "double value", + "double start1", + "double stop1", + "double start2", + "double stop2" + ], + "summary": "Re-maps a number from one range to another.
\n
\nIn the first example above, the number 25 is converted from a value in the range of 0 to 100\ninto a value that ranges from the left edge of the window (0) to the right edge (width).
\n
\nAs shown in the second example, numbers outside the range are not clamped to the minimum and\nmaximum parameters values, because out-of-range values are often intentional and useful.", + "description": "Re-maps a number from one range to another.
\n
\nIn the first example above, the number 25 is converted from a value in the range of 0 to 100\ninto a value that ranges from the left edge of the window (0) to the right edge (width).
\n
\nAs shown in the second example, numbers outside the range are not clamped to the minimum and\nmaximum parameters values, because out-of-range values are often intentional and useful.", + "scratchblock": null, + "paramDocs": [ + "value: the incoming value to be converted", + "start1: lower bound of the value's current range", + "stop1: upper bound of the value's current range", + "start2: lower bound of the value's target range", + "stop2: upper bound of the value's target range" + ], + "returns": "the value mapped to the new range", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/map", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Rechnet einen Wert aus dem Bereich start1..stop1 in den Bereich start2..stop2 um" + } + } + }, + { + "id": "Operators/max(double[])", + "memberId": "Operators/max", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "max", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double[]" + ], + "parameterNames": [ + "v" + ], + "params": [ + "double[] v" + ], + "summary": "Determines the largest value in a sequence of numbers, and then returns that value.\nmax() accepts either two or three double or int values as parameters, or\nan array of any length.", + "description": "Determines the largest value in a sequence of numbers, and then returns that value.\nmax() accepts either two or three double or int values as parameters, or\nan array of any length.", + "scratchblock": null, + "paramDocs": [ + "v: values" + ], + "returns": "the maximum", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/max", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Operators/max(int[])", + "memberId": "Operators/max", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "max", + "static": true, + "returnType": "int", + "parameterTypes": [ + "int[]" + ], + "parameterNames": [ + "v" + ], + "params": [ + "int[] v" + ], + "summary": "Determines the largest value in a sequence of numbers, and then returns that value.\nmax() accepts either two or three double or int values as parameters, or\nan array of any length.", + "description": "Determines the largest value in a sequence of numbers, and then returns that value.\nmax() accepts either two or three double or int values as parameters, or\nan array of any length.", + "scratchblock": null, + "paramDocs": [ + "v: values" + ], + "returns": "the maximum", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/max", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Operators/min(double[])", + "memberId": "Operators/min", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "min", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double[]" + ], + "parameterNames": [ + "v" + ], + "params": [ + "double[] v" + ], + "summary": "Determines the smallest value in a sequence of numbers, and then returns that value.\nmin() accepts either two or three double or int values as parameters, or\nan array of any length.", + "description": "Determines the smallest value in a sequence of numbers, and then returns that value.\nmin() accepts either two or three double or int values as parameters, or\nan array of any length.", + "scratchblock": null, + "paramDocs": [ + "v: values" + ], + "returns": "the minimum", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/min", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Operators/min(int[])", + "memberId": "Operators/min", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "min", + "static": true, + "returnType": "int", + "parameterTypes": [ + "int[]" + ], + "parameterNames": [ + "v" + ], + "params": [ + "int[] v" + ], + "summary": "Determines the smallest value in a sequence of numbers, and then returns that value.\nmin() accepts either two or three double or int values as parameters, or\nan array of any length.", + "description": "Determines the smallest value in a sequence of numbers, and then returns that value.\nmin() accepts either two or three double or int values as parameters, or\nan array of any length.", + "scratchblock": null, + "paramDocs": [ + "v: values" + ], + "returns": "the minimum", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/min", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Operators/mod(double,double)", + "memberId": "Operators/mod", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "mod", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "\"mod\" is an abbreviation for \"modulo\". Modulo returns what is left over when\nthe first input is divided by the second.", + "description": "\"mod\" is an abbreviation for \"modulo\". Modulo returns what is left over when\nthe first input is divided by the second.\n\nThe answer takes the sign of the second input, as the Scratch block does, so\n`mod(-7, 3)` is 2 rather than the -1 Java's own `%` would give.\nThat is what makes it useful for wrapping a value into a range: a sprite\nwhose x has gone negative still lands somewhere sensible.", + "scratchblock": "((x) mod (y))", + "paramDocs": [ + "x: first value", + "y: second value" + ], + "returns": "what is left of the first value after dividing by the second", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/mod", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Rest der Division x geteilt durch y zurück" + } + } + }, + { + "id": "Operators/mod(int,int)", + "memberId": "Operators/mod", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "mod", + "static": true, + "returnType": "int", + "parameterTypes": [ + "int", + "int" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "int x", + "int y" + ], + "summary": "\"mod\" is an abbreviation for \"modulo\". Modulo returns what is left over when\nthe first input is divided by the second, with the sign of the second input,\nas the Scratch block does.", + "description": "\"mod\" is an abbreviation for \"modulo\". Modulo returns what is left over when\nthe first input is divided by the second, with the sign of the second input,\nas the Scratch block does.", + "scratchblock": null, + "paramDocs": [ + "x: first value", + "y: second value" + ], + "returns": "what is left of the first value after dividing by the second", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/mod", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Rest der Division x geteilt durch y zurück" + } + } + }, + { + "id": "Operators/round(double)", + "memberId": "Operators/round", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "round", + "static": true, + "returnType": "int", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "The standard rules of rounding are followed; decimals that are .5 or higher are rounded up,\nwhereas decimals less than .5 are rounded down.", + "description": "The standard rules of rounding are followed; decimals that are .5 or higher are rounded up,\nwhereas decimals less than .5 are rounded down.", + "scratchblock": "(round (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the rounded value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/round", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Rundet auf eine ganze Zahl" + } + } + }, + { + "id": "Operators/round(double,int)", + "memberId": "Operators/round", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "round", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "int" + ], + "parameterNames": [ + "x", + "precision" + ], + "params": [ + "double x", + "int precision" + ], + "summary": "Rounds a number to a specified number of decimal places.", + "description": "Rounds a number to a specified number of decimal places.", + "scratchblock": null, + "paramDocs": [ + "x: a value", + "precision: the number of decimal places to round to" + ], + "returns": "the rounded value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/round", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Rundet auf die angegebene Anzahl Nachkommastellen" + } + } + }, + { + "id": "Operators/sinOf(double)", + "memberId": "Operators/sinOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "sinOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"sin\" is an abbreviation for \"sine.\" The sine of an angle is the ratio between the length of\nthe side that is opposite (across) the triangle from it and the length of the hypotenuse (the\nside that is across from the right angle). In the picture above, the sine of angle A is equal\nto side \"opposite\" divided by side \"hypotenuse\".", + "description": "\"sin\" is an abbreviation for \"sine.\" The sine of an angle is the ratio between the length of\nthe side that is opposite (across) the triangle from it and the length of the hypotenuse (the\nside that is across from the right angle). In the picture above, the sine of angle A is equal\nto side \"opposite\" divided by side \"hypotenuse\".", + "scratchblock": "([sin v] of (x))", + "paramDocs": [ + "x: an angle between [0,...,360]" + ], + "returns": "the sin of the angle", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/sinOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Sinus des Winkels x, x in Grad" + } + } + }, + { + "id": "Operators/sqrtOf(double)", + "memberId": "Operators/sqrtOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "sqrtOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"sqrt\" is an abbreviation for \"square root.\" A number that is squared is multiplied by itself.\nFor example, when 2 is squared, the answer is 2×2, which is 4. When a number is square rooted,\nthe answer is the number that was squared to get it. So, the square root of 4 is 2. Similarly,\nthe square root of 2 is about 1.414213562373095 because 1.4142135623730952\n(1.414213562373095\\u202f×\\u202f1.414213562373095) is close to 2.", + "description": "\"sqrt\" is an abbreviation for \"square root.\" A number that is squared is multiplied by itself.\nFor example, when 2 is squared, the answer is 2×2, which is 4. When a number is square rooted,\nthe answer is the number that was squared to get it. So, the square root of 4 is 2. Similarly,\nthe square root of 2 is about 1.414213562373095 because 1.4142135623730952\n(1.414213562373095\\u202f×\\u202f1.414213562373095) is close to 2.", + "scratchblock": "([sqrt v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "the square root of the value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/sqrtOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Quadratwurzel zurück" + } + } + }, + { + "id": "Operators/tanOf(double)", + "memberId": "Operators/tanOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "tanOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "\"tan\" is the abbreviation for \"tangent.\" The tangent of an angle is the ratio between the\nlength of the side adjacent to it and the side opposite of it. In the picture above, the\ntangent of angle A is equal to side \"opposite\" divided by side \"adjacent\".", + "description": "\"tan\" is the abbreviation for \"tangent.\" The tangent of an angle is the ratio between the\nlength of the side adjacent to it and the side opposite of it. In the picture above, the\ntangent of angle A is equal to side \"opposite\" divided by side \"adjacent\".", + "scratchblock": "([tan v] of (x))", + "paramDocs": [ + "x: an angle between [0, ..., 360]" + ], + "returns": "the tan of the angle", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/tanOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Tangens des Winkels x, x in Grad" + } + } + }, + { + "id": "Operators/tenToThePowerOf(double)", + "memberId": "Operators/tenToThePowerOf", + "owner": "org.openpatch.scratch.Operators", + "className": "Operators", + "methodName": "tenToThePowerOf", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "The 10^ function multiplies 10 times itself the value number of times. For example, if the\nvalue was 6, the answer would be 106 (that is 10×10×10×10×10×10), which is 1,000,000.", + "description": "The 10^ function multiplies 10 times itself the value number of times. For example, if the\nvalue was 6, the answer would be 106 (that is 10×10×10×10×10×10), which is 1,000,000.", + "scratchblock": "([10 ^ v] of (x))", + "paramDocs": [ + "x: a value" + ], + "returns": "10 to the power of that value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Operators/tenToThePowerOf", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt 10 hoch x zurück" + } + } + }, + { + "id": "Pen/changeColor(double)", + "memberId": "Pen/changeColor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "changeColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "c" + ], + "params": [ + "double c" + ], + "summary": "Change color via a hue value, which is added to the current hue value", + "description": "Change color via a hue value, which is added to the current hue value", + "scratchblock": "change pen [color v] by (c)", + "paramDocs": [ + "c: a hue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/changeColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert den Farbton des Stifts um den angegebenen Wert" + } + } + }, + { + "id": "Pen/changeSize(double)", + "memberId": "Pen/changeSize", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "changeSize", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "size" + ], + "params": [ + "double size" + ], + "summary": "Change the size of the pen", + "description": "Change the size of the pen", + "scratchblock": "change pen size by (size)", + "paramDocs": [ + "size: size to change" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/changeSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Strichstärke um den angegebenen Wert" + } + } + }, + { + "id": "Pen/changeTransparency(double)", + "memberId": "Pen/changeTransparency", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "changeTransparency", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "step" + ], + "params": [ + "double step" + ], + "summary": "Change the transparency by a step", + "description": "Change the transparency by a step", + "scratchblock": null, + "paramDocs": [ + "step: the step to change the transparency by" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/changeTransparency", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Deckkraft um den angegebenen Wert" + } + } + }, + { + "id": "Pen/constructor()", + "memberId": "Pen/constructor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "constructor", + "static": false, + "returnType": "Pen", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Pen object.", + "description": "Constructs a new Pen object.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen neuen Stift" + } + } + }, + { + "id": "Pen/constructor(Sprite)", + "memberId": "Pen/constructor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "constructor", + "static": false, + "returnType": "Pen", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "s" + ], + "params": [ + "Sprite s" + ], + "summary": "Constructs a new Pen object associated with the given Sprite.", + "description": "Constructs a new Pen object associated with the given Sprite.", + "scratchblock": null, + "paramDocs": [ + "s: the Sprite object to associate with this Pen" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Senkt den Stift ab, so dass er beim Bewegen zeichnet" + } + } + }, + { + "id": "Pen/constructor(Pen)", + "memberId": "Pen/constructor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "constructor", + "static": false, + "returnType": "Pen", + "parameterTypes": [ + "org.openpatch.scratch.Pen" + ], + "parameterNames": [ + "p" + ], + "params": [ + "Pen p" + ], + "summary": "Copies a Pen object.", + "description": "Copies a Pen object.", + "scratchblock": null, + "paramDocs": [ + "p: Pen object to copy" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Pen/down()", + "memberId": "Pen/down", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "down", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Set the pen down.", + "description": "Set the pen down.", + "scratchblock": "pen down", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/down", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Pen/eraseAll()", + "memberId": "Pen/eraseAll", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "eraseAll", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Erases all.", + "description": "Erases all.", + "scratchblock": "erase all", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/eraseAll", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Löscht alles Gezeichnete" + } + } + }, + { + "id": "Pen/getColor()", + "memberId": "Pen/getColor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "getColor", + "static": false, + "returnType": "Color", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current color of the pen.", + "description": "Retrieves the current color of the pen.", + "scratchblock": null, + "paramDocs": [], + "returns": "the color of the pen", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/getColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Stiftfarbe zurück" + } + } + }, + { + "id": "Pen/getSize()", + "memberId": "Pen/getSize", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "getSize", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the size of the pen", + "description": "Returns the size of the pen", + "scratchblock": null, + "paramDocs": [], + "returns": "the size of the pen", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/getSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Strichstärke zurück" + } + } + }, + { + "id": "Pen/goToBackground()", + "memberId": "Pen/goToBackground", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "goToBackground", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Sets the pen to the background. This method changes the state of the pen to\nindicate that it is\nno longer in the foreground.", + "description": "Sets the pen to the background. This method changes the state of the pen to\nindicate that it is\nno longer in the foreground.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/goToBackground", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeichnet hinter den Figuren" + } + } + }, + { + "id": "Pen/goToForeground()", + "memberId": "Pen/goToForeground", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "goToForeground", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves the pen to the foreground. This method sets the pen's state to indicate\nthat it is in the\nforeground.", + "description": "Moves the pen to the foreground. This method sets the pen's state to indicate\nthat it is in the\nforeground.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/goToForeground", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeichnet vor den Figuren" + } + } + }, + { + "id": "Pen/goToMousePointer()", + "memberId": "Pen/goToMousePointer", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "goToMousePointer", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves the object to the current position of the mouse pointer.", + "description": "Moves the object to the current position of the mouse pointer.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/goToMousePointer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Stift auf die Position des Mauszeigers" + } + } + }, + { + "id": "Pen/goToRandomPosition()", + "memberId": "Pen/goToRandomPosition", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "goToRandomPosition", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves the object to a random position within the boundaries of the stage. The\nnew position is\ndetermined by generating random coordinates within the width and height of\nthe stage.", + "description": "Moves the object to a random position within the boundaries of the stage. The\nnew position is\ndetermined by generating random coordinates within the width and height of\nthe stage.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/goToRandomPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Stift an eine zufällige Position der Bühne" + } + } + }, + { + "id": "Pen/isInBackground()", + "memberId": "Pen/isInBackground", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "isInBackground", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns true if the pen is in the background.", + "description": "Returns true if the pen is in the background.", + "scratchblock": null, + "paramDocs": [], + "returns": "true if the pen is in the background", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/isInBackground", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn der Stift hinter den Figuren zeichnet" + } + } + }, + { + "id": "Pen/setColor(Color)", + "memberId": "Pen/setColor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "setColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Color c" + ], + "summary": "Set the color of the pen", + "description": "Set the color of the pen", + "scratchblock": null, + "paramDocs": [ + "c: color of the pen" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/setColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Stiftfarbe" + } + } + }, + { + "id": "Pen/setColor(double)", + "memberId": "Pen/setColor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "setColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Set color via hue value", + "description": "Set color via hue value", + "scratchblock": "set pen [color v] to (h)", + "paramDocs": [ + "h: a hue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/setColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Stiftfarbe über den Farbton (0 bis 255)" + } + } + }, + { + "id": "Pen/setColor(double,double,double)", + "memberId": "Pen/setColor", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "setColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "double r", + "double g", + "double b" + ], + "summary": "Set color via rgb values", + "description": "Set color via rgb values", + "scratchblock": null, + "paramDocs": [ + "r: a red value [0...255]", + "g: a green value [0...255]", + "b: a blue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/setColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Stiftfarbe aus Rot-, Grün- und Blauanteil (jeweils 0 bis 255)" + } + } + }, + { + "id": "Pen/setPosition(double,double)", + "memberId": "Pen/setPosition", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Set the position if the pen is down.", + "description": "Set the position if the pen is down.", + "scratchblock": null, + "paramDocs": [ + "x: x coordinate", + "y: y coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Stift an die angegebene Position; bei abgesenktem Stift wird eine Linie gezeichnet" + } + } + }, + { + "id": "Pen/setPosition(Vector2)", + "memberId": "Pen/setPosition", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Sets the position of the pen using a Vector2 object.", + "description": "Sets the position of the pen using a Vector2 object.", + "scratchblock": null, + "paramDocs": [ + "v: the Vector2 object containing the new x and y coordinates" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Stift an die angegebene Position; bei abgesenktem Stift wird eine Linie gezeichnet" + } + } + }, + { + "id": "Pen/setSize(double)", + "memberId": "Pen/setSize", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "setSize", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "size" + ], + "params": [ + "double size" + ], + "summary": "Set the size of the pen", + "description": "Set the size of the pen", + "scratchblock": "set pen size to (size)", + "paramDocs": [ + "size: size of the pen" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/setSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Strichstärke" + } + } + }, + { + "id": "Pen/setTransparency(double)", + "memberId": "Pen/setTransparency", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "setTransparency", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "transparency" + ], + "params": [ + "double transparency" + ], + "summary": "Set the transparency", + "description": "Set the transparency", + "scratchblock": null, + "paramDocs": [ + "transparency: transparency of the pen" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/setTransparency", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Deckkraft von 0 (unsichtbar) bis 255 (deckend)" + } + } + }, + { + "id": "Pen/stamp()", + "memberId": "Pen/stamp", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "stamp", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stamps the current sprite onto the canvas. If the sprite is not null, it will\nstamp either to\nthe foreground or the background based on the value of the isForeground flag.", + "description": "Stamps the current sprite onto the canvas. If the sprite is not null, it will\nstamp either to\nthe foreground or the background based on the value of the isForeground flag.", + "scratchblock": "stamp", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/stamp", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Druckt ein Abbild der zugehörigen Figur auf die Bühne" + } + } + }, + { + "id": "Pen/up()", + "memberId": "Pen/up", + "owner": "org.openpatch.scratch.Pen", + "className": "Pen", + "methodName": "up", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Move the pen up.", + "description": "Move the pen up.", + "scratchblock": "pen up", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Pen/up", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Hebt den Stift an, so dass er nicht mehr zeichnet" + } + } + }, + { + "id": "Polygon/addPoint(double,double)", + "memberId": "Polygon/addPoint", + "owner": "org.openpatch.scratch.Polygon", + "className": "Polygon", + "methodName": "addPoint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Adds a point to the polygon.", + "description": "Adds a point to the polygon.", + "scratchblock": null, + "paramDocs": [ + "x: the x-coordinate", + "y: the y-coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Polygon/addPoint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt dem Vieleck einen Punkt hinzu" + } + } + }, + { + "id": "Polygon/constructor()", + "memberId": "Polygon/constructor", + "owner": "org.openpatch.scratch.Polygon", + "className": "Polygon", + "methodName": "constructor", + "static": false, + "returnType": "Polygon", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Creates an empty polygon.", + "description": "Creates an empty polygon.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Polygon/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein leeres Vieleck; Punkte kommen mit addPoint() dazu" + } + } + }, + { + "id": "Polygon/constructor(double[],double[])", + "memberId": "Polygon/constructor", + "owner": "org.openpatch.scratch.Polygon", + "className": "Polygon", + "methodName": "constructor", + "static": false, + "returnType": "Polygon", + "parameterTypes": [ + "double[]", + "double[]" + ], + "parameterNames": [ + "xPoints", + "yPoints" + ], + "params": [ + "double[] xPoints", + "double[] yPoints" + ], + "summary": "Creates a polygon with the specified vertices.", + "description": "Creates a polygon with the specified vertices.", + "scratchblock": null, + "paramDocs": [ + "xPoints: an array of x-coordinates", + "yPoints: an array of y-coordinates" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Polygon/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein Vieleck aus x- und y-Koordinaten" + } + } + }, + { + "id": "Random/noise(double)", + "memberId": "Random/noise", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "noise", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Returns the Open Simplex noise value at specified coordinates", + "description": "Returns the Open Simplex noise value at specified coordinates", + "scratchblock": null, + "paramDocs": [ + "x: x-coordinate" + ], + "returns": "the noise value between 0 and 1", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/noise", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Rauschwert (Open Simplex Noise) an der Stelle x zurück" + } + } + }, + { + "id": "Random/noise(double,double)", + "memberId": "Random/noise", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "noise", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Returns the Open Simplex noise value at specified coordinates", + "description": "Returns the Open Simplex noise value at specified coordinates", + "scratchblock": null, + "paramDocs": [ + "x: x-coordinate", + "y: y-coordinate" + ], + "returns": "the noise value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/noise", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Rauschwert (Open Simplex Noise) an der Stelle (x, y) zurück" + } + } + }, + { + "id": "Random/noise(double,double,double)", + "memberId": "Random/noise", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "noise", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "x", + "y", + "z" + ], + "params": [ + "double x", + "double y", + "double z" + ], + "summary": "Returns the Open Simplex noise value at specified coordinates", + "description": "Returns the Open Simplex noise value at specified coordinates", + "scratchblock": null, + "paramDocs": [ + "x: x-coordinate", + "y: y-coordinate", + "z: z-coordinate" + ], + "returns": "the noise value", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/noise", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Rauschwert (Open Simplex Noise) an der Stelle (x, y, z) zurück" + } + } + }, + { + "id": "Random/noiseSeed(long)", + "memberId": "Random/noiseSeed", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "noiseSeed", + "static": true, + "returnType": "void", + "parameterTypes": [ + "long" + ], + "parameterNames": [ + "noiseSeed" + ], + "params": [ + "long noiseSeed" + ], + "summary": "Sets the seed for the noise method.", + "description": "Sets the seed for the noise method.", + "scratchblock": null, + "paramDocs": [ + "noiseSeed: the seed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/noiseSeed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Startwert für das Rauschen" + } + } + }, + { + "id": "Random/random()", + "memberId": "Random/random", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "random", + "static": true, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns a random double between 0 and 1.", + "description": "Returns a random double between 0 and 1.", + "scratchblock": null, + "paramDocs": [], + "returns": "a random double", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/random", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine Zufallszahl zwischen 0 und 1 zurück" + } + } + }, + { + "id": "Random/random(double)", + "memberId": "Random/random", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "random", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "max" + ], + "params": [ + "double max" + ], + "summary": "Returns a random double between 0 and max.", + "description": "Returns a random double between 0 and max.", + "scratchblock": null, + "paramDocs": [ + "max: the maximum double" + ], + "returns": "a random double", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/random", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine Zufallszahl zwischen 0 und max zurück" + } + } + }, + { + "id": "Random/random(double,double)", + "memberId": "Random/random", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "random", + "static": true, + "returnType": "double", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "min", + "max" + ], + "params": [ + "double min", + "double max" + ], + "summary": "Returns a random double between min and max.", + "description": "Returns a random double between min and max.", + "scratchblock": "(pick random (min) to (max))", + "paramDocs": [ + "min: the minimum double", + "max: the maximum double" + ], + "returns": "a random double", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/random", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine Zufallszahl zwischen min und max zurück" + } + } + }, + { + "id": "Random/randomInt(int)", + "memberId": "Random/randomInt", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "randomInt", + "static": true, + "returnType": "int", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "max" + ], + "params": [ + "int max" + ], + "summary": "Returns a random integer between 0 and max.", + "description": "Returns a random integer between 0 and max.", + "scratchblock": null, + "paramDocs": [ + "max: the maximum integer" + ], + "returns": "a random integer", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/randomInt", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine ganze Zufallszahl zwischen 0 und max zurück (beide eingeschlossen)" + } + } + }, + { + "id": "Random/randomInt(int,int)", + "memberId": "Random/randomInt", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "randomInt", + "static": true, + "returnType": "int", + "parameterTypes": [ + "int", + "int" + ], + "parameterNames": [ + "min", + "max" + ], + "params": [ + "int min", + "int max" + ], + "summary": "Returns a random integer between min and max.", + "description": "Returns a random integer between min and max.", + "scratchblock": "(pick random (min) to (max))", + "paramDocs": [ + "min: the minimum integer", + "max: the maximum integer" + ], + "returns": "a random integer", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/randomInt", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine ganze Zufallszahl zwischen min und max zurück (beide eingeschlossen)" + } + } + }, + { + "id": "Random/randomPosition()", + "memberId": "Random/randomPosition", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "randomPosition", + "static": true, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns a random position with respect to the width of the window.", + "description": "Returns a random position with respect to the width of the window.", + "scratchblock": null, + "paramDocs": [], + "returns": "a random position vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/randomPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine zufällige Position auf der Bühne zurück" + } + } + }, + { + "id": "Random/randomSeed(long)", + "memberId": "Random/randomSeed", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "randomSeed", + "static": true, + "returnType": "void", + "parameterTypes": [ + "long" + ], + "parameterNames": [ + "seed" + ], + "params": [ + "long seed" + ], + "summary": "Sets the seed for the random method.", + "description": "Sets the seed for the random method.", + "scratchblock": null, + "paramDocs": [ + "seed: the seed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/randomSeed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Startwert für die Zufallszahlen; danach wiederholt sich dieselbe Folge" + } + } + }, + { + "id": "Random/randomVector2()", + "memberId": "Random/randomVector2", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "randomVector2", + "static": true, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns a random unit vector", + "description": "Returns a random unit vector", + "scratchblock": null, + "paramDocs": [], + "returns": "a random unit vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/randomVector2", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt einen zufälligen Vektor der Länge 1 zurück" + } + } + }, + { + "id": "Random/randomX()", + "memberId": "Random/randomX", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "randomX", + "static": true, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Return a random x coordinate with respect to the width of the window.", + "description": "Return a random x coordinate with respect to the width of the window.", + "scratchblock": null, + "paramDocs": [], + "returns": "a random x coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/randomX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine zufällige x-Koordinate innerhalb der Bühne zurück" + } + } + }, + { + "id": "Random/randomY()", + "memberId": "Random/randomY", + "owner": "org.openpatch.scratch.Random", + "className": "Random", + "methodName": "randomY", + "static": true, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Return a random y coordinate with respect to the width of the window.", + "description": "Return a random y coordinate with respect to the width of the window.", + "scratchblock": null, + "paramDocs": [], + "returns": "a random y coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Random/randomY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine zufällige y-Koordinate innerhalb der Bühne zurück" + } + } + }, + { + "id": "Rectangle/constructor(double,double,double,double)", + "memberId": "Rectangle/constructor", + "owner": "org.openpatch.scratch.Rectangle", + "className": "Rectangle", + "methodName": "constructor", + "static": false, + "returnType": "Rectangle", + "parameterTypes": [ + "double", + "double", + "double", + "double" + ], + "parameterNames": [ + "x", + "y", + "width", + "height" + ], + "params": [ + "double x", + "double y", + "double width", + "double height" + ], + "summary": "Creates a rectangle with the specified position and size.", + "description": "Creates a rectangle with the specified position and size.", + "scratchblock": null, + "paramDocs": [ + "x: the x-coordinate of the rectangle's top-left corner", + "y: the y-coordinate of the rectangle's top-left corner", + "width: the width of the rectangle", + "height: the height of the rectangle" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Rectangle/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein Rechteck mit der linken oberen Ecke bei (x, y)" + } + } + }, + { + "id": "Shape/contains(double,double)", + "memberId": "Shape/contains", + "owner": "org.openpatch.scratch.Shape", + "className": "Shape", + "methodName": "contains", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Check if the shape contains a point defined by its x and y coordinates.", + "description": "Check if the shape contains a point defined by its x and y coordinates.", + "scratchblock": null, + "paramDocs": [ + "x: the x-coordinate of the point", + "y: the y-coordinate of the point" + ], + "returns": "true if the shape contains the point, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Shape/contains", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn der Punkt in der Form liegt" + } + } + }, + { + "id": "Shape/getBounds()", + "memberId": "Shape/getBounds", + "owner": "org.openpatch.scratch.Shape", + "className": "Shape", + "methodName": "getBounds", + "static": false, + "returnType": "Bounds", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the bounds of the shape.", + "description": "Get the bounds of the shape.", + "scratchblock": null, + "paramDocs": [], + "returns": "a Bounds object representing the bounding box of the shape", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Shape/getBounds", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das umschließende Rechteck zurück" + } + } + }, + { + "id": "Shape/intersects(Shape)", + "memberId": "Shape/intersects", + "owner": "org.openpatch.scratch.Shape", + "className": "Shape", + "methodName": "intersects", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "org.openpatch.scratch.Shape" + ], + "parameterNames": [ + "other" + ], + "params": [ + "Shape other" + ], + "summary": "Check if the shape intersects with another shape.", + "description": "Check if the shape intersects with another shape.", + "scratchblock": null, + "paramDocs": [ + "other: the other shape to check intersection with" + ], + "returns": "true if the shapes intersect, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Shape/intersects", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn sich beide Formen überlappen" + } + } + }, + { + "id": "Shape/rotate(double,double,double)", + "memberId": "Shape/rotate", + "owner": "org.openpatch.scratch.Shape", + "className": "Shape", + "methodName": "rotate", + "static": false, + "returnType": "Shape", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "theta", + "anchorX", + "anchorY" + ], + "params": [ + "double theta", + "double anchorX", + "double anchorY" + ], + "summary": "Rotate the shape by the specified angle around a given anchor point.", + "description": "Rotate the shape by the specified angle around a given anchor point.", + "scratchblock": null, + "paramDocs": [ + "theta: the angle in degrees to rotate", + "anchorX: the x-coordinate of the anchor point", + "anchorY: the y-coordinate of the anchor point" + ], + "returns": "a new Shape object that is rotated", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Shape/rotate", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die um theta Grad gedrehte Form als neue Form zurück" + } + } + }, + { + "id": "Shape/scale(double,double)", + "memberId": "Shape/scale", + "owner": "org.openpatch.scratch.Shape", + "className": "Shape", + "methodName": "scale", + "static": false, + "returnType": "Shape", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "scaleX", + "scaleY" + ], + "params": [ + "double scaleX", + "double scaleY" + ], + "summary": "Check if the shape is empty.", + "description": "Check if the shape is empty.", + "scratchblock": null, + "paramDocs": [ + "scaleX: ", + "scaleY: " + ], + "returns": "true if the shape is empty, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Shape/scale", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die skalierte Form als neue Form zurück" + } + } + }, + { + "id": "Shape/translate(double,double)", + "memberId": "Shape/translate", + "owner": "org.openpatch.scratch.Shape", + "className": "Shape", + "methodName": "translate", + "static": false, + "returnType": "Shape", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "dx", + "dy" + ], + "params": [ + "double dx", + "double dy" + ], + "summary": "Translate the shape by the specified distances in the x and y directions.", + "description": "Translate the shape by the specified distances in the x and y directions.", + "scratchblock": null, + "paramDocs": [ + "dx: the distance to translate in the x direction", + "dy: the distance to translate in the y direction" + ], + "returns": "a new Shape object that is translated", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Shape/translate", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die verschobene Form als neue Form zurück" + } + } + }, + { + "id": "Sprite/addCostume(String)", + "memberId": "Sprite/addCostume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "addCostume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Add one of the costumes that ship with Scratch for Java to the sprite. The\ncostume gets the same name as the built-in sprite. If a costume with that\nname already exists do nothing.", + "description": "Add one of the costumes that ship with Scratch for Java to the sprite. The\ncostume gets the same name as the built-in sprite. If a costume with that\nname already exists do nothing.\n\nExample usage:\n\n```java\nthis.addCostume(\"bunny1_jump\");\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of a built-in sprite, for example \"bunny1_jump\". Add\n the sheet in front of the name, for example\n \"platformer/grass\", if the same name exists on several sheets." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/addCostume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt eines der eingebauten Kostüme hinzu" + } + } + }, + { + "id": "Sprite/addCostume(String,String)", + "memberId": "Sprite/addCostume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "addCostume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "imagePath" + ], + "params": [ + "String name", + "String imagePath" + ], + "summary": "Add a costume to the sprite. If a costume with the received name already\nexists do nothing.", + "description": "Add a costume to the sprite. If a costume with the received name already\nexists do nothing.", + "scratchblock": null, + "paramDocs": [ + "name: a unique name", + "imagePath: a image path, or the name of a built-in sprite such as\n \"bunny1_jump\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/addCostume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt ein Kostüm unter eigenem Namen hinzu" + } + } + }, + { + "id": "Sprite/addCostume(String,String,int,int,int,int)", + "memberId": "Sprite/addCostume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "addCostume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "int", + "int", + "int", + "int" + ], + "parameterNames": [ + "name", + "spriteSheetPath", + "x", + "y", + "width", + "height" + ], + "params": [ + "String name", + "String spriteSheetPath", + "int x", + "int y", + "int width", + "int height" + ], + "summary": "Adds a new costume to the sprite if a costume with the same name does not\nalready exist.", + "description": "Adds a new costume to the sprite if a costume with the same name does not\nalready exist.", + "scratchblock": null, + "paramDocs": [ + "name: The name of the costume.", + "spriteSheetPath: The path to the sprite sheet image file.", + "x: The x-coordinate of the top-left corner of the costume\n in the sprite sheet.", + "y: The y-coordinate of the top-left corner of the costume\n in the sprite sheet.", + "width: The width of the costume in the sprite sheet.", + "height: The height of the costume in the sprite sheet." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/addCostume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schneidet ein Kostüm aus einem Bild aus" + } + } + }, + { + "id": "Sprite/addCostumes(String,String,int,int)", + "memberId": "Sprite/addCostumes", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "addCostumes", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "int", + "int" + ], + "parameterNames": [ + "prefix", + "spriteSheet", + "tileWidth", + "tileHeight" + ], + "params": [ + "String prefix", + "String spriteSheet", + "int tileWidth", + "int tileHeight" + ], + "summary": "Adds all tiles from a spritesheet as costumes. The costumes will be name by\nthe prefix and the\nindex in the spritesheet. For example if the prefix is \"tile\" and the\nspritesheet contains 4\ntiles, the costumes will be named \"tile0\", \"tile1\", \"tile2\", and \"tile3\".", + "description": "Adds all tiles from a spritesheet as costumes. The costumes will be name by\nthe prefix and the\nindex in the spritesheet. For example if the prefix is \"tile\" and the\nspritesheet contains 4\ntiles, the costumes will be named \"tile0\", \"tile1\", \"tile2\", and \"tile3\".", + "scratchblock": null, + "paramDocs": [ + "prefix: a prefix for all generated costumes", + "spriteSheet: a path to a sprite sheet, or the name of a built-in sprite", + "tileWidth: the width of a single tile", + "tileHeight: the height of a single tile" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/addCostumes", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zerschneidet ein Bild in gleich große Kacheln und fügt sie als Kostüme hinzu" + } + } + }, + { + "id": "Sprite/addSound(String,String)", + "memberId": "Sprite/addSound", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "addSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "soundPath" + ], + "params": [ + "String name", + "String soundPath" + ], + "summary": "Add a sound to the sprite. If a sound with the received name already exists\ndo nothing.", + "description": "Add a sound to the sprite. If a sound with the received name already exists\ndo nothing.", + "scratchblock": null, + "paramDocs": [ + "name: a unique name", + "soundPath: a sound path, or the name of a built-in sound such as\n \"footstep_carpet_000\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/addSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt einen Klang unter eigenem Namen hinzu" + } + } + }, + { + "id": "Sprite/addSound(String)", + "memberId": "Sprite/addSound", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "addSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Add one of the sounds that ship with Scratch for Java to the sprite. The\nsound gets the same name as the built-in sound. If a sound with that name\nalready exists do nothing.", + "description": "Add one of the sounds that ship with Scratch for Java to the sprite. The\nsound gets the same name as the built-in sound. If a sound with that name\nalready exists do nothing.\n\nExample usage:\n\n```java\nthis.addSound(\"footstep_carpet_000\");\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of a built-in sound, for example \"footstep_carpet_000\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/addSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt einen der eingebauten Klänge hinzu" + } + } + }, + { + "id": "Sprite/ask(String)", + "memberId": "Sprite/ask", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "ask", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "question" + ], + "params": [ + "String question" + ], + "summary": "Asks a question and waits for an answer to be typed in. The question appears\nat the top of the stage.", + "description": "Asks a question and waits for an answer to be typed in. The question appears\nat the top of the stage.\n\nUnlike Scratch, this does not pause the sprite. `run()` keeps being called\nwhile the question is on screen, so check [isAsking()](isAsking) or wait for\n[getAnswer()](getAnswer) to change.", + "scratchblock": "ask [question] and wait", + "paramDocs": [ + "question: the question to show" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/ask", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Stellt eine Frage; die Antwort wird über getAnswer() abgeholt" + } + } + }, + { + "id": "Sprite/broadcast(String)", + "memberId": "Sprite/broadcast", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "broadcast", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "message" + ], + "params": [ + "String message" + ], + "summary": "Broadcasts a message to every sprite on the stage, this one included, and\nto the stage itself, as in Scratch. If the sprite is not on a stage, nothing\nhappens.", + "description": "Broadcasts a message to every sprite on the stage, this one included, and\nto the stage itself, as in Scratch. If the sprite is not on a stage, nothing\nhappens.", + "scratchblock": "broadcast [message v]", + "paramDocs": [ + "message: The message to broadcast." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/broadcast", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Sendet eine Nachricht an alle Figuren und die Bühne" + } + } + }, + { + "id": "Sprite/changePosition(Vector2)", + "memberId": "Sprite/changePosition", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changePosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Changes the position of the sprite by a given vector.", + "description": "Changes the position of the sprite by a given vector.", + "scratchblock": null, + "paramDocs": [ + "v: a vector representing the change in position" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changePosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Verschiebt die Figur um den angegebenen Vektor" + } + } + }, + { + "id": "Sprite/changePosition(double,double)", + "memberId": "Sprite/changePosition", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changePosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Changes the position of the sprite by the given amounts.", + "description": "Changes the position of the sprite by the given amounts.", + "scratchblock": null, + "paramDocs": [ + "x: how far to move along the x-axis", + "y: how far to move along the y-axis" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changePosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Verschiebt die Figur um die angegebenen Werte" + } + } + }, + { + "id": "Sprite/changeSize(double)", + "memberId": "Sprite/changeSize", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changeSize", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "amount" + ], + "params": [ + "double amount" + ], + "summary": "Changes the size of the sprite by a given percentage.", + "description": "Changes the size of the sprite by a given percentage.", + "scratchblock": "change size by (amount)", + "paramDocs": [ + "amount: a percentage [0...100]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changeSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Größe um den angegebenen Wert in Prozent" + } + } + }, + { + "id": "Sprite/changeTint(double)", + "memberId": "Sprite/changeTint", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changeTint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "step" + ], + "params": [ + "double step" + ], + "summary": "Changes the tint for the sprite by a step.", + "description": "Changes the tint for the sprite by a step.", + "scratchblock": "change [color v] effect by (step)", + "paramDocs": [ + "step: a step value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changeTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert den Farbton der Einfärbung um den angegebenen Wert" + } + } + }, + { + "id": "Sprite/changeTransparency(double)", + "memberId": "Sprite/changeTransparency", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changeTransparency", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "step" + ], + "params": [ + "double step" + ], + "summary": "Changes how see-through the sprite is by a step. A positive step fades it\nout, a negative one brings it back.", + "description": "Changes how see-through the sprite is by a step. A positive step fades it\nout, a negative one brings it back.", + "scratchblock": "change [ghost v] effect by (step)", + "paramDocs": [ + "step: a step value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changeTransparency", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Transparenz um den angegebenen Wert" + } + } + }, + { + "id": "Sprite/changeVolume(double)", + "memberId": "Sprite/changeVolume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changeVolume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "step" + ], + "params": [ + "double step" + ], + "summary": "Makes every sound of this sprite louder or quieter.", + "description": "Makes every sound of this sprite louder or quieter.", + "scratchblock": "change volume by (step)", + "paramDocs": [ + "step: how much to add to the volume, in percent" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changeVolume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Lautstärke um den angegebenen Wert" + } + } + }, + { + "id": "Sprite/changeX(double)", + "memberId": "Sprite/changeX", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changeX", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Changes x by a certain amount", + "description": "Changes x by a certain amount", + "scratchblock": "change x by (x)", + "paramDocs": [ + "x: number in pixels" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changeX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die x-Position um den angegebenen Wert" + } + } + }, + { + "id": "Sprite/changeY(double)", + "memberId": "Sprite/changeY", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "changeY", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "y" + ], + "params": [ + "double y" + ], + "summary": "Changes y by a certain amount", + "description": "Changes y by a certain amount", + "scratchblock": "change y by (y)", + "paramDocs": [ + "y: number in pixels" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/changeY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die y-Position um den angegebenen Wert" + } + } + }, + { + "id": "Sprite/clone()", + "memberId": "Sprite/clone", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "clone", + "static": false, + "returnType": "Sprite", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Creates a clone of this sprite, like Scratch's \"create clone of myself\": a\nnew sprite of the same class (a clone of a `Cat` is a `Cat`),\nwith the same costume, position, direction, size and pen, and a copy of\nthe variables of your class. It is put on the stage right behind this\nsprite, and its [whenStartsAsClone()](whenStartsAsClone) runs; the constructor does\nnot run again.", + "description": "Creates a clone of this sprite, like Scratch's \"create clone of myself\": a\nnew sprite of the same class (a clone of a `Cat` is a `Cat`),\nwith the same costume, position, direction, size and pen, and a copy of\nthe variables of your class. It is put on the stage right behind this\nsprite, and its [whenStartsAsClone()](whenStartsAsClone) runs; the constructor does\nnot run again.\n\nNumbers, text and booleans in your variables are the clone's own. A list\nor another object is shared with the original: give the clone its own in\n[whenStartsAsClone()](whenStartsAsClone) if it needs one.\n\n```java\nBullet bullet = (Bullet) this.clone();\n```", + "scratchblock": "create clone of [myself v]", + "paramDocs": [], + "returns": "the clone, of the same class as this sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/clone", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Sprite/constructor()", + "memberId": "Sprite/constructor", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "constructor", + "static": false, + "returnType": "Sprite", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Sprite object with default settings.", + "description": "Constructs a new Sprite object with default settings.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine neue Figur" + } + } + }, + { + "id": "Sprite/constructor(String,String)", + "memberId": "Sprite/constructor", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "constructor", + "static": false, + "returnType": "Sprite", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "imagePath" + ], + "params": [ + "String name", + "String imagePath" + ], + "summary": "Constructs a new Sprite object with a specified costume.", + "description": "Constructs a new Sprite object with a specified costume.", + "scratchblock": null, + "paramDocs": [ + "name: a unique name for the costume", + "imagePath: a path to an image file, or the name of a built-in sprite\n such as \"slimeGreen\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Figur mit einem ersten Kostüm" + } + } + }, + { + "id": "Sprite/constructor(Sprite)", + "memberId": "Sprite/constructor", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "constructor", + "static": false, + "returnType": "Sprite", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "s" + ], + "params": [ + "Sprite s" + ], + "summary": "Copies a Sprite object.", + "description": "Copies a Sprite object.", + "scratchblock": null, + "paramDocs": [ + "s: a Sprite object to copy" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Kopie der angegebenen Figur" + } + } + }, + { + "id": "Sprite/debug(Object[])", + "memberId": "Sprite/debug", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "debug", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.Object[]" + ], + "parameterNames": [ + "values" + ], + "params": [ + "Object[] values" + ], + "summary": "Prints a debug message to stdout when debug mode is enabled.\nThe message is prefixed with the sprite's class name so you can tell\nwhich sprite it came from.", + "description": "Prints a debug message to stdout when debug mode is enabled.\nThe message is prefixed with the sprite's class name so you can tell\nwhich sprite it came from.\n\nExample:\n\n```java\nthis.debug(\"x =\", getX(), \"y =\", getY());\n// prints: [CatSprite] x = 100.0 y = 200.0\n```", + "scratchblock": null, + "paramDocs": [ + "values: one or more values to print" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/debug", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Sprite/deleteThisClone()", + "memberId": "Sprite/deleteThisClone", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "deleteThisClone", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Removes this sprite from the stage if it is a clone, like Scratch's\n\"delete this clone\". The original stays.", + "description": "Removes this sprite from the stage if it is a clone, like Scratch's\n\"delete this clone\". The original stays.", + "scratchblock": "delete this clone", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/deleteThisClone", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Sprite/disableHitbox()", + "memberId": "Sprite/disableHitbox", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "disableHitbox", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Disables the hitbox for the sprite. Once the hitbox is disabled, the sprite\nwill no longer\ndetect collisions with other objects.", + "description": "Disables the hitbox for the sprite. Once the hitbox is disabled, the sprite\nwill no longer\ndetect collisions with other objects.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/disableHitbox", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schaltet die Berührungserkennung aus" + } + } + }, + { + "id": "Sprite/distanceToMousePointer()", + "memberId": "Sprite/distanceToMousePointer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "distanceToMousePointer", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Calculates the distance from the current sprite to the mouse pointer.", + "description": "Calculates the distance from the current sprite to the mouse pointer.", + "scratchblock": "(distance to [mouse-pointer v])", + "paramDocs": [], + "returns": "the distance to the mouse pointer as a double.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/distanceToMousePointer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Abstand zum Mauszeiger zurück" + } + } + }, + { + "id": "Sprite/distanceToSprite(Sprite)", + "memberId": "Sprite/distanceToSprite", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "distanceToSprite", + "static": false, + "returnType": "double", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "sprite" + ], + "params": [ + "Sprite sprite" + ], + "summary": "Calculates the Euclidean distance between this sprite and another sprite.", + "description": "Calculates the Euclidean distance between this sprite and another sprite.", + "scratchblock": "(distance to [sprite v])", + "paramDocs": [ + "sprite: the other sprite to which the distance is calculated" + ], + "returns": "the distance between this sprite and the specified sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/distanceToSprite", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Abstand zu einer anderen Figur zurück" + } + } + }, + { + "id": "Sprite/enableHitbox()", + "memberId": "Sprite/enableHitbox", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "enableHitbox", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Enables the hitbox for the sprite. This method sets the hitboxDisabled flag\nto false, allowing\nthe sprite to interact with other objects.", + "description": "Enables the hitbox for the sprite. This method sets the hitboxDisabled flag\nto false, allowing\nthe sprite to interact with other objects.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/enableHitbox", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schaltet die Berührungserkennung wieder ein" + } + } + }, + { + "id": "Sprite/getAnswer()", + "memberId": "Sprite/getAnswer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getAnswer", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the last answer that was typed in.", + "description": "Returns the last answer that was typed in.", + "scratchblock": "(answer)", + "paramDocs": [], + "returns": "the answer, or an empty string if nothing has been answered yet", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getAnswer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die zuletzt eingegebene Antwort zurück, sonst eine leere Zeichenkette" + } + } + }, + { + "id": "Sprite/getCurrentCostumeIndex()", + "memberId": "Sprite/getCurrentCostumeIndex", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getCurrentCostumeIndex", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current costume index", + "description": "Returns the current costume index", + "scratchblock": "(costume [number v])", + "paramDocs": [], + "returns": "a costume index", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getCurrentCostumeIndex", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Nummer des aktuellen Kostüms zurück" + } + } + }, + { + "id": "Sprite/getCurrentCostumeName()", + "memberId": "Sprite/getCurrentCostumeName", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getCurrentCostumeName", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current costume name", + "description": "Returns the current costume name", + "scratchblock": "(costume [name v])", + "paramDocs": [], + "returns": "a costume name", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getCurrentCostumeName", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Namen des aktuellen Kostüms zurück" + } + } + }, + { + "id": "Sprite/getDeltaTime()", + "memberId": "Sprite/getDeltaTime", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getDeltaTime", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Gets the seconds passed since the last frame.", + "description": "Gets the seconds passed since the last frame.", + "scratchblock": null, + "paramDocs": [], + "returns": "seconds since last frame", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getDeltaTime", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Dauer des letzten Frames in Sekunden zurück" + } + } + }, + { + "id": "Sprite/getDirection()", + "memberId": "Sprite/getDirection", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getDirection", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the direction of the sprite.", + "description": "Returns the direction of the sprite.", + "scratchblock": "(direction)", + "paramDocs": [], + "returns": "the direction [0...360]", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getDirection", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Blickrichtung in Grad zurück (90 = rechts, 0 = oben)" + } + } + }, + { + "id": "Sprite/getHeight()", + "memberId": "Sprite/getHeight", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getHeight", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Return the height of the current costume or the pen size, when no costume is\navailable.", + "description": "Return the height of the current costume or the pen size, when no costume is\navailable.", + "scratchblock": null, + "paramDocs": [], + "returns": "the height of the sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getHeight", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Höhe der Figur in Pixeln zurück" + } + } + }, + { + "id": "Sprite/getHitbox()", + "memberId": "Sprite/getHitbox", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getHitbox", + "static": false, + "returnType": "Hitbox", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the hitbox of the sprite based on its current costume, position, and\nrotation. If the\nsprite has a hitbox already defined, it updates and returns it. Otherwise, it\ncalculates a new\nhitbox based on the sprite's dimensions and rotation.", + "description": "Returns the hitbox of the sprite based on its current costume, position, and\nrotation. If the\nsprite has a hitbox already defined, it updates and returns it. Otherwise, it\ncalculates a new\nhitbox based on the sprite's dimensions and rotation.", + "scratchblock": null, + "paramDocs": [], + "returns": "the hitbox of the sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getHitbox", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Trefferfläche der Figur zurück" + } + } + }, + { + "id": "Sprite/getMouse()", + "memberId": "Sprite/getMouse", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getMouse", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current position of the mouse cursor.", + "description": "Retrieves the current position of the mouse cursor.", + "scratchblock": null, + "paramDocs": [], + "returns": "a Vector2 object representing the current mouse cursor position, with\n the x-coordinate\n obtained from getMouseX() and the y-coordinate obtained from\n getMouseY().", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getMouse", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Position des Mauszeigers zurück" + } + } + }, + { + "id": "Sprite/getMouseX()", + "memberId": "Sprite/getMouseX", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getMouseX", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current x-position of the mouse cursor", + "description": "Returns the current x-position of the mouse cursor", + "scratchblock": "(mouse x)", + "paramDocs": [], + "returns": "x-position", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getMouseX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die x-Position des Mauszeigers zurück" + } + } + }, + { + "id": "Sprite/getMouseY()", + "memberId": "Sprite/getMouseY", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getMouseY", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current y-position of the mouse cursor", + "description": "Returns the current y-position of the mouse cursor", + "scratchblock": "(mouse y)", + "paramDocs": [], + "returns": "y-position", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getMouseY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die y-Position des Mauszeigers zurück" + } + } + }, + { + "id": "Sprite/getPen()", + "memberId": "Sprite/getPen", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getPen", + "static": false, + "returnType": "Pen", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the pen of the sprite.", + "description": "Returns the pen of the sprite.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getPen", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Stift dieser Figur zurück; mit ihm kann sie eine Spur zeichnen" + } + } + }, + { + "id": "Sprite/getPosition()", + "memberId": "Sprite/getPosition", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getPosition", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current position of the sprite.", + "description": "Retrieves the current position of the sprite.", + "scratchblock": null, + "paramDocs": [], + "returns": "A [Vector2](../Vector2/index) object representing the x and y coordinates of the\n sprite.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Position der Figur zurück" + } + } + }, + { + "id": "Sprite/getShaders()", + "memberId": "Sprite/getShaders", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getShaders", + "static": false, + "returnType": "Shaders", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the shaders of this sprite. Shader handling lives behind this one\nmethod so that it does not crowd the everyday API.", + "description": "Returns the shaders of this sprite. Shader handling lives behind this one\nmethod so that it does not crowd the everyday API.\n\nExample usage:\n\n```java\nthis.getShaders().add(\"blur\", \"blur.frag\", null);\nthis.getShaders().switchTo(\"blur\");\n```", + "scratchblock": null, + "paramDocs": [], + "returns": "the shaders", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getShaders", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Shader dieser Figur zurück" + } + } + }, + { + "id": "Sprite/getSize()", + "memberId": "Sprite/getSize", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getSize", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the size of the sprite.", + "description": "Returns the size of the sprite.", + "scratchblock": "(size)", + "paramDocs": [], + "returns": "size in percentage", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Größe in Prozent zurück" + } + } + }, + { + "id": "Sprite/getStage()", + "memberId": "Sprite/getStage", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getStage", + "static": false, + "returnType": "Stage", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current stage associated with this sprite.", + "description": "Retrieves the current stage associated with this sprite.", + "scratchblock": null, + "paramDocs": [], + "returns": "the stage associated with this sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Bühne zurück, auf der die Figur steht" + } + } + }, + { + "id": "Sprite/getText()", + "memberId": "Sprite/getText", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getText", + "static": false, + "returnType": "Text", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the text associated with this sprite.", + "description": "Retrieves the text associated with this sprite.", + "scratchblock": null, + "paramDocs": [], + "returns": "the text associated with this sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getText", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Text zurück, der über der Figur angezeigt wird" + } + } + }, + { + "id": "Sprite/getTimer()", + "memberId": "Sprite/getTimer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getTimer", + "static": false, + "returnType": "Timer", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Return the default timer", + "description": "Return the default timer", + "scratchblock": "(timer)", + "paramDocs": [], + "returns": "the default timer", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getTimer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Standard-Timer dieser Figur zurück" + } + } + }, + { + "id": "Sprite/getTimer(String)", + "memberId": "Sprite/getTimer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getTimer", + "static": false, + "returnType": "Timer", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Return a timer by name", + "description": "Return a timer by name", + "scratchblock": null, + "paramDocs": [ + "name: " + ], + "returns": "a timer", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getTimer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Timer mit dem angegebenen Namen zurück und legt ihn bei Bedarf an" + } + } + }, + { + "id": "Sprite/getTint()", + "memberId": "Sprite/getTint", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getTint", + "static": false, + "returnType": "Color", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the tint value of the current costume.", + "description": "Retrieves the tint value of the current costume.", + "scratchblock": null, + "paramDocs": [], + "returns": "the tint value of the current costume, or null if there are no\n costumes.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Farbe der Einfärbung zurück" + } + } + }, + { + "id": "Sprite/getTouchingSprite(Class)", + "memberId": "Sprite/getTouchingSprite", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getTouchingSprite", + "static": false, + "returnType": "T", + "parameterTypes": [ + "java.lang.Class" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Class c" + ], + "summary": "Returns the first sprite of the specified type that is currently touching\nthis sprite.", + "description": "Returns the first sprite of the specified type that is currently touching\nthis sprite.", + "scratchblock": null, + "paramDocs": [ + "c: the class object of the type of sprite to check for" + ], + "returns": "the first sprite of the specified type that is touching this sprite,\n or null if no such\n sprite is found", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getTouchingSprite", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die erste berührte Figur dieser Klasse zurück, sonst null" + } + } + }, + { + "id": "Sprite/getTouchingSprites(Class)", + "memberId": "Sprite/getTouchingSprites", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getTouchingSprites", + "static": false, + "returnType": "List", + "parameterTypes": [ + "java.lang.Class" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Class c" + ], + "summary": "Returns a list of sprites of the specified type that are currently touching\nthis sprite.", + "description": "Returns a list of sprites of the specified type that are currently touching\nthis sprite.", + "scratchblock": null, + "paramDocs": [ + "c: the class of the type of sprites to return" + ], + "returns": "a list of sprites of the specified type that are touching this\n sprite, or null if the\n stage is not set", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getTouchingSprites", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt alle berührten Figuren dieser Klasse zurück" + } + } + }, + { + "id": "Sprite/getTransparency()", + "memberId": "Sprite/getTransparency", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getTransparency", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Gets the transparency of the current costume.", + "description": "Gets the transparency of the current costume.", + "scratchblock": null, + "paramDocs": [], + "returns": "how see-through the sprite is, 0 solid and 100 invisible", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getTransparency", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Transparenz in Prozent zurück" + } + } + }, + { + "id": "Sprite/getVolume()", + "memberId": "Sprite/getVolume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getVolume", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns how loud the sounds of this sprite play.", + "description": "Returns how loud the sounds of this sprite play.", + "scratchblock": "(volume)", + "paramDocs": [], + "returns": "the volume, from 0 to 100", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getVolume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Lautstärke in Prozent zurück" + } + } + }, + { + "id": "Sprite/getWidth()", + "memberId": "Sprite/getWidth", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getWidth", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Return the width of the current costume or the pen size, when no costume is\navailable.", + "description": "Return the width of the current costume or the pen size, when no costume is\navailable.", + "scratchblock": null, + "paramDocs": [], + "returns": "the width of the sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getWidth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Breite der Figur in Pixeln zurück" + } + } + }, + { + "id": "Sprite/getX()", + "memberId": "Sprite/getX", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getX", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the x coordinate of the sprite", + "description": "Returns the x coordinate of the sprite", + "scratchblock": "(x position)", + "paramDocs": [], + "returns": "a x coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die x-Position zurück (Mitte der Bühne ist 0)" + } + } + }, + { + "id": "Sprite/getY()", + "memberId": "Sprite/getY", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "getY", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the y coordinate of the sprite", + "description": "Returns the y coordinate of the sprite", + "scratchblock": "(y position)", + "paramDocs": [], + "returns": "a y coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/getY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die y-Position zurück (Mitte der Bühne ist 0, nach oben positiv)" + } + } + }, + { + "id": "Sprite/glide(double,double,double)", + "memberId": "Sprite/glide", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "glide", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "seconds", + "x", + "y" + ], + "params": [ + "double seconds", + "double x", + "double y" + ], + "summary": "Slides the sprite to a place over the given time, instead of jumping there.", + "description": "Slides the sprite to a place over the given time, instead of jumping there.\n\nUnlike Scratch this does not hold up the sprite: `run()` keeps being called\nwhile the sprite is on its way. Use [isGliding()](isGliding) to tell whether it\nhas arrived.", + "scratchblock": "glide (seconds) secs to x: (x) y: (y)", + "paramDocs": [ + "seconds: how long the trip should take", + "x: where to end up", + "y: where to end up" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/glide", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gleitet in der angegebenen Zeit zur Zielposition" + } + } + }, + { + "id": "Sprite/goLayersBackwards(int)", + "memberId": "Sprite/goLayersBackwards", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "goLayersBackwards", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "number" + ], + "params": [ + "int number" + ], + "summary": "Moves the sprite backwards by a specified number of layers in the stage. If\nthe sprite is not\npart of a stage, the method does nothing.", + "description": "Moves the sprite backwards by a specified number of layers in the stage. If\nthe sprite is not\npart of a stage, the method does nothing.", + "scratchblock": "go [backward v] (number) layers", + "paramDocs": [ + "number: the number of layers to move the sprite backwards" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/goLayersBackwards", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schiebt die Figur um die angegebene Anzahl Ebenen nach hinten" + } + } + }, + { + "id": "Sprite/goLayersForwards(int)", + "memberId": "Sprite/goLayersForwards", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "goLayersForwards", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "number" + ], + "params": [ + "int number" + ], + "summary": "Moves the sprite forward by a specified number of layers within its stage.", + "description": "Moves the sprite forward by a specified number of layers within its stage.", + "scratchblock": "go [forward v] (number) layers", + "paramDocs": [ + "number: the number of layers to move the sprite forward" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/goLayersForwards", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Bringt die Figur um die angegebene Anzahl Ebenen nach vorne" + } + } + }, + { + "id": "Sprite/goToBackLayer()", + "memberId": "Sprite/goToBackLayer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "goToBackLayer", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves the sprite to the back layer of the stage. If the sprite is not\nassociated with any\nstage, the method returns without performing any action.", + "description": "Moves the sprite to the back layer of the stage. If the sprite is not\nassociated with any\nstage, the method returns without performing any action.", + "scratchblock": "go to [back v] layer", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/goToBackLayer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schiebt die Figur ganz nach hinten" + } + } + }, + { + "id": "Sprite/goToFrontLayer()", + "memberId": "Sprite/goToFrontLayer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "goToFrontLayer", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves this sprite to the front layer of the stage. If the sprite is not part\nof any stage, the\nmethod does nothing.", + "description": "Moves this sprite to the front layer of the stage. If the sprite is not part\nof any stage, the\nmethod does nothing.", + "scratchblock": "go to [front v] layer", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/goToFrontLayer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Bringt die Figur ganz nach vorne" + } + } + }, + { + "id": "Sprite/goToMousePointer()", + "memberId": "Sprite/goToMousePointer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "goToMousePointer", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves the sprite to the current position of the mouse pointer. This method\nupdates the sprite's\nposition to the coordinates of the mouse cursor.", + "description": "Moves the sprite to the current position of the mouse pointer. This method\nupdates the sprite's\nposition to the coordinates of the mouse cursor.", + "scratchblock": "go to [mouse-pointer v]", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/goToMousePointer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Figur an die Position des Mauszeigers" + } + } + }, + { + "id": "Sprite/goToRandomPosition()", + "memberId": "Sprite/goToRandomPosition", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "goToRandomPosition", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves the sprite to a random position within the boundaries of the stage. The\nnew position is\ndetermined by generating random coordinates within the width and height of\nthe stage.", + "description": "Moves the sprite to a random position within the boundaries of the stage. The\nnew position is\ndetermined by generating random coordinates within the width and height of\nthe stage.", + "scratchblock": "go to [random position v]", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/goToRandomPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Figur an eine zufällige Position auf der Bühne" + } + } + }, + { + "id": "Sprite/goToSprite(Sprite)", + "memberId": "Sprite/goToSprite", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "goToSprite", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "sprite" + ], + "params": [ + "Sprite sprite" + ], + "summary": "Moves this sprite to the position of the specified sprite.", + "description": "Moves this sprite to the position of the specified sprite.", + "scratchblock": "go to [sprite v]", + "paramDocs": [ + "sprite: the sprite to move to" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/goToSprite", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Figur auf die Position einer anderen Figur" + } + } + }, + { + "id": "Sprite/hide()", + "memberId": "Sprite/hide", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "hide", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Hides the sprite. The pen is not effected.", + "description": "Hides the sprite. The pen is not effected.", + "scratchblock": "hide", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/hide", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Macht die Figur unsichtbar" + } + } + }, + { + "id": "Sprite/hideVariable(String)", + "memberId": "Sprite/hideVariable", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "hideVariable", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Hides the monitor of a variable that [showVariable(String,\njava.util.function.Supplier)](showVariable(String,\njava.util.function.Supplier)) showed.", + "description": "Hides the monitor of a variable that [showVariable(String,\njava.util.function.Supplier)](showVariable(String,\njava.util.function.Supplier)) showed.", + "scratchblock": "hide variable [name v]", + "paramDocs": [ + "name: the name the monitor was shown with" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/hideVariable", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Sprite/ifOnEdgeBounce()", + "memberId": "Sprite/ifOnEdgeBounce", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "ifOnEdgeBounce", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks if the sprite is on the edge of the stage and bounces it back if it\nis. The sprite's\ndirection is reversed when it hits the left or right border, and it is\nreversed and rotated by\n180 degrees when it hits the top or bottom border. The method does nothing if\nthe hitbox is\ndisabled or if the sprite is a UI element. It also does nothing if the\nsprite has not been added to a stage yet.", + "description": "Checks if the sprite is on the edge of the stage and bounces it back if it\nis. The sprite's\ndirection is reversed when it hits the left or right border, and it is\nreversed and rotated by\n180 degrees when it hits the top or bottom border. The method does nothing if\nthe hitbox is\ndisabled or if the sprite is a UI element. It also does nothing if the\nsprite has not been added to a stage yet.", + "scratchblock": "if on edge, bounce", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/ifOnEdgeBounce", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Lässt die Figur am Bühnenrand abprallen" + } + } + }, + { + "id": "Sprite/isAsking()", + "memberId": "Sprite/isAsking", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isAsking", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks whether a question is on screen and still waiting for an answer.", + "description": "Checks whether a question is on screen and still waiting for an answer.", + "scratchblock": null, + "paramDocs": [], + "returns": "true while a question is waiting", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isAsking", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn noch auf eine Antwort gewartet wird" + } + } + }, + { + "id": "Sprite/isClone()", + "memberId": "Sprite/isClone", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isClone", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Whether this sprite is a clone, made by [clone()](clone).", + "description": "Whether this sprite is a clone, made by [clone()](clone).", + "scratchblock": null, + "paramDocs": [], + "returns": "true for a clone, false for the original", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isClone", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Kopie der Figur" + } + } + }, + { + "id": "Sprite/isColorTouchingColor(Color,Color)", + "memberId": "Sprite/isColorTouchingColor", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isColorTouchingColor", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "org.openpatch.scratch.Color", + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "color", + "other" + ], + "params": [ + "Color color", + "Color other" + ], + "summary": "Checks whether a colour of the sprite is touching a colour on the stage:\nonly the parts of the costume painted in `color` count. A car whose\nfront bumper is red can ask whether the bumper touches the grass.", + "description": "Checks whether a colour of the sprite is touching a colour on the stage:\nonly the parts of the costume painted in `color` count. A car whose\nfront bumper is red can ask whether the bumper touches the grass.\n\n```java\nif (this.isColorTouchingColor(HtmlColor.RED, HtmlColor.GREEN)) {\n this.say(\"Off the road!\");\n}\n```", + "scratchblock": "<color [#ff0000] is touching [#00ff00]?>", + "paramDocs": [ + "color: a colour of this sprite's costume", + "other: the colour to look for under it" + ], + "returns": "true if the colour touches the other colour", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isColorTouchingColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Prüft, ob die Teile der Figur in der Farbe color über der Farbe other liegen" + } + } + }, + { + "id": "Sprite/isGliding()", + "memberId": "Sprite/isGliding", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isGliding", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks whether the sprite is still on its way to a place it was told to\nglide to.", + "description": "Checks whether the sprite is still on its way to a place it was told to\nglide to.", + "scratchblock": null, + "paramDocs": [], + "returns": "true while it is still moving", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isGliding", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Figur gerade gleitet" + } + } + }, + { + "id": "Sprite/isKeyPressed(KeyCode)", + "memberId": "Sprite/isKeyPressed", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isKeyPressed", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "org.openpatch.scratch.KeyCode" + ], + "parameterNames": [ + "keyCode" + ], + "params": [ + "KeyCode keyCode" + ], + "summary": "Returns true if the key is pressed", + "description": "Returns true if the key is pressed", + "scratchblock": "<key [space v] pressed?>", + "paramDocs": [ + "keyCode: a key" + ], + "returns": "key pressed", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isKeyPressed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Taste gerade gedrückt ist" + } + } + }, + { + "id": "Sprite/isMouseDown()", + "memberId": "Sprite/isMouseDown", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isMouseDown", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns true is the mouse button is down", + "description": "Returns true is the mouse button is down", + "scratchblock": "<mouse down?>", + "paramDocs": [], + "returns": "mouse button down", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isMouseDown", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn eine Maustaste gedrückt ist" + } + } + }, + { + "id": "Sprite/isSoundPlaying(String)", + "memberId": "Sprite/isSoundPlaying", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isSoundPlaying", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Returns true if the sound if playing", + "description": "Returns true if the sound if playing", + "scratchblock": null, + "paramDocs": [ + "name: Name of the sound" + ], + "returns": "playing", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isSoundPlaying", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn der Klang gerade abgespielt wird" + } + } + }, + { + "id": "Sprite/isTouchingColor(Color)", + "memberId": "Sprite/isTouchingColor", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isTouchingColor", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "color" + ], + "params": [ + "Color color" + ], + "summary": "Checks whether the sprite is touching a colour: whether anything it paints\nlies over that colour on the stage - on the backdrop, on what the pen drew,\nor on another sprite.", + "description": "Checks whether the sprite is touching a colour: whether anything it paints\nlies over that colour on the stage - on the backdrop, on what the pen drew,\nor on another sprite.\n\nAs in Scratch, colours that are nearly the same count, so anti-aliased\nedges still match. Only what is under the painted part of the costume\ncounts, not the empty space around it, and not the hitbox.\n\n```java\nif (this.isTouchingColor(HtmlColor.RED)) {\n this.say(\"Ouch!\");\n}\n```\n\nThe time it takes grows with the size of the sprite, not of the stage.", + "scratchblock": "<touching color [#ff0000]?>", + "paramDocs": [ + "color: the colour to look for" + ], + "returns": "true if the sprite is touching the colour", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isTouchingColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Prüft, ob etwas, das die Figur malt, über dieser Farbe auf der Bühne liegt — auf dem Bühnenbild, auf dem, was der Stift gezeichnet hat, oder auf einer anderen Figur. Fast gleiche Farben zählen wie in Scratch." + } + } + }, + { + "id": "Sprite/isTouchingColor(double,double,double)", + "memberId": "Sprite/isTouchingColor", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isTouchingColor", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "double r", + "double g", + "double b" + ], + "summary": "Checks whether the sprite is touching a colour given by its red, green and\nblue parts.", + "description": "Checks whether the sprite is touching a colour given by its red, green and\nblue parts.", + "scratchblock": null, + "paramDocs": [ + "r: the red part [0...255]", + "g: the green part [0...255]", + "b: the blue part [0...255]" + ], + "returns": "true if the sprite is touching the colour", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isTouchingColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Prüft, ob die Figur eine Farbe berührt, angegeben durch Rot, Grün und Blau [0...255]" + } + } + }, + { + "id": "Sprite/isTouchingEdge()", + "memberId": "Sprite/isTouchingEdge", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isTouchingEdge", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns true if the rectangle which contains the image is outside of the\nstage", + "description": "Returns true if the rectangle which contains the image is outside of the\nstage", + "scratchblock": "<touching [edge v]?>", + "paramDocs": [], + "returns": "true if outside", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isTouchingEdge", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Figur den Bühnenrand berührt" + } + } + }, + { + "id": "Sprite/isTouchingMousePointer()", + "memberId": "Sprite/isTouchingMousePointer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isTouchingMousePointer", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns true is the mouse pointer is touching the hitbox of the sprite.", + "description": "Returns true is the mouse pointer is touching the hitbox of the sprite.", + "scratchblock": "<touching [mouse-pointer v]?>", + "paramDocs": [], + "returns": "true if touching", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isTouchingMousePointer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn der Mauszeiger auf der Figur liegt" + } + } + }, + { + "id": "Sprite/isTouchingSprite(Sprite)", + "memberId": "Sprite/isTouchingSprite", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isTouchingSprite", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "sprite" + ], + "params": [ + "Sprite sprite" + ], + "summary": "Checks if this sprite is touching another sprite.", + "description": "Checks if this sprite is touching another sprite.", + "scratchblock": "<touching [sprite v]?>", + "paramDocs": [ + "sprite: The sprite to check for collision with." + ], + "returns": "true if this sprite is touching the specified sprite, false\n otherwise. Returns false if\n the specified sprite is the same as this sprite, if the stage is\n null, if the specified\n sprite is null, not shown, or has its hitbox disabled.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isTouchingSprite", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn sich die Figuren berühren" + } + } + }, + { + "id": "Sprite/isTouchingSprite(Class)", + "memberId": "Sprite/isTouchingSprite", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isTouchingSprite", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "java.lang.Class" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Class c" + ], + "summary": "Checks if this sprite is touching any sprite of the specified class type.", + "description": "Checks if this sprite is touching any sprite of the specified class type.", + "scratchblock": null, + "paramDocs": [ + "c: the class type of the sprite to check for collision" + ], + "returns": "true if this sprite is touching any sprite of the specified class\n type, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isTouchingSprite", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Figur eine Figur dieser Klasse berührt, z.B. isTouchingSprite(Apfel.class)" + } + } + }, + { + "id": "Sprite/isVisible()", + "memberId": "Sprite/isVisible", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "isVisible", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns if the sprite is visible", + "description": "Returns if the sprite is visible", + "scratchblock": null, + "paramDocs": [], + "returns": "is visible", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/isVisible", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Figur sichtbar ist" + } + } + }, + { + "id": "Sprite/move(double)", + "memberId": "Sprite/move", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "move", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "steps" + ], + "params": [ + "double steps" + ], + "summary": "Moves the sprite towards the current rotation by the received steps.", + "description": "Moves the sprite towards the current rotation by the received steps.", + "scratchblock": "move (steps) steps", + "paramDocs": [ + "steps: a number of pixels" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/move", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Bewegt die Figur um die angegebene Schrittzahl in ihre Blickrichtung" + } + } + }, + { + "id": "Sprite/move(Vector2)", + "memberId": "Sprite/move", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "move", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Moves the sprite in the direction of the given vector. The length of the\nvector determines how\nmove the sprite will move in this direction.", + "description": "Moves the sprite in the direction of the given vector. The length of the\nvector determines how\nmove the sprite will move in this direction.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/move", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Verschiebt die Figur um den Vektor" + } + } + }, + { + "id": "Sprite/nextCostume()", + "memberId": "Sprite/nextCostume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "nextCostume", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Switch to the next costume.", + "description": "Switch to the next costume.", + "scratchblock": "next costume", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/nextCostume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zum nächsten Kostüm" + } + } + }, + { + "id": "Sprite/pickRandom(int,int)", + "memberId": "Sprite/pickRandom", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "pickRandom", + "static": false, + "returnType": "int", + "parameterTypes": [ + "int", + "int" + ], + "parameterNames": [ + "from", + "to" + ], + "params": [ + "int from", + "int to" + ], + "summary": "Returns a random integer between the specified range.", + "description": "Returns a random integer between the specified range.", + "scratchblock": "(pick random (from) to (to))", + "paramDocs": [ + "from: the lower bound of the range (inclusive)", + "to: the upper bound of the range (exclusive)" + ], + "returns": "a random integer between the specified range", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/pickRandom", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine Zufallszahl zwischen from und to zurück (beide eingeschlossen)" + } + } + }, + { + "id": "Sprite/playSound(String)", + "memberId": "Sprite/playSound", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "playSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Plays a sound.", + "description": "Plays a sound.\n\nEvery sprite plays its own copy, so ten sprites playing the same sound are\nheard ten times at once. One sprite only plays a sound once at a time:\nplaying it again while it is still going does nothing.", + "scratchblock": "start sound [name v]", + "paramDocs": [ + "name: the sound name" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/playSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Spielt einen zuvor hinzugefügten Klang ab" + } + } + }, + { + "id": "Sprite/pointInDirection(double)", + "memberId": "Sprite/pointInDirection", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "pointInDirection", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "degrees" + ], + "params": [ + "double degrees" + ], + "summary": "Points the sprite in the specified direction.", + "description": "Points the sprite in the specified direction.", + "scratchblock": null, + "paramDocs": [ + "degrees: The direction in degrees to point the sprite. 0 degrees is up,\n 90 degrees is to the right, 180 degrees is down, and 270\n degrees is to the left." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/pointInDirection", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Blickrichtung in Grad (90 = rechts, 0 = oben)" + } + } + }, + { + "id": "Sprite/pointInDirection(Vector2)", + "memberId": "Sprite/pointInDirection", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "pointInDirection", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Points the sprite in the direction of the given vector.", + "description": "Points the sprite in the direction of the given vector.", + "scratchblock": null, + "paramDocs": [ + "v: the target vector to point towards" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/pointInDirection", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Richtet die Figur entlang des angegebenen Vektors aus" + } + } + }, + { + "id": "Sprite/pointTowardsMousePointer()", + "memberId": "Sprite/pointTowardsMousePointer", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "pointTowardsMousePointer", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Points the sprite towards the current position of the mouse pointer. This\nmethod calculates the\nangle between the sprite's current position and the mouse pointer's position,\nthen sets the\nsprite's direction accordingly.", + "description": "Points the sprite towards the current position of the mouse pointer. This\nmethod calculates the\nangle between the sprite's current position and the mouse pointer's position,\nthen sets the\nsprite's direction accordingly.", + "scratchblock": "point towards [mouse-pointer v]", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/pointTowardsMousePointer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Richtet die Figur zum Mauszeiger aus" + } + } + }, + { + "id": "Sprite/pointTowardsSprite(Sprite)", + "memberId": "Sprite/pointTowardsSprite", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "pointTowardsSprite", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "s" + ], + "params": [ + "Sprite s" + ], + "summary": "Points the current sprite towards the specified sprite.", + "description": "Points the current sprite towards the specified sprite.", + "scratchblock": "point towards [sprite v]", + "paramDocs": [ + "s: the sprite to point towards" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/pointTowardsSprite", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Richtet die Figur zu einer anderen Figur aus" + } + } + }, + { + "id": "Sprite/previousCostume()", + "memberId": "Sprite/previousCostume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "previousCostume", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Switch to the previous costume.", + "description": "Switch to the previous costume.", + "scratchblock": "switch costume to (previous costume)", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/previousCostume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zum vorherigen Kostüm" + } + } + }, + { + "id": "Sprite/remove()", + "memberId": "Sprite/remove", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "remove", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Removes this sprite from its current stage. For \"delete this clone\", see\n[deleteThisClone()](deleteThisClone).", + "description": "Removes this sprite from its current stage. For \"delete this clone\", see\n[deleteThisClone()](deleteThisClone).", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/remove", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Entfernt die Figur von der Bühne" + } + } + }, + { + "id": "Sprite/run()", + "memberId": "Sprite/run", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "run", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "This method is intended to be overridden by subclasses to define the behavior\nof the sprite\nwhen it is run. By default, this method does nothing.", + "description": "This method is intended to be overridden by subclasses to define the behavior\nof the sprite\nwhen it is run. By default, this method does nothing.\n\nIt is called every frame.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/run", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird in jedem Frame aufgerufen" + } + } + }, + { + "id": "Sprite/say(String)", + "memberId": "Sprite/say", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "say", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "text" + ], + "params": [ + "String text" + ], + "summary": "Makes the sprite display a speech bubble with the specified text.", + "description": "Makes the sprite display a speech bubble with the specified text.", + "scratchblock": "say [text]", + "paramDocs": [ + "text: The text to be displayed in the speech bubble." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/say", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt eine Sprechblase an" + } + } + }, + { + "id": "Sprite/say(String,int)", + "memberId": "Sprite/say", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "say", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int" + ], + "parameterNames": [ + "text", + "millis" + ], + "params": [ + "String text", + "int millis" + ], + "summary": "Displays a text message for a specified duration.", + "description": "Displays a text message for a specified duration.", + "scratchblock": "say [text] for (millis) seconds", + "paramDocs": [ + "text: The message to be displayed.", + "millis: The duration in milliseconds for which the message will be\n displayed." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/say", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt eine Sprechblase für die angegebene Zeit in Millisekunden" + } + } + }, + { + "id": "Sprite/setDirection(double)", + "memberId": "Sprite/setDirection", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setDirection", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "degrees" + ], + "params": [ + "double degrees" + ], + "summary": "Sets the direction of the sprite to a given degrees. When this value is 0 the\nsprite moves\nup, when it is 180 it moves down.", + "description": "Sets the direction of the sprite to a given degrees. When this value is 0 the\nsprite moves\nup, when it is 180 it moves down.", + "scratchblock": "point in direction (degrees)", + "paramDocs": [ + "degrees: between 0 and 360" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setDirection", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Blickrichtung in Grad (90 = rechts, 0 = oben)" + } + } + }, + { + "id": "Sprite/setDirection(Vector2)", + "memberId": "Sprite/setDirection", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setDirection", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Sets the direction of the sprite to the direction of a given vector.", + "description": "Sets the direction of the sprite to the direction of a given vector.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setDirection", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Blickrichtung auf die Richtung des Vektors" + } + } + }, + { + "id": "Sprite/setHitbox(double[])", + "memberId": "Sprite/setHitbox", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setHitbox", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double[]" + ], + "parameterNames": [ + "points" + ], + "params": [ + "double[] points" + ], + "summary": "Sets the hitbox for the sprite using the provided points. The points should\nbe provided in\npairs representing the x and y coordinates.", + "description": "Sets the hitbox for the sprite using the provided points. The points should\nbe provided in\npairs representing the x and y coordinates.", + "scratchblock": null, + "paramDocs": [ + "points: an array of integers representing the x and y coordinates of\n the hitbox vertices.\n The length of the array should be even, with each pair of\n integers representing a point (x,\n y)." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setHitbox", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Sprite/setHitbox(Shape)", + "memberId": "Sprite/setHitbox", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setHitbox", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Shape" + ], + "parameterNames": [ + "shape" + ], + "params": [ + "Shape shape" + ], + "summary": "Sets the hitbox for the sprite using the specified shape.", + "description": "Sets the hitbox for the sprite using the specified shape.", + "scratchblock": null, + "paramDocs": [ + "shape: the shape to be used for the hitbox" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setHitbox", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Trefferfläche auf die angegebene Form; (0/0) ist die Mitte der Figur" + } + } + }, + { + "id": "Sprite/setPosition(double,double)", + "memberId": "Sprite/setPosition", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Sets the position of the sprite", + "description": "Sets the position of the sprite", + "scratchblock": "go to x: (x) y: (y)", + "paramDocs": [ + "x: a x coordinate", + "y: a y coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Figur an die angegebene Position (Mitte der Bühne ist 0/0)" + } + } + }, + { + "id": "Sprite/setPosition(Vector2)", + "memberId": "Sprite/setPosition", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Sets the position of the sprite based on the coordinates of a given vector.", + "description": "Sets the position of the sprite based on the coordinates of a given vector.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Figur an die angegebene Position (Mitte der Bühne ist 0/0)" + } + } + }, + { + "id": "Sprite/setRotationCenter(double,double)", + "memberId": "Sprite/setRotationCenter", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setRotationCenter", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Sets the point of the costume the sprite turns around - Scratch's rotation\ncenter. It is also the point that sits at the sprite's position, so it is\nwhere the pen draws from and what `goTo` puts in place.", + "description": "Sets the point of the costume the sprite turns around - Scratch's rotation\ncenter. It is also the point that sits at the sprite's position, so it is\nwhere the pen draws from and what `goTo` puts in place.\n\nThe point is given in the costume's own pixels, counted from its top left\ncorner, the same way as [setHitbox(double...)](setHitbox): a sword whose hilt\nis 12 pixels from the left and 60 from the top swings around the hilt with\n`setRotationCenter(12, 60)`. It grows and shrinks with the sprite's\nsize and holds for every costume of the sprite. Without it, a sprite turns\naround the middle of its costume.\n\n```java\nthis.addCostume(\"hand\", \"assets/clock-hand.png\");\nthis.setRotationCenter(8, 100); // the end of the hand\n```", + "scratchblock": null, + "paramDocs": [ + "x: the x-coordinate in the costume, from its left edge", + "y: the y-coordinate in the costume, from its top edge" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setRotationCenter", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Punkt des Kostüms, um den sich die Figur dreht (Drehpunkt). Er sitzt an der Position der Figur. Angegeben in Pixeln des Kostüms von seiner linken oberen Ecke aus, wie bei setHitbox; er wächst mit der Größe und gilt für alle Kostüme." + } + } + }, + { + "id": "Sprite/setRotationStyle(RotationStyle)", + "memberId": "Sprite/setRotationStyle", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setRotationStyle", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.RotationStyle" + ], + "parameterNames": [ + "style" + ], + "params": [ + "RotationStyle style" + ], + "summary": "Sets the rotation style for the sprite.", + "description": "Sets the rotation style for the sprite.", + "scratchblock": "set rotation style [left-right v]", + "paramDocs": [ + "style: the rotation style to be set" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setRotationStyle", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt fest, wie sich die Figur beim Drehen verhält" + } + } + }, + { + "id": "Sprite/setSize(double)", + "memberId": "Sprite/setSize", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setSize", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "percentage" + ], + "params": [ + "double percentage" + ], + "summary": "Sets the size of the sprite.", + "description": "Sets the size of the sprite.", + "scratchblock": "set size to (percentage) %", + "paramDocs": [ + "percentage: a percentage [0...100]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Größe in Prozent (100 = Originalgröße)" + } + } + }, + { + "id": "Sprite/setTint(Color)", + "memberId": "Sprite/setTint", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setTint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Color c" + ], + "summary": "Sets the tint for the sprite with an color object.", + "description": "Sets the tint for the sprite with an color object.", + "scratchblock": null, + "paramDocs": [ + "c: a color object" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Färbt die Figur mit der angegebenen Farbe ein" + } + } + }, + { + "id": "Sprite/setTint(double,double,double)", + "memberId": "Sprite/setTint", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setTint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "double r", + "double g", + "double b" + ], + "summary": "Sets the tint for the sprite with rgb.", + "description": "Sets the tint for the sprite with rgb.", + "scratchblock": null, + "paramDocs": [ + "r: a red value [0...255]", + "g: a green value [0...255]", + "b: a blue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Färbt die Figur mit der angegebenen Farbe ein (Anteile jeweils 0 bis 255)" + } + } + }, + { + "id": "Sprite/setTint(double)", + "memberId": "Sprite/setTint", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setTint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Sets the tint for the sprite with a hue.", + "description": "Sets the tint for the sprite with a hue.", + "scratchblock": "set [color v] effect to (h)", + "paramDocs": [ + "h: a hue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Färbt die Figur mit dem angegebenen Farbton ein (0 bis 255)" + } + } + }, + { + "id": "Sprite/setTransparency(double)", + "memberId": "Sprite/setTransparency", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setTransparency", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "transparency" + ], + "params": [ + "double transparency" + ], + "summary": "Sets how see-through the sprite is, as Scratch's ghost effect does: 0 is the\nsolid sprite you start with and 100 is invisible. Anything outside that is\npinned to it.", + "description": "Sets how see-through the sprite is, as Scratch's ghost effect does: 0 is the\nsolid sprite you start with and 100 is invisible. Anything outside that is\npinned to it.", + "scratchblock": "set [ghost v] effect to (transparency)", + "paramDocs": [ + "transparency: [0...100], 0 solid and 100 invisible" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setTransparency", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Transparenz in Prozent (0 = deckend, 100 = unsichtbar)" + } + } + }, + { + "id": "Sprite/setVolume(double)", + "memberId": "Sprite/setVolume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setVolume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "percent" + ], + "params": [ + "double percent" + ], + "summary": "Sets how loud every sound of this sprite plays.", + "description": "Sets how loud every sound of this sprite plays.", + "scratchblock": "set volume to (percent) %", + "paramDocs": [ + "percent: 0 for silent, 100 for full volume" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setVolume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Lautstärke aller Klänge dieser Figur in Prozent" + } + } + }, + { + "id": "Sprite/setX(double)", + "memberId": "Sprite/setX", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setX", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Sets the x coordinate", + "description": "Sets the x coordinate", + "scratchblock": "set x to (x)", + "paramDocs": [ + "x: a x coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die x-Position" + } + } + }, + { + "id": "Sprite/setY(double)", + "memberId": "Sprite/setY", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "setY", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "y" + ], + "params": [ + "double y" + ], + "summary": "Sets the y coordinate", + "description": "Sets the y coordinate", + "scratchblock": "set y to (y)", + "paramDocs": [ + "y: a y coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/setY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die y-Position" + } + } + }, + { + "id": "Sprite/show()", + "memberId": "Sprite/show", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "show", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Shows the sprite.", + "description": "Shows the sprite.", + "scratchblock": "show", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/show", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Macht die Figur sichtbar" + } + } + }, + { + "id": "Sprite/showVariable(String,Supplier)", + "memberId": "Sprite/showVariable", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "showVariable", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.util.function.Supplier" + ], + "parameterNames": [ + "name", + "value" + ], + "params": [ + "String name", + "Supplier value" + ], + "summary": "Shows a monitor for one of this sprite's variables in the top left corner\nof the stage, like Scratch's variable monitors: \"Cat: score\" and the\ncurrent value, updated every frame. Showing the same name again replaces\nthe monitor; it goes away with the sprite.", + "description": "Shows a monitor for one of this sprite's variables in the top left corner\nof the stage, like Scratch's variable monitors: \"Cat: score\" and the\ncurrent value, updated every frame. Showing the same name again replaces\nthe monitor; it goes away with the sprite.\n\n```java\npublic Cat() {\n this.addCostume(\"cat\", \"bunny1_stand\");\n this.showVariable(\"lives\", () -> lives);\n}\n```", + "scratchblock": "show variable [name v]", + "paramDocs": [ + "name: the variable's name, shown after the sprite's", + "value: gives the value to show; asked for it every frame" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/showVariable", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Sprite/stamp()", + "memberId": "Sprite/stamp", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "stamp", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stamps the current sprite to the background. A stamp is a non interactive\nversion of the sprite.", + "description": "Stamps the current sprite to the background. A stamp is a non interactive\nversion of the sprite.", + "scratchblock": "stamp", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/stamp", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Druckt ein unbewegliches Abbild der Figur auf die Bühne" + } + } + }, + { + "id": "Sprite/stamp(Layer)", + "memberId": "Sprite/stamp", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "stamp", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Layer" + ], + "parameterNames": [ + "layer" + ], + "params": [ + "Layer layer" + ], + "summary": "Stamps the sprite onto one of the stage's layers. A stamp is a picture of\nthe sprite that stays where it is put, and is not interactive.", + "description": "Stamps the sprite onto one of the stage's layers. A stamp is a picture of\nthe sprite that stays where it is put, and is not interactive.\n\nExample usage:\n\n```java\nthis.stamp(Layer.UI);\n```", + "scratchblock": null, + "paramDocs": [ + "layer: which layer to stamp onto" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/stamp", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Druckt ein unbewegliches Abbild der Figur auf die angegebene Ebene" + } + } + }, + { + "id": "Sprite/stopAllSounds()", + "memberId": "Sprite/stopAllSounds", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "stopAllSounds", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stops the playing of all sounds of the sprite.", + "description": "Stops the playing of all sounds of the sprite.", + "scratchblock": "stop all sounds", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/stopAllSounds", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Stoppt alle Klänge dieser Figur" + } + } + }, + { + "id": "Sprite/stopSound(String)", + "memberId": "Sprite/stopSound", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "stopSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Stops the playing of the sound with the given name", + "description": "Stops the playing of the sound with the given name", + "scratchblock": null, + "paramDocs": [ + "name: Name of the sound" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/stopSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Stoppt den Klang mit dem angegebenen Namen" + } + } + }, + { + "id": "Sprite/switchCostume(String)", + "memberId": "Sprite/switchCostume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "switchCostume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Switch to a costume by name.", + "description": "Switch to a costume by name.", + "scratchblock": "switch costume to [name v]", + "paramDocs": [ + "name: the name of a costume" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/switchCostume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zum Kostüm mit dem Namen" + } + } + }, + { + "id": "Sprite/switchCostume(double)", + "memberId": "Sprite/switchCostume", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "switchCostume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "index" + ], + "params": [ + "double index" + ], + "summary": "Switches the current costume of the sprite to the costume at the specified\nindex.", + "description": "Switches the current costume of the sprite to the costume at the specified\nindex.", + "scratchblock": "switch costume to (index)", + "paramDocs": [ + "index: The index of the costume to switch to." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/switchCostume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zum Kostüm mit der angegebenen Nummer" + } + } + }, + { + "id": "Sprite/think(String)", + "memberId": "Sprite/think", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "think", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "text" + ], + "params": [ + "String text" + ], + "summary": "Displays a thought bubble with the specified text.", + "description": "Displays a thought bubble with the specified text.", + "scratchblock": "think [text]", + "paramDocs": [ + "text: The text to be displayed in the thought bubble." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/think", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt eine Denkblase an" + } + } + }, + { + "id": "Sprite/think(String,int)", + "memberId": "Sprite/think", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "think", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int" + ], + "parameterNames": [ + "text", + "millis" + ], + "params": [ + "String text", + "int millis" + ], + "summary": "Displays a thought bubble with the specified text for a given duration.", + "description": "Displays a thought bubble with the specified text for a given duration.", + "scratchblock": "think [text] for (millis) seconds", + "paramDocs": [ + "text: The text to be displayed in the thought bubble.", + "millis: The duration in milliseconds for which the thought bubble will\n be displayed." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/think", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt eine Denkblase für die angegebene Zeit in Millisekunden" + } + } + }, + { + "id": "Sprite/turnLeft(double)", + "memberId": "Sprite/turnLeft", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "turnLeft", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "degrees" + ], + "params": [ + "double degrees" + ], + "summary": "Rotates the sprite by a certain degrees to the left.", + "description": "Rotates the sprite by a certain degrees to the left.", + "scratchblock": "turn left (degrees) degrees", + "paramDocs": [ + "degrees: between 0 and 360" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/turnLeft", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Dreht die Figur um die angegebene Gradzahl nach links" + } + } + }, + { + "id": "Sprite/turnRight(double)", + "memberId": "Sprite/turnRight", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "turnRight", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "degrees" + ], + "params": [ + "double degrees" + ], + "summary": "Rotates the sprite by a certain degrees to the right.", + "description": "Rotates the sprite by a certain degrees to the right.", + "scratchblock": "turn right (degrees) degrees", + "paramDocs": [ + "degrees: between 0 and 360" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/turnRight", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Dreht die Figur um die angegebene Gradzahl nach rechts" + } + } + }, + { + "id": "Sprite/whenAddedToStage()", + "memberId": "Sprite/whenAddedToStage", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenAddedToStage", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "This method is called when the sprite is added to the stage. Override this\nmethod to define\ncustom behavior when the sprite is added to the stage.", + "description": "This method is called when the sprite is added to the stage. Override this\nmethod to define\ncustom behavior when the sprite is added to the stage.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenAddedToStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn die Figur der Bühne hinzugefügt wird" + } + } + }, + { + "id": "Sprite/whenBackdropSwitches(String)", + "memberId": "Sprite/whenBackdropSwitches", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenBackdropSwitches", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "This method is called when the backdrop switches to the specified name.\nOverride this method to\ndefine custom behavior.", + "description": "This method is called when the backdrop switches to the specified name.\nOverride this method to\ndefine custom behavior.", + "scratchblock": "when backdrop switches to [name v]", + "paramDocs": [ + "name: the name of the backdrop to switch to" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenBackdropSwitches", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn der Hintergrund gewechselt wird" + } + } + }, + { + "id": "Sprite/whenClicked()", + "memberId": "Sprite/whenClicked", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenClicked", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "This method is called when the sprite is clicked. Override this method to\ndefine custom\nbehavior for the sprite when it is clicked.", + "description": "This method is called when the sprite is clicked. Override this method to\ndefine custom\nbehavior for the sprite when it is clicked.", + "scratchblock": "when this sprite clicked", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenClicked", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn die Figur angeklickt wird" + } + } + }, + { + "id": "Sprite/whenIReceive(String)", + "memberId": "Sprite/whenIReceive", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenIReceive", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "message" + ], + "params": [ + "String message" + ], + "summary": "This method is called when a message is received. Override this method to\ndefine custom\nbehavior.", + "description": "This method is called when a message is received. Override this method to\ndefine custom\nbehavior.", + "scratchblock": "when I receive [message v]", + "paramDocs": [ + "message: The message that is received." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenIReceive", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn die Bühne eine Nachricht sendet" + } + } + }, + { + "id": "Sprite/whenKeyPressed(KeyCode)", + "memberId": "Sprite/whenKeyPressed", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenKeyPressed", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.KeyCode" + ], + "parameterNames": [ + "keyCode" + ], + "params": [ + "KeyCode keyCode" + ], + "summary": "This method is called when a key is pressed. Override this method to define\ncustom behavior.", + "description": "This method is called when a key is pressed. Override this method to define\ncustom behavior.", + "scratchblock": "when [space v] key pressed", + "paramDocs": [ + "keyCode: the key that was pressed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenKeyPressed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird beim Drücken einer Taste aufgerufen" + } + } + }, + { + "id": "Sprite/whenKeyReleased(KeyCode)", + "memberId": "Sprite/whenKeyReleased", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenKeyReleased", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.KeyCode" + ], + "parameterNames": [ + "keyCode" + ], + "params": [ + "KeyCode keyCode" + ], + "summary": "This method is called when a key is released. Override this method to define\ncustom behavior.", + "description": "This method is called when a key is released. Override this method to define\ncustom behavior.", + "scratchblock": null, + "paramDocs": [ + "keyCode: the key that was released" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenKeyReleased", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird beim Loslassen einer Taste aufgerufen" + } + } + }, + { + "id": "Sprite/whenMouseClicked(MouseCode)", + "memberId": "Sprite/whenMouseClicked", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenMouseClicked", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.MouseCode" + ], + "parameterNames": [ + "mouseCode" + ], + "params": [ + "MouseCode mouseCode" + ], + "summary": "This method is called when a mouse click event occurs. Override this method\nto define custom\nbehavior.", + "description": "This method is called when a mouse click event occurs. Override this method\nto define custom\nbehavior.", + "scratchblock": null, + "paramDocs": [ + "mouseCode: The code representing the mouse button that was clicked." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenMouseClicked", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird bei einem Mausklick aufgerufen, egal wo" + } + } + }, + { + "id": "Sprite/whenMouseMoved(double,double)", + "memberId": "Sprite/whenMouseMoved", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenMouseMoved", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "This method is called when the mouse is moved. Override this method to define\ncustom behavior.", + "description": "This method is called when the mouse is moved. Override this method to define\ncustom behavior.", + "scratchblock": null, + "paramDocs": [ + "x: The x-coordinate of the mouse pointer.", + "y: The y-coordinate of the mouse pointer." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenMouseMoved", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird bei jeder Mausbewegung aufgerufen; x und y sind Bühnenkoordinaten" + } + } + }, + { + "id": "Sprite/whenRemovedFromStage()", + "memberId": "Sprite/whenRemovedFromStage", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenRemovedFromStage", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "This method is called when the sprite is removed from the stage. Override\nthis method to define\ncustom behavior when the sprite is removed.", + "description": "This method is called when the sprite is removed from the stage. Override\nthis method to define\ncustom behavior when the sprite is removed.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenRemovedFromStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn die Figur von der Bühne entfernt wird" + } + } + }, + { + "id": "Sprite/whenStartsAsClone()", + "memberId": "Sprite/whenStartsAsClone", + "owner": "org.openpatch.scratch.Sprite", + "className": "Sprite", + "methodName": "whenStartsAsClone", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Runs when this sprite was just made as a clone, like Scratch's \"when I\nstart as a clone\". Override it to give clones their own behaviour, for\nexample to send a bullet on its way.", + "description": "Runs when this sprite was just made as a clone, like Scratch's \"when I\nstart as a clone\". Override it to give clones their own behaviour, for\nexample to send a bullet on its way.\n\n```java\npublic void whenStartsAsClone() {\n this.show();\n this.goToRandomPosition();\n}\n```", + "scratchblock": "when I start as a clone", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Sprite/whenStartsAsClone", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Stage/add(Sprite)", + "memberId": "Stage/add", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "add", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "sprite" + ], + "params": [ + "Sprite sprite" + ], + "summary": "Adds a sprite to the stage. Sprites are drawn in the order they were added, so a sprite added\nlater is drawn on top of one added earlier.", + "description": "Adds a sprite to the stage. Sprites are drawn in the order they were added, so a sprite added\nlater is drawn on top of one added earlier.", + "scratchblock": null, + "paramDocs": [ + "sprite: the sprite to add" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/add", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt der Bühne eine Figur hinzu" + } + } + }, + { + "id": "Stage/add(Text)", + "memberId": "Stage/add", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "add", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Text" + ], + "parameterNames": [ + "text" + ], + "params": [ + "Text text" + ], + "summary": "Add a text object to the stage", + "description": "Add a text object to the stage", + "scratchblock": null, + "paramDocs": [ + "text: a text" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/add", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt der Bühne einen Text hinzu" + } + } + }, + { + "id": "Stage/add(Pen)", + "memberId": "Stage/add", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "add", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Pen" + ], + "parameterNames": [ + "pen" + ], + "params": [ + "Pen pen" + ], + "summary": "Adds a Pen object to the stage.", + "description": "Adds a Pen object to the stage.", + "scratchblock": null, + "paramDocs": [ + "pen: the Pen object to be added to the stage" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/add", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt der Bühne einen Stift hinzu" + } + } + }, + { + "id": "Stage/addBackdrop(String,String,boolean)", + "memberId": "Stage/addBackdrop", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "addBackdrop", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "boolean" + ], + "parameterNames": [ + "name", + "imagePath", + "stretch" + ], + "params": [ + "String name", + "String imagePath", + "boolean stretch" + ], + "summary": "Add a backdrop to the stage. If a backdrop with the received name already\nexists do nothing.", + "description": "Add a backdrop to the stage. If a backdrop with the received name already\nexists do nothing.", + "scratchblock": null, + "paramDocs": [ + "name: a unique name", + "imagePath: a image path, or the name of a built-in sprite such as\n \"bg_castle\"", + "stretch: stretch image to window size" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/addBackdrop", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt einen Hintergrund hinzu; bei stretch == true wird er auf Bühnengröße gedehnt" + } + } + }, + { + "id": "Stage/addBackdrop(String,String)", + "memberId": "Stage/addBackdrop", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "addBackdrop", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "imagePath" + ], + "params": [ + "String name", + "String imagePath" + ], + "summary": "Add a backdrop to the stage. If a backdrop with the received name already\nexists do nothing.", + "description": "Add a backdrop to the stage. If a backdrop with the received name already\nexists do nothing.", + "scratchblock": null, + "paramDocs": [ + "name: a unique name", + "imagePath: a image path, or the name of a built-in sprite such as\n \"bg_castle\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/addBackdrop", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt einen Hintergrund unter eigenem Namen hinzu" + } + } + }, + { + "id": "Stage/addBackdrop(String)", + "memberId": "Stage/addBackdrop", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "addBackdrop", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Add one of the backdrops that ship with Scratch for Java to the stage. The\nbackdrop gets the same name as the built-in sprite. If a backdrop with that\nname already exists do nothing.", + "description": "Add one of the backdrops that ship with Scratch for Java to the stage. The\nbackdrop gets the same name as the built-in sprite. If a backdrop with that\nname already exists do nothing.\n\nExample usage:\n\n```java\nthis.addBackdrop(\"bg_castle\");\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of a built-in sprite, for example \"bg_castle\". Add the\n sheet in front of the name, for example \"platformer/grass\", if\n the same name exists on several sheets." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/addBackdrop", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt einen der eingebauten Hintergründe hinzu" + } + } + }, + { + "id": "Stage/addSound(String,String)", + "memberId": "Stage/addSound", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "addSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "soundPath" + ], + "params": [ + "String name", + "String soundPath" + ], + "summary": "Add a sound to the stage. If a sound with the received name already exists do\nnothing.", + "description": "Add a sound to the stage. If a sound with the received name already exists do\nnothing.", + "scratchblock": null, + "paramDocs": [ + "name: a unique name", + "soundPath: a sound path, or the name of a built-in sound such as\n \"footstep_carpet_000\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/addSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt einen Klang unter eigenem Namen hinzu" + } + } + }, + { + "id": "Stage/addSound(String)", + "memberId": "Stage/addSound", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "addSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Add one of the sounds that ship with Scratch for Java to the stage. The\nsound gets the same name as the built-in sound. If a sound with that name\nalready exists do nothing.", + "description": "Add one of the sounds that ship with Scratch for Java to the stage. The\nsound gets the same name as the built-in sound. If a sound with that name\nalready exists do nothing.\n\nExample usage:\n\n```java\nthis.addSound(\"footstep_carpet_000\");\n```", + "scratchblock": null, + "paramDocs": [ + "name: the name of a built-in sound, for example \"footstep_carpet_000\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/addSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt einen der eingebauten Klänge hinzu" + } + } + }, + { + "id": "Stage/ask(String)", + "memberId": "Stage/ask", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "ask", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "question" + ], + "params": [ + "String question" + ], + "summary": "Asks a question and waits for an answer to be typed in. A box appears at the\nbottom of the stage; whatever is typed goes into it until Enter is pressed.", + "description": "Asks a question and waits for an answer to be typed in. A box appears at the\nbottom of the stage; whatever is typed goes into it until Enter is pressed.\n\nUnlike Scratch, this does not pause anything. Your `run()` keeps being\ncalled while the question is on screen, so check [isAsking()](isAsking) or wait\nfor [getAnswer()](getAnswer) to change:\n\n```java\npublic void run() {\n if (!this.isAsking() && this.getAnswer().isEmpty()) {\n this.ask(\"What is your name?\");\n }\n if (!this.getAnswer().isEmpty()) {\n this.display(\"Hello \" + this.getAnswer() + \"!\");\n }\n}\n```", + "scratchblock": "ask [question] and wait", + "paramDocs": [ + "question: the question to show" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/ask", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Stellt eine Frage; die Antwort wird über getAnswer() abgeholt" + } + } + }, + { + "id": "Stage/broadcast(String)", + "memberId": "Stage/broadcast", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "broadcast", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "message" + ], + "params": [ + "String message" + ], + "summary": "Broadcasts a message to every sprite on the stage and to the stage itself,\nas in Scratch. Each of them runs its `whenIReceive` method with the\nmessage.", + "description": "Broadcasts a message to every sprite on the stage and to the stage itself,\nas in Scratch. Each of them runs its `whenIReceive` method with the\nmessage.", + "scratchblock": "broadcast [message v]", + "paramDocs": [ + "message: The message to broadcast." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/broadcast", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Sendet eine Nachricht an alle whenIReceive-Empfänger" + } + } + }, + { + "id": "Stage/changeColor(double)", + "memberId": "Stage/changeColor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "changeColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Changes the background color by adding a step to the hue value.", + "description": "Changes the background color by adding a step to the hue value.", + "scratchblock": null, + "paramDocs": [ + "h: a step value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/changeColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert den Farbton des Hintergrunds um den angegebenen Wert" + } + } + }, + { + "id": "Stage/changeTint(double)", + "memberId": "Stage/changeTint", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "changeTint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "step" + ], + "params": [ + "double step" + ], + "summary": "Changes the colour the backdrop is tinted with by a step.", + "description": "Changes the colour the backdrop is tinted with by a step.", + "scratchblock": "change [color v] effect by (step)", + "paramDocs": [ + "step: a step value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/changeTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert den Farbton der Einfärbung um den angegebenen Wert" + } + } + }, + { + "id": "Stage/changeTransparency(double)", + "memberId": "Stage/changeTransparency", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "changeTransparency", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "step" + ], + "params": [ + "double step" + ], + "summary": "Changes how see-through the backdrop is by a step. A positive step fades it\nout, a negative one brings it back.", + "description": "Changes how see-through the backdrop is by a step. A positive step fades it\nout, a negative one brings it back.", + "scratchblock": "change [ghost v] effect by (step)", + "paramDocs": [ + "step: a step value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/changeTransparency", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Transparenz des Hintergrunds" + } + } + }, + { + "id": "Stage/changeVolume(double)", + "memberId": "Stage/changeVolume", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "changeVolume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "step" + ], + "params": [ + "double step" + ], + "summary": "Makes every sound of this stage louder or quieter.", + "description": "Makes every sound of this stage louder or quieter.", + "scratchblock": "change volume by (step)", + "paramDocs": [ + "step: how much to add to the volume, in percent" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/changeVolume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Lautstärke um den angegebenen Wert" + } + } + }, + { + "id": "Stage/constructor()", + "memberId": "Stage/constructor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "constructor", + "static": false, + "returnType": "Stage", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Stage with default dimensions. The default width is 480\npixels and the default\nheight is 360 pixels.", + "description": "Constructs a new Stage with default dimensions. The default width is 480\npixels and the default\nheight is 360 pixels.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Bühne der Größe 480 x 360" + } + } + }, + { + "id": "Stage/constructor(int,int)", + "memberId": "Stage/constructor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "constructor", + "static": false, + "returnType": "Stage", + "parameterTypes": [ + "int", + "int" + ], + "parameterNames": [ + "width", + "height" + ], + "params": [ + "int width", + "int height" + ], + "summary": "Constructs a new Stage with the specified width and height.", + "description": "Constructs a new Stage with the specified width and height.", + "scratchblock": null, + "paramDocs": [ + "width: the width of the stage", + "height: the height of the stage" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Stage/constructor(int,int,String)", + "memberId": "Stage/constructor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "constructor", + "static": false, + "returnType": "Stage", + "parameterTypes": [ + "int", + "int", + "java.lang.String" + ], + "parameterNames": [ + "width", + "height", + "assets" + ], + "params": [ + "int width", + "int height", + "String assets" + ], + "summary": "Constructs a new Stage with the specified width, height, and assets path.", + "description": "Constructs a new Stage with the specified width, height, and assets path.", + "scratchblock": null, + "paramDocs": [ + "width: the width of the stage", + "height: the height of the stage", + "assets: the path to the assets directory" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Bühne der angegebenen Größe. Der Asset-Pfad wird im Browser ignoriert" + } + } + }, + { + "id": "Stage/count(Class)", + "memberId": "Stage/count", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "count", + "static": false, + "returnType": "int", + "parameterTypes": [ + "java.lang.Class" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Class c" + ], + "summary": "Returns the number of sprites of the specified class.", + "description": "Returns the number of sprites of the specified class.", + "scratchblock": null, + "paramDocs": [ + "c: the class of the sprites to count" + ], + "returns": "the number of sprites of the specified class", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/count", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Anzahl der Figuren dieser Klasse zurück, z.B. count(Apfel.class)" + } + } + }, + { + "id": "Stage/debug(Object[])", + "memberId": "Stage/debug", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "debug", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.Object[]" + ], + "parameterNames": [ + "values" + ], + "params": [ + "Object[] values" + ], + "summary": "Prints a debug message to stdout when debug mode is enabled.\nThe message is prefixed with the stage's class name so you can tell\nwhich stage it came from.", + "description": "Prints a debug message to stdout when debug mode is enabled.\nThe message is prefixed with the stage's class name so you can tell\nwhich stage it came from.\n\nExample:\n\n```java\nthis.debug(\"score =\", score, \"lives =\", lives);\n// prints: [MyStage] score = 5 lives = 3\n```", + "scratchblock": null, + "paramDocs": [ + "values: one or more values to print" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/debug", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Stage/display(String)", + "memberId": "Stage/display", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "display", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "text" + ], + "params": [ + "String text" + ], + "summary": "Displays the given text on the stage.", + "description": "Displays the given text on the stage.", + "scratchblock": null, + "paramDocs": [ + "text: the text to be displayed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/display", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt einen Text am unteren Rand der Bühne an" + } + } + }, + { + "id": "Stage/display(String,int)", + "memberId": "Stage/display", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "display", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int" + ], + "parameterNames": [ + "text", + "millis" + ], + "params": [ + "String text", + "int millis" + ], + "summary": "Displays the given text on the screen for a specified duration.", + "description": "Displays the given text on the screen for a specified duration.", + "scratchblock": null, + "paramDocs": [ + "text: The text to be displayed.", + "millis: The duration in milliseconds for which the text will be\n displayed." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/display", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt einen Text für die angegebene Zeit in Millisekunden an" + } + } + }, + { + "id": "Stage/eraseAll()", + "memberId": "Stage/eraseAll", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "eraseAll", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Erases all lines on the pen layer.", + "description": "Erases all lines on the pen layer.", + "scratchblock": "erase all", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/eraseAll", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Löscht alles, was mit Stiften gezeichnet wurde" + } + } + }, + { + "id": "Stage/exit()", + "memberId": "Stage/exit", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "exit", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Close the window and therefore the whole application.", + "description": "Close the window and therefore the whole application.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/exit", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Beendet das Programm" + } + } + }, + { + "id": "Stage/find(Class)", + "memberId": "Stage/find", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "find", + "static": false, + "returnType": "List", + "parameterTypes": [ + "java.lang.Class" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Class c" + ], + "summary": "Find sprites of a given class.", + "description": "Find sprites of a given class.", + "scratchblock": null, + "paramDocs": [ + "c: Class" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/find", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt alle Figuren dieser Klasse zurück, z.B. find(Apfel.class)" + } + } + }, + { + "id": "Stage/getAll()", + "memberId": "Stage/getAll", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getAll", + "static": false, + "returnType": "List", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves a list of all sprites in the current stage.", + "description": "Retrieves a list of all sprites in the current stage.", + "scratchblock": null, + "paramDocs": [], + "returns": "a list containing all sp", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getAll", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt alle Figuren auf der Bühne zurück" + } + } + }, + { + "id": "Stage/getAnswer()", + "memberId": "Stage/getAnswer", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getAnswer", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the last answer that was typed in.", + "description": "Returns the last answer that was typed in.", + "scratchblock": "(answer)", + "paramDocs": [], + "returns": "the answer, or an empty string if nothing has been answered yet", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getAnswer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die zuletzt eingegebene Antwort zurück, sonst eine leere Zeichenkette" + } + } + }, + { + "id": "Stage/getCamera()", + "memberId": "Stage/getCamera", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getCamera", + "static": false, + "returnType": "Camera", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current camera instance associated with this stage.", + "description": "Retrieves the current camera instance associated with this stage.", + "scratchblock": null, + "paramDocs": [], + "returns": "the current Camera object.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getCamera", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Kamera der Bühne zurück" + } + } + }, + { + "id": "Stage/getColor()", + "memberId": "Stage/getColor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getColor", + "static": false, + "returnType": "Color", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current color of the stage.", + "description": "Returns the current color of the stage.", + "scratchblock": null, + "paramDocs": [], + "returns": "the current color", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Hintergrundfarbe zurück" + } + } + }, + { + "id": "Stage/getCurrentBackdropIndex()", + "memberId": "Stage/getCurrentBackdropIndex", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getCurrentBackdropIndex", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current backdrop index", + "description": "Returns the current backdrop index", + "scratchblock": "(backdrop [number v])", + "paramDocs": [], + "returns": "a backdrop index", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getCurrentBackdropIndex", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Nummer des aktuellen Hintergrunds zurück" + } + } + }, + { + "id": "Stage/getCurrentBackdropName()", + "memberId": "Stage/getCurrentBackdropName", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getCurrentBackdropName", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current backdrop name", + "description": "Returns the current backdrop name", + "scratchblock": "(backdrop [name v])", + "paramDocs": [], + "returns": "a backdrop name", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getCurrentBackdropName", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Namen des aktuellen Hintergrunds zurück" + } + } + }, + { + "id": "Stage/getDeltaTime()", + "memberId": "Stage/getDeltaTime", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getDeltaTime", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Gets the seconds passed since the last frame.", + "description": "Gets the seconds passed since the last frame.", + "scratchblock": null, + "paramDocs": [], + "returns": "secons since last frame", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getDeltaTime", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Dauer des letzten Frames in Sekunden zurück" + } + } + }, + { + "id": "Stage/getFrameRate()", + "memberId": "Stage/getFrameRate", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getFrameRate", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Get the frame rate of the application.", + "description": "Get the frame rate of the application.", + "scratchblock": null, + "paramDocs": [], + "returns": "the frame rate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getFrameRate", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die aktuelle Bildrate zurück" + } + } + }, + { + "id": "Stage/getHeight()", + "memberId": "Stage/getHeight", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getHeight", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Return the height of the current costume or the pen size, when no costume is\navailable.", + "description": "Return the height of the current costume or the pen size, when no costume is\navailable.", + "scratchblock": null, + "paramDocs": [], + "returns": "the height of the sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getHeight", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Höhe der Bühne in Pixeln zurück" + } + } + }, + { + "id": "Stage/getMouse()", + "memberId": "Stage/getMouse", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getMouse", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current position of the mouse cursor as a Vector2", + "description": "Returns the current position of the mouse cursor as a Vector2", + "scratchblock": null, + "paramDocs": [], + "returns": "mouse position", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getMouse", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Position des Mauszeigers zurück" + } + } + }, + { + "id": "Stage/getMouseX()", + "memberId": "Stage/getMouseX", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getMouseX", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current x-position of the mouse cursor", + "description": "Returns the current x-position of the mouse cursor", + "scratchblock": "(mouse x)", + "paramDocs": [], + "returns": "x-position", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getMouseX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die x-Position des Mauszeigers zurück" + } + } + }, + { + "id": "Stage/getMouseY()", + "memberId": "Stage/getMouseY", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getMouseY", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the current y-position of the mouse cursor", + "description": "Returns the current y-position of the mouse cursor", + "scratchblock": "(mouse y)", + "paramDocs": [], + "returns": "y-position", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getMouseY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die y-Position des Mauszeigers zurück" + } + } + }, + { + "id": "Stage/getPixels()", + "memberId": "Stage/getPixels", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getPixels", + "static": false, + "returnType": "Pixels", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the colours of everything this stage has drawn.", + "description": "Returns the colours of everything this stage has drawn.\n\nExample usage:\n\n```java\nint[] colours = this.getPixels().main();\n```", + "scratchblock": null, + "paramDocs": [], + "returns": "the pixels", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getPixels", + "availability": "desktop-only", + "availabilityReason": "The desktop pixel buffer is not exposed by the browser renderer.", + "translations": { + "de": { + "description": "Nur in der Desktop-Version: Zugriff auf einzelne Bildpunkte" + } + } + }, + { + "id": "Stage/getShaders()", + "memberId": "Stage/getShaders", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getShaders", + "static": false, + "returnType": "Shaders", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the shaders of this stage. Shader handling lives behind this one\nmethod so that it does not crowd the everyday API.", + "description": "Returns the shaders of this stage. Shader handling lives behind this one\nmethod so that it does not crowd the everyday API.\n\nExample usage:\n\n```java\nthis.getShaders().add(\"blur\", \"blur.frag\", null);\nthis.getShaders().switchTo(\"blur\");\n```", + "scratchblock": null, + "paramDocs": [], + "returns": "the shaders", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getShaders", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Shader der Bühne zurück; sie verändern das ganze Bild ohne die UI" + } + } + }, + { + "id": "Stage/getSorting()", + "memberId": "Stage/getSorting", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getSorting", + "static": false, + "returnType": "Sorting", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the order in which the sprites of this stage are drawn.", + "description": "Returns the order in which the sprites of this stage are drawn.\n\nExample usage:\n\n```java\nthis.getSorting().byY();\n```", + "scratchblock": null, + "paramDocs": [], + "returns": "the sorting", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getSorting", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Sortierung der Bühne zurück. Mit getSorting().byY() werden Figuren weiter unten vor denen weiter oben gezeichnet." + } + } + }, + { + "id": "Stage/getTimer()", + "memberId": "Stage/getTimer", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getTimer", + "static": false, + "returnType": "Timer", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the timer", + "description": "Returns the timer", + "scratchblock": "(timer)", + "paramDocs": [], + "returns": "the timer", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getTimer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Standard-Timer der Bühne zurück" + } + } + }, + { + "id": "Stage/getTimer(String)", + "memberId": "Stage/getTimer", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getTimer", + "static": false, + "returnType": "Timer", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Returns a timer by name", + "description": "Returns a timer by name", + "scratchblock": null, + "paramDocs": [ + "name: a name" + ], + "returns": "the timer", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getTimer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Timer mit dem angegebenen Namen zurück und legt ihn bei Bedarf an" + } + } + }, + { + "id": "Stage/getVolume()", + "memberId": "Stage/getVolume", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getVolume", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns how loud the sounds of this stage play.", + "description": "Returns how loud the sounds of this stage play.", + "scratchblock": "(volume)", + "paramDocs": [], + "returns": "the volume, from 0 to 100", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getVolume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Lautstärke in Prozent zurück" + } + } + }, + { + "id": "Stage/getWidth()", + "memberId": "Stage/getWidth", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "getWidth", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Return the width of the current costume or the pen size, when no costume is\navailable.", + "description": "Return the width of the current costume or the pen size, when no costume is\navailable.", + "scratchblock": null, + "paramDocs": [], + "returns": "the width of the sprite", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/getWidth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Breite der Bühne in Pixeln zurück" + } + } + }, + { + "id": "Stage/hideVariable(String)", + "memberId": "Stage/hideVariable", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "hideVariable", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Hides the monitor of a variable that [showVariable(String,\njava.util.function.Supplier)](showVariable(String,\njava.util.function.Supplier)) showed.", + "description": "Hides the monitor of a variable that [showVariable(String,\njava.util.function.Supplier)](showVariable(String,\njava.util.function.Supplier)) showed.", + "scratchblock": "hide variable [name v]", + "paramDocs": [ + "name: the name the monitor was shown with" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/hideVariable", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Stage/isAsking()", + "memberId": "Stage/isAsking", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "isAsking", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks whether a question is on screen and still waiting for an answer.", + "description": "Checks whether a question is on screen and still waiting for an answer.", + "scratchblock": null, + "paramDocs": [], + "returns": "true while a question is waiting", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/isAsking", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn noch auf eine Antwort gewartet wird" + } + } + }, + { + "id": "Stage/isDebug()", + "memberId": "Stage/isDebug", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "isDebug", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks if the application is in debug mode.", + "description": "Checks if the application is in debug mode.", + "scratchblock": null, + "paramDocs": [], + "returns": "true if the application is in debug mode, false otherwise.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/isDebug", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Fehlersuche eingeschaltet ist" + } + } + }, + { + "id": "Stage/isKeyPressed(KeyCode)", + "memberId": "Stage/isKeyPressed", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "isKeyPressed", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "org.openpatch.scratch.KeyCode" + ], + "parameterNames": [ + "keyCode" + ], + "params": [ + "KeyCode keyCode" + ], + "summary": "Returns true if the key is pressed", + "description": "Returns true if the key is pressed", + "scratchblock": "<key [space v] pressed?>", + "paramDocs": [ + "keyCode: a key" + ], + "returns": "key pressed", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/isKeyPressed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Taste gerade gedrückt ist" + } + } + }, + { + "id": "Stage/isMouseDown()", + "memberId": "Stage/isMouseDown", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "isMouseDown", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns true is the mouse button is down", + "description": "Returns true is the mouse button is down", + "scratchblock": "<mouse down?>", + "paramDocs": [], + "returns": "mouse button down", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/isMouseDown", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn eine Maustaste gedrückt ist" + } + } + }, + { + "id": "Stage/isSoundPlaying(String)", + "memberId": "Stage/isSoundPlaying", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "isSoundPlaying", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Returns true if the sound if playing", + "description": "Returns true if the sound if playing", + "scratchblock": null, + "paramDocs": [ + "name: " + ], + "returns": "playing", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/isSoundPlaying", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn der Klang gerade abgespielt wird" + } + } + }, + { + "id": "Stage/nextBackdrop()", + "memberId": "Stage/nextBackdrop", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "nextBackdrop", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Switch to the next backdrop.", + "description": "Switch to the next backdrop.", + "scratchblock": "next backdrop", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/nextBackdrop", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zum nächsten Hintergrund" + } + } + }, + { + "id": "Stage/pickRandom(int,int)", + "memberId": "Stage/pickRandom", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "pickRandom", + "static": false, + "returnType": "int", + "parameterTypes": [ + "int", + "int" + ], + "parameterNames": [ + "from", + "to" + ], + "params": [ + "int from", + "int to" + ], + "summary": "Returns a random integer between the specified range (inclusive).", + "description": "Returns a random integer between the specified range (inclusive).", + "scratchblock": "(pick random (from) to (to))", + "paramDocs": [ + "from: the lower bound of the range (inclusive)", + "to: the upper bound of the range (inclusive)" + ], + "returns": "a random integer between `from` and `to` (inclusive)", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/pickRandom", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine Zufallszahl zwischen from und to zurück (beide eingeschlossen)" + } + } + }, + { + "id": "Stage/playSound(String)", + "memberId": "Stage/playSound", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "playSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Plays a sound.", + "description": "Plays a sound.", + "scratchblock": "start sound [name v]", + "paramDocs": [ + "name: the sound name" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/playSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Spielt einen zuvor hinzugefügten Klang ab" + } + } + }, + { + "id": "Stage/previousBackdrop()", + "memberId": "Stage/previousBackdrop", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "previousBackdrop", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Switch to the previous backdrop.", + "description": "Switch to the previous backdrop.", + "scratchblock": "switch backdrop to [previous backdrop v]", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/previousBackdrop", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zum vorherigen Hintergrund" + } + } + }, + { + "id": "Stage/randomBackdrop()", + "memberId": "Stage/randomBackdrop", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "randomBackdrop", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Switch to a random backdrop.", + "description": "Switch to a random backdrop.", + "scratchblock": "switch backdrop to [random backdrop v]", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/randomBackdrop", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zu einem zufälligen Hintergrund" + } + } + }, + { + "id": "Stage/remove(Sprite)", + "memberId": "Stage/remove", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "remove", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "sprite" + ], + "params": [ + "Sprite sprite" + ], + "summary": "Removes the specified sprite from the stage.", + "description": "Removes the specified sprite from the stage.", + "scratchblock": null, + "paramDocs": [ + "sprite: the sprite to be removed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/remove", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Entfernt die Figur von der Bühne" + } + } + }, + { + "id": "Stage/remove(Pen)", + "memberId": "Stage/remove", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "remove", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Pen" + ], + "parameterNames": [ + "pen" + ], + "params": [ + "Pen pen" + ], + "summary": "Removes the specified pen from the stage.", + "description": "Removes the specified pen from the stage.", + "scratchblock": null, + "paramDocs": [ + "pen: the pen to be removed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/remove", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Entfernt den Stift von der Bühne" + } + } + }, + { + "id": "Stage/remove(Text)", + "memberId": "Stage/remove", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "remove", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Text" + ], + "parameterNames": [ + "text" + ], + "params": [ + "Text text" + ], + "summary": "Removes the specified text from the stage.", + "description": "Removes the specified text from the stage.", + "scratchblock": null, + "paramDocs": [ + "text: the text to be removed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/remove", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Entfernt den Text von der Bühne" + } + } + }, + { + "id": "Stage/remove(Class)", + "memberId": "Stage/remove", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "remove", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.Class" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Class c" + ], + "summary": "Removes all sprites of the specified class from the stage.", + "description": "Removes all sprites of the specified class from the stage.", + "scratchblock": null, + "paramDocs": [ + "c: the class of the sprites to remove" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/remove", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Entfernt alle Figuren dieser Klasse von der Bühne, z.B. remove(Apfel.class)" + } + } + }, + { + "id": "Stage/removeAll()", + "memberId": "Stage/removeAll", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "removeAll", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Removes all elements from the stage.", + "description": "Removes all elements from the stage.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/removeAll", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Entfernt alle Figuren von der Bühne" + } + } + }, + { + "id": "Stage/run()", + "memberId": "Stage/run", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "run", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Executes the main logic of the stage. This method should be overridden by\nsubclasses to define\nthe specific behavior of the stage.", + "description": "Executes the main logic of the stage. This method should be overridden by\nsubclasses to define\nthe specific behavior of the stage.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/run", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird in jedem Frame aufgerufen" + } + } + }, + { + "id": "Stage/setColor(double)", + "memberId": "Stage/setColor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Sets the background color via a hue value", + "description": "Sets the background color via a hue value", + "scratchblock": null, + "paramDocs": [ + "h: a hue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Hintergrundfarbe über den Farbton (0 bis 255)" + } + } + }, + { + "id": "Stage/setColor(double,double,double)", + "memberId": "Stage/setColor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "double r", + "double g", + "double b" + ], + "summary": "Sets the background color via a rgb value", + "description": "Sets the background color via a rgb value", + "scratchblock": null, + "paramDocs": [ + "r: a red value [0...255]", + "g: a green value [0...255]", + "b: a blue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Hintergrundfarbe aus Rot-, Grün- und Blauanteil (jeweils 0 bis 255)" + } + } + }, + { + "id": "Stage/setColor(Color)", + "memberId": "Stage/setColor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Color c" + ], + "summary": "Sets the color of the stage.", + "description": "Sets the color of the stage.", + "scratchblock": null, + "paramDocs": [ + "c: the new color to be set" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Hintergrundfarbe" + } + } + }, + { + "id": "Stage/setCursor(String)", + "memberId": "Stage/setCursor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setCursor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "path" + ], + "params": [ + "String path" + ], + "summary": "Sets the cursor image for the stage.", + "description": "Sets the cursor image for the stage.", + "scratchblock": null, + "paramDocs": [ + "path: a path to an image file, or the name of a built-in sprite" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setCursor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt das Mauszeigerbild" + } + } + }, + { + "id": "Stage/setCursor(String,int,int)", + "memberId": "Stage/setCursor", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setCursor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int", + "int" + ], + "parameterNames": [ + "path", + "x", + "y" + ], + "params": [ + "String path", + "int x", + "int y" + ], + "summary": "Sets the cursor image and its active spot coordinates.", + "description": "Sets the cursor image and its active spot coordinates.", + "scratchblock": null, + "paramDocs": [ + "path: a path to an image file, or the name of a built-in sprite", + "x: the x-coordinate of the cursor's active spot", + "y: the y-coordinate of the cursor's active spot" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setCursor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt das Mauszeigerbild mit eigenem Aktivpunkt" + } + } + }, + { + "id": "Stage/setDebug(boolean)", + "memberId": "Stage/setDebug", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setDebug", + "static": false, + "returnType": "void", + "parameterTypes": [ + "boolean" + ], + "parameterNames": [ + "debug" + ], + "params": [ + "boolean debug" + ], + "summary": "Enables or disables the debug mode for the application.", + "description": "Enables or disables the debug mode for the application.", + "scratchblock": null, + "paramDocs": [ + "debug: a boolean value where `true` enables debug mode and\n `false` disables\n it." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setDebug", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schaltet die Ausgabe von debug() ein oder aus" + } + } + }, + { + "id": "Stage/setTint(double,double,double)", + "memberId": "Stage/setTint", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setTint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double", + "double" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "double r", + "double g", + "double b" + ], + "summary": "Sets the colour the backdrop is tinted with.", + "description": "Sets the colour the backdrop is tinted with.", + "scratchblock": null, + "paramDocs": [ + "r: a red value [0...255]", + "g: a green value [0...255]", + "b: a blue value [0...255]" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Färbt den Hintergrund ein (Anteile jeweils 0 bis 255)" + } + } + }, + { + "id": "Stage/setTint(double)", + "memberId": "Stage/setTint", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setTint", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Sets the colour the backdrop is tinted with, as a hue.", + "description": "Sets the colour the backdrop is tinted with, as a hue.", + "scratchblock": "set [color v] effect to (h)", + "paramDocs": [ + "h: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setTint", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Färbt den Hintergrund mit dem angegebenen Farbton ein (0 bis 255)" + } + } + }, + { + "id": "Stage/setTransparency(double)", + "memberId": "Stage/setTransparency", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setTransparency", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "transparency" + ], + "params": [ + "double transparency" + ], + "summary": "Sets how see-through the backdrop is, as Scratch's ghost effect does: 0 is\nthe solid backdrop you start with and 100 is invisible.", + "description": "Sets how see-through the backdrop is, as Scratch's ghost effect does: 0 is\nthe solid backdrop you start with and 100 is invisible.", + "scratchblock": "set [ghost v] effect to (transparency)", + "paramDocs": [ + "transparency: [0...100], 0 solid and 100 invisible" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setTransparency", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Transparenz des Hintergrunds in Prozent" + } + } + }, + { + "id": "Stage/setVolume(double)", + "memberId": "Stage/setVolume", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "setVolume", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "percent" + ], + "params": [ + "double percent" + ], + "summary": "Sets how loud every sound of this stage plays.", + "description": "Sets how loud every sound of this stage plays.", + "scratchblock": "set volume to (percent) %", + "paramDocs": [ + "percent: 0 for silent, 100 for full volume" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/setVolume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Lautstärke in Prozent" + } + } + }, + { + "id": "Stage/showVariable(String,Supplier)", + "memberId": "Stage/showVariable", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "showVariable", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.util.function.Supplier" + ], + "parameterNames": [ + "name", + "value" + ], + "params": [ + "String name", + "Supplier value" + ], + "summary": "Shows a monitor for a variable in the top left corner of the stage, like\nScratch's variable monitors: the name and the current value, updated every\nframe. Showing the same name again replaces the monitor.", + "description": "Shows a monitor for a variable in the top left corner of the stage, like\nScratch's variable monitors: the name and the current value, updated every\nframe. Showing the same name again replaces the monitor.\n\n```java\nthis.showVariable(\"score\", () -> score);\n```", + "scratchblock": "show variable [name v]", + "paramDocs": [ + "name: what the monitor says", + "value: gives the value to show; asked for it every frame" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/showVariable", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Bühne mit der angegebenen Breite und Höhe" + } + } + }, + { + "id": "Stage/stopAllSounds()", + "memberId": "Stage/stopAllSounds", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "stopAllSounds", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stops the playing of all sounds of the stage.", + "description": "Stops the playing of all sounds of the stage.", + "scratchblock": "stop all sounds", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/stopAllSounds", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Stoppt alle Klänge der Bühne" + } + } + }, + { + "id": "Stage/stopSound(String)", + "memberId": "Stage/stopSound", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "stopSound", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Stops the playing of the sound with the given name", + "description": "Stops the playing of the sound with the given name", + "scratchblock": null, + "paramDocs": [ + "name: Name of the sound" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/stopSound", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Stoppt den Klang mit dem angegebenen Namen" + } + } + }, + { + "id": "Stage/switchBackdrop(String)", + "memberId": "Stage/switchBackdrop", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "switchBackdrop", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Switch to a backdrop by name.", + "description": "Switch to a backdrop by name.", + "scratchblock": "switch backdrop to [name v]", + "paramDocs": [ + "name: the name of a backdrop" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/switchBackdrop", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zum Hintergrund mit dem angegebenen Namen" + } + } + }, + { + "id": "Stage/wait(int)", + "memberId": "Stage/wait", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "wait", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "millis" + ], + "params": [ + "int millis" + ], + "summary": "Stop the execution of the whole applications for the given milliseconds.", + "description": "Stop the execution of the whole applications for the given milliseconds.", + "scratchblock": "wait (millis) seconds", + "paramDocs": [ + "millis: Milliseconds" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/wait", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Pausiert das Programm für die angegebene Zeit in Millisekunden" + } + } + }, + { + "id": "Stage/waitUntil(BooleanSupplier)", + "memberId": "Stage/waitUntil", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "waitUntil", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.util.function.BooleanSupplier" + ], + "parameterNames": [ + "condition" + ], + "params": [ + "BooleanSupplier condition" + ], + "summary": "Waits until something becomes true, then carries on.", + "description": "Waits until something becomes true, then carries on.\n\nLike [wait(int)](wait) this holds up the code that calls it, not the whole\nprogram: sprites keep running and the stage keeps drawing while it waits.\nThat makes it useful for setting a scene up in a constructor, and a bad idea\ninside `run()`, which is called once per frame and should return quickly.\n\n```java\nthis.ask(\"What is your name?\");\nthis.waitUntil(() -> !this.isAsking());\nthis.display(\"Hello \" + this.getAnswer() + \"!\");\n```", + "scratchblock": "wait until <condition>", + "paramDocs": [ + "condition: checked over and over until it is true" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/waitUntil", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wartet, bis die Bedingung erfüllt ist" + } + } + }, + { + "id": "Stage/whenBackdropSwitches(String)", + "memberId": "Stage/whenBackdropSwitches", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "whenBackdropSwitches", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "This method is called when the backdrop switches to the specified name.\nOverride this method to\nadd custom behavior.", + "description": "This method is called when the backdrop switches to the specified name.\nOverride this method to\nadd custom behavior.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the backdrop to switch to" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/whenBackdropSwitches", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird beim Wechsel des Hintergrunds aufgerufen" + } + } + }, + { + "id": "Stage/whenIReceive(String)", + "memberId": "Stage/whenIReceive", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "whenIReceive", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "message" + ], + "params": [ + "String message" + ], + "summary": "This method is called when a specific message is received. Override this\nmethod to add custom\nbehavior.", + "description": "This method is called when a specific message is received. Override this\nmethod to add custom\nbehavior.", + "scratchblock": "when I receive [message v]", + "paramDocs": [ + "message: The message that triggers this method." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/whenIReceive", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird bei broadcast(message) aufgerufen" + } + } + }, + { + "id": "Stage/whenKeyPressed(KeyCode)", + "memberId": "Stage/whenKeyPressed", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "whenKeyPressed", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.KeyCode" + ], + "parameterNames": [ + "keyCode" + ], + "params": [ + "KeyCode keyCode" + ], + "summary": "This method is called when a key is pressed. Override this method to add\ncustom behavior.", + "description": "This method is called when a key is pressed. Override this method to add\ncustom behavior.", + "scratchblock": "when [space v] key pressed", + "paramDocs": [ + "keyCode: the key that was pressed" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/whenKeyPressed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird beim Drücken der Taste aufgerufen" + } + } + }, + { + "id": "Stage/whenKeyReleased(KeyCode)", + "memberId": "Stage/whenKeyReleased", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "whenKeyReleased", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.KeyCode" + ], + "parameterNames": [ + "keyCode" + ], + "params": [ + "KeyCode keyCode" + ], + "summary": "This method is called when a key is released. Override this method to add\ncustom behavior.", + "description": "This method is called when a key is released. Override this method to add\ncustom behavior.", + "scratchblock": null, + "paramDocs": [ + "keyCode: the key that was released" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/whenKeyReleased", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird beim Loslassen der Taste aufgerufen" + } + } + }, + { + "id": "Stage/whenMouseClicked(MouseCode)", + "memberId": "Stage/whenMouseClicked", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "whenMouseClicked", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.MouseCode" + ], + "parameterNames": [ + "mouseEvent" + ], + "params": [ + "MouseCode mouseEvent" + ], + "summary": "This method is called when a mouse click event occurs. Overwrite this method\nto add custom\nbehavior.", + "description": "This method is called when a mouse click event occurs. Overwrite this method\nto add custom\nbehavior.", + "scratchblock": "when stage clicked", + "paramDocs": [ + "mouseEvent: The mouse event that triggered this method." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/whenMouseClicked", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird bei einem Mausklick aufgerufen" + } + } + }, + { + "id": "Stage/whenMouseWheelMoved(int)", + "memberId": "Stage/whenMouseWheelMoved", + "owner": "org.openpatch.scratch.Stage", + "className": "Stage", + "methodName": "whenMouseWheelMoved", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "steps" + ], + "params": [ + "int steps" + ], + "summary": "This method is called when the mouse wheel is moved. Overwrite this method to\nadd custom\nbehavior.", + "description": "This method is called when the mouse wheel is moved. Overwrite this method to\nadd custom\nbehavior.", + "scratchblock": null, + "paramDocs": [ + "steps: the number of steps the mouse wheel has moved. Positive values\n indicate movement\n away from the user, while negative values indicate movement\n towards the user." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Stage/whenMouseWheelMoved", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird beim Drehen des Mausrads aufgerufen" + } + } + }, + { + "id": "Text/addFont(String,String)", + "memberId": "Text/addFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "addFont", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "path" + ], + "params": [ + "String name", + "String path" + ], + "summary": "Adds a new font to the list of fonts if it does not already exist.", + "description": "Adds a new font to the list of fonts if it does not already exist.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the font to be added", + "path: the path to the font file" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/addFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Fügt eine Schriftart hinzu" + } + } + }, + { + "id": "Text/constructor()", + "memberId": "Text/constructor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "constructor", + "static": false, + "returnType": "Text", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Text object with default values. The text is initialized to an empty string,\npositioned at (0, 0), with a default size of 0. The text style is set to plain and the text\nis centred on its position, as every text is. Call [setAlign(TextAlign)](setAlign) for anything\nelse.", + "description": "Constructs a new Text object with default values. The text is initialized to an empty string,\npositioned at (0, 0), with a default size of 0. The text style is set to plain and the text\nis centred on its position, as every text is. Call [setAlign(TextAlign)](setAlign) for anything\nelse.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen leeren Text in der Mitte der Bühne" + } + } + }, + { + "id": "Text/constructor(Sprite)", + "memberId": "Text/constructor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "constructor", + "static": false, + "returnType": "Text", + "parameterTypes": [ + "org.openpatch.scratch.Sprite" + ], + "parameterNames": [ + "s" + ], + "params": [ + "Sprite s" + ], + "summary": "Constructs a new Text object associated with a given Sprite.", + "description": "Constructs a new Text object associated with a given Sprite.", + "scratchblock": null, + "paramDocs": [ + "s: the Sprite to associate with this Text object" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen Text an der angegebenen Position mit der angegebenen Breite" + } + } + }, + { + "id": "Text/constructor(String,double,double,double)", + "memberId": "Text/constructor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "constructor", + "static": false, + "returnType": "Text", + "parameterTypes": [ + "java.lang.String", + "double", + "double", + "double" + ], + "parameterNames": [ + "text", + "x", + "y", + "width" + ], + "params": [ + "String text", + "double x", + "double y", + "double width" + ], + "summary": "Constructs a new Text object with the specified text, position, and width.", + "description": "Constructs a new Text object with the specified text, position, and width.", + "scratchblock": null, + "paramDocs": [ + "text: the text to be displayed", + "x: the x-coordinate of the text's position", + "y: the y-coordinate of the text's position", + "width: the width of the text" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Text/constructor(String,double,double,double,TextStyle)", + "memberId": "Text/constructor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "constructor", + "static": false, + "returnType": "Text", + "parameterTypes": [ + "java.lang.String", + "double", + "double", + "double", + "org.openpatch.scratch.TextStyle" + ], + "parameterNames": [ + "text", + "x", + "y", + "width", + "style" + ], + "params": [ + "String text", + "double x", + "double y", + "double width", + "TextStyle style" + ], + "summary": "Constructs a new Text object with the specified text, position, width, and style.", + "description": "Constructs a new Text object with the specified text, position, width, and style.", + "scratchblock": null, + "paramDocs": [ + "text: the text content to be displayed", + "x: the x-coordinate of the text's position", + "y: the y-coordinate of the text's position", + "width: the width of the text area", + "style: the style to be applied to the text" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen Text an der angegebenen Position, mit der angegebenen Breite und im angegebenen Stil" + } + } + }, + { + "id": "Text/constructor(Text)", + "memberId": "Text/constructor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "constructor", + "static": false, + "returnType": "Text", + "parameterTypes": [ + "org.openpatch.scratch.Text" + ], + "parameterNames": [ + "t" + ], + "params": [ + "Text t" + ], + "summary": "Copy constructor for the Text class. Creates a new Text object by copying the properties of the\ngiven Text object.", + "description": "Copy constructor for the Text class. Creates a new Text object by copying the properties of the\ngiven Text object.", + "scratchblock": null, + "paramDocs": [ + "t: the Text object to copy" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Text/getAlign()", + "memberId": "Text/getAlign", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getAlign", + "static": false, + "returnType": "TextAlign", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns where the text sits relative to its position.", + "description": "Returns where the text sits relative to its position.", + "scratchblock": null, + "paramDocs": [], + "returns": "the alignment", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getAlign", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Ausrichtung des Texts zurück" + } + } + }, + { + "id": "Text/getCurrentFontIndex()", + "memberId": "Text/getCurrentFontIndex", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getCurrentFontIndex", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the index of the current font.", + "description": "Returns the index of the current font.", + "scratchblock": null, + "paramDocs": [], + "returns": "the index of the current font", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getCurrentFontIndex", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Nummer der aktuellen Schriftart zurück" + } + } + }, + { + "id": "Text/getCurrentFontName()", + "memberId": "Text/getCurrentFontName", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getCurrentFontName", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the name of the current font.", + "description": "Retrieves the name of the current font.", + "scratchblock": null, + "paramDocs": [], + "returns": "the name of the current font, or `null` if no fonts are available.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getCurrentFontName", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Namen der aktuellen Schriftart zurück" + } + } + }, + { + "id": "Text/getDefaultFont()", + "memberId": "Text/getDefaultFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getDefaultFont", + "static": true, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the font that text is written in by default.", + "description": "Returns the font that text is written in by default.", + "scratchblock": null, + "paramDocs": [], + "returns": "the path to the font file", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getDefaultFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Standardschriftart zurück" + } + } + }, + { + "id": "Text/getDefaultFontSize()", + "memberId": "Text/getDefaultFontSize", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getDefaultFontSize", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the size text is written in by default.", + "description": "Returns the size text is written in by default.", + "scratchblock": null, + "paramDocs": [], + "returns": "the font size", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getDefaultFontSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Standardschriftgröße zurück" + } + } + }, + { + "id": "Text/getFont()", + "memberId": "Text/getFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getFont", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the name of the font.", + "description": "Retrieves the name of the font.", + "scratchblock": null, + "paramDocs": [], + "returns": "the name of the font as a String.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Namen der aktuellen Schriftart zurück" + } + } + }, + { + "id": "Text/getPosition()", + "memberId": "Text/getPosition", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getPosition", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current position as a Vector2 object.", + "description": "Retrieves the current position as a Vector2 object.", + "scratchblock": null, + "paramDocs": [], + "returns": "a Vector2 object representing the current x and y coordinates.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Position des Texts zurück" + } + } + }, + { + "id": "Text/getStage()", + "memberId": "Text/getStage", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getStage", + "static": false, + "returnType": "Stage", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current stage associated with this object.", + "description": "Retrieves the current stage associated with this object.", + "scratchblock": null, + "paramDocs": [], + "returns": "the current stage", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Bühne zurück, auf der der Text liegt" + } + } + }, + { + "id": "Text/getStyle()", + "memberId": "Text/getStyle", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getStyle", + "static": false, + "returnType": "TextStyle", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the style the text is drawn in.", + "description": "Returns the style the text is drawn in.", + "scratchblock": null, + "paramDocs": [], + "returns": "the style, never null", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getStyle", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Stil zurück, in dem der Text gezeichnet wird" + } + } + }, + { + "id": "Text/getTextSize()", + "memberId": "Text/getTextSize", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getTextSize", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the size of the text.", + "description": "Returns the size of the text.", + "scratchblock": null, + "paramDocs": [], + "returns": "the size of the text as an integer", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getTextSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Schriftgröße zurück" + } + } + }, + { + "id": "Text/getWidth()", + "memberId": "Text/getWidth", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getWidth", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the width of the text.", + "description": "Returns the width of the text.", + "scratchblock": null, + "paramDocs": [], + "returns": "the width of the text as a double", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getWidth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Breite des Textfelds zurück" + } + } + }, + { + "id": "Text/getX()", + "memberId": "Text/getX", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getX", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the x-coordinate of this object.", + "description": "Returns the x-coordinate of this object.", + "scratchblock": null, + "paramDocs": [], + "returns": "the x-coordinate as a double", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die x-Position zurück" + } + } + }, + { + "id": "Text/getY()", + "memberId": "Text/getY", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "getY", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the y-coordinate of this object.", + "description": "Returns the y-coordinate of this object.", + "scratchblock": null, + "paramDocs": [], + "returns": "the y-coordinate as a double", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/getY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die y-Position zurück" + } + } + }, + { + "id": "Text/goLayersBackwards(int)", + "memberId": "Text/goLayersBackwards", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "goLayersBackwards", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "number" + ], + "params": [ + "int number" + ], + "summary": "Moves the text backwards by a specified number of layers in the stage. If\nthe text is not on a stage, the method does nothing.", + "description": "Moves the text backwards by a specified number of layers in the stage. If\nthe text is not on a stage, the method does nothing.", + "scratchblock": "go [backward v] (number) layers", + "paramDocs": [ + "number: the number of layers to move the text backwards" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/goLayersBackwards", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schiebt den Text um die angegebene Anzahl Ebenen nach hinten" + } + } + }, + { + "id": "Text/goLayersForwards(int)", + "memberId": "Text/goLayersForwards", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "goLayersForwards", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "number" + ], + "params": [ + "int number" + ], + "summary": "Moves the text forward by a specified number of layers within its stage. If\nthe text is not on a stage, the method does nothing.", + "description": "Moves the text forward by a specified number of layers within its stage. If\nthe text is not on a stage, the method does nothing.", + "scratchblock": "go [forward v] (number) layers", + "paramDocs": [ + "number: the number of layers to move the text forward" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/goLayersForwards", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Bringt den Text um die angegebene Anzahl Ebenen nach vorne" + } + } + }, + { + "id": "Text/goToBackLayer()", + "memberId": "Text/goToBackLayer", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "goToBackLayer", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves this text to the back layer of the stage, behind every other text on\nit. If the text is not on a stage, the method does nothing.", + "description": "Moves this text to the back layer of the stage, behind every other text on\nit. If the text is not on a stage, the method does nothing.\n\nTexts are drawn on top of the sprites, so this orders a text against the\nother texts rather than against the sprites.", + "scratchblock": "go to [back v] layer", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/goToBackLayer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schiebt den Text hinter die anderen Texte" + } + } + }, + { + "id": "Text/goToFrontLayer()", + "memberId": "Text/goToFrontLayer", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "goToFrontLayer", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Moves this text to the front layer of the stage, in front of every other\ntext on it. If the text is not on a stage, the method does nothing.", + "description": "Moves this text to the front layer of the stage, in front of every other\ntext on it. If the text is not on a stage, the method does nothing.\n\nTexts are drawn on top of the sprites, so this orders a text against the\nother texts rather than against the sprites.", + "scratchblock": "go to [front v] layer", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/goToFrontLayer", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Bringt den Text vor die anderen Texte" + } + } + }, + { + "id": "Text/isUI()", + "memberId": "Text/isUI", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "isUI", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks if the current instance is a UI element.", + "description": "Checks if the current instance is a UI element.", + "scratchblock": null, + "paramDocs": [], + "returns": "`true` if this instance is a UI element, `false` otherwise.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/isUI", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn der Text zur Benutzeroberfläche gehört" + } + } + }, + { + "id": "Text/nextFont()", + "memberId": "Text/nextFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "nextFont", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Advances to the next font in the list of available fonts. The current font index is incremented\nby one and wraps around to the beginning of the list if it exceeds the number of available\nfonts.", + "description": "Advances to the next font in the list of available fonts. The current font index is incremented\nby one and wraps around to the beginning of the list if it exceeds the number of available\nfonts.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/nextFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zur nächsten Schriftart" + } + } + }, + { + "id": "Text/remove()", + "memberId": "Text/remove", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "remove", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Removes this object from its current stage if it is associated with one. If the object is not\nassociated with any stage, this method does nothing.", + "description": "Removes this object from its current stage if it is associated with one. If the object is not\nassociated with any stage, this method does nothing.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/remove", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Entfernt den Text von der Bühne" + } + } + }, + { + "id": "Text/setAlign(TextAlign)", + "memberId": "Text/setAlign", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setAlign", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.TextAlign" + ], + "parameterNames": [ + "align" + ], + "params": [ + "TextAlign align" + ], + "summary": "Sets the alignment of the text.", + "description": "Sets the alignment of the text.", + "scratchblock": null, + "paramDocs": [ + "align: where the text should sit relative to its position" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setAlign", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt fest, wie der Text zu seiner Position ausgerichtet wird" + } + } + }, + { + "id": "Text/setBackgroundColor(int,int,int)", + "memberId": "Text/setBackgroundColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setBackgroundColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int", + "int", + "int" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "int r", + "int g", + "int b" + ], + "summary": "Sets the background color using the specified RGB values.", + "description": "Sets the background color using the specified RGB values.", + "scratchblock": null, + "paramDocs": [ + "r: the red component of the color (0-255)", + "g: the green component of the color (0-255)", + "b: the blue component of the color (0-255)" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setBackgroundColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Hintergrundfarbe aus Rot-, Grün- und Blauanteil (jeweils 0 bis 255)" + } + } + }, + { + "id": "Text/setBackgroundColor(double)", + "memberId": "Text/setBackgroundColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setBackgroundColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Sets the background color using the specified hue value.", + "description": "Sets the background color using the specified hue value.", + "scratchblock": null, + "paramDocs": [ + "h: the hue value for the background color" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setBackgroundColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Hintergrundfarbe über den Farbton (0 bis 255)" + } + } + }, + { + "id": "Text/setBackgroundColor(Color)", + "memberId": "Text/setBackgroundColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setBackgroundColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Color c" + ], + "summary": "Sets the background color of the text.", + "description": "Sets the background color of the text.", + "scratchblock": null, + "paramDocs": [ + "c: the new background color to be set" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setBackgroundColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Hintergrundfarbe" + } + } + }, + { + "id": "Text/setFont(String)", + "memberId": "Text/setFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setFont", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Sets the font name for the text.", + "description": "Sets the font name for the text.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the font to be set" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zur Schriftart mit dem angegebenen Namen" + } + } + }, + { + "id": "Text/setIsUI(boolean)", + "memberId": "Text/setIsUI", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setIsUI", + "static": false, + "returnType": "void", + "parameterTypes": [ + "boolean" + ], + "parameterNames": [ + "isUI" + ], + "params": [ + "boolean isUI" + ], + "summary": "Sets the UI status of this object.", + "description": "Sets the UI status of this object.", + "scratchblock": null, + "paramDocs": [ + "isUI: a boolean indicating whether this object is part of the UI" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setIsUI", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt fest, ob der Text zur Benutzeroberfläche gehört und sich nicht mit der Kamera bewegt" + } + } + }, + { + "id": "Text/setPosition(double,double)", + "memberId": "Text/setPosition", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Sets the position of the text", + "description": "Sets the position of the text", + "scratchblock": null, + "paramDocs": [ + "x: a x coordinate", + "y: a y coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Text an die angegebene Position (Mitte der Bühne ist 0/0)" + } + } + }, + { + "id": "Text/setPosition(Vector2)", + "memberId": "Text/setPosition", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Sets the position of the text object using a Vector2 object.", + "description": "Sets the position of the text object using a Vector2 object.", + "scratchblock": null, + "paramDocs": [ + "v: the Vector2 object containing the x and y coordinates" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Text an die angegebene Position (Mitte der Bühne ist 0/0)" + } + } + }, + { + "id": "Text/setStrokeColor(int,int,int)", + "memberId": "Text/setStrokeColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setStrokeColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int", + "int", + "int" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "int r", + "int g", + "int b" + ], + "summary": "Sets the stroke color using the specified RGB values.", + "description": "Sets the stroke color using the specified RGB values.", + "scratchblock": null, + "paramDocs": [ + "r: the red component of the color (0-255)", + "g: the green component of the color (0-255)", + "b: the blue component of the color (0-255)" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setStrokeColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Rahmenfarbe aus Rot-, Grün- und Blauanteil (jeweils 0 bis 255)" + } + } + }, + { + "id": "Text/setStrokeColor(double)", + "memberId": "Text/setStrokeColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setStrokeColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Sets the stroke color using the specified hue value.", + "description": "Sets the stroke color using the specified hue value.", + "scratchblock": null, + "paramDocs": [ + "h: the hue value for the stroke color" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setStrokeColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Rahmenfarbe über den Farbton (0 bis 255)" + } + } + }, + { + "id": "Text/setStrokeColor(Color)", + "memberId": "Text/setStrokeColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setStrokeColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Color c" + ], + "summary": "Sets the stroke color for the text.", + "description": "Sets the stroke color for the text.", + "scratchblock": null, + "paramDocs": [ + "c: the color to set as the stroke color" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setStrokeColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Rahmenfarbe" + } + } + }, + { + "id": "Text/setStyle(TextStyle)", + "memberId": "Text/setStyle", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setStyle", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.TextStyle" + ], + "parameterNames": [ + "style" + ], + "params": [ + "TextStyle style" + ], + "summary": "Sets the style of the text.", + "description": "Sets the style of the text.", + "scratchblock": null, + "paramDocs": [ + "style: the TextStyle to be applied to the text" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setStyle", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt fest, ob der Text als Kasten, Sprech- oder Denkblase dargestellt wird" + } + } + }, + { + "id": "Text/setTextColor(int,int,int)", + "memberId": "Text/setTextColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setTextColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int", + "int", + "int" + ], + "parameterNames": [ + "r", + "g", + "b" + ], + "params": [ + "int r", + "int g", + "int b" + ], + "summary": "Sets the text color using RGB values.", + "description": "Sets the text color using RGB values.", + "scratchblock": null, + "paramDocs": [ + "r: the red component of the color (0-255)", + "g: the green component of the color (0-255)", + "b: the blue component of the color (0-255)" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setTextColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Schriftfarbe aus Rot-, Grün- und Blauanteil (jeweils 0 bis 255)" + } + } + }, + { + "id": "Text/setTextColor(double)", + "memberId": "Text/setTextColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setTextColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "h" + ], + "params": [ + "double h" + ], + "summary": "Sets the text color using the specified hue value.", + "description": "Sets the text color using the specified hue value.", + "scratchblock": null, + "paramDocs": [ + "h: the hue value for the text color" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setTextColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Schriftfarbe über den Farbton (0 bis 255)" + } + } + }, + { + "id": "Text/setTextColor(Color)", + "memberId": "Text/setTextColor", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setTextColor", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "c" + ], + "params": [ + "Color c" + ], + "summary": "Sets the color of the text.", + "description": "Sets the color of the text.", + "scratchblock": null, + "paramDocs": [ + "c: the new color to be set for the text" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setTextColor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Schriftfarbe" + } + } + }, + { + "id": "Text/setTextSize(int)", + "memberId": "Text/setTextSize", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setTextSize", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "size" + ], + "params": [ + "int size" + ], + "summary": "Sets the size of the text.", + "description": "Sets the size of the text.", + "scratchblock": null, + "paramDocs": [ + "size: the new size of the text" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setTextSize", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Schriftgröße" + } + } + }, + { + "id": "Text/setWidth(double)", + "memberId": "Text/setWidth", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setWidth", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "width" + ], + "params": [ + "double width" + ], + "summary": "Sets the width of the text.", + "description": "Sets the width of the text.", + "scratchblock": null, + "paramDocs": [ + "width: the new width to set" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setWidth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Breite des Textfelds; längere Texte werden umgebrochen" + } + } + }, + { + "id": "Text/setX(double)", + "memberId": "Text/setX", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setX", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Sets the x-coordinate for this object.", + "description": "Sets the x-coordinate for this object.", + "scratchblock": null, + "paramDocs": [ + "x: the new x-coordinate value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die x-Position" + } + } + }, + { + "id": "Text/setY(double)", + "memberId": "Text/setY", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "setY", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "y" + ], + "params": [ + "double y" + ], + "summary": "Sets the Y coordinate of the text.", + "description": "Sets the Y coordinate of the text.", + "scratchblock": null, + "paramDocs": [ + "y: the new Y coordinate value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/setY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die y-Position" + } + } + }, + { + "id": "Text/showText(String)", + "memberId": "Text/showText", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "showText", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "text" + ], + "params": [ + "String text" + ], + "summary": "Displays the specified text.", + "description": "Displays the specified text.", + "scratchblock": null, + "paramDocs": [ + "text: The text to be displayed. If the text is null or empty, the text will be set to\n null." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/showText", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt den Text an" + } + } + }, + { + "id": "Text/showText(String,int)", + "memberId": "Text/showText", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "showText", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int" + ], + "parameterNames": [ + "text", + "millis" + ], + "params": [ + "String text", + "int millis" + ], + "summary": "Displays the specified text for a given duration.", + "description": "Displays the specified text for a given duration.", + "scratchblock": null, + "paramDocs": [ + "text: The text to be displayed.", + "millis: The duration in milliseconds for which the text should be displayed." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/showText", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt den Text für die angegebene Zeit in Millisekunden an" + } + } + }, + { + "id": "Text/switchFont(String)", + "memberId": "Text/switchFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "switchFont", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Switches the current font to the font with the specified name.", + "description": "Switches the current font to the font with the specified name.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the font to switch to" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/switchFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt zur Schriftart mit dem angegebenen Namen" + } + } + }, + { + "id": "Text/useFont(String,int)", + "memberId": "Text/useFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "useFont", + "static": true, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int" + ], + "parameterNames": [ + "path", + "size" + ], + "params": [ + "String path", + "int size" + ], + "summary": "Chooses the font all text is written in, and how big it is.", + "description": "Chooses the font all text is written in, and how big it is.\n\nCall it before the first stage is created. The font is loaded while the\nwindow starts up, so choosing one later is not reliable.\n\n```java\npublic static void main(String[] args) {\n Text.useFont(\"assets/Retro Gaming.ttf\", 11);\n new MyStage();\n}\n```", + "scratchblock": null, + "paramDocs": [ + "path: the path to a .ttf or .otf file", + "size: the size to write in" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/useFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt Schriftart und -größe für alle Texte fest" + } + } + }, + { + "id": "Text/useFont(String)", + "memberId": "Text/useFont", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "useFont", + "static": true, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "path" + ], + "params": [ + "String path" + ], + "summary": "Chooses the font all text is written in, keeping the current size.", + "description": "Chooses the font all text is written in, keeping the current size.", + "scratchblock": null, + "paramDocs": [ + "path: the path to a .ttf or .otf file" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/useFont", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt die Schriftart für alle Texte fest" + } + } + }, + { + "id": "Text/useFontSizes(int[])", + "memberId": "Text/useFontSizes", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "useFontSizes", + "static": true, + "returnType": "void", + "parameterTypes": [ + "int[]" + ], + "parameterNames": [ + "sizes" + ], + "params": [ + "int[] sizes" + ], + "summary": "Prepares several sizes of the font in advance. Only needed when text is\nshown at more than one size, so that every size looks sharp.", + "description": "Prepares several sizes of the font in advance. Only needed when text is\nshown at more than one size, so that every size looks sharp.", + "scratchblock": null, + "paramDocs": [ + "sizes: the sizes to prepare" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/useFontSizes", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Text/useSmoothing(boolean)", + "memberId": "Text/useSmoothing", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "useSmoothing", + "static": true, + "returnType": "void", + "parameterTypes": [ + "boolean" + ], + "parameterNames": [ + "smooth" + ], + "params": [ + "boolean smooth" + ], + "summary": "Chooses whether letters are smoothed. Turn it off for pixel fonts.", + "description": "Chooses whether letters are smoothed. Turn it off for pixel fonts.", + "scratchblock": null, + "paramDocs": [ + "smooth: true to smooth the letters" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/useSmoothing", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt fest, ob Schrift geglättet wird" + } + } + }, + { + "id": "Text/whenAddedToStage()", + "memberId": "Text/whenAddedToStage", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "whenAddedToStage", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "This method is called when the object is added to the stage. Override this method to define\ncustom behavior when the object is added to the stage.", + "description": "This method is called when the object is added to the stage. Override this method to define\ncustom behavior when the object is added to the stage.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/whenAddedToStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn der Text der Bühne hinzugefügt wird" + } + } + }, + { + "id": "Text/whenAddedToStage(Stage)", + "memberId": "Text/whenAddedToStage", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "whenAddedToStage", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Stage" + ], + "parameterNames": [ + "stage" + ], + "params": [ + "Stage stage" + ], + "summary": "This method is called when the text is added to the stage. Override this method to define\ncustom behavior when the text.", + "description": "This method is called when the text is added to the stage. Override this method to define\ncustom behavior when the text.", + "scratchblock": null, + "paramDocs": [ + "stage: The stage to which the text is added." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/whenAddedToStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn der Text der Bühne hinzugefügt wird" + } + } + }, + { + "id": "Text/whenRemovedFromStage()", + "memberId": "Text/whenRemovedFromStage", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "whenRemovedFromStage", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "This method is called when the object is removed from the stage. Override this method to define\ncustom behavior that should occur when the object is no longer part of the stage.", + "description": "This method is called when the object is removed from the stage. Override this method to define\ncustom behavior that should occur when the object is no longer part of the stage.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/whenRemovedFromStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn der Text von der Bühne entfernt wird" + } + } + }, + { + "id": "Text/whenRemovedFromStage(Stage)", + "memberId": "Text/whenRemovedFromStage", + "owner": "org.openpatch.scratch.Text", + "className": "Text", + "methodName": "whenRemovedFromStage", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Stage" + ], + "parameterNames": [ + "stage" + ], + "params": [ + "Stage stage" + ], + "summary": "This method is called when the text is removed from the stage. Override this method to define\ncustom behavior that should occur.", + "description": "This method is called when the text is removed from the stage. Override this method to define\ncustom behavior that should occur.", + "scratchblock": null, + "paramDocs": [ + "stage: The stage from which the text is removed." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Text/whenRemovedFromStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird aufgerufen, wenn der Text von der Bühne entfernt wird" + } + } + }, + { + "id": "Timer/afterMillis(int)", + "memberId": "Timer/afterMillis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "afterMillis", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "millis" + ], + "params": [ + "int millis" + ], + "summary": "Checks if the specified number of milliseconds has passed since the method was first called.", + "description": "Checks if the specified number of milliseconds has passed since the method was first called.", + "scratchblock": null, + "paramDocs": [ + "millis: the number of milliseconds to check against" + ], + "returns": "true if the specified number of milliseconds has passed since the method was first\n called, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/afterMillis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt true zurück, sobald seit dem Zurücksetzen millis Millisekunden vergangen sind" + } + } + }, + { + "id": "Timer/constructor()", + "memberId": "Timer/constructor", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "constructor", + "static": false, + "returnType": "Timer", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Timer object.", + "description": "Constructs a new Timer object.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen neuen Timer" + } + } + }, + { + "id": "Timer/everyMillis(int)", + "memberId": "Timer/everyMillis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "everyMillis", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "millis" + ], + "params": [ + "int millis" + ], + "summary": "Checks if the specified number of milliseconds has passed since the last time this method\nreturned true.", + "description": "Checks if the specified number of milliseconds has passed since the last time this method\nreturned true.", + "scratchblock": null, + "paramDocs": [ + "millis: The number of milliseconds to wait before returning true." + ], + "returns": "true if the specified number of milliseconds has passed since the last call that\n returned true, false otherwise.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/everyMillis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt alle millis Millisekunden einmal true zurück" + } + } + }, + { + "id": "Timer/forMillis(int)", + "memberId": "Timer/forMillis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "forMillis", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "millis" + ], + "params": [ + "int millis" + ], + "summary": "Checks if the specified amount of milliseconds has passed since the method was first called. If\nthe method is called for the first time, it initializes the start time.", + "description": "Checks if the specified amount of milliseconds has passed since the method was first called. If\nthe method is called for the first time, it initializes the start time.", + "scratchblock": null, + "paramDocs": [ + "millis: the number of milliseconds to check against" + ], + "returns": "true if the current time is less than the start time plus the specified milliseconds,\n false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/forMillis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt für die ersten millis Millisekunden nach dem Zurücksetzen true zurück" + } + } + }, + { + "id": "Timer/intervalMillis(int)", + "memberId": "Timer/intervalMillis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "intervalMillis", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "int" + ], + "parameterNames": [ + "millis" + ], + "params": [ + "int millis" + ], + "summary": "Checks if the specified interval in milliseconds has passed.", + "description": "Checks if the specified interval in milliseconds has passed.", + "scratchblock": null, + "paramDocs": [ + "millis: the interval in milliseconds to check" + ], + "returns": "true if the interval has passed, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/intervalMillis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt alle millis Millisekunden zwischen true und false" + } + } + }, + { + "id": "Timer/intervalMillis(int,boolean)", + "memberId": "Timer/intervalMillis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "intervalMillis", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "int", + "boolean" + ], + "parameterNames": [ + "millis", + "skipFirst" + ], + "params": [ + "int millis", + "boolean skipFirst" + ], + "summary": "Checks if the specified interval in milliseconds has passed.", + "description": "Checks if the specified interval in milliseconds has passed.", + "scratchblock": null, + "paramDocs": [ + "millis: the interval in milliseconds to check", + "skipFirst: if true, the first interval will be skipped" + ], + "returns": "true if the interval has passed, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/intervalMillis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wechselt alle millis Millisekunden zwischen true und false; skipFirst überspringt das erste Intervall" + } + } + }, + { + "id": "Timer/intervalMillis(int,int)", + "memberId": "Timer/intervalMillis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "intervalMillis", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "int", + "int" + ], + "parameterNames": [ + "millis1", + "millis2" + ], + "params": [ + "int millis1", + "int millis2" + ], + "summary": "Checks if the specified interval in milliseconds has passed.", + "description": "Checks if the specified interval in milliseconds has passed.", + "scratchblock": null, + "paramDocs": [ + "millis1: the first interval in milliseconds to check", + "millis2: the second interval in milliseconds to check" + ], + "returns": "true if the interval has passed, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/intervalMillis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt millis1 Millisekunden lang true und danach millis2 Millisekunden lang false zurück" + } + } + }, + { + "id": "Timer/intervalMillis(int,int,boolean)", + "memberId": "Timer/intervalMillis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "intervalMillis", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "int", + "int", + "boolean" + ], + "parameterNames": [ + "millis1", + "millis2", + "skipFirst" + ], + "params": [ + "int millis1", + "int millis2", + "boolean skipFirst" + ], + "summary": "Checks if the specified interval in milliseconds has passed.", + "description": "Checks if the specified interval in milliseconds has passed.", + "scratchblock": null, + "paramDocs": [ + "millis1: the first interval in milliseconds to check", + "millis2: the second interval in milliseconds to check", + "skipFirst: if true, the first interval will be skipped" + ], + "returns": "true if the interval has passed, false otherwise", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/intervalMillis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt millis1 Millisekunden lang true und danach millis2 Millisekunden lang false zurück; skipFirst überspringt das erste Intervall" + } + } + }, + { + "id": "Timer/millis()", + "memberId": "Timer/millis", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "millis", + "static": true, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the number of milliseconds of game time since the program started.\nGame time stands still while the game is paused and runs slower or faster\nwith the game speed (see [Window.pause()](../Window/pause) and\n[Window.setGameSpeed(double)](../Window/setGameSpeed)); without either, it is the real time.", + "description": "Returns the number of milliseconds of game time since the program started.\nGame time stands still while the game is paused and runs slower or faster\nwith the game speed (see [Window.pause()](../Window/pause) and\n[Window.setGameSpeed(double)](../Window/setGameSpeed)); without either, it is the real time.", + "scratchblock": "(timer)", + "paramDocs": [], + "returns": "the milliseconds of game time since the program started", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/millis", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die seit dem Programmstart vergangenen Millisekunden zurück" + } + } + }, + { + "id": "Timer/reset()", + "memberId": "Timer/reset", + "owner": "org.openpatch.scratch.Timer", + "className": "Timer", + "methodName": "reset", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Resets the timer.", + "description": "Resets the timer.", + "scratchblock": "reset timer", + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Timer/reset", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt den Timer auf 0 zurück" + } + } + }, + { + "id": "Triangle/constructor(double,double,double,double,double,double)", + "memberId": "Triangle/constructor", + "owner": "org.openpatch.scratch.Triangle", + "className": "Triangle", + "methodName": "constructor", + "static": false, + "returnType": "Triangle", + "parameterTypes": [ + "double", + "double", + "double", + "double", + "double", + "double" + ], + "parameterNames": [ + "x1", + "y1", + "x2", + "y2", + "x3", + "y3" + ], + "params": [ + "double x1", + "double y1", + "double x2", + "double y2", + "double x3", + "double y3" + ], + "summary": "Creates a triangle with the specified vertices.", + "description": "Creates a triangle with the specified vertices.", + "scratchblock": null, + "paramDocs": [ + "x1: the x-coordinate of the first vertex", + "y1: the y-coordinate of the first vertex", + "x2: the x-coordinate of the second vertex", + "y2: the y-coordinate of the second vertex", + "x3: the x-coordinate of the third vertex", + "y3: the y-coordinate of the third vertex" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Triangle/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein Dreieck aus den drei Eckpunkten" + } + } + }, + { + "id": "UISprite/changeHeight(double)", + "memberId": "UISprite/changeHeight", + "owner": "org.openpatch.scratch.UISprite", + "className": "UISprite", + "methodName": "changeHeight", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "amount" + ], + "params": [ + "double amount" + ], + "summary": "Changes the height of the sprite by the given number of pixels.", + "description": "Changes the height of the sprite by the given number of pixels.", + "scratchblock": null, + "paramDocs": [ + "amount: how many pixels to add to the height" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/UISprite/changeHeight", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Höhe um die angegebene Anzahl Pixel" + } + } + }, + { + "id": "UISprite/changeWidth(double)", + "memberId": "UISprite/changeWidth", + "owner": "org.openpatch.scratch.UISprite", + "className": "UISprite", + "methodName": "changeWidth", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "amount" + ], + "params": [ + "double amount" + ], + "summary": "Changes the width of the sprite by the given number of pixels.", + "description": "Changes the width of the sprite by the given number of pixels.", + "scratchblock": null, + "paramDocs": [ + "amount: how many pixels to add to the width" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/UISprite/changeWidth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Ändert die Breite um die angegebene Anzahl Pixel" + } + } + }, + { + "id": "UISprite/constructor()", + "memberId": "UISprite/constructor", + "owner": "org.openpatch.scratch.UISprite", + "className": "UISprite", + "methodName": "constructor", + "static": false, + "returnType": "UISprite", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Creates a sprite that is drawn as part of the user interface.", + "description": "Creates a sprite that is drawn as part of the user interface.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/UISprite/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine neue UI-Figur" + } + } + }, + { + "id": "UISprite/disableNineSlice()", + "memberId": "UISprite/disableNineSlice", + "owner": "org.openpatch.scratch.UISprite", + "className": "UISprite", + "methodName": "disableNineSlice", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Lets the whole costume stretch again.", + "description": "Lets the whole costume stretch again.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/UISprite/disableNineSlice", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Lässt das ganze Kostüm wieder mitskalieren" + } + } + }, + { + "id": "UISprite/setHeight(double)", + "memberId": "UISprite/setHeight", + "owner": "org.openpatch.scratch.UISprite", + "className": "UISprite", + "methodName": "setHeight", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "height" + ], + "params": [ + "double height" + ], + "summary": "Sets the height of the sprite in pixels.", + "description": "Sets the height of the sprite in pixels.", + "scratchblock": null, + "paramDocs": [ + "height: the height in pixels" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/UISprite/setHeight", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Höhe in Pixeln" + } + } + }, + { + "id": "UISprite/setNineSlice(int,int,int,int)", + "memberId": "UISprite/setNineSlice", + "owner": "org.openpatch.scratch.UISprite", + "className": "UISprite", + "methodName": "setNineSlice", + "static": false, + "returnType": "void", + "parameterTypes": [ + "int", + "int", + "int", + "int" + ], + "parameterNames": [ + "top", + "right", + "bottom", + "left" + ], + "params": [ + "int top", + "int right", + "int bottom", + "int left" + ], + "summary": "Keeps the corners and edges of the costume from stretching when the sprite\nis resized, so that a button costume can be made any size.", + "description": "Keeps the corners and edges of the costume from stretching when the sprite\nis resized, so that a button costume can be made any size.", + "scratchblock": null, + "paramDocs": [ + "top: how many pixels of the costume belong to the top edge", + "right: how many pixels of the costume belong to the right edge", + "bottom: how many pixels of the costume belong to the bottom edge", + "left: how many pixels of the costume belong to the left edge" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/UISprite/setNineSlice", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Hält die Ecken und Ränder des Kostüms beim Skalieren fest (Nine-Slice)" + } + } + }, + { + "id": "UISprite/setWidth(double)", + "memberId": "UISprite/setWidth", + "owner": "org.openpatch.scratch.UISprite", + "className": "UISprite", + "methodName": "setWidth", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "width" + ], + "params": [ + "double width" + ], + "summary": "Sets the width of the sprite in pixels.", + "description": "Sets the width of the sprite in pixels.", + "scratchblock": null, + "paramDocs": [ + "width: the width in pixels" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/UISprite/setWidth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Setzt die Breite in Pixeln" + } + } + }, + { + "id": "Vector2/add(Vector2)", + "memberId": "Vector2/add", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "add", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Adds another vector and returns the result", + "description": "Adds another vector and returns the result", + "scratchblock": null, + "paramDocs": [ + "v: " + ], + "returns": "the sum", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/add", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Summe beider Vektoren als neuen Vektor zurück" + } + } + }, + { + "id": "Vector2/angle()", + "memberId": "Vector2/angle", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "angle", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the angle of the vector.", + "description": "Returns the angle of the vector.", + "scratchblock": null, + "paramDocs": [], + "returns": "the angle", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/angle", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Winkel des Vektors in Grad zurück" + } + } + }, + { + "id": "Vector2/clone()", + "memberId": "Vector2/clone", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "clone", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Creates a clone of the vector", + "description": "Creates a clone of the vector", + "scratchblock": null, + "paramDocs": [], + "returns": "the cloned vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/clone", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt eine Kopie des Vektors zurück" + } + } + }, + { + "id": "Vector2/constructor()", + "memberId": "Vector2/constructor", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "constructor", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructor for the null vector.", + "description": "Constructor for the null vector.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt den Nullvektor" + } + } + }, + { + "id": "Vector2/constructor(double,double)", + "memberId": "Vector2/constructor", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "constructor", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Constructor for a 2D vector.", + "description": "Constructor for a 2D vector.", + "scratchblock": null, + "paramDocs": [ + "x: x-coordinate", + "y: y-coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen Vektor mit den angegebenen Koordinaten" + } + } + }, + { + "id": "Vector2/constructor(Vector2)", + "memberId": "Vector2/constructor", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "constructor", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Copy constructor for copying a vector.", + "description": "Copy constructor for copying a vector.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt eine Kopie des übergebenen Vektors" + } + } + }, + { + "id": "Vector2/distance(Vector2)", + "memberId": "Vector2/distance", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "distance", + "static": false, + "returnType": "double", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Calculates the distance to another vector.", + "description": "Calculates the distance to another vector.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": "the distance", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/distance", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Abstand zu v zurück" + } + } + }, + { + "id": "Vector2/distanceSq(Vector2)", + "memberId": "Vector2/distanceSq", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "distanceSq", + "static": false, + "returnType": "double", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Calculates the squared distance to another vector.", + "description": "Calculates the squared distance to another vector.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": "the squared distance", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/distanceSq", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das Quadrat des Abstands zu v zurück" + } + } + }, + { + "id": "Vector2/dot(Vector2)", + "memberId": "Vector2/dot", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "dot", + "static": false, + "returnType": "double", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Calculates the dot product.", + "description": "Calculates the dot product.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": "the dot product", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/dot", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das Skalarprodukt beider Vektoren zurück" + } + } + }, + { + "id": "Vector2/equals(Object)", + "memberId": "Vector2/equals", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "equals", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "java.lang.Object" + ], + "parameterNames": [ + "obj" + ], + "params": [ + "Object obj" + ], + "summary": "Compares this vector with another object.", + "description": "Compares this vector with another object.", + "scratchblock": null, + "paramDocs": [ + "obj: the object to compare with" + ], + "returns": "true if the other object is a vector with the same x- and y-coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/equals", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn beide Vektoren gleich sind" + } + } + }, + { + "id": "Vector2/fromPolar(double,double)", + "memberId": "Vector2/fromPolar", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "fromPolar", + "static": true, + "returnType": "Vector2", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "magnitude", + "angle" + ], + "params": [ + "double magnitude", + "double angle" + ], + "summary": "Constructor method for constructing a vector based on polar coordinates.", + "description": "Constructor method for constructing a vector based on polar coordinates.", + "scratchblock": null, + "paramDocs": [ + "magnitude: of the vector", + "angle: of the vector" + ], + "returns": "a vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/fromPolar", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt einen Vektor aus Länge und Winkel (in Grad)" + } + } + }, + { + "id": "Vector2/getX()", + "memberId": "Vector2/getX", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "getX", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the x coordinate of the vector", + "description": "Returns the x coordinate of the vector", + "scratchblock": null, + "paramDocs": [], + "returns": "the x coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/getX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die x-Koordinate zurück" + } + } + }, + { + "id": "Vector2/getY()", + "memberId": "Vector2/getY", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "getY", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the y coordinate of the vector", + "description": "Returns the y coordinate of the vector", + "scratchblock": null, + "paramDocs": [], + "returns": "the y coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/getY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die y-Koordinate zurück" + } + } + }, + { + "id": "Vector2/hashCode()", + "memberId": "Vector2/hashCode", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "hashCode", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the hash code of the vector. Vectors that are equal have the same hash code, which is\nwhat lets them be used as keys in a `HashMap`.", + "description": "Returns the hash code of the vector. Vectors that are equal have the same hash code, which is\nwhat lets them be used as keys in a `HashMap`.", + "scratchblock": null, + "paramDocs": [], + "returns": "the hash code of the vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/hashCode", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Hashwert des Vektors zurück" + } + } + }, + { + "id": "Vector2/length()", + "memberId": "Vector2/length", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "length", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Calculates the length of the vector.", + "description": "Calculates the length of the vector.", + "scratchblock": null, + "paramDocs": [], + "returns": "the length of the vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/length", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Länge des Vektors zurück" + } + } + }, + { + "id": "Vector2/lengthSq()", + "memberId": "Vector2/lengthSq", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "lengthSq", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Calculates the squared length of the vector.", + "description": "Calculates the squared length of the vector.", + "scratchblock": null, + "paramDocs": [], + "returns": "the squared length of the vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/lengthSq", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das Quadrat der Länge zurück (schneller als length())" + } + } + }, + { + "id": "Vector2/multiply(double)", + "memberId": "Vector2/multiply", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "multiply", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "scalar" + ], + "params": [ + "double scalar" + ], + "summary": "Multiplies a scalar and return the result.", + "description": "Multiplies a scalar and return the result.", + "scratchblock": null, + "paramDocs": [ + "scalar: a scalar" + ], + "returns": "the vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/multiply", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den mit scalar multiplizierten Vektor als neuen Vektor zurück" + } + } + }, + { + "id": "Vector2/normalVector()", + "memberId": "Vector2/normalVector", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "normalVector", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the normal vector, which is perpendicular to the vector.", + "description": "Returns the normal vector, which is perpendicular to the vector.", + "scratchblock": null, + "paramDocs": [], + "returns": "a normal vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/normalVector", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt einen dazu senkrechten Vektor zurück" + } + } + }, + { + "id": "Vector2/reverse()", + "memberId": "Vector2/reverse", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "reverse", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Reverses a vector and returns the result.", + "description": "Reverses a vector and returns the result.", + "scratchblock": null, + "paramDocs": [], + "returns": "the reversed vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/reverse", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den entgegengesetzten Vektor zurück" + } + } + }, + { + "id": "Vector2/rotateBy(double)", + "memberId": "Vector2/rotateBy", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "rotateBy", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "angle" + ], + "params": [ + "double angle" + ], + "summary": "Rotates the vector by an angle and returns the result.", + "description": "Rotates the vector by an angle and returns the result.", + "scratchblock": null, + "paramDocs": [ + "angle: an angle between [0, ..., 360]" + ], + "returns": "the rotated vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/rotateBy", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den um angle Grad gedrehten Vektor als neuen Vektor zurück" + } + } + }, + { + "id": "Vector2/rotateTo(double)", + "memberId": "Vector2/rotateTo", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "rotateTo", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "angle" + ], + "params": [ + "double angle" + ], + "summary": "Rotates the vector to a given angle and returns the result.", + "description": "Rotates the vector to a given angle and returns the result.", + "scratchblock": null, + "paramDocs": [ + "angle: an angle between [0,...,360]" + ], + "returns": "the rotated vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/rotateTo", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt einen Vektor gleicher Länge mit dem Winkel angle (in Grad) zurück" + } + } + }, + { + "id": "Vector2/sub(Vector2)", + "memberId": "Vector2/sub", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "sub", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Substracts another vector and returns the result", + "description": "Substracts another vector and returns the result", + "scratchblock": null, + "paramDocs": [ + "v: " + ], + "returns": "the difference", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/sub", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Differenz beider Vektoren als neuen Vektor zurück" + } + } + }, + { + "id": "Vector2/toString()", + "memberId": "Vector2/toString", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "toString", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the vector as a text, for example `Vector2[60.0, 80.0]`.", + "description": "Returns the vector as a text, for example `Vector2[60.0, 80.0]`.", + "scratchblock": null, + "paramDocs": [], + "returns": "the vector as a text", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/toString", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Vektor als Zeichenkette zurück" + } + } + }, + { + "id": "Vector2/unitVector()", + "memberId": "Vector2/unitVector", + "owner": "org.openpatch.scratch.Vector2", + "className": "Vector2", + "methodName": "unitVector", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the unit vector.", + "description": "Returns the unit vector.", + "scratchblock": null, + "paramDocs": [], + "returns": "a unit vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Vector2/unitVector", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt einen Vektor gleicher Richtung mit der Länge 1 zurück" + } + } + }, + { + "id": "Window/constructor()", + "memberId": "Window/constructor", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "constructor", + "static": false, + "returnType": "Window", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Window with default dimensions. The default width is 480\npixels and the\ndefault height is 360 pixels.", + "description": "Constructs a new Window with default dimensions. The default width is 480\npixels and the\ndefault height is 360 pixels.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein Fenster in Standardgröße" + } + } + }, + { + "id": "Window/constructor(String)", + "memberId": "Window/constructor", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "constructor", + "static": false, + "returnType": "Window", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "assets" + ], + "params": [ + "String assets" + ], + "summary": "Constructs a new Window with the specified assets. The window will have a\ndefault width of 480\npixels and a height of 360 pixels.", + "description": "Constructs a new Window with the specified assets. The window will have a\ndefault width of 480\npixels and a height of 360 pixels.", + "scratchblock": null, + "paramDocs": [ + "assets: the path to the assets to be used in the window" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein Fenster mit eigenem Asset-Ordner" + } + } + }, + { + "id": "Window/constructor(int,int)", + "memberId": "Window/constructor", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "constructor", + "static": false, + "returnType": "Window", + "parameterTypes": [ + "int", + "int" + ], + "parameterNames": [ + "width", + "height" + ], + "params": [ + "int width", + "int height" + ], + "summary": "Constructs a new Window with the specified width and height.", + "description": "Constructs a new Window with the specified width and height.", + "scratchblock": null, + "paramDocs": [ + "width: the width of the window", + "height: the height of the window" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein Fenster mit der angegebenen Größe" + } + } + }, + { + "id": "Window/constructor(int,int,String)", + "memberId": "Window/constructor", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "constructor", + "static": false, + "returnType": "Window", + "parameterTypes": [ + "int", + "int", + "java.lang.String" + ], + "parameterNames": [ + "width", + "height", + "assets" + ], + "params": [ + "int width", + "int height", + "String assets" + ], + "summary": "Constructs a new Window with the specified width, height, and assets path.\nEnsures that only\none instance of Window can be created.", + "description": "Constructs a new Window with the specified width, height, and assets path.\nEnsures that only\none instance of Window can be created.\n\nThe single exception is the window Java builds by itself: a class that\nextends Window and has a `main` method which is not static is\ninstantiated by the JVM before `main` is called, so the\n`new MyWindow()` in that `main` would be the second window. That\none reuses the first instead of failing.", + "scratchblock": null, + "paramDocs": [ + "width: the width of the window", + "height: the height of the window", + "assets: the path to the assets" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Erzeugt ein Fenster mit Größe und eigenem Asset-Ordner" + } + } + }, + { + "id": "Window/debug(Object[])", + "memberId": "Window/debug", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "debug", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.Object[]" + ], + "parameterNames": [ + "values" + ], + "params": [ + "Object[] values" + ], + "summary": "Prints a debug message to stdout when debug mode is enabled.\nThe message is prefixed with the window's class name.", + "description": "Prints a debug message to stdout when debug mode is enabled.\nThe message is prefixed with the window's class name.\n\nExample:\n\n```java\nthis.debug(\"fps =\", getFps());\n// prints: [MyWindow] fps = 60\n```", + "scratchblock": null, + "paramDocs": [ + "values: one or more values to print" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/debug", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Window/exit()", + "memberId": "Window/exit", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "exit", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Exits the application by invoking the `whenExits` method and then calling the\n`exit` method on\nthe `Applet` instance.", + "description": "Exits the application by invoking the `whenExits` method and then calling the\n`exit` method on\nthe `Applet` instance.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/exit", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Beendet das Programm" + } + } + }, + { + "id": "Window/getDeltaTime()", + "memberId": "Window/getDeltaTime", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getDeltaTime", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Gets the seconds of game time passed since the last frame. While the game\nis paused this is 0, and at half speed half the real time.", + "description": "Gets the seconds of game time passed since the last frame. While the game\nis paused this is 0, and at half speed half the real time.", + "scratchblock": null, + "paramDocs": [], + "returns": "seconds since last frame", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getDeltaTime", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Dauer des letzten Frames in Sekunden zurück" + } + } + }, + { + "id": "Window/getGameSpeed()", + "memberId": "Window/getGameSpeed", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getGameSpeed", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "The game speed set with [setGameSpeed(double)](setGameSpeed).", + "description": "The game speed set with [setGameSpeed(double)](setGameSpeed).", + "scratchblock": null, + "paramDocs": [], + "returns": "1 for normal speed", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getGameSpeed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Window/getHeight()", + "memberId": "Window/getHeight", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getHeight", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the height of the current window.", + "description": "Retrieves the height of the current window.", + "scratchblock": null, + "paramDocs": [], + "returns": "the height of the window in pixels", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getHeight", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Höhe des Fensters in Pixeln zurück" + } + } + }, + { + "id": "Window/getInstance()", + "memberId": "Window/getInstance", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getInstance", + "static": true, + "returnType": "Window", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the singleton instance of the Window class.", + "description": "Returns the singleton instance of the Window class.", + "scratchblock": null, + "paramDocs": [], + "returns": "the singleton instance of Window", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getInstance", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das Fenster des laufenden Programms zurück" + } + } + }, + { + "id": "Window/getLibraryTitle()", + "memberId": "Window/getLibraryTitle", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getLibraryTitle", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the title of the library.", + "description": "Returns the title of the library.", + "scratchblock": null, + "paramDocs": [], + "returns": "the title of the library as a String", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getLibraryTitle", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt den Namen der Bibliothek zurück" + } + } + }, + { + "id": "Window/getLibraryVersion()", + "memberId": "Window/getLibraryVersion", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getLibraryVersion", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the version of the library.", + "description": "Returns the version of the library.", + "scratchblock": null, + "paramDocs": [], + "returns": "the version of the library as a String", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getLibraryVersion", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Version der Bibliothek zurück" + } + } + }, + { + "id": "Window/getStage()", + "memberId": "Window/getStage", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getStage", + "static": false, + "returnType": "Stage", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the current stage from the Applet instance.", + "description": "Retrieves the current stage from the Applet instance.", + "scratchblock": null, + "paramDocs": [], + "returns": "the current Stage object", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Window/getTextureSampling()", + "memberId": "Window/getTextureSampling", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getTextureSampling", + "static": true, + "returnType": "TextureSampling", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns how pictures are being smoothed.", + "description": "Returns how pictures are being smoothed.", + "scratchblock": null, + "paramDocs": [], + "returns": "the current setting", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getTextureSampling", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt das eingestellte Glättungsverfahren zurück" + } + } + }, + { + "id": "Window/getWidth()", + "memberId": "Window/getWidth", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "getWidth", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Retrieves the width of the current window.", + "description": "Retrieves the width of the current window.", + "scratchblock": null, + "paramDocs": [], + "returns": "the width of the window in pixels", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/getWidth", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Breite des Fensters in Pixeln zurück" + } + } + }, + { + "id": "Window/isDebug()", + "memberId": "Window/isDebug", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "isDebug", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks if the application is in debug mode.", + "description": "Checks if the application is in debug mode.\n\nDebug mode can be toggled at runtime by pressing F12.", + "scratchblock": null, + "paramDocs": [], + "returns": "true if the application is in debug mode, false otherwise.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/isDebug", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt genau dann true zurück, wenn die Fehlersuche eingeschaltet ist" + } + } + }, + { + "id": "Window/isPaused()", + "memberId": "Window/isPaused", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "isPaused", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Whether the game is paused.", + "description": "Whether the game is paused.", + "scratchblock": null, + "paramDocs": [], + "returns": "true while paused", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/isPaused", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Window/pause()", + "memberId": "Window/pause", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "pause", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Pauses the game: `run()` is no longer called, and timers, gliding\nand animations stand still. The window keeps drawing, so the paused\npicture stays visible, and keys and clicks still reach methods like\n`whenKeyPressed`, so a key can [resume()](resume) the game.", + "description": "Pauses the game: `run()` is no longer called, and timers, gliding\nand animations stand still. The window keeps drawing, so the paused\npicture stays visible, and keys and clicks still reach methods like\n`whenKeyPressed`, so a key can [resume()](resume) the game.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/pause", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Gibt die Bühne zurück, die gerade angezeigt wird" + } + } + }, + { + "id": "Window/resume()", + "memberId": "Window/resume", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "resume", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Lets a paused game go on where it stopped.", + "description": "Lets a paused game go on where it stopped.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/resume", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Window/setDebug(boolean)", + "memberId": "Window/setDebug", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "setDebug", + "static": false, + "returnType": "void", + "parameterTypes": [ + "boolean" + ], + "parameterNames": [ + "debug" + ], + "params": [ + "boolean debug" + ], + "summary": "Enables or disables the debug mode for the application.", + "description": "Enables or disables the debug mode for the application.\n\nDebug mode shows sprite positions, hitboxes, and other debug information.\nIt can also be toggled at runtime by pressing F12.", + "scratchblock": null, + "paramDocs": [ + "debug: a boolean value where `true` enables debug mode and\n `false` disables\n it." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/setDebug", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Schaltet die Ausgabe von debug() ein oder aus" + } + } + }, + { + "id": "Window/setGameSpeed(double)", + "memberId": "Window/setGameSpeed", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "setGameSpeed", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "speed" + ], + "params": [ + "double speed" + ], + "summary": "Makes the game run slower or faster: 1 is normal, 0.5 half as fast, 2\ntwice as fast. `run()`, timers, gliding and animations all follow,\nso the whole game looks like slow motion; the window keeps drawing\nsmoothly.", + "description": "Makes the game run slower or faster: 1 is normal, 0.5 half as fast, 2\ntwice as fast. `run()`, timers, gliding and animations all follow,\nso the whole game looks like slow motion; the window keeps drawing\nsmoothly.", + "scratchblock": null, + "paramDocs": [ + "speed: 1 for normal speed, smaller for slower, larger for faster" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/setGameSpeed", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Window/setStage(Stage)", + "memberId": "Window/setStage", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "setStage", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Stage" + ], + "parameterNames": [ + "stage" + ], + "params": [ + "Stage stage" + ], + "summary": "Sets the current stage of the application.", + "description": "Sets the current stage of the application.", + "scratchblock": null, + "paramDocs": [ + "stage: the new stage to be set" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/setStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Zeigt die angegebene Bühne an" + } + } + }, + { + "id": "Window/step()", + "memberId": "Window/step", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "step", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "While the game is paused: runs it for exactly one frame (every\n`run()` once) and pauses again. Useful to watch closely what\nhappens, for example when two sprites touch.", + "description": "While the game is paused: runs it for exactly one frame (every\n`run()` once) and pauses again. Useful to watch closely what\nhappens, for example when two sprites touch.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/step", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "Window/transitionToStage(Stage,int)", + "memberId": "Window/transitionToStage", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "transitionToStage", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Stage", + "int" + ], + "parameterNames": [ + "stage", + "duration" + ], + "params": [ + "Stage stage", + "int duration" + ], + "summary": "Transitions to a new stage with a specified duration.", + "description": "Transitions to a new stage with a specified duration.", + "scratchblock": null, + "paramDocs": [ + "stage: the new stage to transition to", + "duration: the duration of the transition in milliseconds" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/transitionToStage", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Blendet über Schwarz zur angegebenen Bühne über" + } + } + }, + { + "id": "Window/useFullScreen()", + "memberId": "Window/useFullScreen", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "useFullScreen", + "static": true, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Makes the window fill the whole screen.", + "description": "Makes the window fill the whole screen.\n\nCall it before the first stage is created, because the size of the window is\nsettled the moment it opens:\n\n```java\npublic static void main(String[] args) {\n Window.useFullScreen();\n new MyStage();\n}\n```", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/useFullScreen", + "availability": "desktop-only", + "availabilityReason": "The embedded browser output uses its enclosing page; this desktop window option only reports a limitation.", + "translations": { + "de": { + "description": "Nur in der Desktop-Version: startet im Vollbild" + } + } + }, + { + "id": "Window/useSplashLogo(String)", + "memberId": "Window/useSplashLogo", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "useSplashLogo", + "static": true, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "path" + ], + "params": [ + "String path" + ], + "summary": "Puts your own picture on the loading screen in place of the Scratch for Java\nlogo. The picture fades in while your project starts and fades out again\nonce it is ready.", + "description": "Puts your own picture on the loading screen in place of the Scratch for Java\nlogo. The picture fades in while your project starts and fades out again\nonce it is ready.\n\nIt is shrunk to fit if it is large, and never enlarged, so a picture of\nroughly 300 by 300 looks right in a window of the usual size.\n\nCall it before the first stage is created, because the loading screen is the\nfirst thing the window draws:\n\n```java\npublic static void main(String[] args) {\n Window.useSplashLogo(\"assets/logo.png\");\n new MyStage();\n}\n```", + "scratchblock": null, + "paramDocs": [ + "path: a path to an image file or the name of a built-in sprite, or\n `null` for the Scratch for Java logo" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/useSplashLogo", + "availability": "desktop-only", + "availabilityReason": "The browser has no desktop splash window. This option only reports a limitation.", + "translations": { + "de": { + "description": "Nur in der Desktop-Version: zeigt beim Start ein Logo" + } + } + }, + { + "id": "Window/useTextureSampling(TextureSampling)", + "memberId": "Window/useTextureSampling", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "useTextureSampling", + "static": true, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.TextureSampling" + ], + "parameterNames": [ + "sampling" + ], + "params": [ + "TextureSampling sampling" + ], + "summary": "Chooses how pictures are smoothed when they are drawn larger or smaller than\nthey really are. Pixel art usually wants [TextureSampling.POINT](../TextureSampling/POINT).", + "description": "Chooses how pictures are smoothed when they are drawn larger or smaller than\nthey really are. Pixel art usually wants [TextureSampling.POINT](../TextureSampling/POINT).\n\nCall it before the first stage is created.\n\n```java\nWindow.useTextureSampling(TextureSampling.POINT);\nnew MyStage();\n```", + "scratchblock": null, + "paramDocs": [ + "sampling: how to smooth pictures" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/useTextureSampling", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Legt fest, wie Bilder beim Vergrößern und Verkleinern geglättet werden. TextureSampling.POINT hält Pixelgrafik scharf, LINEAR (Standard) glättet. BILINEAR und TRILINEAR wirken im Browser wie LINEAR." + } + } + }, + { + "id": "Window/whenExits()", + "memberId": "Window/whenExits", + "owner": "org.openpatch.scratch.Window", + "className": "Window", + "methodName": "whenExits", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "This method is called when the window exits. Override this method to define\ncustom behavior\nwhen the window is closed.", + "description": "This method is called when the window exits. Override this method to define\ncustom behavior\nwhen the window is closed.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/Window/whenExits", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": { + "de": { + "description": "Wird beim Beenden des Programms aufgerufen" + } + } + }, + { + "id": "extensions/camera/Camera/changeX(double)", + "memberId": "extensions/camera/Camera/changeX", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "changeX", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Changes x by a certain amount", + "description": "Changes x by a certain amount", + "scratchblock": null, + "paramDocs": [ + "x: number in pixels" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/changeX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/changeY(double)", + "memberId": "extensions/camera/Camera/changeY", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "changeY", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "y" + ], + "params": [ + "double y" + ], + "summary": "Changes y by a certain amount", + "description": "Changes y by a certain amount", + "scratchblock": null, + "paramDocs": [ + "y: number in pixels" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/changeY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/changeZoom(double)", + "memberId": "extensions/camera/Camera/changeZoom", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "changeZoom", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "dz" + ], + "params": [ + "double dz" + ], + "summary": "Changes the zoom level by a certain amount", + "description": "Changes the zoom level by a certain amount", + "scratchblock": null, + "paramDocs": [ + "dz: the amount to change the zoom level by" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/changeZoom", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/constructor()", + "memberId": "extensions/camera/Camera/constructor", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "constructor", + "static": false, + "returnType": "Camera", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Constructs a new Camera with default values. The default position is (0, 0) and the default\nzoom level is 100.", + "description": "Constructs a new Camera with default values. The default position is (0, 0) and the default\nzoom level is 100.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/getPosition()", + "memberId": "extensions/camera/Camera/getPosition", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "getPosition", + "static": false, + "returnType": "Vector2", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the position of the sprite", + "description": "Returns the position of the sprite", + "scratchblock": null, + "paramDocs": [], + "returns": "a vector", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/getPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/getX()", + "memberId": "extensions/camera/Camera/getX", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "getX", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the x coordinate of the sprite", + "description": "Returns the x coordinate of the sprite", + "scratchblock": null, + "paramDocs": [], + "returns": "a x coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/getX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/getY()", + "memberId": "extensions/camera/Camera/getY", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "getY", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the y coordinate of the sprite", + "description": "Returns the y coordinate of the sprite", + "scratchblock": null, + "paramDocs": [], + "returns": "a y coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/getY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/getZoom()", + "memberId": "extensions/camera/Camera/getZoom", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "getZoom", + "static": false, + "returnType": "double", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the zoom level", + "description": "Returns the zoom level", + "scratchblock": null, + "paramDocs": [], + "returns": "the zoom level", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/getZoom", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/resetZoom()", + "memberId": "extensions/camera/Camera/resetZoom", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "resetZoom", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Resets the zoom level to 100", + "description": "Resets the zoom level to 100", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/resetZoom", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/setPosition(double,double)", + "memberId": "extensions/camera/Camera/setPosition", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "x", + "y" + ], + "params": [ + "double x", + "double y" + ], + "summary": "Sets the position of the sprite", + "description": "Sets the position of the sprite", + "scratchblock": null, + "paramDocs": [ + "x: a x coordinate", + "y: a y coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/setPosition(Vector2)", + "memberId": "extensions/camera/Camera/setPosition", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "setPosition", + "static": false, + "returnType": "void", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Sets the position of the sprite based on the coordinates of a given vector.", + "description": "Sets the position of the sprite based on the coordinates of a given vector.", + "scratchblock": null, + "paramDocs": [ + "v: a vector" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/setPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/setX(double)", + "memberId": "extensions/camera/Camera/setX", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "setX", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Sets the x coordinate", + "description": "Sets the x coordinate", + "scratchblock": null, + "paramDocs": [ + "x: a x coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/setX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/setY(double)", + "memberId": "extensions/camera/Camera/setY", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "setY", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "y" + ], + "params": [ + "double y" + ], + "summary": "Sets the y coordinate", + "description": "Sets the y coordinate", + "scratchblock": null, + "paramDocs": [ + "y: a y coordinate" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/setY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/setZoom(double)", + "memberId": "extensions/camera/Camera/setZoom", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "setZoom", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "zoom" + ], + "params": [ + "double zoom" + ], + "summary": "Sets the zoom", + "description": "Sets the zoom", + "scratchblock": null, + "paramDocs": [ + "zoom: the zoom level" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/setZoom", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/setZoomLimit(double,double)", + "memberId": "extensions/camera/Camera/setZoomLimit", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "setZoomLimit", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double", + "double" + ], + "parameterNames": [ + "low", + "high" + ], + "params": [ + "double low", + "double high" + ], + "summary": "Sets the zoom limits", + "description": "Sets the zoom limits", + "scratchblock": null, + "paramDocs": [ + "low: the lower limit", + "high: the upper limit" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/setZoomLimit", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/toGlobalPosition(Vector2)", + "memberId": "extensions/camera/Camera/toGlobalPosition", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "toGlobalPosition", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Converts local camera coordinates to screen coordinates", + "description": "Converts local camera coordinates to screen coordinates", + "scratchblock": null, + "paramDocs": [ + "v: local camera coordinates" + ], + "returns": "screen coordinates", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/toGlobalPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/toGlobalX(double)", + "memberId": "extensions/camera/Camera/toGlobalX", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "toGlobalX", + "static": false, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Converts local camera x coordinate to screen x coordinate", + "description": "Converts local camera x coordinate to screen x coordinate", + "scratchblock": null, + "paramDocs": [ + "x: local camera x coordinate" + ], + "returns": "screen x coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/toGlobalX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/toGlobalY(double)", + "memberId": "extensions/camera/Camera/toGlobalY", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "toGlobalY", + "static": false, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "y" + ], + "params": [ + "double y" + ], + "summary": "Converts local camera y coordinate to screen y coordinate", + "description": "Converts local camera y coordinate to screen y coordinate", + "scratchblock": null, + "paramDocs": [ + "y: local camera y coordinate" + ], + "returns": "screen y coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/toGlobalY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/toLocalPosition(Vector2)", + "memberId": "extensions/camera/Camera/toLocalPosition", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "toLocalPosition", + "static": false, + "returnType": "Vector2", + "parameterTypes": [ + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "v" + ], + "params": [ + "Vector2 v" + ], + "summary": "Converts screen coordinates to local camera coordinates", + "description": "Converts screen coordinates to local camera coordinates", + "scratchblock": null, + "paramDocs": [ + "v: screen coordinates" + ], + "returns": "local coordinates", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/toLocalPosition", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/toLocalX(double)", + "memberId": "extensions/camera/Camera/toLocalX", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "toLocalX", + "static": false, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "x" + ], + "params": [ + "double x" + ], + "summary": "Converts screen x coordinate to local camera x coordinate", + "description": "Converts screen x coordinate to local camera x coordinate", + "scratchblock": null, + "paramDocs": [ + "x: screen x coordinate" + ], + "returns": "local x coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/toLocalX", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/camera/Camera/toLocalY(double)", + "memberId": "extensions/camera/Camera/toLocalY", + "owner": "org.openpatch.scratch.extensions.camera.Camera", + "className": "Camera", + "methodName": "toLocalY", + "static": false, + "returnType": "double", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "y" + ], + "params": [ + "double y" + ], + "summary": "Converts screen y coordinate to local camera y coordinate", + "description": "Converts screen y coordinate to local camera y coordinate", + "scratchblock": null, + "paramDocs": [ + "y: screen y coordinate" + ], + "returns": "local y coordinate", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/camera/Camera/toLocalY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/fs/File/constructor()", + "memberId": "extensions/fs/File/constructor", + "owner": "org.openpatch.scratch.extensions.fs.File", + "className": "File", + "methodName": "constructor", + "static": false, + "returnType": "File", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "The File class provides methods to save and load objects to and from files in\nJSON or XML format.\nIt supports saving and loading objects with automatic detection of file type\nbased on the method\nused. The class uses Jackson ObjectMapper for JSON and XmlMapper for XML\nserialization and\ndeserialization.", + "description": "The File class provides methods to save and load objects to and from files in\nJSON or XML format.\nIt supports saving and loading objects with automatic detection of file type\nbased on the method\nused. The class uses Jackson ObjectMapper for JSON and XmlMapper for XML\nserialization and\ndeserialization.\n\nUsage examples:\n\n```java\n// Save an object as JSON\nFile.save(\"/path/to/file.json\", myObject);\n\n// Save an object as XML\nFile.saveXML(\"/path/to/file.xml\", myObject);\n\n// Load an object from JSON\nMyClass obj = File.load(\"/path/to/file.json\", MyClass.class);\n\n// Load an object from XML\nMyClass obj = File.loadXML(\"/path/to/file.xml\", MyClass.class);\n```\n\nNote: The file paths can be absolute or relative. If a relative path is\nprovided, the class\nwill attempt to load the file from the classpath.\n\nSupported file types:\n\n
    \n
  • JSON\n
  • XML\n
", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/fs/File/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/fs/File/load(String,Class)", + "memberId": "extensions/fs/File/load", + "owner": "org.openpatch.scratch.extensions.fs.File", + "className": "File", + "methodName": "load", + "static": true, + "returnType": "T", + "parameterTypes": [ + "java.lang.String", + "java.lang.Class" + ], + "parameterNames": [ + "path", + "cls" + ], + "params": [ + "String path", + "Class cls" + ], + "summary": "Loads an object of the specified class from a file at the given path.", + "description": "Loads an object of the specified class from a file at the given path.", + "scratchblock": null, + "paramDocs": [ + "path: the path to the file from which the object is to be loaded", + "cls: the class of the object to be loaded" + ], + "returns": "the loaded object of the specified class", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/fs/File/load", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/fs/File/loadOrCreate(String,Class)", + "memberId": "extensions/fs/File/loadOrCreate", + "owner": "org.openpatch.scratch.extensions.fs.File", + "className": "File", + "methodName": "loadOrCreate", + "static": true, + "returnType": "T", + "parameterTypes": [ + "java.lang.String", + "java.lang.Class" + ], + "parameterNames": [ + "path", + "cls" + ], + "params": [ + "String path", + "Class cls" + ], + "summary": "Loads an object of the specified class from a file at the given path, or\ncreates a new one if the file does not exist.", + "description": "Loads an object of the specified class from a file at the given path, or\ncreates a new one if the file does not exist.", + "scratchblock": null, + "paramDocs": [ + "path: the path to the file from which the object is to be loaded", + "cls: the class of the object to be loaded" + ], + "returns": "the loaded object of the specified class, or a new instance if the\n file does not exist", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/fs/File/loadOrCreate", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/fs/File/loadXML(String,Class)", + "memberId": "extensions/fs/File/loadXML", + "owner": "org.openpatch.scratch.extensions.fs.File", + "className": "File", + "methodName": "loadXML", + "static": true, + "returnType": "T", + "parameterTypes": [ + "java.lang.String", + "java.lang.Class" + ], + "parameterNames": [ + "path", + "cls" + ], + "params": [ + "String path", + "Class cls" + ], + "summary": "Loads an object of the specified class from an XML file at the given path.", + "description": "Loads an object of the specified class from an XML file at the given path.", + "scratchblock": null, + "paramDocs": [ + "path: the path to the XML file", + "cls: the class of the object to be loaded" + ], + "returns": "the object loaded from the XML file", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/fs/File/loadXML", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/fs/File/loadXMLOrCreate(String,Class)", + "memberId": "extensions/fs/File/loadXMLOrCreate", + "owner": "org.openpatch.scratch.extensions.fs.File", + "className": "File", + "methodName": "loadXMLOrCreate", + "static": true, + "returnType": "T", + "parameterTypes": [ + "java.lang.String", + "java.lang.Class" + ], + "parameterNames": [ + "path", + "cls" + ], + "params": [ + "String path", + "Class cls" + ], + "summary": "Loads an object of the specified class from an XML file at the given path,\nor creates a new one if the file does not exist.", + "description": "Loads an object of the specified class from an XML file at the given path,\nor creates a new one if the file does not exist.", + "scratchblock": null, + "paramDocs": [ + "path: the path to the XML file", + "cls: the class of the object to be loaded" + ], + "returns": "the object loaded from the XML file, or a new instance if the file\n does not exist", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/fs/File/loadXMLOrCreate", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/fs/File/save(String,T)", + "memberId": "extensions/fs/File/save", + "owner": "org.openpatch.scratch.extensions.fs.File", + "className": "File", + "methodName": "save", + "static": true, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "T" + ], + "parameterNames": [ + "path", + "obj" + ], + "params": [ + "String path", + "T obj" + ], + "summary": "Saves the given object to the specified path in the default file type (JSON).", + "description": "Saves the given object to the specified path in the default file type (JSON).", + "scratchblock": null, + "paramDocs": [ + "path: the path where the object should be saved", + "obj: the object to be saved" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/fs/File/save", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/fs/File/saveXML(String,T)", + "memberId": "extensions/fs/File/saveXML", + "owner": "org.openpatch.scratch.extensions.fs.File", + "className": "File", + "methodName": "saveXML", + "static": true, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "T" + ], + "parameterNames": [ + "path", + "obj" + ], + "params": [ + "String path", + "T obj" + ], + "summary": "Saves the given object as an XML file at the specified path.", + "description": "Saves the given object as an XML file at the specified path.", + "scratchblock": null, + "paramDocs": [ + "path: the path where the XML file will be saved", + "obj: the object to be saved as XML" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/fs/File/saveXML", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/pixels/Pixels/background()", + "memberId": "extensions/pixels/Pixels/background", + "owner": "org.openpatch.scratch.extensions.pixels.Pixels", + "className": "Pixels", + "methodName": "background", + "static": false, + "returnType": "int[]", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the pixels of the background layer, where the pen and stamps draw.", + "description": "Returns the pixels of the background layer, where the pen and stamps draw.", + "scratchblock": null, + "paramDocs": [], + "returns": "one colour per pixel", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/pixels/Pixels/background", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/pixels/Pixels/constructor(PGraphics,PGraphics,PGraphics)", + "memberId": "extensions/pixels/Pixels/constructor", + "owner": "org.openpatch.scratch.extensions.pixels.Pixels", + "className": "Pixels", + "methodName": "constructor", + "static": false, + "returnType": "Pixels", + "parameterTypes": [ + "processing.core.PGraphics", + "processing.core.PGraphics", + "processing.core.PGraphics" + ], + "parameterNames": [ + "mainBuffer", + "backgroundBuffer", + "foregroundBuffer" + ], + "params": [ + "PGraphics mainBuffer", + "PGraphics backgroundBuffer", + "PGraphics foregroundBuffer" + ], + "summary": "Creates the pixel access for a stage.", + "description": "Creates the pixel access for a stage.", + "scratchblock": null, + "paramDocs": [ + "mainBuffer: where the sprites are drawn", + "backgroundBuffer: where the background is drawn", + "foregroundBuffer: where the foreground is drawn" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/pixels/Pixels/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/pixels/Pixels/foreground()", + "memberId": "extensions/pixels/Pixels/foreground", + "owner": "org.openpatch.scratch.extensions.pixels.Pixels", + "className": "Pixels", + "methodName": "foreground", + "static": false, + "returnType": "int[]", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the pixels of the foreground layer.", + "description": "Returns the pixels of the foreground layer.", + "scratchblock": null, + "paramDocs": [], + "returns": "one colour per pixel", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/pixels/Pixels/foreground", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/pixels/Pixels/main()", + "memberId": "extensions/pixels/Pixels/main", + "owner": "org.openpatch.scratch.extensions.pixels.Pixels", + "className": "Pixels", + "methodName": "main", + "static": false, + "returnType": "int[]", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the pixels of the layer the sprites are drawn on.", + "description": "Returns the pixels of the layer the sprites are drawn on.", + "scratchblock": null, + "paramDocs": [], + "returns": "one colour per pixel", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/pixels/Pixels/main", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/FFmpegRecorder/constructor(String)", + "memberId": "extensions/recorder/FFmpegRecorder/constructor", + "owner": "org.openpatch.scratch.extensions.recorder.FFmpegRecorder", + "className": "FFmpegRecorder", + "methodName": "constructor", + "static": false, + "returnType": "FFmpegRecorder", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "path" + ], + "params": [ + "String path" + ], + "summary": "Constructs an FFmpegRecorder object with the specified path.", + "description": "Constructs an FFmpegRecorder object with the specified path.", + "scratchblock": null, + "paramDocs": [ + "path: the path where the recording will be saved\n \n\nThis constructor initializes the FFmpegRecorder by creating a temporary directory and\n setting up a pattern for temporary PNG files. If the temporary directory cannot be created,\n an error message is printed to the console." + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/FFmpegRecorder/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/FFmpegRecorder/saveFrame()", + "memberId": "extensions/recorder/FFmpegRecorder/saveFrame", + "owner": "org.openpatch.scratch.extensions.recorder.FFmpegRecorder", + "className": "FFmpegRecorder", + "methodName": "saveFrame", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Saves the current frame using the specified pattern.", + "description": "Saves the current frame using the specified pattern.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/FFmpegRecorder/saveFrame", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/FFmpegRecorder/stop()", + "memberId": "extensions/recorder/FFmpegRecorder/stop", + "owner": "org.openpatch.scratch.extensions.recorder.FFmpegRecorder", + "className": "FFmpegRecorder", + "methodName": "stop", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stops the recording process and converts the recorded frames into a video file using FFmpeg.", + "description": "Stops the recording process and converts the recorded frames into a video file using FFmpeg.\n\nThis method overrides the `stop` method from the superclass. It first calls the superclass's\n`stop` method, then checks if the temporary directory (`tmpDir`) is not null. If it is not\nnull, it constructs a command to run FFmpeg, which converts the recorded frames (stored as PNG\nfiles) into a video file with the specified frame rate and codec.\n\nThe FFmpeg command is executed, and a message is printed to the console indicating that the\nvideo conversion is in progress. If there is an error during the execution of the command, the\nerror message is printed to the console.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/FFmpegRecorder/stop", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/FrameRecorder/constructor(String)", + "memberId": "extensions/recorder/FrameRecorder/constructor", + "owner": "org.openpatch.scratch.extensions.recorder.FrameRecorder", + "className": "FrameRecorder", + "methodName": "constructor", + "static": false, + "returnType": "FrameRecorder", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "outputFolder" + ], + "params": [ + "String outputFolder" + ], + "summary": "Constructs a new FrameRecorder with the specified output folder.", + "description": "Constructs a new FrameRecorder with the specified output folder.", + "scratchblock": null, + "paramDocs": [ + "outputFolder: the folder where the recorded frames will be saved" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/FrameRecorder/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/FrameRecorder/saveFrame()", + "memberId": "extensions/recorder/FrameRecorder/saveFrame", + "owner": "org.openpatch.scratch.extensions.recorder.FrameRecorder", + "className": "FrameRecorder", + "methodName": "saveFrame", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Saves the current frame of the applet to the specified output folder. The frame is saved as a\nPNG file with a filename pattern \"#######.png\". The exact filename will be generated based on\nthe current frame number.", + "description": "Saves the current frame of the applet to the specified output folder. The frame is saved as a\nPNG file with a filename pattern \"#######.png\". The exact filename will be generated based on\nthe current frame number.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/FrameRecorder/saveFrame", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/FrameRecorder/snapshot(String)", + "memberId": "extensions/recorder/FrameRecorder/snapshot", + "owner": "org.openpatch.scratch.extensions.recorder.FrameRecorder", + "className": "FrameRecorder", + "methodName": "snapshot", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "filename" + ], + "params": [ + "String filename" + ], + "summary": "Takes a snapshot of the current frame and saves it to the specified filename.", + "description": "Takes a snapshot of the current frame and saves it to the specified filename.", + "scratchblock": null, + "paramDocs": [ + "filename: the name of the file to save the snapshot to" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/FrameRecorder/snapshot", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/GifRecorder/constructor(String)", + "memberId": "extensions/recorder/GifRecorder/constructor", + "owner": "org.openpatch.scratch.extensions.recorder.GifRecorder", + "className": "GifRecorder", + "methodName": "constructor", + "static": false, + "returnType": "GifRecorder", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "filePath" + ], + "params": [ + "String filePath" + ], + "summary": "Constructs a new GifRecorder object.", + "description": "Constructs a new GifRecorder object.", + "scratchblock": null, + "paramDocs": [ + "filePath: the path where the GIF file will be saved" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/GifRecorder/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/GifRecorder/saveFrame()", + "memberId": "extensions/recorder/GifRecorder/saveFrame", + "owner": "org.openpatch.scratch.extensions.recorder.GifRecorder", + "className": "GifRecorder", + "methodName": "saveFrame", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Saves the current frame of the applet as a GIF image.", + "description": "Saves the current frame of the applet as a GIF image.\n\nThis method captures the current frame from the applet, sets the frame rate, and adds the\nframe to the GIF encoder. If the applet's pixels are null, the frame is not saved.\n\nNote: This method catches and ignores any NullPointerException that may occur.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/GifRecorder/saveFrame", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/GifRecorder/snapshot()", + "memberId": "extensions/recorder/GifRecorder/snapshot", + "owner": "org.openpatch.scratch.extensions.recorder.GifRecorder", + "className": "GifRecorder", + "methodName": "snapshot", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Captures a snapshot and saves it as a GIF. This method starts the GIF encoder, saves the\ncurrent frame, and then finishes the encoding process.", + "description": "Captures a snapshot and saves it as a GIF. This method starts the GIF encoder, saves the\ncurrent frame, and then finishes the encoding process.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/GifRecorder/snapshot", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/GifRecorder/start()", + "memberId": "extensions/recorder/GifRecorder/start", + "owner": "org.openpatch.scratch.extensions.recorder.GifRecorder", + "className": "GifRecorder", + "methodName": "start", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Starts the GIF recording process.", + "description": "Starts the GIF recording process.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/GifRecorder/start", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/GifRecorder/stop()", + "memberId": "extensions/recorder/GifRecorder/stop", + "owner": "org.openpatch.scratch.extensions.recorder.GifRecorder", + "className": "GifRecorder", + "methodName": "stop", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stops the GIF recording process and finalizes the GIF file.", + "description": "Stops the GIF recording process and finalizes the GIF file.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/GifRecorder/stop", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/Recorder/constructor(String,String)", + "memberId": "extensions/recorder/Recorder/constructor", + "owner": "org.openpatch.scratch.extensions.recorder.Recorder", + "className": "Recorder", + "methodName": "constructor", + "static": false, + "returnType": "Recorder", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "path", + "ext" + ], + "params": [ + "String path", + "String ext" + ], + "summary": "Constructs a new Recorder object with the specified file path and extension. If the provided\npath does not end with the specified extension, the extension is appended to the path.", + "description": "Constructs a new Recorder object with the specified file path and extension. If the provided\npath does not end with the specified extension, the extension is appended to the path.", + "scratchblock": null, + "paramDocs": [ + "path: the file path where the recording will be saved", + "ext: the file extension to be used for the recording" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/Recorder/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/Recorder/post()", + "memberId": "extensions/recorder/Recorder/post", + "owner": "org.openpatch.scratch.extensions.recorder.Recorder", + "className": "Recorder", + "methodName": "post", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Called after each frame is drawn. This method is registered with the Applet class to ensure\nthat frames are saved at the appropriate time during the recording process.", + "description": "Called after each frame is drawn. This method is registered with the Applet class to ensure\nthat frames are saved at the appropriate time during the recording process.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/Recorder/post", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/Recorder/saveFrame()", + "memberId": "extensions/recorder/Recorder/saveFrame", + "owner": "org.openpatch.scratch.extensions.recorder.Recorder", + "className": "Recorder", + "methodName": "saveFrame", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Saves the current frame. This method should be implemented by subclasses to define the specific\nbehavior for saving a frame.", + "description": "Saves the current frame. This method should be implemented by subclasses to define the specific\nbehavior for saving a frame.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/Recorder/saveFrame", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/Recorder/start()", + "memberId": "extensions/recorder/Recorder/start", + "owner": "org.openpatch.scratch.extensions.recorder.Recorder", + "className": "Recorder", + "methodName": "start", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Starts the recording process.", + "description": "Starts the recording process.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/Recorder/start", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/recorder/Recorder/stop()", + "memberId": "extensions/recorder/Recorder/stop", + "owner": "org.openpatch.scratch.extensions.recorder.Recorder", + "className": "Recorder", + "methodName": "stop", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stops the recording process.", + "description": "Stops the recording process.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/recorder/Recorder/stop", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/constructor(String,String,String)", + "memberId": "extensions/shader/Shader/constructor", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "constructor", + "static": false, + "returnType": "Shader", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "fragmentShaderPath", + "vertexShaderPath" + ], + "params": [ + "String name", + "String fragmentShaderPath", + "String vertexShaderPath" + ], + "summary": "Constructor", + "description": "Constructor", + "scratchblock": null, + "paramDocs": [ + "name: unique name", + "fragmentShaderPath: path to the fragment shader file", + "vertexShaderPath: path to the vertex shader file, or null for Processing's default one" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/constructor(Shader)", + "memberId": "extensions/shader/Shader/constructor", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "constructor", + "static": false, + "returnType": "Shader", + "parameterTypes": [ + "org.openpatch.scratch.extensions.shader.Shader" + ], + "parameterNames": [ + "shader" + ], + "params": [ + "Shader shader" + ], + "summary": "Copy constructor", + "description": "Copy constructor", + "scratchblock": null, + "paramDocs": [ + "shader: shader" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/getName()", + "memberId": "extensions/shader/Shader/getName", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "getName", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the name", + "description": "Returns the name", + "scratchblock": null, + "paramDocs": [], + "returns": "the name", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/getName", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/getPShader()", + "memberId": "extensions/shader/Shader/getPShader", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "getPShader", + "static": false, + "returnType": "PShader", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the shader", + "description": "Returns the shader", + "scratchblock": null, + "paramDocs": [], + "returns": "the shader", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/getPShader", + "availability": "desktop-only", + "availabilityReason": "Processing's PShader object belongs to the desktop renderer. The browser uses WebGL filters.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,int)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int" + ], + "parameterNames": [ + "name", + "x" + ], + "params": [ + "String name", + "int x" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the uniform in the shader file", + "x: the value" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,boolean)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "boolean" + ], + "parameterNames": [ + "name", + "x" + ], + "params": [ + "String name", + "boolean x" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "x: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,double)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "double" + ], + "parameterNames": [ + "name", + "x" + ], + "params": [ + "String name", + "double x" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "x: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,int,int)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int", + "int" + ], + "parameterNames": [ + "name", + "x", + "y" + ], + "params": [ + "String name", + "int x", + "int y" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "x: ", + "y: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,boolean,boolean)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "boolean", + "boolean" + ], + "parameterNames": [ + "name", + "x", + "y" + ], + "params": [ + "String name", + "boolean x", + "boolean y" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "x: ", + "y: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,double,double)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "double", + "double" + ], + "parameterNames": [ + "name", + "x", + "y" + ], + "params": [ + "String name", + "double x", + "double y" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "x: ", + "y: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,Vector2)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "org.openpatch.scratch.Vector2" + ], + "parameterNames": [ + "name", + "vec" + ], + "params": [ + "String name", + "Vector2 vec" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "vec: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,int[],int)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "int[]", + "int" + ], + "parameterNames": [ + "name", + "values", + "ncoords" + ], + "params": [ + "String name", + "int[] values", + "int ncoords" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "values: ", + "ncoords: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,double[],int)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "double[]", + "int" + ], + "parameterNames": [ + "name", + "values", + "ncoords" + ], + "params": [ + "String name", + "double[] values", + "int ncoords" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "values: ", + "ncoords: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/set(String,Color)", + "memberId": "extensions/shader/Shader/set", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "set", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String", + "org.openpatch.scratch.Color" + ], + "parameterNames": [ + "name", + "c" + ], + "params": [ + "String name", + "Color c" + ], + "summary": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.", + "description": "Sets a `uniform` of the shader: a value the shader reads but the\nprogram decides, such as the time for an animation or a position on the\nstage.\n\nThe name is the one the shader file declares, `uniform float blocks;`\nis set with `set(\"blocks\", 20)`. There is a `set` for one or two\nnumbers or booleans, a [Vector2](../Vector2/index), a\n[Color](../Color/index) (as a `vec3`), and an array of\nnumbers, `ncoords` at a time, for an array uniform like\n`uniform vec3 lights[10];`.\n\nA uniform keeps its value until it is set again, so a value that changes is\nset in `run()`.", + "scratchblock": null, + "paramDocs": [ + "name: ", + "c: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/set", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shader/setName(String)", + "memberId": "extensions/shader/Shader/setName", + "owner": "org.openpatch.scratch.extensions.shader.Shader", + "className": "Shader", + "methodName": "setName", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Sets the name", + "description": "Sets the name", + "scratchblock": null, + "paramDocs": [ + "name: unique name" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shader/setName", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/add(String,String,String)", + "memberId": "extensions/shader/Shaders/add", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "add", + "static": false, + "returnType": "Shader", + "parameterTypes": [ + "java.lang.String", + "java.lang.String", + "java.lang.String" + ], + "parameterNames": [ + "name", + "fragmentShaderPath", + "vertexShaderPath" + ], + "params": [ + "String name", + "String fragmentShaderPath", + "String vertexShaderPath" + ], + "summary": "Adds a shader. If a shader with the given name already exists, that one is\nreturned instead.", + "description": "Adds a shader. If a shader with the given name already exists, that one is\nreturned instead.\n\nThe first shader added is drawn with right away; the ones after it wait\nuntil [switchTo(String)](switchTo) or [next()](next) picks them.\n\nThe vertex shader is usually `null`, which uses Processing's default\none. In the browser any other vertex shader is ignored.", + "scratchblock": null, + "paramDocs": [ + "name: a unique name", + "fragmentShaderPath: the path to the fragment shader", + "vertexShaderPath: the path to the vertex shader, may be null" + ], + "returns": "the shader", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/add", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/constructor(String)", + "memberId": "extensions/shader/Shaders/constructor", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "constructor", + "static": false, + "returnType": "Shaders", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "owner" + ], + "params": [ + "String owner" + ], + "summary": "Creates an empty set of shaders.", + "description": "Creates an empty set of shaders.", + "scratchblock": null, + "paramDocs": [ + "owner: what the shaders belong to, used in error messages: \"sprite\" or\n \"stage\"" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/constructor(Shaders)", + "memberId": "extensions/shader/Shaders/constructor", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "constructor", + "static": false, + "returnType": "Shaders", + "parameterTypes": [ + "org.openpatch.scratch.extensions.shader.Shaders" + ], + "parameterNames": [ + "s" + ], + "params": [ + "Shaders s" + ], + "summary": "Copies a set of shaders.", + "description": "Copies a set of shaders.", + "scratchblock": null, + "paramDocs": [ + "s: the shaders to copy" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/get(String)", + "memberId": "extensions/shader/Shaders/get", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "get", + "static": false, + "returnType": "Shader", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Returns a shader by name.", + "description": "Returns a shader by name.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the shader" + ], + "returns": "the shader, or null if there is none with that name", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/get", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/getCurrent()", + "memberId": "extensions/shader/Shaders/getCurrent", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "getCurrent", + "static": false, + "returnType": "Shader", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the shader currently drawn with.", + "description": "Returns the shader currently drawn with.", + "scratchblock": null, + "paramDocs": [], + "returns": "the current shader, or null if there is none", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/getCurrent", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/getCurrentIndex()", + "memberId": "extensions/shader/Shaders/getCurrentIndex", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "getCurrentIndex", + "static": false, + "returnType": "int", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the position of the current shader.", + "description": "Returns the position of the current shader.", + "scratchblock": null, + "paramDocs": [], + "returns": "the position, or -1 if no shader is in use", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/getCurrentIndex", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/getCurrentName()", + "memberId": "extensions/shader/Shaders/getCurrentName", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "getCurrentName", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the name of the current shader.", + "description": "Returns the name of the current shader.", + "scratchblock": null, + "paramDocs": [], + "returns": "the name, or null if no shader is in use", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/getCurrentName", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/next()", + "memberId": "extensions/shader/Shaders/next", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "next", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Switches to the next shader, in the order they were added. After the last\none comes the first one again.", + "description": "Switches to the next shader, in the order they were added. After the last\none comes the first one again.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/next", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/reset()", + "memberId": "extensions/shader/Shaders/reset", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "reset", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Stops drawing with a shader, so the sprite or stage looks as it does\nwithout one. The shaders are kept: [switchTo(String)](switchTo) or\n[next()](next) brings one back.", + "description": "Stops drawing with a shader, so the sprite or stage looks as it does\nwithout one. The shaders are kept: [switchTo(String)](switchTo) or\n[next()](next) brings one back.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/reset", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/switchTo(String)", + "memberId": "extensions/shader/Shaders/switchTo", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "switchTo", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Switches to the shader with the given name, or with the given position in\nthe order the shaders were added. A name that is not there leaves the\ncurrent shader and prints which ones there are.", + "description": "Switches to the shader with the given name, or with the given position in\nthe order the shaders were added. A name that is not there leaves the\ncurrent shader and prints which ones there are.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the shader" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/switchTo", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/shader/Shaders/switchTo(double)", + "memberId": "extensions/shader/Shaders/switchTo", + "owner": "org.openpatch.scratch.extensions.shader.Shaders", + "className": "Shaders", + "methodName": "switchTo", + "static": false, + "returnType": "void", + "parameterTypes": [ + "double" + ], + "parameterNames": [ + "index" + ], + "params": [ + "double index" + ], + "summary": "Switches to the shader at the given position.", + "description": "Switches to the shader at the given position.", + "scratchblock": null, + "paramDocs": [ + "index: the position of the shader" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/shader/Shaders/switchTo", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/sorting/Sorting/by(Comparator)", + "memberId": "extensions/sorting/Sorting/by", + "owner": "org.openpatch.scratch.extensions.sorting.Sorting", + "className": "Sorting", + "methodName": "by", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.util.Comparator" + ], + "parameterNames": [ + "comparator" + ], + "params": [ + "Comparator comparator" + ], + "summary": "Draws sprites in an order of your own.", + "description": "Draws sprites in an order of your own.", + "scratchblock": null, + "paramDocs": [ + "comparator: decides which of two sprites is drawn first" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/sorting/Sorting/by", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/sorting/Sorting/byY()", + "memberId": "extensions/sorting/Sorting/byY", + "owner": "org.openpatch.scratch.extensions.sorting.Sorting", + "className": "Sorting", + "methodName": "byY", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Draws sprites that are further down the stage in front of sprites that are\nfurther up, which is what a view from above usually wants.", + "description": "Draws sprites that are further down the stage in front of sprites that are\nfurther up, which is what a view from above usually wants.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/sorting/Sorting/byY", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/sorting/Sorting/constructor()", + "memberId": "extensions/sorting/Sorting/constructor", + "owner": "org.openpatch.scratch.extensions.sorting.Sorting", + "className": "Sorting", + "methodName": "constructor", + "static": false, + "returnType": "Sorting", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Decides the order in which the sprites of a stage are drawn.", + "description": "Decides the order in which the sprites of a stage are drawn.\n\nReached through `stage.getSorting()`:\n\n```java\nthis.getSorting().byY();\n```", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/sorting/Sorting/constructor", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/sorting/Sorting/getComparator()", + "memberId": "extensions/sorting/Sorting/getComparator", + "owner": "org.openpatch.scratch.extensions.sorting.Sorting", + "className": "Sorting", + "methodName": "getComparator", + "static": false, + "returnType": "Comparator", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns the order currently used.", + "description": "Returns the order currently used.", + "scratchblock": null, + "paramDocs": [], + "returns": "the comparator, or null if the sprites are not sorted", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/sorting/Sorting/getComparator", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/sorting/Sorting/isOn()", + "memberId": "extensions/sorting/Sorting/isOn", + "owner": "org.openpatch.scratch.extensions.sorting.Sorting", + "className": "Sorting", + "methodName": "isOn", + "static": false, + "returnType": "boolean", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Checks whether the sprites are being sorted.", + "description": "Checks whether the sprites are being sorted.", + "scratchblock": null, + "paramDocs": [], + "returns": "true if an order is set", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/sorting/Sorting/isOn", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/sorting/Sorting/off()", + "memberId": "extensions/sorting/Sorting/off", + "owner": "org.openpatch.scratch.extensions.sorting.Sorting", + "className": "Sorting", + "methodName": "off", + "static": false, + "returnType": "void", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Draws sprites in the order they were added, which is the default.", + "description": "Draws sprites in the order they were added, which is the default.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/sorting/Sorting/off", + "availability": "implemented", + "availabilityReason": "Declared by the browser; behavioral limitations and compiler dialect differences still apply.", + "translations": {} + }, + { + "id": "extensions/tiled/MapObject/constructor()", + "memberId": "extensions/tiled/MapObject/constructor", + "owner": "org.openpatch.scratch.extensions.tiled.MapObject", + "className": "MapObject", + "methodName": "constructor", + "static": false, + "returnType": "MapObject", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Represents a map object with various properties such as dimensions, position,\nvisibility, and\ntype. It also provides methods to retrieve property values in different\nformats and to get a\nShape representation of the map object.", + "description": "Represents a map object with various properties such as dimensions, position,\nvisibility, and\ntype. It also provides methods to retrieve property values in different\nformats and to get a\nShape representation of the map object.", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/MapObject/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/MapObject/getProperty(String)", + "memberId": "extensions/tiled/MapObject/getProperty", + "owner": "org.openpatch.scratch.extensions.tiled.MapObject", + "className": "MapObject", + "methodName": "getProperty", + "static": false, + "returnType": "String", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Retrieves the value of a property with the specified name from the properties\nlist.", + "description": "Retrieves the value of a property with the specified name from the properties\nlist.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the property to retrieve" + ], + "returns": "the value of the property with the specified name", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/MapObject/getProperty", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/MapObject/getPropertyBoolean(String)", + "memberId": "extensions/tiled/MapObject/getPropertyBoolean", + "owner": "org.openpatch.scratch.extensions.tiled.MapObject", + "className": "MapObject", + "methodName": "getPropertyBoolean", + "static": false, + "returnType": "boolean", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Retrieves the value of the specified property as a boolean.", + "description": "Retrieves the value of the specified property as a boolean.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the property to retrieve" + ], + "returns": "the boolean value of the property, or false if the property is not\n found or cannot be\n parsed as a boolean", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/MapObject/getPropertyBoolean", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/MapObject/getPropertyFloat(String)", + "memberId": "extensions/tiled/MapObject/getPropertyFloat", + "owner": "org.openpatch.scratch.extensions.tiled.MapObject", + "className": "MapObject", + "methodName": "getPropertyFloat", + "static": false, + "returnType": "float", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Retrieves the value of a specified property as a float.", + "description": "Retrieves the value of a specified property as a float.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the property to retrieve" + ], + "returns": "the float value of the specified property", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/MapObject/getPropertyFloat", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/MapObject/getPropertyInt(String)", + "memberId": "extensions/tiled/MapObject/getPropertyInt", + "owner": "org.openpatch.scratch.extensions.tiled.MapObject", + "className": "MapObject", + "methodName": "getPropertyInt", + "static": false, + "returnType": "int", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Retrieves the value of a property with the specified name and converts it to\nan integer.", + "description": "Retrieves the value of a property with the specified name and converts it to\nan integer.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the property to retrieve" + ], + "returns": "the integer value of the property", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/MapObject/getPropertyInt", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/MapObject/getShape()", + "memberId": "extensions/tiled/MapObject/getShape", + "owner": "org.openpatch.scratch.extensions.tiled.MapObject", + "className": "MapObject", + "methodName": "getShape", + "static": false, + "returnType": "Shape", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "Returns a Shape object representing the current map object. The type of Shape\nreturned depends\non the properties of the map object: - If the object is a point, a 1x1\nrectangle is returned. -\nIf the object is an ellipse, an Ellipse2D object with the specified width and\nheight is\nreturned. - If the object is a polygon, a Polygon object with the specified\npoints is returned.\n- If none of the above conditions are met, a rectangle with the specified\nwidth and height is\nreturned.", + "description": "Returns a Shape object representing the current map object. The type of Shape\nreturned depends\non the properties of the map object: - If the object is a point, a 1x1\nrectangle is returned. -\nIf the object is an ellipse, an Ellipse2D object with the specified width and\nheight is\nreturned. - If the object is a polygon, a Polygon object with the specified\npoints is returned.\n- If none of the above conditions are met, a rectangle with the specified\nwidth and height is\nreturned.", + "scratchblock": null, + "paramDocs": [], + "returns": "a Shape object representing the current map object.", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/MapObject/getShape", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/MapObject/setClassName(String)", + "memberId": "extensions/tiled/MapObject/setClassName", + "owner": "org.openpatch.scratch.extensions.tiled.MapObject", + "className": "MapObject", + "methodName": "setClassName", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "className" + ], + "params": [ + "String className" + ], + "summary": "Tiled 1.9 renamed an object's type to class; both end up in [type](type)\n(an explicit type wins).", + "description": "Tiled 1.9 renamed an object's type to class; both end up in [type](type)\n(an explicit type wins).", + "scratchblock": null, + "paramDocs": [ + "className: " + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/MapObject/setClassName", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/Property/constructor()", + "memberId": "extensions/tiled/Property/constructor", + "owner": "org.openpatch.scratch.extensions.tiled.Property", + "className": "Property", + "methodName": "constructor", + "static": false, + "returnType": "Property", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "The Property class represents a property of a Tiled object. It includes fields for the property\nname, type, and value.", + "description": "The Property class represents a property of a Tiled object. It includes fields for the property\nname, type, and value.\n\nExample usage:\n\n```java\nProperty p = new Property();\np.name = \"myProperty\";\np.type = \"number\";\np.value = \"42\";\n```", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/Property/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/Property/setText(String)", + "memberId": "extensions/tiled/Property/setText", + "owner": "org.openpatch.scratch.extensions.tiled.Property", + "className": "Property", + "methodName": "setText", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "text" + ], + "params": [ + "String text" + ], + "summary": "Multi-line strings are written as the element's text instead of a value\nattribute.", + "description": "Multi-line strings are written as the element's text instead of a value\nattribute.", + "scratchblock": null, + "paramDocs": [ + "text: the element text" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/Property/setText", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/TiledMap/constructor(String,Stage)", + "memberId": "extensions/tiled/TiledMap/constructor", + "owner": "org.openpatch.scratch.extensions.tiled.TiledMap", + "className": "TiledMap", + "methodName": "constructor", + "static": false, + "returnType": "TiledMap", + "parameterTypes": [ + "java.lang.String", + "org.openpatch.scratch.Stage" + ], + "parameterNames": [ + "path", + "stage" + ], + "params": [ + "String path", + "Stage stage" + ], + "summary": "Constructs a new TiledMap object.", + "description": "Constructs a new TiledMap object.", + "scratchblock": null, + "paramDocs": [ + "path: the file path to the Tiled map XML file", + "stage: the stage to which this Tiled map belongs" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/TiledMap/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/TiledMap/getObjectsFromLayer(String)", + "memberId": "extensions/tiled/TiledMap/getObjectsFromLayer", + "owner": "org.openpatch.scratch.extensions.tiled.TiledMap", + "className": "TiledMap", + "methodName": "getObjectsFromLayer", + "static": false, + "returnType": "MapObject[]", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Retrieves the objects from a specified layer in the tiled map.", + "description": "Retrieves the objects from a specified layer in the tiled map.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the layer from which to retrieve objects" + ], + "returns": "an array of MapObject from the specified layer, or null if the layer\n does not exist", + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/TiledMap/getObjectsFromLayer", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/TiledMap/stampLayerToBackground(String)", + "memberId": "extensions/tiled/TiledMap/stampLayerToBackground", + "owner": "org.openpatch.scratch.extensions.tiled.TiledMap", + "className": "TiledMap", + "methodName": "stampLayerToBackground", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Stamps a specified layer onto the background.", + "description": "Stamps a specified layer onto the background.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the layer to be stamped onto the background" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/TiledMap/stampLayerToBackground", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/TiledMap/stampLayerToForeground(String)", + "memberId": "extensions/tiled/TiledMap/stampLayerToForeground", + "owner": "org.openpatch.scratch.extensions.tiled.TiledMap", + "className": "TiledMap", + "methodName": "stampLayerToForeground", + "static": false, + "returnType": "void", + "parameterTypes": [ + "java.lang.String" + ], + "parameterNames": [ + "name" + ], + "params": [ + "String name" + ], + "summary": "Stamps the specified layer to the foreground.", + "description": "Stamps the specified layer to the foreground.", + "scratchblock": null, + "paramDocs": [ + "name: the name of the layer to be stamped to the foreground" + ], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/TiledMap/stampLayerToForeground", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/TiledMap/toString()", + "memberId": "extensions/tiled/TiledMap/toString", + "owner": "org.openpatch.scratch.extensions.tiled.TiledMap", + "className": "TiledMap", + "methodName": "toString", + "static": false, + "returnType": "String", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "", + "description": "", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/TiledMap/toString", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + }, + { + "id": "extensions/tiled/TilesetImage/constructor()", + "memberId": "extensions/tiled/TilesetImage/constructor", + "owner": "org.openpatch.scratch.extensions.tiled.TilesetImage", + "className": "TilesetImage", + "methodName": "constructor", + "static": false, + "returnType": "TilesetImage", + "parameterTypes": [], + "parameterNames": [], + "params": [], + "summary": "", + "description": "", + "scratchblock": null, + "paramDocs": [], + "returns": null, + "since": "", + "docsUrl": "https://scratch4j.openpatch.org/reference/extensions/tiled/TilesetImage/constructor", + "availability": "desktop-only", + "availabilityReason": "This API requires the desktop runtime. Browser declarations may report the limitation without performing the operation.", + "translations": {} + } + ] +} diff --git a/core/src/main/resources/catalogs/assets.json b/core/src/main/resources/catalogs/assets.json new file mode 100644 index 0000000..5905bda --- /dev/null +++ b/core/src/main/resources/catalogs/assets.json @@ -0,0 +1,12138 @@ +{ + "schemaVersion": 1, + "libraryVersion": "5.8.0", + "browserVersion": "5.8.0-browser.1", + "license": "CC0", + "images": [ + { + "id": "platformer/alienBeige_climb1", + "name": "alienBeige_climb1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_climb1" + }, + { + "id": "platformer/alienBeige_climb2", + "name": "alienBeige_climb2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_climb2" + }, + { + "id": "platformer/alienBeige_duck", + "name": "alienBeige_duck", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_duck" + }, + { + "id": "platformer/alienBeige_front", + "name": "alienBeige_front", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_front" + }, + { + "id": "platformer/alienBeige_hit", + "name": "alienBeige_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_hit" + }, + { + "id": "platformer/alienBeige_jump", + "name": "alienBeige_jump", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_jump" + }, + { + "id": "platformer/alienBeige_stand", + "name": "alienBeige_stand", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 1548, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_stand" + }, + { + "id": "platformer/alienBeige_swim1", + "name": "alienBeige_swim1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_swim1" + }, + { + "id": "platformer/alienBeige_swim2", + "name": "alienBeige_swim2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_swim2" + }, + { + "id": "platformer/alienBeige_walk1", + "name": "alienBeige_walk1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_walk1" + }, + { + "id": "platformer/alienBeige_walk2", + "name": "alienBeige_walk2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBeige_walk2" + }, + { + "id": "platformer/alienBlue_climb1", + "name": "alienBlue_climb1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_climb1" + }, + { + "id": "platformer/alienBlue_climb2", + "name": "alienBlue_climb2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_climb2" + }, + { + "id": "platformer/alienBlue_duck", + "name": "alienBlue_duck", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 1548, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_duck" + }, + { + "id": "platformer/alienBlue_front", + "name": "alienBlue_front", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_front" + }, + { + "id": "platformer/alienBlue_hit", + "name": "alienBlue_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_hit" + }, + { + "id": "platformer/alienBlue_jump", + "name": "alienBlue_jump", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_jump" + }, + { + "id": "platformer/alienBlue_stand", + "name": "alienBlue_stand", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_stand" + }, + { + "id": "platformer/alienBlue_swim1", + "name": "alienBlue_swim1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_swim1" + }, + { + "id": "platformer/alienBlue_swim2", + "name": "alienBlue_swim2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_swim2" + }, + { + "id": "platformer/alienBlue_walk1", + "name": "alienBlue_walk1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 1548, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_walk1" + }, + { + "id": "platformer/alienBlue_walk2", + "name": "alienBlue_walk2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienBlue_walk2" + }, + { + "id": "platformer/alienGreen_climb1", + "name": "alienGreen_climb1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_climb1" + }, + { + "id": "platformer/alienGreen_climb2", + "name": "alienGreen_climb2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_climb2" + }, + { + "id": "platformer/alienGreen_duck", + "name": "alienGreen_duck", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_duck" + }, + { + "id": "platformer/alienGreen_front", + "name": "alienGreen_front", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_front" + }, + { + "id": "platformer/alienGreen_hit", + "name": "alienGreen_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_hit" + }, + { + "id": "platformer/alienGreen_jump", + "name": "alienGreen_jump", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 1548, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_jump" + }, + { + "id": "platformer/alienGreen_stand", + "name": "alienGreen_stand", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_stand" + }, + { + "id": "platformer/alienGreen_swim1", + "name": "alienGreen_swim1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_swim1" + }, + { + "id": "platformer/alienGreen_swim2", + "name": "alienGreen_swim2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_swim2" + }, + { + "id": "platformer/alienGreen_walk1", + "name": "alienGreen_walk1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_walk1" + }, + { + "id": "platformer/alienGreen_walk2", + "name": "alienGreen_walk2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienGreen_walk2" + }, + { + "id": "platformer/alienPink_climb1", + "name": "alienPink_climb1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_climb1" + }, + { + "id": "platformer/alienPink_climb2", + "name": "alienPink_climb2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 1548, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_climb2" + }, + { + "id": "platformer/alienPink_duck", + "name": "alienPink_duck", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_duck" + }, + { + "id": "platformer/alienPink_front", + "name": "alienPink_front", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_front" + }, + { + "id": "platformer/alienPink_hit", + "name": "alienPink_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_hit" + }, + { + "id": "platformer/alienPink_jump", + "name": "alienPink_jump", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_jump" + }, + { + "id": "platformer/alienPink_stand", + "name": "alienPink_stand", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_stand" + }, + { + "id": "platformer/alienPink_swim1", + "name": "alienPink_swim1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_swim1" + }, + { + "id": "platformer/alienPink_swim2", + "name": "alienPink_swim2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 1548, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_swim2" + }, + { + "id": "platformer/alienPink_walk1", + "name": "alienPink_walk1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_walk1" + }, + { + "id": "platformer/alienPink_walk2", + "name": "alienPink_walk2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienPink_walk2" + }, + { + "id": "platformer/alienYellow_climb1", + "name": "alienYellow_climb1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_climb1" + }, + { + "id": "platformer/alienYellow_climb2", + "name": "alienYellow_climb2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_climb2" + }, + { + "id": "platformer/alienYellow_duck", + "name": "alienYellow_duck", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_duck" + }, + { + "id": "platformer/alienYellow_front", + "name": "alienYellow_front", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_front" + }, + { + "id": "platformer/alienYellow_hit", + "name": "alienYellow_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 1548, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_hit" + }, + { + "id": "platformer/alienYellow_jump", + "name": "alienYellow_jump", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 1290, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_jump" + }, + { + "id": "platformer/alienYellow_stand", + "name": "alienYellow_stand", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 1032, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_stand" + }, + { + "id": "platformer/alienYellow_swim1", + "name": "alienYellow_swim1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 774, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_swim1" + }, + { + "id": "platformer/alienYellow_swim2", + "name": "alienYellow_swim2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 516, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_swim2" + }, + { + "id": "platformer/alienYellow_walk1", + "name": "alienYellow_walk1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 258, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_walk1" + }, + { + "id": "platformer/alienYellow_walk2", + "name": "alienYellow_walk2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 0, + "width": 128, + "height": 256, + "direction": 90.0, + "referenceName": "alienYellow_walk2" + }, + { + "id": "platformer/barnacle", + "name": "barnacle", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "barnacle" + }, + { + "id": "platformer/barnacle_attack", + "name": "barnacle_attack", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "barnacle_attack" + }, + { + "id": "platformer/barnacle_dead", + "name": "barnacle_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "barnacle_dead" + }, + { + "id": "platformer/bee", + "name": "bee", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3510, + "y": 130, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "bee" + }, + { + "id": "platformer/bee_dead", + "name": "bee_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3510, + "y": 0, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "bee_dead" + }, + { + "id": "platformer/bee_move", + "name": "bee_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 1820, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "bee_move" + }, + { + "id": "platformer/bomb", + "name": "bomb", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "bomb" + }, + { + "id": "platformer/bombWhite", + "name": "bombWhite", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "bombWhite" + }, + { + "id": "platformer/boxCoin", + "name": "boxCoin", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCoin" + }, + { + "id": "platformer/boxCoin_boxed", + "name": "boxCoin_boxed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCoin_boxed" + }, + { + "id": "platformer/boxCoin_disabled", + "name": "boxCoin_disabled", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCoin_disabled" + }, + { + "id": "platformer/boxCoin_disabled_boxed", + "name": "boxCoin_disabled_boxed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCoin_disabled_boxed" + }, + { + "id": "platformer/boxCrate", + "name": "boxCrate", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCrate" + }, + { + "id": "platformer/boxCrate_double", + "name": "boxCrate_double", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCrate_double" + }, + { + "id": "platformer/boxCrate_single", + "name": "boxCrate_single", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCrate_single" + }, + { + "id": "platformer/boxCrate_warning", + "name": "boxCrate_warning", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxCrate_warning" + }, + { + "id": "platformer/boxExplosive", + "name": "boxExplosive", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxExplosive" + }, + { + "id": "platformer/boxExplosive_disabled", + "name": "boxExplosive_disabled", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxExplosive_disabled" + }, + { + "id": "platformer/boxExplosive_used", + "name": "boxExplosive_used", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxExplosive_used" + }, + { + "id": "platformer/boxItem", + "name": "boxItem", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxItem" + }, + { + "id": "platformer/boxItem_boxed", + "name": "boxItem_boxed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxItem_boxed" + }, + { + "id": "platformer/boxItem_disabled", + "name": "boxItem_disabled", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxItem_disabled" + }, + { + "id": "platformer/boxItem_disabled_boxed", + "name": "boxItem_disabled_boxed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "boxItem_disabled_boxed" + }, + { + "id": "platformer/brickBrown", + "name": "brickBrown", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "brickBrown" + }, + { + "id": "platformer/brickGrey", + "name": "brickGrey", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "brickGrey" + }, + { + "id": "platformer/bridgeA", + "name": "bridgeA", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2340, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "bridgeA" + }, + { + "id": "platformer/bridgeB", + "name": "bridgeB", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "bridgeB" + }, + { + "id": "platformer/bush", + "name": "bush", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "bush" + }, + { + "id": "platformer/cactus", + "name": "cactus", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "cactus" + }, + { + "id": "platformer/chain", + "name": "chain", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "chain" + }, + { + "id": "platformer/coinBronze", + "name": "coinBronze", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "coinBronze" + }, + { + "id": "platformer/coinGold", + "name": "coinGold", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "coinGold" + }, + { + "id": "platformer/coinSilver", + "name": "coinSilver", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "coinSilver" + }, + { + "id": "platformer/dirt", + "name": "dirt", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirt" + }, + { + "id": "platformer/dirtCenter", + "name": "dirtCenter", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCenter" + }, + { + "id": "platformer/dirtCenter_rounded", + "name": "dirtCenter_rounded", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCenter_rounded" + }, + { + "id": "platformer/dirtCliffAlt_left", + "name": "dirtCliffAlt_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCliffAlt_left" + }, + { + "id": "platformer/dirtCliffAlt_right", + "name": "dirtCliffAlt_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCliffAlt_right" + }, + { + "id": "platformer/dirtCliff_left", + "name": "dirtCliff_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCliff_left" + }, + { + "id": "platformer/dirtCliff_right", + "name": "dirtCliff_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCliff_right" + }, + { + "id": "platformer/dirtCorner_left", + "name": "dirtCorner_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCorner_left" + }, + { + "id": "platformer/dirtCorner_right", + "name": "dirtCorner_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtCorner_right" + }, + { + "id": "platformer/dirtHalf", + "name": "dirtHalf", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtHalf" + }, + { + "id": "platformer/dirtHalf_left", + "name": "dirtHalf_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtHalf_left" + }, + { + "id": "platformer/dirtHalf_mid", + "name": "dirtHalf_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtHalf_mid" + }, + { + "id": "platformer/dirtHalf_right", + "name": "dirtHalf_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtHalf_right" + }, + { + "id": "platformer/dirtHill_left", + "name": "dirtHill_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtHill_left" + }, + { + "id": "platformer/dirtHill_right", + "name": "dirtHill_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtHill_right" + }, + { + "id": "platformer/dirtLeft", + "name": "dirtLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtLeft" + }, + { + "id": "platformer/dirtMid", + "name": "dirtMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtMid" + }, + { + "id": "platformer/dirtRight", + "name": "dirtRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "dirtRight" + }, + { + "id": "platformer/doorClosed_mid", + "name": "doorClosed_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "doorClosed_mid" + }, + { + "id": "platformer/doorClosed_top", + "name": "doorClosed_top", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "doorClosed_top" + }, + { + "id": "platformer/doorOpen_mid", + "name": "doorOpen_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "doorOpen_mid" + }, + { + "id": "platformer/doorOpen_top", + "name": "doorOpen_top", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "doorOpen_top" + }, + { + "id": "platformer/fence", + "name": "fence", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "fence" + }, + { + "id": "platformer/fenceBroken", + "name": "fenceBroken", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "fenceBroken" + }, + { + "id": "platformer/fireball", + "name": "fireball", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 650, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fireball" + }, + { + "id": "platformer/fishBlue", + "name": "fishBlue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 1690, + "width": 128, + "height": 128, + "direction": 0.0, + "referenceName": "fishBlue" + }, + { + "id": "platformer/fishBlue_dead", + "name": "fishBlue_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 1560, + "width": 128, + "height": 128, + "direction": 0.0, + "referenceName": "fishBlue_dead" + }, + { + "id": "platformer/fishBlue_fall", + "name": "fishBlue_fall", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 1430, + "width": 128, + "height": 128, + "direction": 0.0, + "referenceName": "fishBlue_fall" + }, + { + "id": "platformer/fishGreen", + "name": "fishGreen", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 1300, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fishGreen" + }, + { + "id": "platformer/fishGreen_dead", + "name": "fishGreen_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 1170, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fishGreen_dead" + }, + { + "id": "platformer/fishGreen_move", + "name": "fishGreen_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 1040, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fishGreen_move" + }, + { + "id": "platformer/fishPink", + "name": "fishPink", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 910, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fishPink" + }, + { + "id": "platformer/fishPink_dead", + "name": "fishPink_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 780, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fishPink_dead" + }, + { + "id": "platformer/fishPink_move", + "name": "fishPink_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 650, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fishPink_move" + }, + { + "id": "platformer/flagBlue1", + "name": "flagBlue1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagBlue1" + }, + { + "id": "platformer/flagBlue2", + "name": "flagBlue2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagBlue2" + }, + { + "id": "platformer/flagBlue_down", + "name": "flagBlue_down", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagBlue_down" + }, + { + "id": "platformer/flagGreen1", + "name": "flagGreen1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagGreen1" + }, + { + "id": "platformer/flagGreen2", + "name": "flagGreen2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagGreen2" + }, + { + "id": "platformer/flagGreen_down", + "name": "flagGreen_down", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagGreen_down" + }, + { + "id": "platformer/flagRed1", + "name": "flagRed1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagRed1" + }, + { + "id": "platformer/flagRed2", + "name": "flagRed2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagRed2" + }, + { + "id": "platformer/flagRed_down", + "name": "flagRed_down", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagRed_down" + }, + { + "id": "platformer/flagYellow1", + "name": "flagYellow1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagYellow1" + }, + { + "id": "platformer/flagYellow2", + "name": "flagYellow2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagYellow2" + }, + { + "id": "platformer/flagYellow_down", + "name": "flagYellow_down", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "flagYellow_down" + }, + { + "id": "platformer/fly", + "name": "fly", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 520, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fly" + }, + { + "id": "platformer/fly_dead", + "name": "fly_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 390, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fly_dead" + }, + { + "id": "platformer/fly_move", + "name": "fly_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 260, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "fly_move" + }, + { + "id": "platformer/frog", + "name": "frog", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 130, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "frog" + }, + { + "id": "platformer/frog_dead", + "name": "frog_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3380, + "y": 0, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "frog_dead" + }, + { + "id": "platformer/frog_move", + "name": "frog_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 1820, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "frog_move" + }, + { + "id": "platformer/gemBlue", + "name": "gemBlue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "gemBlue" + }, + { + "id": "platformer/gemGreen", + "name": "gemGreen", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2600, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "gemGreen" + }, + { + "id": "platformer/gemRed", + "name": "gemRed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "gemRed" + }, + { + "id": "platformer/gemYellow", + "name": "gemYellow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "gemYellow" + }, + { + "id": "platformer/grass", + "name": "grass", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grass" + }, + { + "id": "platformer/grassCenter", + "name": "grassCenter", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCenter" + }, + { + "id": "platformer/grassCenter_round", + "name": "grassCenter_round", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCenter_round" + }, + { + "id": "platformer/grassCliffAlt_left", + "name": "grassCliffAlt_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCliffAlt_left" + }, + { + "id": "platformer/grassCliffAlt_right", + "name": "grassCliffAlt_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1690, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCliffAlt_right" + }, + { + "id": "platformer/grassCliff_left", + "name": "grassCliff_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCliff_left" + }, + { + "id": "platformer/grassCliff_right", + "name": "grassCliff_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCliff_right" + }, + { + "id": "platformer/grassCorner_left", + "name": "grassCorner_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCorner_left" + }, + { + "id": "platformer/grassCorner_right", + "name": "grassCorner_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassCorner_right" + }, + { + "id": "platformer/grassHalf", + "name": "grassHalf", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassHalf" + }, + { + "id": "platformer/grassHalf_left", + "name": "grassHalf_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassHalf_left" + }, + { + "id": "platformer/grassHalf_mid", + "name": "grassHalf_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassHalf_mid" + }, + { + "id": "platformer/grassHalf_right", + "name": "grassHalf_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassHalf_right" + }, + { + "id": "platformer/grassHill_left", + "name": "grassHill_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassHill_left" + }, + { + "id": "platformer/grassHill_right", + "name": "grassHill_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassHill_right" + }, + { + "id": "platformer/grassLeft", + "name": "grassLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassLeft" + }, + { + "id": "platformer/grassMid", + "name": "grassMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassMid" + }, + { + "id": "platformer/grassRight", + "name": "grassRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "grassRight" + }, + { + "id": "platformer/hud0", + "name": "hud0", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud0" + }, + { + "id": "platformer/hud1", + "name": "hud1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud1" + }, + { + "id": "platformer/hud2", + "name": "hud2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud2" + }, + { + "id": "platformer/hud3", + "name": "hud3", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud3" + }, + { + "id": "platformer/hud4", + "name": "hud4", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud4" + }, + { + "id": "platformer/hud5", + "name": "hud5", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud5" + }, + { + "id": "platformer/hud6", + "name": "hud6", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud6" + }, + { + "id": "platformer/hud7", + "name": "hud7", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud7" + }, + { + "id": "platformer/hud8", + "name": "hud8", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud8" + }, + { + "id": "platformer/hud9", + "name": "hud9", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hud9" + }, + { + "id": "platformer/hudCoin", + "name": "hudCoin", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudCoin" + }, + { + "id": "platformer/hudHeart_empty", + "name": "hudHeart_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudHeart_empty" + }, + { + "id": "platformer/hudHeart_full", + "name": "hudHeart_full", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudHeart_full" + }, + { + "id": "platformer/hudHeart_half", + "name": "hudHeart_half", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudHeart_half" + }, + { + "id": "platformer/hudJewel_blue", + "name": "hudJewel_blue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_blue" + }, + { + "id": "platformer/hudJewel_blue_empty", + "name": "hudJewel_blue_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_blue_empty" + }, + { + "id": "platformer/hudJewel_green", + "name": "hudJewel_green", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_green" + }, + { + "id": "platformer/hudJewel_green_empty", + "name": "hudJewel_green_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_green_empty" + }, + { + "id": "platformer/hudJewel_red", + "name": "hudJewel_red", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_red" + }, + { + "id": "platformer/hudJewel_red_empty", + "name": "hudJewel_red_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_red_empty" + }, + { + "id": "platformer/hudJewel_yellow", + "name": "hudJewel_yellow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_yellow" + }, + { + "id": "platformer/hudJewel_yellow_empty", + "name": "hudJewel_yellow_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudJewel_yellow_empty" + }, + { + "id": "platformer/hudKey_blue", + "name": "hudKey_blue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2860, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_blue" + }, + { + "id": "platformer/hudKey_blue_empty", + "name": "hudKey_blue_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_blue_empty" + }, + { + "id": "platformer/hudKey_green", + "name": "hudKey_green", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_green" + }, + { + "id": "platformer/hudKey_green_empty", + "name": "hudKey_green_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_green_empty" + }, + { + "id": "platformer/hudKey_red", + "name": "hudKey_red", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_red" + }, + { + "id": "platformer/hudKey_red_empty", + "name": "hudKey_red_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_red_empty" + }, + { + "id": "platformer/hudKey_yellow", + "name": "hudKey_yellow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_yellow" + }, + { + "id": "platformer/hudKey_yellow_empty", + "name": "hudKey_yellow_empty", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudKey_yellow_empty" + }, + { + "id": "platformer/hudPlayer_beige", + "name": "hudPlayer_beige", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudPlayer_beige" + }, + { + "id": "platformer/hudPlayer_blue", + "name": "hudPlayer_blue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudPlayer_blue" + }, + { + "id": "platformer/hudPlayer_green", + "name": "hudPlayer_green", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudPlayer_green" + }, + { + "id": "platformer/hudPlayer_pink", + "name": "hudPlayer_pink", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudPlayer_pink" + }, + { + "id": "platformer/hudPlayer_yellow", + "name": "hudPlayer_yellow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudPlayer_yellow" + }, + { + "id": "platformer/hudX", + "name": "hudX", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2730, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "hudX" + }, + { + "id": "platformer/keyBlue", + "name": "keyBlue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "keyBlue" + }, + { + "id": "platformer/keyGreen", + "name": "keyGreen", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "keyGreen" + }, + { + "id": "platformer/keyRed", + "name": "keyRed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "keyRed" + }, + { + "id": "platformer/keyYellow", + "name": "keyYellow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "keyYellow" + }, + { + "id": "platformer/ladderMid", + "name": "ladderMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "ladderMid" + }, + { + "id": "platformer/ladderTop", + "name": "ladderTop", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "ladderTop" + }, + { + "id": "platformer/ladybug", + "name": "ladybug", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 1690, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "ladybug" + }, + { + "id": "platformer/ladybug_fly", + "name": "ladybug_fly", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 1560, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "ladybug_fly" + }, + { + "id": "platformer/ladybug_move", + "name": "ladybug_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 1430, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "ladybug_move" + }, + { + "id": "platformer/lava", + "name": "lava", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "lava" + }, + { + "id": "platformer/lavaTop_high", + "name": "lavaTop_high", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2210, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "lavaTop_high" + }, + { + "id": "platformer/lavaTop_low", + "name": "lavaTop_low", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "lavaTop_low" + }, + { + "id": "platformer/leverLeft", + "name": "leverLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "leverLeft" + }, + { + "id": "platformer/leverMid", + "name": "leverMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "leverMid" + }, + { + "id": "platformer/leverRight", + "name": "leverRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "leverRight" + }, + { + "id": "platformer/lockBlue", + "name": "lockBlue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "lockBlue" + }, + { + "id": "platformer/lockGreen", + "name": "lockGreen", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "lockGreen" + }, + { + "id": "platformer/lockRed", + "name": "lockRed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "lockRed" + }, + { + "id": "platformer/lockYellow", + "name": "lockYellow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "lockYellow" + }, + { + "id": "platformer/mouse", + "name": "mouse", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 1300, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "mouse" + }, + { + "id": "platformer/mouse_dead", + "name": "mouse_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 1170, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "mouse_dead" + }, + { + "id": "platformer/mouse_move", + "name": "mouse_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 1040, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "mouse_move" + }, + { + "id": "platformer/mushroomBrown", + "name": "mushroomBrown", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "mushroomBrown" + }, + { + "id": "platformer/mushroomRed", + "name": "mushroomRed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "mushroomRed" + }, + { + "id": "platformer/planet", + "name": "planet", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planet" + }, + { + "id": "platformer/planetCenter", + "name": "planetCenter", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1560, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCenter" + }, + { + "id": "platformer/planetCenter_rounded", + "name": "planetCenter_rounded", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCenter_rounded" + }, + { + "id": "platformer/planetCliffAlt_left", + "name": "planetCliffAlt_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCliffAlt_left" + }, + { + "id": "platformer/planetCliffAlt_right", + "name": "planetCliffAlt_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCliffAlt_right" + }, + { + "id": "platformer/planetCliff_left", + "name": "planetCliff_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCliff_left" + }, + { + "id": "platformer/planetCliff_right", + "name": "planetCliff_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCliff_right" + }, + { + "id": "platformer/planetCorner_left", + "name": "planetCorner_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCorner_left" + }, + { + "id": "platformer/planetCorner_right", + "name": "planetCorner_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetCorner_right" + }, + { + "id": "platformer/planetHalf", + "name": "planetHalf", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetHalf" + }, + { + "id": "platformer/planetHalf_left", + "name": "planetHalf_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetHalf_left" + }, + { + "id": "platformer/planetHalf_mid", + "name": "planetHalf_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetHalf_mid" + }, + { + "id": "platformer/planetHalf_right", + "name": "planetHalf_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetHalf_right" + }, + { + "id": "platformer/planetHill_left", + "name": "planetHill_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetHill_left" + }, + { + "id": "platformer/planetHill_right", + "name": "planetHill_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetHill_right" + }, + { + "id": "platformer/planetLeft", + "name": "planetLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetLeft" + }, + { + "id": "platformer/planetMid", + "name": "planetMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1430, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetMid" + }, + { + "id": "platformer/planetRight", + "name": "planetRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "planetRight" + }, + { + "id": "platformer/plantPurple", + "name": "plantPurple", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "plantPurple" + }, + { + "id": "platformer/rock", + "name": "rock", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "rock" + }, + { + "id": "platformer/sand", + "name": "sand", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sand" + }, + { + "id": "platformer/sandCenter", + "name": "sandCenter", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCenter" + }, + { + "id": "platformer/sandCenter_rounded", + "name": "sandCenter_rounded", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCenter_rounded" + }, + { + "id": "platformer/sandCliffAlt_left", + "name": "sandCliffAlt_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCliffAlt_left" + }, + { + "id": "platformer/sandCliffAlt_right", + "name": "sandCliffAlt_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCliffAlt_right" + }, + { + "id": "platformer/sandCliff_left", + "name": "sandCliff_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCliff_left" + }, + { + "id": "platformer/sandCliff_right", + "name": "sandCliff_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCliff_right" + }, + { + "id": "platformer/sandCorner_leftg", + "name": "sandCorner_leftg", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCorner_leftg" + }, + { + "id": "platformer/sandCorner_right", + "name": "sandCorner_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandCorner_right" + }, + { + "id": "platformer/sandHalf", + "name": "sandHalf", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandHalf" + }, + { + "id": "platformer/sandHalf_left", + "name": "sandHalf_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandHalf_left" + }, + { + "id": "platformer/sandHalf_mid", + "name": "sandHalf_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandHalf_mid" + }, + { + "id": "platformer/sandHalf_right", + "name": "sandHalf_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandHalf_right" + }, + { + "id": "platformer/sandHill_left", + "name": "sandHill_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1300, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandHill_left" + }, + { + "id": "platformer/sandHill_right", + "name": "sandHill_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandHill_right" + }, + { + "id": "platformer/sandLeft", + "name": "sandLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandLeft" + }, + { + "id": "platformer/sandMid", + "name": "sandMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandMid" + }, + { + "id": "platformer/sandRight", + "name": "sandRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sandRight" + }, + { + "id": "platformer/saw", + "name": "saw", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "saw" + }, + { + "id": "platformer/sawHalf", + "name": "sawHalf", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sawHalf" + }, + { + "id": "platformer/sawHalf_dead", + "name": "sawHalf_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sawHalf_dead" + }, + { + "id": "platformer/sawHalf_move", + "name": "sawHalf_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3510, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sawHalf_move" + }, + { + "id": "platformer/saw_dead", + "name": "saw_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "saw_dead" + }, + { + "id": "platformer/saw_move", + "name": "saw_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "saw_move" + }, + { + "id": "platformer/sign", + "name": "sign", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sign" + }, + { + "id": "platformer/signExit", + "name": "signExit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "signExit" + }, + { + "id": "platformer/signLeft", + "name": "signLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2080, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "signLeft" + }, + { + "id": "platformer/signRight", + "name": "signRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "signRight" + }, + { + "id": "platformer/slimeBlock", + "name": "slimeBlock", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "slimeBlock" + }, + { + "id": "platformer/slimeBlock_dead", + "name": "slimeBlock_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3250, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "slimeBlock_dead" + }, + { + "id": "platformer/slimeBlock_move", + "name": "slimeBlock_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "slimeBlock_move" + }, + { + "id": "platformer/slimeBlue", + "name": "slimeBlue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 1690, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeBlue" + }, + { + "id": "platformer/slimeBlue_dead", + "name": "slimeBlue_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 1560, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeBlue_dead" + }, + { + "id": "platformer/slimeBlue_hit", + "name": "slimeBlue_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 1430, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeBlue_hit" + }, + { + "id": "platformer/slimeBlue_move", + "name": "slimeBlue_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 1300, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeBlue_move" + }, + { + "id": "platformer/slimeGreen", + "name": "slimeGreen", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 1170, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeGreen" + }, + { + "id": "platformer/slimeGreen_dead", + "name": "slimeGreen_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 1040, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeGreen_dead" + }, + { + "id": "platformer/slimeGreen_hit", + "name": "slimeGreen_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 910, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeGreen_hit" + }, + { + "id": "platformer/slimeGreen_move", + "name": "slimeGreen_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 780, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimeGreen_move" + }, + { + "id": "platformer/slimePurple", + "name": "slimePurple", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 650, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimePurple" + }, + { + "id": "platformer/slimePurple_dead", + "name": "slimePurple_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 520, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimePurple_dead" + }, + { + "id": "platformer/slimePurple_hit", + "name": "slimePurple_hit", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 390, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimePurple_hit" + }, + { + "id": "platformer/slimePurple_move", + "name": "slimePurple_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 260, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "slimePurple_move" + }, + { + "id": "platformer/snail", + "name": "snail", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 130, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "snail" + }, + { + "id": "platformer/snail_move", + "name": "snail_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 3120, + "y": 0, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "snail_move" + }, + { + "id": "platformer/snail_shell", + "name": "snail_shell", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 1820, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "snail_shell" + }, + { + "id": "platformer/snow", + "name": "snow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snow" + }, + { + "id": "platformer/snowCenter", + "name": "snowCenter", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCenter" + }, + { + "id": "platformer/snowCenter_rounded", + "name": "snowCenter_rounded", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCenter_rounded" + }, + { + "id": "platformer/snowCliffAlt_left", + "name": "snowCliffAlt_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCliffAlt_left" + }, + { + "id": "platformer/snowCliffAlt_right", + "name": "snowCliffAlt_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCliffAlt_right" + }, + { + "id": "platformer/snowCliff_left", + "name": "snowCliff_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCliff_left" + }, + { + "id": "platformer/snowCliff_right", + "name": "snowCliff_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCliff_right" + }, + { + "id": "platformer/snowCorner_left", + "name": "snowCorner_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCorner_left" + }, + { + "id": "platformer/snowCorner_right", + "name": "snowCorner_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowCorner_right" + }, + { + "id": "platformer/snowHalf", + "name": "snowHalf", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowHalf" + }, + { + "id": "platformer/snowHalf_left", + "name": "snowHalf_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1170, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowHalf_left" + }, + { + "id": "platformer/snowHalf_mid", + "name": "snowHalf_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowHalf_mid" + }, + { + "id": "platformer/snowHalf_right", + "name": "snowHalf_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowHalf_right" + }, + { + "id": "platformer/snowHill_left", + "name": "snowHill_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowHill_left" + }, + { + "id": "platformer/snowHill_right", + "name": "snowHill_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowHill_right" + }, + { + "id": "platformer/snowLeft", + "name": "snowLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowLeft" + }, + { + "id": "platformer/snowMid", + "name": "snowMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowMid" + }, + { + "id": "platformer/snowRight", + "name": "snowRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "snowRight" + }, + { + "id": "platformer/spikes", + "name": "spikes", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "spikes" + }, + { + "id": "platformer/spring", + "name": "spring", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "spring" + }, + { + "id": "platformer/sprung", + "name": "sprung", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "sprung" + }, + { + "id": "platformer/star", + "name": "star", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "star" + }, + { + "id": "platformer/stone", + "name": "stone", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 910, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stone" + }, + { + "id": "platformer/stoneCenter", + "name": "stoneCenter", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCenter" + }, + { + "id": "platformer/stoneCenter_rounded", + "name": "stoneCenter_rounded", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCenter_rounded" + }, + { + "id": "platformer/stoneCliffAlt_left", + "name": "stoneCliffAlt_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCliffAlt_left" + }, + { + "id": "platformer/stoneCliffAlt_right", + "name": "stoneCliffAlt_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCliffAlt_right" + }, + { + "id": "platformer/stoneCliff_left", + "name": "stoneCliff_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCliff_left" + }, + { + "id": "platformer/stoneCliff_right", + "name": "stoneCliff_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCliff_right" + }, + { + "id": "platformer/stoneCorner_left", + "name": "stoneCorner_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1040, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCorner_left" + }, + { + "id": "platformer/stoneCorner_right", + "name": "stoneCorner_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 1808, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneCorner_right" + }, + { + "id": "platformer/stoneHalf", + "name": "stoneHalf", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 1678, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneHalf" + }, + { + "id": "platformer/stoneHalf_left", + "name": "stoneHalf_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 910, + "y": 1548, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneHalf_left" + }, + { + "id": "platformer/stoneHalf_mid", + "name": "stoneHalf_mid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 780, + "y": 1806, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneHalf_mid" + }, + { + "id": "platformer/stoneHalf_right", + "name": "stoneHalf_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 650, + "y": 1806, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneHalf_right" + }, + { + "id": "platformer/stoneHill_left", + "name": "stoneHill_left", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 520, + "y": 1806, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneHill_left" + }, + { + "id": "platformer/stoneHill_right", + "name": "stoneHill_right", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 390, + "y": 1806, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneHill_right" + }, + { + "id": "platformer/stoneLeft", + "name": "stoneLeft", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 260, + "y": 1806, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneLeft" + }, + { + "id": "platformer/stoneMid", + "name": "stoneMid", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 130, + "y": 1806, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneMid" + }, + { + "id": "platformer/stoneRight", + "name": "stoneRight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 0, + "y": 1806, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "stoneRight" + }, + { + "id": "platformer/switchBlue", + "name": "switchBlue", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchBlue" + }, + { + "id": "platformer/switchBlue_pressed", + "name": "switchBlue_pressed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchBlue_pressed" + }, + { + "id": "platformer/switchGreen", + "name": "switchGreen", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2470, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchGreen" + }, + { + "id": "platformer/switchGreen_pressed", + "name": "switchGreen_pressed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 780, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchGreen_pressed" + }, + { + "id": "platformer/switchRed", + "name": "switchRed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 650, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchRed" + }, + { + "id": "platformer/switchRed_pressed", + "name": "switchRed_pressed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 520, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchRed_pressed" + }, + { + "id": "platformer/switchYellow", + "name": "switchYellow", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 390, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchYellow" + }, + { + "id": "platformer/switchYellow_pressed", + "name": "switchYellow_pressed", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 260, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "switchYellow_pressed" + }, + { + "id": "platformer/torch1", + "name": "torch1", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 130, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "torch1" + }, + { + "id": "platformer/torch2", + "name": "torch2", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1950, + "y": 0, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "torch2" + }, + { + "id": "platformer/torchOff", + "name": "torchOff", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 1820, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "torchOff" + }, + { + "id": "platformer/water", + "name": "water", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 1690, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "water" + }, + { + "id": "platformer/waterTop_high", + "name": "waterTop_high", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 1560, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "waterTop_high" + }, + { + "id": "platformer/waterTop_low", + "name": "waterTop_low", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 1430, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "waterTop_low" + }, + { + "id": "platformer/weight", + "name": "weight", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 1300, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "weight" + }, + { + "id": "platformer/weightAttached", + "name": "weightAttached", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 1170, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "weightAttached" + }, + { + "id": "platformer/window", + "name": "window", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 1820, + "y": 1040, + "width": 128, + "height": 128, + "direction": 90.0, + "referenceName": "window" + }, + { + "id": "platformer/wormGreen", + "name": "wormGreen", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 1690, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "wormGreen" + }, + { + "id": "platformer/wormGreen_dead", + "name": "wormGreen_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 1560, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "wormGreen_dead" + }, + { + "id": "platformer/wormGreen_move", + "name": "wormGreen_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 1430, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "wormGreen_move" + }, + { + "id": "platformer/wormPink", + "name": "wormPink", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 1300, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "wormPink" + }, + { + "id": "platformer/wormPink_dead", + "name": "wormPink_dead", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 1170, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "wormPink_dead" + }, + { + "id": "platformer/wormPink_move", + "name": "wormPink_move", + "sheet": "platformer", + "sheetPath": "images/platformer.png", + "x": 2990, + "y": 1040, + "width": 128, + "height": 128, + "direction": -90.0, + "referenceName": "wormPink_move" + }, + { + "id": "jumper/bronze_1", + "name": "bronze_1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 707, + "y": 296, + "width": 84, + "height": 84, + "direction": 90.0, + "referenceName": "bronze_1" + }, + { + "id": "jumper/bronze_2", + "name": "bronze_2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 826, + "y": 206, + "width": 66, + "height": 84, + "direction": 90.0, + "referenceName": "bronze_2" + }, + { + "id": "jumper/bronze_3", + "name": "bronze_3", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 899, + "y": 116, + "width": 50, + "height": 84, + "direction": 90.0, + "referenceName": "bronze_3" + }, + { + "id": "jumper/bronze_4", + "name": "bronze_4", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 670, + "y": 406, + "width": 14, + "height": 84, + "direction": 90.0, + "referenceName": "bronze_4" + }, + { + "id": "jumper/bubble", + "name": "bubble", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1662, + "width": 211, + "height": 215, + "direction": 90.0, + "referenceName": "bubble" + }, + { + "id": "jumper/bunny1_hurt", + "name": "bunny1_hurt", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 946, + "width": 150, + "height": 174, + "direction": 90.0, + "referenceName": "bunny1_hurt" + }, + { + "id": "jumper/bunny1_jump", + "name": "bunny1_jump", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 763, + "width": 150, + "height": 181, + "direction": 90.0, + "referenceName": "bunny1_jump" + }, + { + "id": "jumper/bunny1_ready", + "name": "bunny1_ready", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 614, + "y": 1063, + "width": 120, + "height": 191, + "direction": 90.0, + "referenceName": "bunny1_ready" + }, + { + "id": "jumper/bunny1_stand", + "name": "bunny1_stand", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 690, + "y": 406, + "width": 120, + "height": 201, + "direction": 90.0, + "referenceName": "bunny1_stand" + }, + { + "id": "jumper/bunny1_walk1", + "name": "bunny1_walk1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 678, + "y": 860, + "width": 120, + "height": 201, + "direction": 90.0, + "referenceName": "bunny1_walk1" + }, + { + "id": "jumper/bunny1_walk2", + "name": "bunny1_walk2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 692, + "y": 1458, + "width": 120, + "height": 207, + "direction": 90.0, + "referenceName": "bunny1_walk2" + }, + { + "id": "jumper/bunny2_hurt", + "name": "bunny2_hurt", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 411, + "y": 1866, + "width": 150, + "height": 174, + "direction": 90.0, + "referenceName": "bunny2_hurt" + }, + { + "id": "jumper/bunny2_jump", + "name": "bunny2_jump", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 416, + "y": 1660, + "width": 150, + "height": 181, + "direction": 90.0, + "referenceName": "bunny2_jump" + }, + { + "id": "jumper/bunny2_ready", + "name": "bunny2_ready", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 581, + "y": 1265, + "width": 121, + "height": 191, + "direction": 90.0, + "referenceName": "bunny2_ready" + }, + { + "id": "jumper/bunny2_stand", + "name": "bunny2_stand", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 584, + "y": 0, + "width": 121, + "height": 201, + "direction": 90.0, + "referenceName": "bunny2_stand" + }, + { + "id": "jumper/bunny2_walk1", + "name": "bunny2_walk1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 584, + "y": 203, + "width": 121, + "height": 201, + "direction": 90.0, + "referenceName": "bunny2_walk1" + }, + { + "id": "jumper/bunny2_walk2", + "name": "bunny2_walk2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 678, + "y": 651, + "width": 121, + "height": 207, + "direction": 90.0, + "referenceName": "bunny2_walk2" + }, + { + "id": "jumper/cactus", + "name": "cactus", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 707, + "y": 134, + "width": 117, + "height": 160, + "direction": 90.0, + "referenceName": "jumper/cactus" + }, + { + "id": "jumper/carrot", + "name": "carrot", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 820, + "y": 1733, + "width": 78, + "height": 70, + "direction": 90.0, + "referenceName": "carrot" + }, + { + "id": "jumper/carrot_gold", + "name": "carrot_gold", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 814, + "y": 1661, + "width": 78, + "height": 70, + "direction": 90.0, + "referenceName": "carrot_gold" + }, + { + "id": "jumper/carrots", + "name": "carrots", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 812, + "y": 554, + "width": 54, + "height": 49, + "direction": 90.0, + "referenceName": "carrots" + }, + { + "id": "jumper/cloud", + "name": "cloud", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1152, + "width": 260, + "height": 134, + "direction": 90.0, + "referenceName": "cloud" + }, + { + "id": "jumper/coin_bronze", + "name": "coin_bronze", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 329, + "y": 1390, + "width": 60, + "height": 61, + "direction": 90.0, + "referenceName": "coin_bronze" + }, + { + "id": "jumper/coin_gold", + "name": "coin_gold", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 244, + "y": 1981, + "width": 61, + "height": 61, + "direction": 90.0, + "referenceName": "coin_gold" + }, + { + "id": "jumper/coin_silver", + "name": "coin_silver", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 307, + "y": 1981, + "width": 61, + "height": 61, + "direction": 90.0, + "referenceName": "coin_silver" + }, + { + "id": "jumper/flame", + "name": "flame", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 900, + "y": 1733, + "width": 41, + "height": 80, + "direction": 90.0, + "referenceName": "flame" + }, + { + "id": "jumper/flyMan_fly", + "name": "flyMan_fly", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 566, + "y": 510, + "width": 122, + "height": 139, + "direction": 90.0, + "referenceName": "flyMan_fly" + }, + { + "id": "jumper/flyMan_jump", + "name": "flyMan_jump", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 568, + "y": 1534, + "width": 122, + "height": 135, + "direction": 90.0, + "referenceName": "flyMan_jump" + }, + { + "id": "jumper/flyMan_stand", + "name": "flyMan_stand", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 568, + "y": 1671, + "width": 122, + "height": 139, + "direction": 90.0, + "referenceName": "flyMan_stand" + }, + { + "id": "jumper/flyMan_still_fly", + "name": "flyMan_still_fly", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 692, + "y": 1667, + "width": 120, + "height": 132, + "direction": 90.0, + "referenceName": "flyMan_still_fly" + }, + { + "id": "jumper/flyMan_still_jump", + "name": "flyMan_still_jump", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 698, + "y": 1801, + "width": 120, + "height": 128, + "direction": 90.0, + "referenceName": "flyMan_still_jump" + }, + { + "id": "jumper/flyMan_still_stand", + "name": "flyMan_still_stand", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 707, + "y": 0, + "width": 120, + "height": 132, + "direction": 90.0, + "referenceName": "flyMan_still_stand" + }, + { + "id": "jumper/gold_1", + "name": "gold_1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 698, + "y": 1931, + "width": 84, + "height": 84, + "direction": 90.0, + "referenceName": "gold_1" + }, + { + "id": "jumper/gold_2", + "name": "gold_2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 829, + "y": 0, + "width": 66, + "height": 84, + "direction": 90.0, + "referenceName": "gold_2" + }, + { + "id": "jumper/gold_3", + "name": "gold_3", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 897, + "y": 1574, + "width": 50, + "height": 84, + "direction": 90.0, + "referenceName": "gold_3" + }, + { + "id": "jumper/gold_4", + "name": "gold_4", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 645, + "y": 651, + "width": 15, + "height": 84, + "direction": 90.0, + "referenceName": "gold_4" + }, + { + "id": "jumper/grass1", + "name": "grass1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 868, + "y": 1877, + "width": 58, + "height": 57, + "direction": 90.0, + "referenceName": "grass1" + }, + { + "id": "jumper/grass2", + "name": "grass2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 784, + "y": 1931, + "width": 82, + "height": 70, + "direction": 90.0, + "referenceName": "grass2" + }, + { + "id": "jumper/grass_brown1", + "name": "grass_brown1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 534, + "y": 1063, + "width": 58, + "height": 57, + "direction": 90.0, + "referenceName": "grass_brown1" + }, + { + "id": "jumper/grass_brown2", + "name": "grass_brown2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 801, + "y": 752, + "width": 82, + "height": 70, + "direction": 90.0, + "referenceName": "grass_brown2" + }, + { + "id": "jumper/ground_cake", + "name": "ground_cake", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 576, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_cake" + }, + { + "id": "jumper/ground_cake_broken", + "name": "ground_cake_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 0, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_cake_broken" + }, + { + "id": "jumper/ground_cake_small", + "name": "ground_cake_small", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 218, + "y": 1456, + "width": 201, + "height": 100, + "direction": 90.0, + "referenceName": "ground_cake_small" + }, + { + "id": "jumper/ground_cake_small_broken", + "name": "ground_cake_small_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 262, + "y": 1152, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_cake_small_broken" + }, + { + "id": "jumper/ground_grass", + "name": "ground_grass", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 288, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_grass" + }, + { + "id": "jumper/ground_grass_broken", + "name": "ground_grass_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 384, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_grass_broken" + }, + { + "id": "jumper/ground_grass_small", + "name": "ground_grass_small", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 213, + "y": 1662, + "width": 201, + "height": 100, + "direction": 90.0, + "referenceName": "ground_grass_small" + }, + { + "id": "jumper/ground_grass_small_broken", + "name": "ground_grass_small_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 204, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_grass_small_broken" + }, + { + "id": "jumper/ground_sand", + "name": "ground_sand", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 672, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_sand" + }, + { + "id": "jumper/ground_sand_broken", + "name": "ground_sand_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1056, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_sand_broken" + }, + { + "id": "jumper/ground_sand_small", + "name": "ground_sand_small", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 208, + "y": 1879, + "width": 201, + "height": 100, + "direction": 90.0, + "referenceName": "ground_sand_small" + }, + { + "id": "jumper/ground_sand_small_broken", + "name": "ground_sand_small_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 102, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_sand_small_broken" + }, + { + "id": "jumper/ground_snow", + "name": "ground_snow", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 768, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_snow" + }, + { + "id": "jumper/ground_snow_broken", + "name": "ground_snow_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 480, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_snow_broken" + }, + { + "id": "jumper/ground_snow_small", + "name": "ground_snow_small", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 213, + "y": 1764, + "width": 201, + "height": 100, + "direction": 90.0, + "referenceName": "ground_snow_small" + }, + { + "id": "jumper/ground_snow_small_broken", + "name": "ground_snow_small_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 306, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_snow_small_broken" + }, + { + "id": "jumper/ground_stone", + "name": "ground_stone", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 96, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_stone" + }, + { + "id": "jumper/ground_stone_broken", + "name": "ground_stone_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 192, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_stone_broken" + }, + { + "id": "jumper/ground_stone_small", + "name": "ground_stone_small", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 408, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_stone_small" + }, + { + "id": "jumper/ground_stone_small_broken", + "name": "ground_stone_small_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 232, + "y": 1288, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_stone_small_broken" + }, + { + "id": "jumper/ground_wood", + "name": "ground_wood", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 960, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_wood" + }, + { + "id": "jumper/ground_wood_broken", + "name": "ground_wood_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 864, + "width": 380, + "height": 94, + "direction": 90.0, + "referenceName": "ground_wood_broken" + }, + { + "id": "jumper/ground_wood_small", + "name": "ground_wood_small", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 218, + "y": 1558, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_wood_small" + }, + { + "id": "jumper/ground_wood_small_broken", + "name": "ground_wood_small_broken", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 0, + "width": 200, + "height": 100, + "direction": 90.0, + "referenceName": "ground_wood_small_broken" + }, + { + "id": "jumper/jetpack", + "name": "jetpack", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 563, + "y": 1843, + "width": 133, + "height": 160, + "direction": 90.0, + "referenceName": "jetpack" + }, + { + "id": "jumper/jetpack_item", + "name": "jetpack_item", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 852, + "y": 1089, + "width": 65, + "height": 77, + "direction": 90.0, + "referenceName": "jetpack_item" + }, + { + "id": "jumper/lifes", + "name": "lifes", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 868, + "y": 1936, + "width": 52, + "height": 71, + "direction": 90.0, + "referenceName": "lifes" + }, + { + "id": "jumper/lighting_blue", + "name": "lighting_blue", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 895, + "y": 453, + "width": 55, + "height": 114, + "direction": 90.0, + "referenceName": "lighting_blue" + }, + { + "id": "jumper/lighting_yellow", + "name": "lighting_yellow", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 897, + "y": 0, + "width": 55, + "height": 114, + "direction": 90.0, + "referenceName": "lighting_yellow" + }, + { + "id": "jumper/mushroom_brown", + "name": "mushroom_brown", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 814, + "y": 1574, + "width": 81, + "height": 85, + "direction": 90.0, + "referenceName": "mushroom_brown" + }, + { + "id": "jumper/mushroom_red", + "name": "mushroom_red", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 812, + "y": 453, + "width": 81, + "height": 99, + "direction": 90.0, + "referenceName": "mushroom_red" + }, + { + "id": "jumper/particle_beige", + "name": "particle_beige", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 563, + "y": 2005, + "width": 58, + "height": 41, + "direction": 90.0, + "referenceName": "particle_beige" + }, + { + "id": "jumper/particle_blue", + "name": "particle_blue", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 852, + "y": 1168, + "width": 51, + "height": 49, + "direction": 90.0, + "referenceName": "particle_blue" + }, + { + "id": "jumper/particle_brown", + "name": "particle_brown", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 820, + "y": 1877, + "width": 44, + "height": 48, + "direction": 90.0, + "referenceName": "particle_brown" + }, + { + "id": "jumper/particle_darkBrown", + "name": "particle_darkBrown", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 784, + "y": 2003, + "width": 54, + "height": 43, + "direction": 90.0, + "referenceName": "particle_darkBrown" + }, + { + "id": "jumper/particle_darkGrey", + "name": "particle_darkGrey", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 826, + "y": 1364, + "width": 51, + "height": 43, + "direction": 90.0, + "referenceName": "particle_darkGrey" + }, + { + "id": "jumper/particle_green", + "name": "particle_green", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 800, + "y": 1003, + "width": 48, + "height": 46, + "direction": 90.0, + "referenceName": "particle_green" + }, + { + "id": "jumper/particle_grey", + "name": "particle_grey", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 623, + "y": 2005, + "width": 38, + "height": 41, + "direction": 90.0, + "referenceName": "particle_grey" + }, + { + "id": "jumper/particle_pink", + "name": "particle_pink", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 829, + "y": 86, + "width": 53, + "height": 46, + "direction": 90.0, + "referenceName": "particle_pink" + }, + { + "id": "jumper/portal_orange", + "name": "portal_orange", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1288, + "width": 230, + "height": 82, + "direction": 90.0, + "referenceName": "portal_orange" + }, + { + "id": "jumper/portal_orangeParticle", + "name": "portal_orangeParticle", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 262, + "y": 1254, + "width": 20, + "height": 20, + "direction": 90.0, + "referenceName": "portal_orangeParticle" + }, + { + "id": "jumper/portal_yellow", + "name": "portal_yellow", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1372, + "width": 230, + "height": 82, + "direction": 90.0, + "referenceName": "portal_yellow" + }, + { + "id": "jumper/portal_yellowParticle", + "name": "portal_yellowParticle", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 284, + "y": 1254, + "width": 20, + "height": 20, + "direction": 90.0, + "referenceName": "portal_yellowParticle" + }, + { + "id": "jumper/powerup_bubble", + "name": "powerup_bubble", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 826, + "y": 134, + "width": 71, + "height": 70, + "direction": 90.0, + "referenceName": "powerup_bubble" + }, + { + "id": "jumper/powerup_bunny", + "name": "powerup_bunny", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 826, + "y": 1220, + "width": 71, + "height": 70, + "direction": 90.0, + "referenceName": "powerup_bunny" + }, + { + "id": "jumper/powerup_empty", + "name": "powerup_empty", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 894, + "y": 1661, + "width": 71, + "height": 70, + "direction": 90.0, + "referenceName": "powerup_empty" + }, + { + "id": "jumper/powerup_jetpack", + "name": "powerup_jetpack", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 820, + "y": 1805, + "width": 71, + "height": 70, + "direction": 90.0, + "referenceName": "powerup_jetpack" + }, + { + "id": "jumper/powerup_wings", + "name": "powerup_wings", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 826, + "y": 1292, + "width": 71, + "height": 70, + "direction": 90.0, + "referenceName": "powerup_wings" + }, + { + "id": "jumper/silver_1", + "name": "silver_1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 584, + "y": 406, + "width": 84, + "height": 84, + "direction": 90.0, + "referenceName": "silver_1" + }, + { + "id": "jumper/silver_2", + "name": "silver_2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 852, + "y": 1003, + "width": 66, + "height": 84, + "direction": 90.0, + "referenceName": "silver_2" + }, + { + "id": "jumper/silver_3", + "name": "silver_3", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 899, + "y": 1219, + "width": 50, + "height": 84, + "direction": 90.0, + "referenceName": "silver_3" + }, + { + "id": "jumper/silver_4", + "name": "silver_4", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 662, + "y": 651, + "width": 14, + "height": 84, + "direction": 90.0, + "referenceName": "silver_4" + }, + { + "id": "jumper/smoke", + "name": "smoke", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 879, + "y": 1364, + "width": 51, + "height": 48, + "direction": 90.0, + "referenceName": "smoke" + }, + { + "id": "jumper/spikeBall1", + "name": "spikeBall1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 534, + "y": 763, + "width": 142, + "height": 148, + "direction": 90.0, + "referenceName": "spikeBall1" + }, + { + "id": "jumper/spikeBall_2", + "name": "spikeBall_2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 464, + "y": 1122, + "width": 148, + "height": 141, + "direction": 90.0, + "referenceName": "spikeBall_2" + }, + { + "id": "jumper/spikeMan_jump", + "name": "spikeMan_jump", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 736, + "y": 1063, + "width": 114, + "height": 155, + "direction": 90.0, + "referenceName": "spikeMan_jump" + }, + { + "id": "jumper/spikeMan_stand", + "name": "spikeMan_stand", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 814, + "y": 1417, + "width": 90, + "height": 155, + "direction": 90.0, + "referenceName": "spikeMan_stand" + }, + { + "id": "jumper/spikeMan_walk1", + "name": "spikeMan_walk1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 704, + "y": 1256, + "width": 120, + "height": 159, + "direction": 90.0, + "referenceName": "spikeMan_walk1" + }, + { + "id": "jumper/spikeMan_walk2", + "name": "spikeMan_walk2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 812, + "y": 296, + "width": 90, + "height": 155, + "direction": 90.0, + "referenceName": "spikeMan_walk2" + }, + { + "id": "jumper/spike_bottom", + "name": "spike_bottom", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 894, + "y": 206, + "width": 51, + "height": 87, + "direction": 90.0, + "referenceName": "spike_bottom" + }, + { + "id": "jumper/spike_top", + "name": "spike_top", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 885, + "y": 752, + "width": 51, + "height": 87, + "direction": 90.0, + "referenceName": "spike_top" + }, + { + "id": "jumper/spikes_bottom", + "name": "spikes_bottom", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 147, + "y": 1988, + "width": 95, + "height": 53, + "direction": 90.0, + "referenceName": "spikes_bottom" + }, + { + "id": "jumper/spikes_top", + "name": "spikes_top", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 232, + "y": 1390, + "width": 95, + "height": 53, + "direction": 90.0, + "referenceName": "spikes_top" + }, + { + "id": "jumper/spring", + "name": "spring", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 420, + "y": 1558, + "width": 145, + "height": 77, + "direction": 90.0, + "referenceName": "jumper/spring" + }, + { + "id": "jumper/springMan_hurt", + "name": "springMan_hurt", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 800, + "y": 860, + "width": 110, + "height": 141, + "direction": 90.0, + "referenceName": "springMan_hurt" + }, + { + "id": "jumper/springMan_stand", + "name": "springMan_stand", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 801, + "y": 609, + "width": 110, + "height": 141, + "direction": 90.0, + "referenceName": "springMan_stand" + }, + { + "id": "jumper/spring_in", + "name": "spring_in", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1988, + "width": 145, + "height": 57, + "direction": 90.0, + "referenceName": "spring_in" + }, + { + "id": "jumper/spring_out", + "name": "spring_out", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 434, + "y": 1265, + "width": 145, + "height": 110, + "direction": 90.0, + "referenceName": "spring_out" + }, + { + "id": "jumper/sun1", + "name": "sun1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 534, + "y": 913, + "width": 142, + "height": 148, + "direction": 90.0, + "referenceName": "sun1" + }, + { + "id": "jumper/sun2", + "name": "sun2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 421, + "y": 1390, + "width": 148, + "height": 142, + "direction": 90.0, + "referenceName": "sun2" + }, + { + "id": "jumper/wingMan1", + "name": "wingMan1", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 635, + "width": 174, + "height": 126, + "direction": 90.0, + "referenceName": "wingMan1" + }, + { + "id": "jumper/wingMan2", + "name": "wingMan2", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1879, + "width": 206, + "height": 107, + "direction": 90.0, + "referenceName": "wingMan2" + }, + { + "id": "jumper/wingMan3", + "name": "wingMan3", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1559, + "width": 216, + "height": 101, + "direction": 90.0, + "referenceName": "wingMan3" + }, + { + "id": "jumper/wingMan4", + "name": "wingMan4", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 0, + "y": 1456, + "width": 216, + "height": 101, + "direction": 90.0, + "referenceName": "wingMan4" + }, + { + "id": "jumper/wingMan5", + "name": "wingMan5", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 382, + "y": 510, + "width": 182, + "height": 123, + "direction": 90.0, + "referenceName": "wingMan5" + }, + { + "id": "jumper/wing_left", + "name": "wing_left", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 558, + "y": 651, + "width": 85, + "height": 74, + "direction": 90.0, + "referenceName": "wing_left" + }, + { + "id": "jumper/wing_right", + "name": "wing_right", + "sheet": "jumper", + "sheetPath": "images/jumper.png", + "x": 571, + "y": 1458, + "width": 85, + "height": 74, + "direction": 90.0, + "referenceName": "wing_right" + }, + { + "id": "space_shooter/beam0", + "name": "beam0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 143, + "y": 377, + "width": 43, + "height": 31, + "direction": 0.0, + "referenceName": "beam0" + }, + { + "id": "space_shooter/beam1", + "name": "beam1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 327, + "y": 644, + "width": 40, + "height": 20, + "direction": 0.0, + "referenceName": "beam1" + }, + { + "id": "space_shooter/beam2", + "name": "beam2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 262, + "y": 907, + "width": 38, + "height": 31, + "direction": 0.0, + "referenceName": "beam2" + }, + { + "id": "space_shooter/beam3", + "name": "beam3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 396, + "y": 384, + "width": 29, + "height": 29, + "direction": 0.0, + "referenceName": "beam3" + }, + { + "id": "space_shooter/beam4", + "name": "beam4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 177, + "y": 496, + "width": 41, + "height": 17, + "direction": 0.0, + "referenceName": "beam4" + }, + { + "id": "space_shooter/beam5", + "name": "beam5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 186, + "y": 377, + "width": 40, + "height": 25, + "direction": 0.0, + "referenceName": "beam5" + }, + { + "id": "space_shooter/beam6", + "name": "beam6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 120, + "y": 688, + "width": 43, + "height": 23, + "direction": 0.0, + "referenceName": "beam6" + }, + { + "id": "space_shooter/beamLong1", + "name": "beamLong1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 828, + "y": 943, + "width": 15, + "height": 67, + "direction": 0.0, + "referenceName": "beamLong1" + }, + { + "id": "space_shooter/beamLong2", + "name": "beamLong2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 307, + "y": 309, + "width": 25, + "height": 64, + "direction": 0.0, + "referenceName": "beamLong2" + }, + { + "id": "space_shooter/bold_silver", + "name": "bold_silver", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 810, + "y": 837, + "width": 19, + "height": 30, + "direction": 90.0, + "referenceName": "bold_silver" + }, + { + "id": "space_shooter/bolt_bronze", + "name": "bolt_bronze", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 810, + "y": 467, + "width": 19, + "height": 30, + "direction": 90.0, + "referenceName": "bolt_bronze" + }, + { + "id": "space_shooter/bolt_gold", + "name": "bolt_gold", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 809, + "y": 437, + "width": 19, + "height": 30, + "direction": 90.0, + "referenceName": "bolt_gold" + }, + { + "id": "space_shooter/buttonBlue", + "name": "buttonBlue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 78, + "width": 222, + "height": 39, + "direction": 90.0, + "referenceName": "buttonBlue" + }, + { + "id": "space_shooter/buttonGreen", + "name": "buttonGreen", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 117, + "width": 222, + "height": 39, + "direction": 90.0, + "referenceName": "buttonGreen" + }, + { + "id": "space_shooter/buttonRed", + "name": "buttonRed", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 0, + "width": 222, + "height": 39, + "direction": 90.0, + "referenceName": "buttonRed" + }, + { + "id": "space_shooter/buttonYellow", + "name": "buttonYellow", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 39, + "width": 222, + "height": 39, + "direction": 90.0, + "referenceName": "buttonYellow" + }, + { + "id": "space_shooter/cockpitBlue_0", + "name": "cockpitBlue_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 586, + "y": 0, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitBlue_0" + }, + { + "id": "space_shooter/cockpitBlue_1", + "name": "cockpitBlue_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 736, + "y": 862, + "width": 40, + "height": 40, + "direction": 0.0, + "referenceName": "cockpitBlue_1" + }, + { + "id": "space_shooter/cockpitBlue_2", + "name": "cockpitBlue_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 684, + "y": 67, + "width": 42, + "height": 56, + "direction": 0.0, + "referenceName": "cockpitBlue_2" + }, + { + "id": "space_shooter/cockpitBlue_3", + "name": "cockpitBlue_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 336, + "y": 384, + "width": 60, + "height": 61, + "direction": 0.0, + "referenceName": "cockpitBlue_3" + }, + { + "id": "space_shooter/cockpitBlue_4", + "name": "cockpitBlue_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 637, + "y": 0, + "width": 47, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitBlue_4" + }, + { + "id": "space_shooter/cockpitBlue_5", + "name": "cockpitBlue_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 627, + "y": 144, + "width": 48, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitBlue_5" + }, + { + "id": "space_shooter/cockpitBlue_6", + "name": "cockpitBlue_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 684, + "y": 0, + "width": 42, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitBlue_6" + }, + { + "id": "space_shooter/cockpitBlue_7", + "name": "cockpitBlue_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 737, + "y": 542, + "width": 41, + "height": 71, + "direction": 0.0, + "referenceName": "cockpitBlue_7" + }, + { + "id": "space_shooter/cockpitGreen_0", + "name": "cockpitGreen_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 576, + "y": 225, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitGreen_0" + }, + { + "id": "space_shooter/cockpitGreen_1", + "name": "cockpitGreen_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 734, + "y": 977, + "width": 40, + "height": 40, + "direction": 0.0, + "referenceName": "cockpitGreen_1" + }, + { + "id": "space_shooter/cockpitGreen_2", + "name": "cockpitGreen_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 696, + "y": 659, + "width": 42, + "height": 56, + "direction": 0.0, + "referenceName": "cockpitGreen_2" + }, + { + "id": "space_shooter/cockpitGreen_3", + "name": "cockpitGreen_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 346, + "y": 234, + "width": 60, + "height": 61, + "direction": 0.0, + "referenceName": "cockpitGreen_3" + }, + { + "id": "space_shooter/cockpitGreen_4", + "name": "cockpitGreen_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 627, + "y": 219, + "width": 47, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitGreen_4" + }, + { + "id": "space_shooter/cockpitGreen_5", + "name": "cockpitGreen_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 694, + "y": 364, + "width": 42, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitGreen_5" + }, + { + "id": "space_shooter/cockpitGreen_6", + "name": "cockpitGreen_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 737, + "y": 471, + "width": 41, + "height": 71, + "direction": 0.0, + "referenceName": "cockpitGreen_6" + }, + { + "id": "space_shooter/cockpitGreen_7", + "name": "cockpitGreen_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 602, + "y": 525, + "width": 48, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitGreen_7" + }, + { + "id": "space_shooter/cockpitRed_0", + "name": "cockpitRed_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 535, + "y": 75, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitRed_0" + }, + { + "id": "space_shooter/cockpitRed_1", + "name": "cockpitRed_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 351, + "y": 982, + "width": 40, + "height": 40, + "direction": 0.0, + "referenceName": "cockpitRed_1" + }, + { + "id": "space_shooter/cockpitRed_2", + "name": "cockpitRed_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 718, + "y": 197, + "width": 42, + "height": 56, + "direction": 0.0, + "referenceName": "cockpitRed_2" + }, + { + "id": "space_shooter/cockpitRed_3", + "name": "cockpitRed_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 520, + "y": 661, + "width": 60, + "height": 61, + "direction": 0.0, + "referenceName": "cockpitRed_3" + }, + { + "id": "space_shooter/cockpitRed_4", + "name": "cockpitRed_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 647, + "y": 857, + "width": 47, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitRed_4" + }, + { + "id": "space_shooter/cockpitRed_5", + "name": "cockpitRed_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 605, + "y": 707, + "width": 48, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitRed_5" + }, + { + "id": "space_shooter/cockpitRed_6", + "name": "cockpitRed_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 736, + "y": 795, + "width": 42, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitRed_6" + }, + { + "id": "space_shooter/cockpitRed_7", + "name": "cockpitRed_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 736, + "y": 329, + "width": 41, + "height": 71, + "direction": 0.0, + "referenceName": "cockpitRed_7" + }, + { + "id": "space_shooter/cockpitYellow_0", + "name": "cockpitYellow_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 726, + "y": 80, + "width": 40, + "height": 40, + "direction": 0.0, + "referenceName": "cockpitYellow_0" + }, + { + "id": "space_shooter/cockpitYellow_1", + "name": "cockpitYellow_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 247, + "y": 309, + "width": 60, + "height": 61, + "direction": 0.0, + "referenceName": "cockpitYellow_1" + }, + { + "id": "space_shooter/cockpitYellow_2", + "name": "cockpitYellow_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 637, + "y": 67, + "width": 47, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitYellow_2" + }, + { + "id": "space_shooter/cockpitYellow_3", + "name": "cockpitYellow_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 607, + "y": 782, + "width": 48, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitYellow_3" + }, + { + "id": "space_shooter/cockpitYellow_4", + "name": "cockpitYellow_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 696, + "y": 262, + "width": 42, + "height": 67, + "direction": 0.0, + "referenceName": "cockpitYellow_4" + }, + { + "id": "space_shooter/cockpitYellow_5", + "name": "cockpitYellow_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 736, + "y": 400, + "width": 41, + "height": 71, + "direction": 0.0, + "referenceName": "cockpitYellow_5" + }, + { + "id": "space_shooter/cockpitYellow_6", + "name": "cockpitYellow_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 734, + "y": 921, + "width": 42, + "height": 56, + "direction": 0.0, + "referenceName": "cockpitYellow_6" + }, + { + "id": "space_shooter/cockpitYellow_7", + "name": "cockpitYellow_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 600, + "y": 375, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "cockpitYellow_7" + }, + { + "id": "space_shooter/cursor", + "name": "cursor", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 797, + "y": 173, + "width": 30, + "height": 33, + "direction": 90.0, + "referenceName": "cursor" + }, + { + "id": "space_shooter/enemyBlack1", + "name": "enemyBlack1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 423, + "y": 728, + "width": 93, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlack1" + }, + { + "id": "space_shooter/enemyBlack2", + "name": "enemyBlack2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 120, + "y": 604, + "width": 104, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlack2" + }, + { + "id": "space_shooter/enemyBlack3", + "name": "enemyBlack3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 144, + "y": 156, + "width": 103, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlack3" + }, + { + "id": "space_shooter/enemyBlack4", + "name": "enemyBlack4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 518, + "y": 325, + "width": 82, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlack4" + }, + { + "id": "space_shooter/enemyBlack5", + "name": "enemyBlack5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 346, + "y": 150, + "width": 97, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlack5" + }, + { + "id": "space_shooter/enemyBlue1", + "name": "enemyBlue1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 425, + "y": 468, + "width": 93, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlue1" + }, + { + "id": "space_shooter/enemyBlue2", + "name": "enemyBlue2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 143, + "y": 293, + "width": 104, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlue2" + }, + { + "id": "space_shooter/enemyBlue3", + "name": "enemyBlue3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 222, + "y": 0, + "width": 103, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlue3" + }, + { + "id": "space_shooter/enemyBlue4", + "name": "enemyBlue4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 518, + "y": 409, + "width": 82, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlue4" + }, + { + "id": "space_shooter/enemyBlue5", + "name": "enemyBlue5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 421, + "y": 814, + "width": 97, + "height": 84, + "direction": 180.0, + "referenceName": "enemyBlue5" + }, + { + "id": "space_shooter/enemyGreen1", + "name": "enemyGreen1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 425, + "y": 552, + "width": 93, + "height": 84, + "direction": 180.0, + "referenceName": "enemyGreen1" + }, + { + "id": "space_shooter/enemyGreen2", + "name": "enemyGreen2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 133, + "y": 412, + "width": 104, + "height": 84, + "direction": 180.0, + "referenceName": "enemyGreen2" + }, + { + "id": "space_shooter/enemyGreen3", + "name": "enemyGreen3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 224, + "y": 496, + "width": 103, + "height": 84, + "direction": 180.0, + "referenceName": "enemyGreen3" + }, + { + "id": "space_shooter/enemyGreen4", + "name": "enemyGreen4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 518, + "y": 493, + "width": 82, + "height": 84, + "direction": 180.0, + "referenceName": "enemyGreen4" + }, + { + "id": "space_shooter/enemyGreen5", + "name": "enemyGreen5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 408, + "y": 907, + "width": 97, + "height": 84, + "direction": 180.0, + "referenceName": "enemyGreen5" + }, + { + "id": "space_shooter/enemyRed1", + "name": "enemyRed1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 425, + "y": 384, + "width": 93, + "height": 84, + "direction": 180.0, + "referenceName": "enemyRed1" + }, + { + "id": "space_shooter/enemyRed2", + "name": "enemyRed2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 120, + "y": 520, + "width": 104, + "height": 84, + "direction": 180.0, + "referenceName": "enemyRed2" + }, + { + "id": "space_shooter/enemyRed3", + "name": "enemyRed3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 224, + "y": 580, + "width": 103, + "height": 84, + "direction": 180.0, + "referenceName": "enemyRed3" + }, + { + "id": "space_shooter/enemyRed4", + "name": "enemyRed4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 520, + "y": 577, + "width": 82, + "height": 84, + "direction": 180.0, + "referenceName": "enemyRed4" + }, + { + "id": "space_shooter/enemyRed5", + "name": "enemyRed5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 423, + "y": 644, + "width": 97, + "height": 84, + "direction": 180.0, + "referenceName": "enemyRed5" + }, + { + "id": "space_shooter/engine1", + "name": "engine1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 224, + "y": 907, + "width": 38, + "height": 23, + "direction": 0.0, + "referenceName": "engine1" + }, + { + "id": "space_shooter/engine2", + "name": "engine2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 163, + "y": 688, + "width": 42, + "height": 28, + "direction": 0.0, + "referenceName": "engine2" + }, + { + "id": "space_shooter/engine3", + "name": "engine3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 644, + "y": 1002, + "width": 27, + "height": 22, + "direction": 0.0, + "referenceName": "engine3" + }, + { + "id": "space_shooter/engine4", + "name": "engine4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 144, + "y": 240, + "width": 49, + "height": 45, + "direction": 0.0, + "referenceName": "engine4" + }, + { + "id": "space_shooter/engine5", + "name": "engine5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 133, + "y": 496, + "width": 44, + "height": 24, + "direction": 0.0, + "referenceName": "engine5" + }, + { + "id": "space_shooter/fire00", + "name": "fire00", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 827, + "y": 125, + "width": 16, + "height": 40, + "direction": 0.0, + "referenceName": "fire00" + }, + { + "id": "space_shooter/fire01", + "name": "fire01", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 828, + "y": 206, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire01" + }, + { + "id": "space_shooter/fire02", + "name": "fire02", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 827, + "y": 663, + "width": 14, + "height": 32, + "direction": 0.0, + "referenceName": "fire02" + }, + { + "id": "space_shooter/fire03", + "name": "fire03", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 829, + "y": 437, + "width": 14, + "height": 34, + "direction": 0.0, + "referenceName": "fire03" + }, + { + "id": "space_shooter/fire04", + "name": "fire04", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 831, + "y": 0, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire04" + }, + { + "id": "space_shooter/fire05", + "name": "fire05", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 834, + "y": 299, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire05" + }, + { + "id": "space_shooter/fire06", + "name": "fire06", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 502, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire06" + }, + { + "id": "space_shooter/fire07", + "name": "fire07", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 330, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire07" + }, + { + "id": "space_shooter/fire08", + "name": "fire08", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 827, + "y": 867, + "width": 16, + "height": 40, + "direction": 0.0, + "referenceName": "fire08" + }, + { + "id": "space_shooter/fire09", + "name": "fire09", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 811, + "y": 663, + "width": 16, + "height": 40, + "direction": 0.0, + "referenceName": "fire09" + }, + { + "id": "space_shooter/fire10", + "name": "fire10", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 812, + "y": 206, + "width": 16, + "height": 40, + "direction": 0.0, + "referenceName": "fire10" + }, + { + "id": "space_shooter/fire11", + "name": "fire11", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 395, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire11" + }, + { + "id": "space_shooter/fire12", + "name": "fire12", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 533, + "width": 14, + "height": 32, + "direction": 0.0, + "referenceName": "fire12" + }, + { + "id": "space_shooter/fire13", + "name": "fire13", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 361, + "width": 14, + "height": 34, + "direction": 0.0, + "referenceName": "fire13" + }, + { + "id": "space_shooter/fire14", + "name": "fire14", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 831, + "y": 31, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire14" + }, + { + "id": "space_shooter/fire15", + "name": "fire15", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 829, + "y": 471, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire15" + }, + { + "id": "space_shooter/fire16", + "name": "fire16", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 828, + "y": 268, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire16" + }, + { + "id": "space_shooter/fire17", + "name": "fire17", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 828, + "y": 237, + "width": 14, + "height": 31, + "direction": 0.0, + "referenceName": "fire17" + }, + { + "id": "space_shooter/fire18", + "name": "fire18", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 827, + "y": 165, + "width": 16, + "height": 41, + "direction": 0.0, + "referenceName": "fire18" + }, + { + "id": "space_shooter/fire19", + "name": "fire19", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 812, + "y": 246, + "width": 16, + "height": 41, + "direction": 0.0, + "referenceName": "fire19" + }, + { + "id": "space_shooter/gun00", + "name": "gun00", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 827, + "y": 907, + "width": 16, + "height": 36, + "direction": 0.0, + "referenceName": "gun00" + }, + { + "id": "space_shooter/gun01", + "name": "gun01", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 810, + "y": 867, + "width": 17, + "height": 33, + "direction": 0.0, + "referenceName": "gun01" + }, + { + "id": "space_shooter/gun02", + "name": "gun02", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 829, + "y": 611, + "width": 14, + "height": 36, + "direction": 0.0, + "referenceName": "gun02" + }, + { + "id": "space_shooter/gun03", + "name": "gun03", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 809, + "y": 796, + "width": 20, + "height": 41, + "direction": 0.0, + "referenceName": "gun03" + }, + { + "id": "space_shooter/gun04", + "name": "gun04", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 827, + "y": 84, + "width": 16, + "height": 41, + "direction": 0.0, + "referenceName": "gun04" + }, + { + "id": "space_shooter/gun05", + "name": "gun05", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 423, + "y": 0, + "width": 21, + "height": 41, + "direction": 0.0, + "referenceName": "gun05" + }, + { + "id": "space_shooter/gun06", + "name": "gun06", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 810, + "y": 900, + "width": 17, + "height": 38, + "direction": 0.0, + "referenceName": "gun06" + }, + { + "id": "space_shooter/gun07", + "name": "gun07", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 829, + "y": 796, + "width": 14, + "height": 41, + "direction": 0.0, + "referenceName": "gun07" + }, + { + "id": "space_shooter/gun08", + "name": "gun08", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 848, + "y": 263, + "width": 10, + "height": 47, + "direction": 0.0, + "referenceName": "gun08" + }, + { + "id": "space_shooter/gun09", + "name": "gun09", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 809, + "y": 611, + "width": 20, + "height": 52, + "direction": 0.0, + "referenceName": "gun09" + }, + { + "id": "space_shooter/gun10", + "name": "gun10", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 808, + "y": 961, + "width": 20, + "height": 52, + "direction": 0.0, + "referenceName": "gun10" + }, + { + "id": "space_shooter/laserBlue01", + "name": "laserBlue01", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 421, + "width": 9, + "height": 54, + "direction": 0.0, + "referenceName": "laserBlue01" + }, + { + "id": "space_shooter/laserBlue02", + "name": "laserBlue02", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 841, + "y": 647, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue02" + }, + { + "id": "space_shooter/laserBlue03", + "name": "laserBlue03", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 57, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue03" + }, + { + "id": "space_shooter/laserBlue04", + "name": "laserBlue04", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 565, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue04" + }, + { + "id": "space_shooter/laserBlue05", + "name": "laserBlue05", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 858, + "y": 475, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue05" + }, + { + "id": "space_shooter/laserBlue06", + "name": "laserBlue06", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 752, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue06" + }, + { + "id": "space_shooter/laserBlue07", + "name": "laserBlue07", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 775, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue07" + }, + { + "id": "space_shooter/laserBlue08", + "name": "laserBlue08", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 596, + "y": 961, + "width": 48, + "height": 46, + "direction": 0.0, + "referenceName": "laserBlue08" + }, + { + "id": "space_shooter/laserBlue09", + "name": "laserBlue09", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 434, + "y": 325, + "width": 48, + "height": 46, + "direction": 0.0, + "referenceName": "laserBlue09" + }, + { + "id": "space_shooter/laserBlue10", + "name": "laserBlue10", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 740, + "y": 724, + "width": 37, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue10" + }, + { + "id": "space_shooter/laserBlue11", + "name": "laserBlue11", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 698, + "y": 795, + "width": 38, + "height": 37, + "direction": 0.0, + "referenceName": "laserBlue11" + }, + { + "id": "space_shooter/laserBlue12", + "name": "laserBlue12", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 835, + "y": 695, + "width": 13, + "height": 57, + "direction": 0.0, + "referenceName": "laserBlue12" + }, + { + "id": "space_shooter/laserBlue13", + "name": "laserBlue13", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 869, + "width": 9, + "height": 57, + "direction": 0.0, + "referenceName": "laserBlue13" + }, + { + "id": "space_shooter/laserBlue14", + "name": "laserBlue14", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 842, + "y": 206, + "width": 13, + "height": 57, + "direction": 0.0, + "referenceName": "laserBlue14" + }, + { + "id": "space_shooter/laserBlue15", + "name": "laserBlue15", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 849, + "y": 480, + "width": 9, + "height": 57, + "direction": 0.0, + "referenceName": "laserBlue15" + }, + { + "id": "space_shooter/laserBlue16", + "name": "laserBlue16", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 62, + "width": 13, + "height": 54, + "direction": 0.0, + "referenceName": "laserBlue16" + }, + { + "id": "space_shooter/laserGreen01", + "name": "laserGreen01", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 740, + "y": 686, + "width": 37, + "height": 38, + "direction": 0.0, + "referenceName": "laserGreen01" + }, + { + "id": "space_shooter/laserGreen02", + "name": "laserGreen02", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 116, + "width": 13, + "height": 57, + "direction": 0.0, + "referenceName": "laserGreen02" + }, + { + "id": "space_shooter/laserGreen03", + "name": "laserGreen03", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 855, + "y": 173, + "width": 9, + "height": 57, + "direction": 0.0, + "referenceName": "laserGreen03" + }, + { + "id": "space_shooter/laserGreen04", + "name": "laserGreen04", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 848, + "y": 565, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserGreen04" + }, + { + "id": "space_shooter/laserGreen05", + "name": "laserGreen05", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 854, + "y": 639, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserGreen05" + }, + { + "id": "space_shooter/laserGreen06", + "name": "laserGreen06", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 845, + "y": 0, + "width": 13, + "height": 57, + "direction": 0.0, + "referenceName": "laserGreen06" + }, + { + "id": "space_shooter/laserGreen07", + "name": "laserGreen07", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 849, + "y": 364, + "width": 9, + "height": 57, + "direction": 0.0, + "referenceName": "laserGreen07" + }, + { + "id": "space_shooter/laserGreen08", + "name": "laserGreen08", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 848, + "y": 738, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserGreen08" + }, + { + "id": "space_shooter/laserGreen09", + "name": "laserGreen09", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 94, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserGreen09" + }, + { + "id": "space_shooter/laserGreen10", + "name": "laserGreen10", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 426, + "width": 13, + "height": 54, + "direction": 0.0, + "referenceName": "laserGreen10" + }, + { + "id": "space_shooter/laserGreen11", + "name": "laserGreen11", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 849, + "y": 310, + "width": 9, + "height": 54, + "direction": 0.0, + "referenceName": "laserGreen11" + }, + { + "id": "space_shooter/laserGreen12", + "name": "laserGreen12", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 602, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserGreen12" + }, + { + "id": "space_shooter/laserGreen13", + "name": "laserGreen13", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 858, + "y": 0, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserGreen13" + }, + { + "id": "space_shooter/laserGreen14", + "name": "laserGreen14", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 193, + "y": 240, + "width": 48, + "height": 46, + "direction": 0.0, + "referenceName": "laserGreen14" + }, + { + "id": "space_shooter/laserGreen15", + "name": "laserGreen15", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 443, + "y": 182, + "width": 48, + "height": 46, + "direction": 0.0, + "referenceName": "laserGreen15" + }, + { + "id": "space_shooter/laserGreen16", + "name": "laserGreen16", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 760, + "y": 192, + "width": 37, + "height": 37, + "direction": 0.0, + "referenceName": "laserGreen16" + }, + { + "id": "space_shooter/laserRed01", + "name": "laserRed01", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 858, + "y": 230, + "width": 9, + "height": 54, + "direction": 0.0, + "referenceName": "laserRed01" + }, + { + "id": "space_shooter/laserRed02", + "name": "laserRed02", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 977, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserRed02" + }, + { + "id": "space_shooter/laserRed03", + "name": "laserRed03", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 602, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserRed03" + }, + { + "id": "space_shooter/laserRed04", + "name": "laserRed04", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 940, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserRed04" + }, + { + "id": "space_shooter/laserRed05", + "name": "laserRed05", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 983, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserRed05" + }, + { + "id": "space_shooter/laserRed06", + "name": "laserRed06", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 903, + "width": 13, + "height": 37, + "direction": 0.0, + "referenceName": "laserRed06" + }, + { + "id": "space_shooter/laserRed07", + "name": "laserRed07", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 131, + "width": 9, + "height": 37, + "direction": 0.0, + "referenceName": "laserRed07" + }, + { + "id": "space_shooter/laserRed08", + "name": "laserRed08", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 580, + "y": 661, + "width": 48, + "height": 46, + "direction": 0.0, + "referenceName": "laserRed08" + }, + { + "id": "space_shooter/laserRed09", + "name": "laserRed09", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 602, + "y": 600, + "width": 48, + "height": 46, + "direction": 0.0, + "referenceName": "laserRed09" + }, + { + "id": "space_shooter/laserRed10", + "name": "laserRed10", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 738, + "y": 650, + "width": 37, + "height": 36, + "direction": 0.0, + "referenceName": "laserRed10" + }, + { + "id": "space_shooter/laserRed11", + "name": "laserRed11", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 737, + "y": 613, + "width": 37, + "height": 37, + "direction": 0.0, + "referenceName": "laserRed11" + }, + { + "id": "space_shooter/laserRed12", + "name": "laserRed12", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 846, + "width": 13, + "height": 57, + "direction": 0.0, + "referenceName": "laserRed12" + }, + { + "id": "space_shooter/laserRed13", + "name": "laserRed13", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 812, + "width": 9, + "height": 57, + "direction": 0.0, + "referenceName": "laserRed13" + }, + { + "id": "space_shooter/laserRed14", + "name": "laserRed14", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 843, + "y": 789, + "width": 13, + "height": 57, + "direction": 0.0, + "referenceName": "laserRed14" + }, + { + "id": "space_shooter/laserRed15", + "name": "laserRed15", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 856, + "y": 926, + "width": 9, + "height": 57, + "direction": 0.0, + "referenceName": "laserRed15" + }, + { + "id": "space_shooter/laserRed16", + "name": "laserRed16", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 848, + "y": 684, + "width": 13, + "height": 54, + "direction": 0.0, + "referenceName": "laserRed16" + }, + { + "id": "space_shooter/meteorBrown_big1", + "name": "meteorBrown_big1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 224, + "y": 664, + "width": 101, + "height": 84, + "direction": 90.0, + "referenceName": "meteorBrown_big1" + }, + { + "id": "space_shooter/meteorBrown_big2", + "name": "meteorBrown_big2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 520, + "width": 120, + "height": 98, + "direction": 90.0, + "referenceName": "meteorBrown_big2" + }, + { + "id": "space_shooter/meteorBrown_big3", + "name": "meteorBrown_big3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 518, + "y": 810, + "width": 89, + "height": 82, + "direction": 90.0, + "referenceName": "meteorBrown_big3" + }, + { + "id": "space_shooter/meteorBrown_big4", + "name": "meteorBrown_big4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 327, + "y": 452, + "width": 98, + "height": 96, + "direction": 90.0, + "referenceName": "meteorBrown_big4" + }, + { + "id": "space_shooter/meteorBrown_med1", + "name": "meteorBrown_med1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 651, + "y": 447, + "width": 43, + "height": 43, + "direction": 90.0, + "referenceName": "meteorBrown_med1" + }, + { + "id": "space_shooter/meteorBrown_med3", + "name": "meteorBrown_med3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 237, + "y": 452, + "width": 45, + "height": 40, + "direction": 90.0, + "referenceName": "meteorBrown_med3" + }, + { + "id": "space_shooter/meteorBrown_small1", + "name": "meteorBrown_small1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 406, + "y": 234, + "width": 28, + "height": 28, + "direction": 90.0, + "referenceName": "meteorBrown_small1" + }, + { + "id": "space_shooter/meteorBrown_small2", + "name": "meteorBrown_small2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 778, + "y": 587, + "width": 29, + "height": 26, + "direction": 90.0, + "referenceName": "meteorBrown_small2" + }, + { + "id": "space_shooter/meteorBrown_tiny1", + "name": "meteorBrown_tiny1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 346, + "y": 814, + "width": 18, + "height": 18, + "direction": 90.0, + "referenceName": "meteorBrown_tiny1" + }, + { + "id": "space_shooter/meteorBrown_tiny2", + "name": "meteorBrown_tiny2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 399, + "y": 814, + "width": 16, + "height": 15, + "direction": 90.0, + "referenceName": "meteorBrown_tiny2" + }, + { + "id": "space_shooter/meteorGrey_big1", + "name": "meteorGrey_big1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 224, + "y": 748, + "width": 101, + "height": 84, + "direction": 90.0, + "referenceName": "meteorGrey_big1" + }, + { + "id": "space_shooter/meteorGrey_big2", + "name": "meteorGrey_big2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 618, + "width": 120, + "height": 98, + "direction": 90.0, + "referenceName": "meteorGrey_big2" + }, + { + "id": "space_shooter/meteorGrey_big3", + "name": "meteorGrey_big3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 516, + "y": 728, + "width": 89, + "height": 82, + "direction": 90.0, + "referenceName": "meteorGrey_big3" + }, + { + "id": "space_shooter/meteorGrey_big4", + "name": "meteorGrey_big4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 327, + "y": 548, + "width": 98, + "height": 96, + "direction": 90.0, + "referenceName": "meteorGrey_big4" + }, + { + "id": "space_shooter/meteorGrey_med1", + "name": "meteorGrey_med1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 674, + "y": 219, + "width": 43, + "height": 43, + "direction": 90.0, + "referenceName": "meteorGrey_med1" + }, + { + "id": "space_shooter/meteorGrey_med2", + "name": "meteorGrey_med2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 282, + "y": 452, + "width": 45, + "height": 40, + "direction": 90.0, + "referenceName": "meteorGrey_med2" + }, + { + "id": "space_shooter/meteorGrey_small1", + "name": "meteorGrey_small1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 406, + "y": 262, + "width": 28, + "height": 28, + "direction": 90.0, + "referenceName": "meteorGrey_small1" + }, + { + "id": "space_shooter/meteorGrey_small2", + "name": "meteorGrey_small2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 396, + "y": 413, + "width": 29, + "height": 26, + "direction": 90.0, + "referenceName": "meteorGrey_small2" + }, + { + "id": "space_shooter/meteorGrey_tiny1", + "name": "meteorGrey_tiny1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 364, + "y": 814, + "width": 18, + "height": 18, + "direction": 90.0, + "referenceName": "meteorGrey_tiny1" + }, + { + "id": "space_shooter/meteorGrey_tiny2", + "name": "meteorGrey_tiny2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 602, + "y": 646, + "width": 16, + "height": 15, + "direction": 90.0, + "referenceName": "meteorGrey_tiny2" + }, + { + "id": "space_shooter/numeral0", + "name": "numeral0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 367, + "y": 644, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral0" + }, + { + "id": "space_shooter/numeral1", + "name": "numeral1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 205, + "y": 688, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral1" + }, + { + "id": "space_shooter/numeral2", + "name": "numeral2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 406, + "y": 290, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral2" + }, + { + "id": "space_shooter/numeral3", + "name": "numeral3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 580, + "y": 707, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral3" + }, + { + "id": "space_shooter/numeral4", + "name": "numeral4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 386, + "y": 644, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral4" + }, + { + "id": "space_shooter/numeral5", + "name": "numeral5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 628, + "y": 646, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral5" + }, + { + "id": "space_shooter/numeral6", + "name": "numeral6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 671, + "y": 1002, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral6" + }, + { + "id": "space_shooter/numeral7", + "name": "numeral7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 690, + "y": 1004, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral7" + }, + { + "id": "space_shooter/numeral8", + "name": "numeral8", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 709, + "y": 1004, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral8" + }, + { + "id": "space_shooter/numeral9", + "name": "numeral9", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 491, + "y": 215, + "width": 19, + "height": 19, + "direction": 90.0, + "referenceName": "numeral9" + }, + { + "id": "space_shooter/numeralX", + "name": "numeralX", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 382, + "y": 814, + "width": 17, + "height": 17, + "direction": 90.0, + "referenceName": "numeralX" + }, + { + "id": "space_shooter/pill_blue", + "name": "pill_blue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 674, + "y": 262, + "width": 22, + "height": 21, + "direction": 90.0, + "referenceName": "pill_blue" + }, + { + "id": "space_shooter/pill_green", + "name": "pill_green", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 573, + "y": 989, + "width": 22, + "height": 21, + "direction": 90.0, + "referenceName": "pill_green" + }, + { + "id": "space_shooter/pill_red", + "name": "pill_red", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 222, + "y": 108, + "width": 22, + "height": 21, + "direction": 90.0, + "referenceName": "pill_red" + }, + { + "id": "space_shooter/pill_yellow", + "name": "pill_yellow", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 222, + "y": 129, + "width": 22, + "height": 21, + "direction": 90.0, + "referenceName": "pill_yellow" + }, + { + "id": "space_shooter/playerLife1_blue", + "name": "playerLife1_blue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 482, + "y": 358, + "width": 33, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife1_blue" + }, + { + "id": "space_shooter/playerLife1_green", + "name": "playerLife1_green", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 535, + "y": 150, + "width": 33, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife1_green" + }, + { + "id": "space_shooter/playerLife1_orange", + "name": "playerLife1_orange", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 777, + "y": 327, + "width": 33, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife1_orange" + }, + { + "id": "space_shooter/playerLife1_red", + "name": "playerLife1_red", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 775, + "y": 301, + "width": 33, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife1_red" + }, + { + "id": "space_shooter/playerLife2_blue", + "name": "playerLife2_blue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 465, + "y": 991, + "width": 37, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife2_blue" + }, + { + "id": "space_shooter/playerLife2_green", + "name": "playerLife2_green", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 391, + "y": 991, + "width": 37, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife2_green" + }, + { + "id": "space_shooter/playerLife2_orange", + "name": "playerLife2_orange", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 428, + "y": 991, + "width": 37, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife2_orange" + }, + { + "id": "space_shooter/playerLife2_red", + "name": "playerLife2_red", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 502, + "y": 991, + "width": 37, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife2_red" + }, + { + "id": "space_shooter/playerLife3_blue", + "name": "playerLife3_blue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 777, + "y": 385, + "width": 32, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife3_blue" + }, + { + "id": "space_shooter/playerLife3_green", + "name": "playerLife3_green", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 778, + "y": 469, + "width": 32, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife3_green" + }, + { + "id": "space_shooter/playerLife3_orange", + "name": "playerLife3_orange", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 777, + "y": 712, + "width": 32, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife3_orange" + }, + { + "id": "space_shooter/playerLife3_red", + "name": "playerLife3_red", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 777, + "y": 443, + "width": 32, + "height": 26, + "direction": 0.0, + "referenceName": "playerLife3_red" + }, + { + "id": "space_shooter/playerShip1_blue", + "name": "playerShip1_blue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 211, + "y": 941, + "width": 99, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip1_blue" + }, + { + "id": "space_shooter/playerShip1_damage1", + "name": "playerShip1_damage1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 112, + "y": 941, + "width": 99, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip1_damage1" + }, + { + "id": "space_shooter/playerShip1_damage2", + "name": "playerShip1_damage2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 247, + "y": 234, + "width": 99, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip1_damage2" + }, + { + "id": "space_shooter/playerShip1_damage3", + "name": "playerShip1_damage3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 247, + "y": 159, + "width": 99, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip1_damage3" + }, + { + "id": "space_shooter/playerShip1_green", + "name": "playerShip1_green", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 237, + "y": 377, + "width": 99, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip1_green" + }, + { + "id": "space_shooter/playerShip1_orange", + "name": "playerShip1_orange", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 247, + "y": 84, + "width": 99, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip1_orange" + }, + { + "id": "space_shooter/playerShip1_red", + "name": "playerShip1_red", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 224, + "y": 832, + "width": 99, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip1_red" + }, + { + "id": "space_shooter/playerShip2_blue", + "name": "playerShip2_blue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 112, + "y": 791, + "width": 112, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip2_blue" + }, + { + "id": "space_shooter/playerShip2_damage1", + "name": "playerShip2_damage1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 866, + "width": 112, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip2_damage1" + }, + { + "id": "space_shooter/playerShip2_damage2", + "name": "playerShip2_damage2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 791, + "width": 112, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip2_damage2" + }, + { + "id": "space_shooter/playerShip2_damage3", + "name": "playerShip2_damage3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 716, + "width": 112, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip2_damage3" + }, + { + "id": "space_shooter/playerShip2_green", + "name": "playerShip2_green", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 112, + "y": 866, + "width": 112, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip2_green" + }, + { + "id": "space_shooter/playerShip2_orange", + "name": "playerShip2_orange", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 112, + "y": 716, + "width": 112, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip2_orange" + }, + { + "id": "space_shooter/playerShip2_red", + "name": "playerShip2_red", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 941, + "width": 112, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip2_red" + }, + { + "id": "space_shooter/playerShip3_blue", + "name": "playerShip3_blue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 325, + "y": 739, + "width": 98, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip3_blue" + }, + { + "id": "space_shooter/playerShip3_damage1", + "name": "playerShip3_damage1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 323, + "y": 832, + "width": 98, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip3_damage1" + }, + { + "id": "space_shooter/playerShip3_damage2", + "name": "playerShip3_damage2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 310, + "y": 907, + "width": 98, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip3_damage2" + }, + { + "id": "space_shooter/playerShip3_damage3", + "name": "playerShip3_damage3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 325, + "y": 664, + "width": 98, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip3_damage3" + }, + { + "id": "space_shooter/playerShip3_green", + "name": "playerShip3_green", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 346, + "y": 75, + "width": 98, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip3_green" + }, + { + "id": "space_shooter/playerShip3_orange", + "name": "playerShip3_orange", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 336, + "y": 309, + "width": 98, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip3_orange" + }, + { + "id": "space_shooter/playerShip3_red", + "name": "playerShip3_red", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 325, + "y": 0, + "width": 98, + "height": 75, + "direction": 0.0, + "referenceName": "playerShip3_red" + }, + { + "id": "space_shooter/powerupBlue", + "name": "powerupBlue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 696, + "y": 329, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupBlue" + }, + { + "id": "space_shooter/powerupBlue_bolt", + "name": "powerupBlue_bolt", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 539, + "y": 989, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupBlue_bolt" + }, + { + "id": "space_shooter/powerupBlue_shield", + "name": "powerupBlue_shield", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 777, + "y": 679, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupBlue_shield" + }, + { + "id": "space_shooter/powerupBlue_star", + "name": "powerupBlue_star", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 776, + "y": 895, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupBlue_star" + }, + { + "id": "space_shooter/powerupGreen", + "name": "powerupGreen", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 774, + "y": 613, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupGreen" + }, + { + "id": "space_shooter/powerupGreen_bolt", + "name": "powerupGreen_bolt", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 766, + "y": 80, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupGreen_bolt" + }, + { + "id": "space_shooter/powerupGreen_shield", + "name": "powerupGreen_shield", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 776, + "y": 862, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupGreen_shield" + }, + { + "id": "space_shooter/powerupGreen_star", + "name": "powerupGreen_star", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 651, + "y": 490, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupGreen_star" + }, + { + "id": "space_shooter/powerupRed", + "name": "powerupRed", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 491, + "y": 182, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupRed" + }, + { + "id": "space_shooter/powerupRed_bolt", + "name": "powerupRed_bolt", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 775, + "y": 646, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupRed_bolt" + }, + { + "id": "space_shooter/powerupRed_shield", + "name": "powerupRed_shield", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 776, + "y": 928, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupRed_shield" + }, + { + "id": "space_shooter/powerupRed_star", + "name": "powerupRed_star", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 774, + "y": 977, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupRed_star" + }, + { + "id": "space_shooter/powerupYellow", + "name": "powerupYellow", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 774, + "y": 761, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupYellow" + }, + { + "id": "space_shooter/powerupYellow_bolt", + "name": "powerupYellow_bolt", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 740, + "y": 761, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupYellow_bolt" + }, + { + "id": "space_shooter/powerupYellow_shield", + "name": "powerupYellow_shield", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 482, + "y": 325, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupYellow_shield" + }, + { + "id": "space_shooter/powerupYellow_star", + "name": "powerupYellow_star", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 607, + "y": 857, + "width": 34, + "height": 33, + "direction": 90.0, + "referenceName": "powerupYellow_star" + }, + { + "id": "space_shooter/scratch1", + "name": "scratch1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 325, + "y": 814, + "width": 21, + "height": 16, + "direction": 90.0, + "referenceName": "scratch1" + }, + { + "id": "space_shooter/scratch2", + "name": "scratch2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 423, + "y": 41, + "width": 21, + "height": 16, + "direction": 90.0, + "referenceName": "scratch2" + }, + { + "id": "space_shooter/scratch3", + "name": "scratch3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 346, + "y": 295, + "width": 16, + "height": 12, + "direction": 90.0, + "referenceName": "scratch3" + }, + { + "id": "space_shooter/shield1", + "name": "shield1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 412, + "width": 133, + "height": 108, + "direction": 0.0, + "referenceName": "shield1" + }, + { + "id": "space_shooter/shield2", + "name": "shield2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 293, + "width": 143, + "height": 119, + "direction": 0.0, + "referenceName": "shield2" + }, + { + "id": "space_shooter/shield3", + "name": "shield3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 0, + "y": 156, + "width": 144, + "height": 137, + "direction": 0.0, + "referenceName": "shield3" + }, + { + "id": "space_shooter/shield_bronze", + "name": "shield_bronze", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 797, + "y": 143, + "width": 30, + "height": 30, + "direction": 90.0, + "referenceName": "shield_bronze" + }, + { + "id": "space_shooter/shield_gold", + "name": "shield_gold", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 797, + "y": 113, + "width": 30, + "height": 30, + "direction": 90.0, + "referenceName": "shield_gold" + }, + { + "id": "space_shooter/shield_silver", + "name": "shield_silver", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 778, + "y": 824, + "width": 30, + "height": 30, + "direction": 90.0, + "referenceName": "shield_silver" + }, + { + "id": "space_shooter/speed", + "name": "speed", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 858, + "y": 284, + "width": 7, + "height": 108, + "direction": 0.0, + "referenceName": "speed" + }, + { + "id": "space_shooter/star1", + "name": "star1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 628, + "y": 681, + "width": 25, + "height": 24, + "direction": 90.0, + "referenceName": "star1" + }, + { + "id": "space_shooter/star2", + "name": "star2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 222, + "y": 84, + "width": 25, + "height": 24, + "direction": 90.0, + "referenceName": "star2" + }, + { + "id": "space_shooter/star3", + "name": "star3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 576, + "y": 300, + "width": 24, + "height": 24, + "direction": 90.0, + "referenceName": "star3" + }, + { + "id": "space_shooter/star_bronze", + "name": "star_bronze", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 778, + "y": 794, + "width": 31, + "height": 30, + "direction": 90.0, + "referenceName": "star_bronze" + }, + { + "id": "space_shooter/star_gold", + "name": "star_gold", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 778, + "y": 557, + "width": 31, + "height": 30, + "direction": 90.0, + "referenceName": "star_gold" + }, + { + "id": "space_shooter/star_silver", + "name": "star_silver", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 778, + "y": 527, + "width": 31, + "height": 30, + "direction": 90.0, + "referenceName": "star_silver" + }, + { + "id": "space_shooter/things_bronze", + "name": "things_bronze", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 778, + "y": 495, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "things_bronze" + }, + { + "id": "space_shooter/things_gold", + "name": "things_gold", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 777, + "y": 411, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "things_gold" + }, + { + "id": "space_shooter/things_silver", + "name": "things_silver", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 777, + "y": 353, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "things_silver" + }, + { + "id": "space_shooter/turretBase_big", + "name": "turretBase_big", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 310, + "y": 982, + "width": 41, + "height": 41, + "direction": 90.0, + "referenceName": "turretBase_big" + }, + { + "id": "space_shooter/turretBase_small", + "name": "turretBase_small", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 808, + "y": 301, + "width": 26, + "height": 26, + "direction": 90.0, + "referenceName": "turretBase_small" + }, + { + "id": "space_shooter/ufoBlue", + "name": "ufoBlue", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 444, + "y": 91, + "width": 91, + "height": 91, + "direction": 90.0, + "referenceName": "ufoBlue" + }, + { + "id": "space_shooter/ufoGreen", + "name": "ufoGreen", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 434, + "y": 234, + "width": 91, + "height": 91, + "direction": 90.0, + "referenceName": "ufoGreen" + }, + { + "id": "space_shooter/ufoRed", + "name": "ufoRed", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 444, + "y": 0, + "width": 91, + "height": 91, + "direction": 90.0, + "referenceName": "ufoRed" + }, + { + "id": "space_shooter/ufoYellow", + "name": "ufoYellow", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 505, + "y": 898, + "width": 91, + "height": 91, + "direction": 90.0, + "referenceName": "ufoYellow" + }, + { + "id": "space_shooter/wingBlue_0", + "name": "wingBlue_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 647, + "y": 924, + "width": 45, + "height": 78, + "direction": 0.0, + "referenceName": "wingBlue_0" + }, + { + "id": "space_shooter/wingBlue_1", + "name": "wingBlue_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 738, + "y": 253, + "width": 37, + "height": 72, + "direction": 0.0, + "referenceName": "wingBlue_1" + }, + { + "id": "space_shooter/wingBlue_2", + "name": "wingBlue_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 805, + "y": 0, + "width": 26, + "height": 84, + "direction": 0.0, + "referenceName": "wingBlue_2" + }, + { + "id": "space_shooter/wingBlue_3", + "name": "wingBlue_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 600, + "y": 450, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "wingBlue_3" + }, + { + "id": "space_shooter/wingBlue_4", + "name": "wingBlue_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 692, + "y": 924, + "width": 42, + "height": 80, + "direction": 0.0, + "referenceName": "wingBlue_4" + }, + { + "id": "space_shooter/wingBlue_5", + "name": "wingBlue_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 596, + "y": 892, + "width": 51, + "height": 69, + "direction": 0.0, + "referenceName": "wingBlue_5" + }, + { + "id": "space_shooter/wingBlue_6", + "name": "wingBlue_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 694, + "y": 847, + "width": 42, + "height": 74, + "direction": 0.0, + "referenceName": "wingBlue_6" + }, + { + "id": "space_shooter/wingBlue_7", + "name": "wingBlue_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 675, + "y": 134, + "width": 43, + "height": 83, + "direction": 0.0, + "referenceName": "wingBlue_7" + }, + { + "id": "space_shooter/wingGreen_0", + "name": "wingGreen_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 650, + "y": 525, + "width": 45, + "height": 78, + "direction": 0.0, + "referenceName": "wingGreen_0" + }, + { + "id": "space_shooter/wingGreen_1", + "name": "wingGreen_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 775, + "y": 229, + "width": 37, + "height": 72, + "direction": 0.0, + "referenceName": "wingGreen_1" + }, + { + "id": "space_shooter/wingGreen_2", + "name": "wingGreen_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 809, + "y": 527, + "width": 26, + "height": 84, + "direction": 0.0, + "referenceName": "wingGreen_2" + }, + { + "id": "space_shooter/wingGreen_3", + "name": "wingGreen_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 535, + "y": 0, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "wingGreen_3" + }, + { + "id": "space_shooter/wingGreen_4", + "name": "wingGreen_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 694, + "y": 431, + "width": 42, + "height": 80, + "direction": 0.0, + "referenceName": "wingGreen_4" + }, + { + "id": "space_shooter/wingGreen_5", + "name": "wingGreen_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 525, + "y": 251, + "width": 51, + "height": 69, + "direction": 0.0, + "referenceName": "wingGreen_5" + }, + { + "id": "space_shooter/wingGreen_6", + "name": "wingGreen_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 695, + "y": 511, + "width": 42, + "height": 74, + "direction": 0.0, + "referenceName": "wingGreen_6" + }, + { + "id": "space_shooter/wingGreen_7", + "name": "wingGreen_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 655, + "y": 764, + "width": 43, + "height": 83, + "direction": 0.0, + "referenceName": "wingGreen_7" + }, + { + "id": "space_shooter/wingRed_0", + "name": "wingRed_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 809, + "y": 712, + "width": 26, + "height": 84, + "direction": 0.0, + "referenceName": "wingRed_0" + }, + { + "id": "space_shooter/wingRed_1", + "name": "wingRed_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 768, + "y": 0, + "width": 37, + "height": 72, + "direction": 0.0, + "referenceName": "wingRed_1" + }, + { + "id": "space_shooter/wingRed_2", + "name": "wingRed_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 600, + "y": 300, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "wingRed_2" + }, + { + "id": "space_shooter/wingRed_3", + "name": "wingRed_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 698, + "y": 715, + "width": 42, + "height": 80, + "direction": 0.0, + "referenceName": "wingRed_3" + }, + { + "id": "space_shooter/wingRed_4", + "name": "wingRed_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 586, + "y": 75, + "width": 51, + "height": 69, + "direction": 0.0, + "referenceName": "wingRed_4" + }, + { + "id": "space_shooter/wingRed_5", + "name": "wingRed_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 718, + "y": 123, + "width": 42, + "height": 74, + "direction": 0.0, + "referenceName": "wingRed_5" + }, + { + "id": "space_shooter/wingRed_6", + "name": "wingRed_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 653, + "y": 681, + "width": 43, + "height": 83, + "direction": 0.0, + "referenceName": "wingRed_6" + }, + { + "id": "space_shooter/wingRed_7", + "name": "wingRed_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 651, + "y": 286, + "width": 45, + "height": 78, + "direction": 0.0, + "referenceName": "wingRed_7" + }, + { + "id": "space_shooter/wingYellow_0", + "name": "wingYellow_0", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 650, + "y": 603, + "width": 45, + "height": 78, + "direction": 0.0, + "referenceName": "wingYellow_0" + }, + { + "id": "space_shooter/wingYellow_1", + "name": "wingYellow_1", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 760, + "y": 120, + "width": 37, + "height": 72, + "direction": 0.0, + "referenceName": "wingYellow_1" + }, + { + "id": "space_shooter/wingYellow_2", + "name": "wingYellow_2", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 809, + "y": 353, + "width": 26, + "height": 84, + "direction": 0.0, + "referenceName": "wingYellow_2" + }, + { + "id": "space_shooter/wingYellow_3", + "name": "wingYellow_3", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 576, + "y": 150, + "width": 51, + "height": 75, + "direction": 0.0, + "referenceName": "wingYellow_3" + }, + { + "id": "space_shooter/wingYellow_4", + "name": "wingYellow_4", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 726, + "y": 0, + "width": 42, + "height": 80, + "direction": 0.0, + "referenceName": "wingYellow_4" + }, + { + "id": "space_shooter/wingYellow_5", + "name": "wingYellow_5", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 525, + "y": 182, + "width": 51, + "height": 69, + "direction": 0.0, + "referenceName": "wingYellow_5" + }, + { + "id": "space_shooter/wingYellow_6", + "name": "wingYellow_6", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 695, + "y": 585, + "width": 42, + "height": 74, + "direction": 0.0, + "referenceName": "wingYellow_6" + }, + { + "id": "space_shooter/wingYellow_7", + "name": "wingYellow_7", + "sheet": "space_shooter", + "sheetPath": "images/space_shooter.png", + "x": 651, + "y": 364, + "width": 43, + "height": 83, + "direction": 0.0, + "referenceName": "wingYellow_7" + }, + { + "id": "tappy_plane/UIbg", + "name": "UIbg", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 986, + "width": 264, + "height": 264, + "direction": 90.0, + "referenceName": "UIbg" + }, + { + "id": "tappy_plane/background", + "name": "background", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 355, + "width": 800, + "height": 480, + "direction": 90.0, + "referenceName": "background" + }, + { + "id": "tappy_plane/buttonLarge", + "name": "buttonLarge", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 1250, + "width": 196, + "height": 70, + "direction": 90.0, + "referenceName": "buttonLarge" + }, + { + "id": "tappy_plane/buttonSmall", + "name": "buttonSmall", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 1320, + "width": 136, + "height": 80, + "direction": 90.0, + "referenceName": "buttonSmall" + }, + { + "id": "tappy_plane/groundDirt", + "name": "groundDirt", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 0, + "width": 808, + "height": 71, + "direction": 90.0, + "referenceName": "groundDirt" + }, + { + "id": "tappy_plane/groundGrass", + "name": "groundGrass", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 142, + "width": 808, + "height": 71, + "direction": 90.0, + "referenceName": "groundGrass" + }, + { + "id": "tappy_plane/groundIce", + "name": "groundIce", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 71, + "width": 808, + "height": 71, + "direction": 90.0, + "referenceName": "groundIce" + }, + { + "id": "tappy_plane/groundRock", + "name": "groundRock", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 284, + "width": 808, + "height": 71, + "direction": 90.0, + "referenceName": "groundRock" + }, + { + "id": "tappy_plane/groundSnow", + "name": "groundSnow", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 213, + "width": 808, + "height": 71, + "direction": 90.0, + "referenceName": "groundSnow" + }, + { + "id": "tappy_plane/letterA", + "name": "letterA", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 412, + "y": 835, + "width": 61, + "height": 64, + "direction": 90.0, + "referenceName": "letterA" + }, + { + "id": "tappy_plane/letterB", + "name": "letterB", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 487, + "y": 1537, + "width": 50, + "height": 66, + "direction": 90.0, + "referenceName": "letterB" + }, + { + "id": "tappy_plane/letterC", + "name": "letterC", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 460, + "y": 977, + "width": 52, + "height": 66, + "direction": 90.0, + "referenceName": "letterC" + }, + { + "id": "tappy_plane/letterD", + "name": "letterD", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 432, + "y": 1613, + "width": 54, + "height": 66, + "direction": 90.0, + "referenceName": "letterD" + }, + { + "id": "tappy_plane/letterE", + "name": "letterE", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 511, + "y": 1965, + "width": 45, + "height": 64, + "direction": 90.0, + "referenceName": "letterE" + }, + { + "id": "tappy_plane/letterF", + "name": "letterF", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 512, + "y": 963, + "width": 44, + "height": 64, + "direction": 90.0, + "referenceName": "letterF" + }, + { + "id": "tappy_plane/letterG", + "name": "letterG", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 460, + "y": 1107, + "width": 52, + "height": 66, + "direction": 90.0, + "referenceName": "letterG" + }, + { + "id": "tappy_plane/letterH", + "name": "letterH", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 473, + "y": 835, + "width": 51, + "height": 64, + "direction": 90.0, + "referenceName": "letterH" + }, + { + "id": "tappy_plane/letterI", + "name": "letterI", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 524, + "y": 835, + "width": 22, + "height": 64, + "direction": 90.0, + "referenceName": "letterI" + }, + { + "id": "tappy_plane/letterJ", + "name": "letterJ", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 512, + "y": 1027, + "width": 42, + "height": 66, + "direction": 90.0, + "referenceName": "letterJ" + }, + { + "id": "tappy_plane/letterK", + "name": "letterK", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 432, + "y": 1821, + "width": 53, + "height": 64, + "direction": 90.0, + "referenceName": "letterK" + }, + { + "id": "tappy_plane/letterL", + "name": "letterL", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 512, + "y": 899, + "width": 44, + "height": 64, + "direction": 90.0, + "referenceName": "letterL" + }, + { + "id": "tappy_plane/letterM", + "name": "letterM", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 392, + "y": 1967, + "width": 66, + "height": 64, + "direction": 90.0, + "referenceName": "letterM" + }, + { + "id": "tappy_plane/letterN", + "name": "letterN", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 432, + "y": 1679, + "width": 53, + "height": 64, + "direction": 90.0, + "referenceName": "letterN" + }, + { + "id": "tappy_plane/letterO", + "name": "letterO", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 418, + "y": 1284, + "width": 60, + "height": 66, + "direction": 90.0, + "referenceName": "letterO" + }, + { + "id": "tappy_plane/letterP", + "name": "letterP", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 489, + "y": 1427, + "width": 48, + "height": 65, + "direction": 90.0, + "referenceName": "letterP" + }, + { + "id": "tappy_plane/letterQ", + "name": "letterQ", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 418, + "y": 1205, + "width": 60, + "height": 79, + "direction": 90.0, + "referenceName": "letterQ" + }, + { + "id": "tappy_plane/letterR", + "name": "letterR", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 478, + "y": 1249, + "width": 51, + "height": 65, + "direction": 90.0, + "referenceName": "letterR" + }, + { + "id": "tappy_plane/letterS", + "name": "letterS", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 511, + "y": 1899, + "width": 46, + "height": 66, + "direction": 90.0, + "referenceName": "letterS" + }, + { + "id": "tappy_plane/letterT", + "name": "letterT", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 460, + "y": 1043, + "width": 52, + "height": 64, + "direction": 90.0, + "referenceName": "letterT" + }, + { + "id": "tappy_plane/letterU", + "name": "letterU", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 485, + "y": 1757, + "width": 51, + "height": 66, + "direction": 90.0, + "referenceName": "letterU" + }, + { + "id": "tappy_plane/letterV", + "name": "letterV", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 400, + "y": 913, + "width": 61, + "height": 64, + "direction": 90.0, + "referenceName": "letterV" + }, + { + "id": "tappy_plane/letterW", + "name": "letterW", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 136, + "y": 1320, + "width": 76, + "height": 64, + "direction": 90.0, + "referenceName": "letterW" + }, + { + "id": "tappy_plane/letterX", + "name": "letterX", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 418, + "y": 1409, + "width": 58, + "height": 64, + "direction": 90.0, + "referenceName": "letterX" + }, + { + "id": "tappy_plane/letterY", + "name": "letterY", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 432, + "y": 1473, + "width": 57, + "height": 64, + "direction": 90.0, + "referenceName": "letterY" + }, + { + "id": "tappy_plane/letterZ", + "name": "letterZ", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 486, + "y": 1613, + "width": 50, + "height": 64, + "direction": 90.0, + "referenceName": "letterZ" + }, + { + "id": "tappy_plane/medalBronze", + "name": "medalBronze", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 1400, + "width": 114, + "height": 119, + "direction": 90.0, + "referenceName": "medalBronze" + }, + { + "id": "tappy_plane/medalGold", + "name": "medalGold", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 1519, + "width": 114, + "height": 119, + "direction": 90.0, + "referenceName": "medalGold" + }, + { + "id": "tappy_plane/medalSilver", + "name": "medalSilver", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 1638, + "width": 114, + "height": 119, + "direction": 90.0, + "referenceName": "medalSilver" + }, + { + "id": "tappy_plane/number0", + "name": "number0", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 432, + "y": 1743, + "width": 53, + "height": 78, + "direction": 90.0, + "referenceName": "number0" + }, + { + "id": "tappy_plane/number1", + "name": "number1", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 512, + "y": 1093, + "width": 37, + "height": 76, + "direction": 90.0, + "referenceName": "number1" + }, + { + "id": "tappy_plane/number2", + "name": "number2", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 477, + "y": 1350, + "width": 51, + "height": 77, + "direction": 90.0, + "referenceName": "number2" + }, + { + "id": "tappy_plane/number3", + "name": "number3", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 485, + "y": 1679, + "width": 51, + "height": 78, + "direction": 90.0, + "referenceName": "number3" + }, + { + "id": "tappy_plane/number4", + "name": "number4", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 432, + "y": 1537, + "width": 55, + "height": 76, + "direction": 90.0, + "referenceName": "number4" + }, + { + "id": "tappy_plane/number5", + "name": "number5", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 485, + "y": 1823, + "width": 50, + "height": 76, + "direction": 90.0, + "referenceName": "number5" + }, + { + "id": "tappy_plane/number6", + "name": "number6", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 432, + "y": 1885, + "width": 53, + "height": 77, + "direction": 90.0, + "referenceName": "number6" + }, + { + "id": "tappy_plane/number7", + "name": "number7", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 478, + "y": 1173, + "width": 51, + "height": 76, + "direction": 90.0, + "referenceName": "number7" + }, + { + "id": "tappy_plane/number8", + "name": "number8", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 461, + "y": 899, + "width": 51, + "height": 78, + "direction": 90.0, + "referenceName": "number8" + }, + { + "id": "tappy_plane/number9", + "name": "number9", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 458, + "y": 1962, + "width": 53, + "height": 77, + "direction": 90.0, + "referenceName": "number9" + }, + { + "id": "tappy_plane/planeBlue1", + "name": "planeBlue1", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 330, + "y": 1371, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeBlue1" + }, + { + "id": "tappy_plane/planeBlue2", + "name": "planeBlue2", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 372, + "y": 1132, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeBlue2" + }, + { + "id": "tappy_plane/planeBlue3", + "name": "planeBlue3", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 222, + "y": 1562, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeBlue3" + }, + { + "id": "tappy_plane/planeGreen1", + "name": "planeGreen1", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 114, + "y": 1639, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeGreen1" + }, + { + "id": "tappy_plane/planeGreen2", + "name": "planeGreen2", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 216, + "y": 1951, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeGreen2" + }, + { + "id": "tappy_plane/planeGreen3", + "name": "planeGreen3", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 222, + "y": 1489, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeGreen3" + }, + { + "id": "tappy_plane/planeRed1", + "name": "planeRed1", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 216, + "y": 1878, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeRed1" + }, + { + "id": "tappy_plane/planeRed2", + "name": "planeRed2", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 372, + "y": 1059, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeRed2" + }, + { + "id": "tappy_plane/planeRed3", + "name": "planeRed3", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 372, + "y": 986, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeRed3" + }, + { + "id": "tappy_plane/planeYellow1", + "name": "planeYellow1", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 304, + "y": 1967, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeYellow1" + }, + { + "id": "tappy_plane/planeYellow2", + "name": "planeYellow2", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 330, + "y": 1298, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeYellow2" + }, + { + "id": "tappy_plane/planeYellow3", + "name": "planeYellow3", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 330, + "y": 1225, + "width": 88, + "height": 73, + "direction": 90.0, + "referenceName": "planeYellow3" + }, + { + "id": "tappy_plane/puffLarge", + "name": "puffLarge", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 114, + "y": 1712, + "width": 42, + "height": 35, + "direction": 90.0, + "referenceName": "puffLarge" + }, + { + "id": "tappy_plane/puffSmall", + "name": "puffSmall", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 196, + "y": 1250, + "width": 25, + "height": 21, + "direction": 90.0, + "referenceName": "puffSmall" + }, + { + "id": "tappy_plane/rock", + "name": "rock", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 114, + "y": 1400, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "tappy_plane/rock" + }, + { + "id": "tappy_plane/rockDown", + "name": "rockDown", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 324, + "y": 1489, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "rockDown" + }, + { + "id": "tappy_plane/rockGrass", + "name": "rockGrass", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 1757, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "rockGrass" + }, + { + "id": "tappy_plane/rockGrassDown", + "name": "rockGrassDown", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 264, + "y": 986, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "rockGrassDown" + }, + { + "id": "tappy_plane/rockIce", + "name": "rockIce", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 216, + "y": 1639, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "rockIce" + }, + { + "id": "tappy_plane/rockIceDown", + "name": "rockIceDown", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 222, + "y": 1250, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "rockIceDown" + }, + { + "id": "tappy_plane/rockSnow", + "name": "rockSnow", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 324, + "y": 1728, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "rockSnow" + }, + { + "id": "tappy_plane/rockSnowDown", + "name": "rockSnowDown", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 108, + "y": 1757, + "width": 108, + "height": 239, + "direction": 90.0, + "referenceName": "rockSnowDown" + }, + { + "id": "tappy_plane/starBronze", + "name": "starBronze", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 170, + "y": 1996, + "width": 39, + "height": 37, + "direction": 90.0, + "referenceName": "starBronze" + }, + { + "id": "tappy_plane/starGold", + "name": "starGold", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 369, + "y": 1444, + "width": 39, + "height": 37, + "direction": 90.0, + "referenceName": "starGold" + }, + { + "id": "tappy_plane/starSilver", + "name": "starSilver", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 330, + "y": 1444, + "width": 39, + "height": 37, + "direction": 90.0, + "referenceName": "starSilver" + }, + { + "id": "tappy_plane/tap", + "name": "tap", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 156, + "y": 1712, + "width": 40, + "height": 40, + "direction": 90.0, + "referenceName": "tap" + }, + { + "id": "tappy_plane/tapLeft", + "name": "tapLeft", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 1996, + "width": 85, + "height": 42, + "direction": 90.0, + "referenceName": "tapLeft" + }, + { + "id": "tappy_plane/tapRight", + "name": "tapRight", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 85, + "y": 1996, + "width": 85, + "height": 42, + "direction": 90.0, + "referenceName": "tapRight" + }, + { + "id": "tappy_plane/tapTick", + "name": "tapTick", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 418, + "y": 1350, + "width": 59, + "height": 59, + "direction": 90.0, + "referenceName": "tapTick" + }, + { + "id": "tappy_plane/textGameOver", + "name": "textGameOver", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 835, + "width": 412, + "height": 78, + "direction": 90.0, + "referenceName": "textGameOver" + }, + { + "id": "tappy_plane/textGetReady", + "name": "textGetReady", + "sheet": "tappy_plane", + "sheetPath": "images/tappy_plane.png", + "x": 0, + "y": 913, + "width": 400, + "height": 73, + "direction": 90.0, + "referenceName": "textGetReady" + }, + { + "id": "cat/cat_idle_1", + "name": "cat_idle_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_1" + }, + { + "id": "cat/cat_idle_2", + "name": "cat_idle_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_2" + }, + { + "id": "cat/cat_idle_6", + "name": "cat_idle_6", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_6" + }, + { + "id": "cat/cat_idle_10", + "name": "cat_idle_10", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_10" + }, + { + "id": "cat/cat_idle_14", + "name": "cat_idle_14", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_14" + }, + { + "id": "cat/cat_idle_18", + "name": "cat_idle_18", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_18" + }, + { + "id": "cat/cat_idle_3", + "name": "cat_idle_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_3" + }, + { + "id": "cat/cat_idle_7", + "name": "cat_idle_7", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_7" + }, + { + "id": "cat/cat_idle_11", + "name": "cat_idle_11", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_11" + }, + { + "id": "cat/cat_idle_15", + "name": "cat_idle_15", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_15" + }, + { + "id": "cat/cat_idle_19", + "name": "cat_idle_19", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_19" + }, + { + "id": "cat/cat_idle_25", + "name": "cat_idle_25", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_25" + }, + { + "id": "cat/cat_idle_4", + "name": "cat_idle_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_4" + }, + { + "id": "cat/cat_idle_8", + "name": "cat_idle_8", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_8" + }, + { + "id": "cat/cat_idle_12", + "name": "cat_idle_12", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_12" + }, + { + "id": "cat/cat_idle_16", + "name": "cat_idle_16", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_16" + }, + { + "id": "cat/cat_idle_26", + "name": "cat_idle_26", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_26" + }, + { + "id": "cat/cat_idle_5", + "name": "cat_idle_5", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 264, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_5" + }, + { + "id": "cat/cat_idle_9", + "name": "cat_idle_9", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 264, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_9" + }, + { + "id": "cat/cat_idle_13", + "name": "cat_idle_13", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 264, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_13" + }, + { + "id": "cat/cat_idle_17", + "name": "cat_idle_17", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 264, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_17" + }, + { + "id": "cat/cat_idle_20", + "name": "cat_idle_20", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 330, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_20" + }, + { + "id": "cat/cat_idle_21", + "name": "cat_idle_21", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 396, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_21" + }, + { + "id": "cat/cat_idle_22", + "name": "cat_idle_22", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 462, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_22" + }, + { + "id": "cat/cat_idle_23", + "name": "cat_idle_23", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 528, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_23" + }, + { + "id": "cat/cat_idle_24", + "name": "cat_idle_24", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 594, + "y": 0, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_idle_24" + }, + { + "id": "cat/cat_walk_1", + "name": "cat_walk_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 66, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_walk_1" + }, + { + "id": "cat/cat_walk_2", + "name": "cat_walk_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 66, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_walk_2" + }, + { + "id": "cat/cat_walk_3", + "name": "cat_walk_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 66, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_walk_3" + }, + { + "id": "cat/cat_walk_4", + "name": "cat_walk_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 66, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_walk_4" + }, + { + "id": "cat/cat_walk_5", + "name": "cat_walk_5", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 264, + "y": 66, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_walk_5" + }, + { + "id": "cat/cat_walk_6", + "name": "cat_walk_6", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 330, + "y": 66, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_walk_6" + }, + { + "id": "cat/cat_crouch_1", + "name": "cat_crouch_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 132, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_crouch_1" + }, + { + "id": "cat/cat_crouch_2", + "name": "cat_crouch_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 132, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_crouch_2" + }, + { + "id": "cat/cat_crouch_3", + "name": "cat_crouch_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 132, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_crouch_3" + }, + { + "id": "cat/cat_crouch_4", + "name": "cat_crouch_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 132, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_crouch_4" + }, + { + "id": "cat/cat_jump_1", + "name": "cat_jump_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 198, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_jump_1" + }, + { + "id": "cat/cat_jump_2", + "name": "cat_jump_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 198, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_jump_2" + }, + { + "id": "cat/cat_jump_3", + "name": "cat_jump_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 198, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_jump_3" + }, + { + "id": "cat/cat_fall_1", + "name": "cat_fall_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 264, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_fall_1" + }, + { + "id": "cat/cat_fall_2", + "name": "cat_fall_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 264, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_fall_2" + }, + { + "id": "cat/cat_land_1", + "name": "cat_land_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 330, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_land_1" + }, + { + "id": "cat/cat_land_2", + "name": "cat_land_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 330, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_land_2" + }, + { + "id": "cat/cat_punch_1", + "name": "cat_punch_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 396, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_punch_1" + }, + { + "id": "cat/cat_punch_2", + "name": "cat_punch_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 396, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_punch_2" + }, + { + "id": "cat/cat_punch_3", + "name": "cat_punch_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 396, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_punch_3" + }, + { + "id": "cat/cat_punch_4", + "name": "cat_punch_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 396, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_punch_4" + }, + { + "id": "cat/cat_punch_5", + "name": "cat_punch_5", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 396, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_punch_5" + }, + { + "id": "cat/cat_punch_6", + "name": "cat_punch_6", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 264, + "y": 396, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_punch_6" + }, + { + "id": "cat/cat_hurt_1", + "name": "cat_hurt_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 462, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_hurt_1" + }, + { + "id": "cat/cat_hurt_2", + "name": "cat_hurt_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 462, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_hurt_2" + }, + { + "id": "cat/cat_hurt_3", + "name": "cat_hurt_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 462, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_hurt_3" + }, + { + "id": "cat/cat_ko_1", + "name": "cat_ko_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 528, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_ko_1" + }, + { + "id": "cat/cat_ko_2", + "name": "cat_ko_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 528, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_ko_2" + }, + { + "id": "cat/cat_ko_3", + "name": "cat_ko_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 528, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_ko_3" + }, + { + "id": "cat/cat_ko_4", + "name": "cat_ko_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 198, + "y": 528, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_ko_4" + }, + { + "id": "cat/cat_ko_5", + "name": "cat_ko_5", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 264, + "y": 528, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_ko_5" + }, + { + "id": "cat/cat_cheer_1", + "name": "cat_cheer_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 594, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_cheer_1" + }, + { + "id": "cat/cat_cheer_3", + "name": "cat_cheer_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 594, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_cheer_3" + }, + { + "id": "cat/cat_cheer_2", + "name": "cat_cheer_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 594, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_cheer_2" + }, + { + "id": "cat/cat_cheer_4", + "name": "cat_cheer_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 594, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_cheer_4" + }, + { + "id": "cat/cat_climb_1", + "name": "cat_climb_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 660, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_climb_1" + }, + { + "id": "cat/cat_climb_2", + "name": "cat_climb_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 660, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_climb_2" + }, + { + "id": "cat/cat_climb_4", + "name": "cat_climb_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 66, + "y": 660, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_climb_4" + }, + { + "id": "cat/cat_climb_3", + "name": "cat_climb_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 132, + "y": 660, + "width": 64, + "height": 64, + "direction": 90.0, + "referenceName": "cat_climb_3" + }, + { + "id": "cat/coffee_bean_1", + "name": "coffee_bean_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 726, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "coffee_bean_1" + }, + { + "id": "cat/coffee_bean_2", + "name": "coffee_bean_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 34, + "y": 726, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "coffee_bean_2" + }, + { + "id": "cat/coffee_bean_3", + "name": "coffee_bean_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 68, + "y": 726, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "coffee_bean_3" + }, + { + "id": "cat/coffee_bean_4", + "name": "coffee_bean_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 102, + "y": 726, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "coffee_bean_4" + }, + { + "id": "cat/bug_walk_1", + "name": "bug_walk_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 760, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "bug_walk_1" + }, + { + "id": "cat/bug_walk_3", + "name": "bug_walk_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 760, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "bug_walk_3" + }, + { + "id": "cat/bug_walk_2", + "name": "bug_walk_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 34, + "y": 760, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "bug_walk_2" + }, + { + "id": "cat/bug_walk_4", + "name": "bug_walk_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 68, + "y": 760, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "bug_walk_4" + }, + { + "id": "cat/bug_squished_1", + "name": "bug_squished_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 794, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "bug_squished_1" + }, + { + "id": "cat/bug_squished_2", + "name": "bug_squished_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 34, + "y": 794, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "bug_squished_2" + }, + { + "id": "cat/goal_mug_1", + "name": "goal_mug_1", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 828, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "goal_mug_1" + }, + { + "id": "cat/goal_mug_2", + "name": "goal_mug_2", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 34, + "y": 828, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "goal_mug_2" + }, + { + "id": "cat/goal_mug_3", + "name": "goal_mug_3", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 68, + "y": 828, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "goal_mug_3" + }, + { + "id": "cat/goal_mug_4", + "name": "goal_mug_4", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 102, + "y": 828, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "goal_mug_4" + }, + { + "id": "cat/heart_full", + "name": "heart_full", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 0, + "y": 862, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "heart_full" + }, + { + "id": "cat/heart_empty", + "name": "heart_empty", + "sheet": "cat", + "sheetPath": "images/cat.png", + "x": 34, + "y": 862, + "width": 32, + "height": 32, + "direction": 90.0, + "referenceName": "heart_empty" + } + ], + "sounds": [ + { + "id": "footstep_carpet_000", + "path": "sounds/impact/footstep_carpet_000.ogg" + }, + { + "id": "footstep_carpet_001", + "path": "sounds/impact/footstep_carpet_001.ogg" + }, + { + "id": "footstep_carpet_002", + "path": "sounds/impact/footstep_carpet_002.ogg" + }, + { + "id": "footstep_carpet_003", + "path": "sounds/impact/footstep_carpet_003.ogg" + }, + { + "id": "footstep_carpet_004", + "path": "sounds/impact/footstep_carpet_004.ogg" + }, + { + "id": "footstep_concrete_000", + "path": "sounds/impact/footstep_concrete_000.ogg" + }, + { + "id": "footstep_concrete_001", + "path": "sounds/impact/footstep_concrete_001.ogg" + }, + { + "id": "footstep_concrete_002", + "path": "sounds/impact/footstep_concrete_002.ogg" + }, + { + "id": "footstep_concrete_003", + "path": "sounds/impact/footstep_concrete_003.ogg" + }, + { + "id": "footstep_concrete_004", + "path": "sounds/impact/footstep_concrete_004.ogg" + }, + { + "id": "footstep_grass_000", + "path": "sounds/impact/footstep_grass_000.ogg" + }, + { + "id": "footstep_grass_001", + "path": "sounds/impact/footstep_grass_001.ogg" + }, + { + "id": "footstep_grass_002", + "path": "sounds/impact/footstep_grass_002.ogg" + }, + { + "id": "footstep_grass_003", + "path": "sounds/impact/footstep_grass_003.ogg" + }, + { + "id": "footstep_grass_004", + "path": "sounds/impact/footstep_grass_004.ogg" + }, + { + "id": "footstep_snow_000", + "path": "sounds/impact/footstep_snow_000.ogg" + }, + { + "id": "footstep_snow_001", + "path": "sounds/impact/footstep_snow_001.ogg" + }, + { + "id": "footstep_snow_002", + "path": "sounds/impact/footstep_snow_002.ogg" + }, + { + "id": "footstep_snow_003", + "path": "sounds/impact/footstep_snow_003.ogg" + }, + { + "id": "footstep_snow_004", + "path": "sounds/impact/footstep_snow_004.ogg" + }, + { + "id": "footstep_wood_000", + "path": "sounds/impact/footstep_wood_000.ogg" + }, + { + "id": "footstep_wood_001", + "path": "sounds/impact/footstep_wood_001.ogg" + }, + { + "id": "footstep_wood_002", + "path": "sounds/impact/footstep_wood_002.ogg" + }, + { + "id": "footstep_wood_003", + "path": "sounds/impact/footstep_wood_003.ogg" + }, + { + "id": "footstep_wood_004", + "path": "sounds/impact/footstep_wood_004.ogg" + }, + { + "id": "impactBell_heavy_000", + "path": "sounds/impact/impactBell_heavy_000.ogg" + }, + { + "id": "impactBell_heavy_001", + "path": "sounds/impact/impactBell_heavy_001.ogg" + }, + { + "id": "impactBell_heavy_002", + "path": "sounds/impact/impactBell_heavy_002.ogg" + }, + { + "id": "impactBell_heavy_003", + "path": "sounds/impact/impactBell_heavy_003.ogg" + }, + { + "id": "impactBell_heavy_004", + "path": "sounds/impact/impactBell_heavy_004.ogg" + }, + { + "id": "impactGeneric_light_000", + "path": "sounds/impact/impactGeneric_light_000.ogg" + }, + { + "id": "impactGeneric_light_001", + "path": "sounds/impact/impactGeneric_light_001.ogg" + }, + { + "id": "impactGeneric_light_002", + "path": "sounds/impact/impactGeneric_light_002.ogg" + }, + { + "id": "impactGeneric_light_003", + "path": "sounds/impact/impactGeneric_light_003.ogg" + }, + { + "id": "impactGeneric_light_004", + "path": "sounds/impact/impactGeneric_light_004.ogg" + }, + { + "id": "impactGlass_heavy_000", + "path": "sounds/impact/impactGlass_heavy_000.ogg" + }, + { + "id": "impactGlass_heavy_001", + "path": "sounds/impact/impactGlass_heavy_001.ogg" + }, + { + "id": "impactGlass_heavy_002", + "path": "sounds/impact/impactGlass_heavy_002.ogg" + }, + { + "id": "impactGlass_heavy_003", + "path": "sounds/impact/impactGlass_heavy_003.ogg" + }, + { + "id": "impactGlass_heavy_004", + "path": "sounds/impact/impactGlass_heavy_004.ogg" + }, + { + "id": "impactGlass_light_000", + "path": "sounds/impact/impactGlass_light_000.ogg" + }, + { + "id": "impactGlass_light_001", + "path": "sounds/impact/impactGlass_light_001.ogg" + }, + { + "id": "impactGlass_light_002", + "path": "sounds/impact/impactGlass_light_002.ogg" + }, + { + "id": "impactGlass_light_003", + "path": "sounds/impact/impactGlass_light_003.ogg" + }, + { + "id": "impactGlass_light_004", + "path": "sounds/impact/impactGlass_light_004.ogg" + }, + { + "id": "impactGlass_medium_000", + "path": "sounds/impact/impactGlass_medium_000.ogg" + }, + { + "id": "impactGlass_medium_001", + "path": "sounds/impact/impactGlass_medium_001.ogg" + }, + { + "id": "impactGlass_medium_002", + "path": "sounds/impact/impactGlass_medium_002.ogg" + }, + { + "id": "impactGlass_medium_003", + "path": "sounds/impact/impactGlass_medium_003.ogg" + }, + { + "id": "impactGlass_medium_004", + "path": "sounds/impact/impactGlass_medium_004.ogg" + }, + { + "id": "impactMetal_heavy_000", + "path": "sounds/impact/impactMetal_heavy_000.ogg" + }, + { + "id": "impactMetal_heavy_001", + "path": "sounds/impact/impactMetal_heavy_001.ogg" + }, + { + "id": "impactMetal_heavy_002", + "path": "sounds/impact/impactMetal_heavy_002.ogg" + }, + { + "id": "impactMetal_heavy_003", + "path": "sounds/impact/impactMetal_heavy_003.ogg" + }, + { + "id": "impactMetal_heavy_004", + "path": "sounds/impact/impactMetal_heavy_004.ogg" + }, + { + "id": "impactMetal_light_000", + "path": "sounds/impact/impactMetal_light_000.ogg" + }, + { + "id": "impactMetal_light_001", + "path": "sounds/impact/impactMetal_light_001.ogg" + }, + { + "id": "impactMetal_light_002", + "path": "sounds/impact/impactMetal_light_002.ogg" + }, + { + "id": "impactMetal_light_003", + "path": "sounds/impact/impactMetal_light_003.ogg" + }, + { + "id": "impactMetal_light_004", + "path": "sounds/impact/impactMetal_light_004.ogg" + }, + { + "id": "impactMetal_medium_000", + "path": "sounds/impact/impactMetal_medium_000.ogg" + }, + { + "id": "impactMetal_medium_001", + "path": "sounds/impact/impactMetal_medium_001.ogg" + }, + { + "id": "impactMetal_medium_002", + "path": "sounds/impact/impactMetal_medium_002.ogg" + }, + { + "id": "impactMetal_medium_003", + "path": "sounds/impact/impactMetal_medium_003.ogg" + }, + { + "id": "impactMetal_medium_004", + "path": "sounds/impact/impactMetal_medium_004.ogg" + }, + { + "id": "impactMining_000", + "path": "sounds/impact/impactMining_000.ogg" + }, + { + "id": "impactMining_001", + "path": "sounds/impact/impactMining_001.ogg" + }, + { + "id": "impactMining_002", + "path": "sounds/impact/impactMining_002.ogg" + }, + { + "id": "impactMining_003", + "path": "sounds/impact/impactMining_003.ogg" + }, + { + "id": "impactMining_004", + "path": "sounds/impact/impactMining_004.ogg" + }, + { + "id": "impactPlank_medium_000", + "path": "sounds/impact/impactPlank_medium_000.ogg" + }, + { + "id": "impactPlank_medium_001", + "path": "sounds/impact/impactPlank_medium_001.ogg" + }, + { + "id": "impactPlank_medium_002", + "path": "sounds/impact/impactPlank_medium_002.ogg" + }, + { + "id": "impactPlank_medium_003", + "path": "sounds/impact/impactPlank_medium_003.ogg" + }, + { + "id": "impactPlank_medium_004", + "path": "sounds/impact/impactPlank_medium_004.ogg" + }, + { + "id": "impactPlate_heavy_000", + "path": "sounds/impact/impactPlate_heavy_000.ogg" + }, + { + "id": "impactPlate_heavy_001", + "path": "sounds/impact/impactPlate_heavy_001.ogg" + }, + { + "id": "impactPlate_heavy_002", + "path": "sounds/impact/impactPlate_heavy_002.ogg" + }, + { + "id": "impactPlate_heavy_003", + "path": "sounds/impact/impactPlate_heavy_003.ogg" + }, + { + "id": "impactPlate_heavy_004", + "path": "sounds/impact/impactPlate_heavy_004.ogg" + }, + { + "id": "impactPlate_light_000", + "path": "sounds/impact/impactPlate_light_000.ogg" + }, + { + "id": "impactPlate_light_001", + "path": "sounds/impact/impactPlate_light_001.ogg" + }, + { + "id": "impactPlate_light_002", + "path": "sounds/impact/impactPlate_light_002.ogg" + }, + { + "id": "impactPlate_light_003", + "path": "sounds/impact/impactPlate_light_003.ogg" + }, + { + "id": "impactPlate_light_004", + "path": "sounds/impact/impactPlate_light_004.ogg" + }, + { + "id": "impactPlate_medium_000", + "path": "sounds/impact/impactPlate_medium_000.ogg" + }, + { + "id": "impactPlate_medium_001", + "path": "sounds/impact/impactPlate_medium_001.ogg" + }, + { + "id": "impactPlate_medium_002", + "path": "sounds/impact/impactPlate_medium_002.ogg" + }, + { + "id": "impactPlate_medium_003", + "path": "sounds/impact/impactPlate_medium_003.ogg" + }, + { + "id": "impactPlate_medium_004", + "path": "sounds/impact/impactPlate_medium_004.ogg" + }, + { + "id": "impactPunch_heavy_000", + "path": "sounds/impact/impactPunch_heavy_000.ogg" + }, + { + "id": "impactPunch_heavy_001", + "path": "sounds/impact/impactPunch_heavy_001.ogg" + }, + { + "id": "impactPunch_heavy_002", + "path": "sounds/impact/impactPunch_heavy_002.ogg" + }, + { + "id": "impactPunch_heavy_003", + "path": "sounds/impact/impactPunch_heavy_003.ogg" + }, + { + "id": "impactPunch_heavy_004", + "path": "sounds/impact/impactPunch_heavy_004.ogg" + }, + { + "id": "impactPunch_medium_000", + "path": "sounds/impact/impactPunch_medium_000.ogg" + }, + { + "id": "impactPunch_medium_001", + "path": "sounds/impact/impactPunch_medium_001.ogg" + }, + { + "id": "impactPunch_medium_002", + "path": "sounds/impact/impactPunch_medium_002.ogg" + }, + { + "id": "impactPunch_medium_003", + "path": "sounds/impact/impactPunch_medium_003.ogg" + }, + { + "id": "impactPunch_medium_004", + "path": "sounds/impact/impactPunch_medium_004.ogg" + }, + { + "id": "impactSoft_heavy_000", + "path": "sounds/impact/impactSoft_heavy_000.ogg" + }, + { + "id": "impactSoft_heavy_001", + "path": "sounds/impact/impactSoft_heavy_001.ogg" + }, + { + "id": "impactSoft_heavy_002", + "path": "sounds/impact/impactSoft_heavy_002.ogg" + }, + { + "id": "impactSoft_heavy_003", + "path": "sounds/impact/impactSoft_heavy_003.ogg" + }, + { + "id": "impactSoft_heavy_004", + "path": "sounds/impact/impactSoft_heavy_004.ogg" + }, + { + "id": "impactSoft_medium_000", + "path": "sounds/impact/impactSoft_medium_000.ogg" + }, + { + "id": "impactSoft_medium_001", + "path": "sounds/impact/impactSoft_medium_001.ogg" + }, + { + "id": "impactSoft_medium_002", + "path": "sounds/impact/impactSoft_medium_002.ogg" + }, + { + "id": "impactSoft_medium_003", + "path": "sounds/impact/impactSoft_medium_003.ogg" + }, + { + "id": "impactSoft_medium_004", + "path": "sounds/impact/impactSoft_medium_004.ogg" + }, + { + "id": "impactTin_medium_000", + "path": "sounds/impact/impactTin_medium_000.ogg" + }, + { + "id": "impactTin_medium_001", + "path": "sounds/impact/impactTin_medium_001.ogg" + }, + { + "id": "impactTin_medium_002", + "path": "sounds/impact/impactTin_medium_002.ogg" + }, + { + "id": "impactTin_medium_003", + "path": "sounds/impact/impactTin_medium_003.ogg" + }, + { + "id": "impactTin_medium_004", + "path": "sounds/impact/impactTin_medium_004.ogg" + }, + { + "id": "impactWood_heavy_000", + "path": "sounds/impact/impactWood_heavy_000.ogg" + }, + { + "id": "impactWood_heavy_001", + "path": "sounds/impact/impactWood_heavy_001.ogg" + }, + { + "id": "impactWood_heavy_002", + "path": "sounds/impact/impactWood_heavy_002.ogg" + }, + { + "id": "impactWood_heavy_003", + "path": "sounds/impact/impactWood_heavy_003.ogg" + }, + { + "id": "impactWood_heavy_004", + "path": "sounds/impact/impactWood_heavy_004.ogg" + }, + { + "id": "impactWood_light_000", + "path": "sounds/impact/impactWood_light_000.ogg" + }, + { + "id": "impactWood_light_001", + "path": "sounds/impact/impactWood_light_001.ogg" + }, + { + "id": "impactWood_light_002", + "path": "sounds/impact/impactWood_light_002.ogg" + }, + { + "id": "impactWood_light_003", + "path": "sounds/impact/impactWood_light_003.ogg" + }, + { + "id": "impactWood_light_004", + "path": "sounds/impact/impactWood_light_004.ogg" + }, + { + "id": "impactWood_medium_000", + "path": "sounds/impact/impactWood_medium_000.ogg" + }, + { + "id": "impactWood_medium_001", + "path": "sounds/impact/impactWood_medium_001.ogg" + }, + { + "id": "impactWood_medium_002", + "path": "sounds/impact/impactWood_medium_002.ogg" + }, + { + "id": "impactWood_medium_003", + "path": "sounds/impact/impactWood_medium_003.ogg" + }, + { + "id": "impactWood_medium_004", + "path": "sounds/impact/impactWood_medium_004.ogg" + }, + { + "id": "jingles_NES00", + "path": "sounds/jingles/8-Bit jingles/jingles_NES00.ogg" + }, + { + "id": "jingles_NES01", + "path": "sounds/jingles/8-Bit jingles/jingles_NES01.ogg" + }, + { + "id": "jingles_NES02", + "path": "sounds/jingles/8-Bit jingles/jingles_NES02.ogg" + }, + { + "id": "jingles_NES03", + "path": "sounds/jingles/8-Bit jingles/jingles_NES03.ogg" + }, + { + "id": "jingles_NES04", + "path": "sounds/jingles/8-Bit jingles/jingles_NES04.ogg" + }, + { + "id": "jingles_NES05", + "path": "sounds/jingles/8-Bit jingles/jingles_NES05.ogg" + }, + { + "id": "jingles_NES06", + "path": "sounds/jingles/8-Bit jingles/jingles_NES06.ogg" + }, + { + "id": "jingles_NES07", + "path": "sounds/jingles/8-Bit jingles/jingles_NES07.ogg" + }, + { + "id": "jingles_NES08", + "path": "sounds/jingles/8-Bit jingles/jingles_NES08.ogg" + }, + { + "id": "jingles_NES09", + "path": "sounds/jingles/8-Bit jingles/jingles_NES09.ogg" + }, + { + "id": "jingles_NES10", + "path": "sounds/jingles/8-Bit jingles/jingles_NES10.ogg" + }, + { + "id": "jingles_NES11", + "path": "sounds/jingles/8-Bit jingles/jingles_NES11.ogg" + }, + { + "id": "jingles_NES12", + "path": "sounds/jingles/8-Bit jingles/jingles_NES12.ogg" + }, + { + "id": "jingles_NES13", + "path": "sounds/jingles/8-Bit jingles/jingles_NES13.ogg" + }, + { + "id": "jingles_NES14", + "path": "sounds/jingles/8-Bit jingles/jingles_NES14.ogg" + }, + { + "id": "jingles_NES15", + "path": "sounds/jingles/8-Bit jingles/jingles_NES15.ogg" + }, + { + "id": "jingles_NES16", + "path": "sounds/jingles/8-Bit jingles/jingles_NES16.ogg" + }, + { + "id": "jingles_HIT00", + "path": "sounds/jingles/Hit jingles/jingles_HIT00.ogg" + }, + { + "id": "jingles_HIT01", + "path": "sounds/jingles/Hit jingles/jingles_HIT01.ogg" + }, + { + "id": "jingles_HIT02", + "path": "sounds/jingles/Hit jingles/jingles_HIT02.ogg" + }, + { + "id": "jingles_HIT03", + "path": "sounds/jingles/Hit jingles/jingles_HIT03.ogg" + }, + { + "id": "jingles_HIT04", + "path": "sounds/jingles/Hit jingles/jingles_HIT04.ogg" + }, + { + "id": "jingles_HIT05", + "path": "sounds/jingles/Hit jingles/jingles_HIT05.ogg" + }, + { + "id": "jingles_HIT06", + "path": "sounds/jingles/Hit jingles/jingles_HIT06.ogg" + }, + { + "id": "jingles_HIT07", + "path": "sounds/jingles/Hit jingles/jingles_HIT07.ogg" + }, + { + "id": "jingles_HIT08", + "path": "sounds/jingles/Hit jingles/jingles_HIT08.ogg" + }, + { + "id": "jingles_HIT09", + "path": "sounds/jingles/Hit jingles/jingles_HIT09.ogg" + }, + { + "id": "jingles_HIT10", + "path": "sounds/jingles/Hit jingles/jingles_HIT10.ogg" + }, + { + "id": "jingles_HIT11", + "path": "sounds/jingles/Hit jingles/jingles_HIT11.ogg" + }, + { + "id": "jingles_HIT12", + "path": "sounds/jingles/Hit jingles/jingles_HIT12.ogg" + }, + { + "id": "jingles_HIT13", + "path": "sounds/jingles/Hit jingles/jingles_HIT13.ogg" + }, + { + "id": "jingles_HIT14", + "path": "sounds/jingles/Hit jingles/jingles_HIT14.ogg" + }, + { + "id": "jingles_HIT15", + "path": "sounds/jingles/Hit jingles/jingles_HIT15.ogg" + }, + { + "id": "jingles_HIT16", + "path": "sounds/jingles/Hit jingles/jingles_HIT16.ogg" + }, + { + "id": "jingles_PIZZI00", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI00.ogg" + }, + { + "id": "jingles_PIZZI01", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI01.ogg" + }, + { + "id": "jingles_PIZZI02", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI02.ogg" + }, + { + "id": "jingles_PIZZI03", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI03.ogg" + }, + { + "id": "jingles_PIZZI04", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI04.ogg" + }, + { + "id": "jingles_PIZZI05", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI05.ogg" + }, + { + "id": "jingles_PIZZI06", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI06.ogg" + }, + { + "id": "jingles_PIZZI07", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI07.ogg" + }, + { + "id": "jingles_PIZZI08", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI08.ogg" + }, + { + "id": "jingles_PIZZI09", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI09.ogg" + }, + { + "id": "jingles_PIZZI10", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI10.ogg" + }, + { + "id": "jingles_PIZZI11", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI11.ogg" + }, + { + "id": "jingles_PIZZI12", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI12.ogg" + }, + { + "id": "jingles_PIZZI13", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI13.ogg" + }, + { + "id": "jingles_PIZZI14", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI14.ogg" + }, + { + "id": "jingles_PIZZI15", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI15.ogg" + }, + { + "id": "jingles_PIZZI16", + "path": "sounds/jingles/Pizzicato jingles/jingles_PIZZI16.ogg" + }, + { + "id": "jingles_SAX00", + "path": "sounds/jingles/Sax jingles/jingles_SAX00.ogg" + }, + { + "id": "jingles_SAX01", + "path": "sounds/jingles/Sax jingles/jingles_SAX01.ogg" + }, + { + "id": "jingles_SAX02", + "path": "sounds/jingles/Sax jingles/jingles_SAX02.ogg" + }, + { + "id": "jingles_SAX03", + "path": "sounds/jingles/Sax jingles/jingles_SAX03.ogg" + }, + { + "id": "jingles_SAX04", + "path": "sounds/jingles/Sax jingles/jingles_SAX04.ogg" + }, + { + "id": "jingles_SAX05", + "path": "sounds/jingles/Sax jingles/jingles_SAX05.ogg" + }, + { + "id": "jingles_SAX06", + "path": "sounds/jingles/Sax jingles/jingles_SAX06.ogg" + }, + { + "id": "jingles_SAX07", + "path": "sounds/jingles/Sax jingles/jingles_SAX07.ogg" + }, + { + "id": "jingles_SAX08", + "path": "sounds/jingles/Sax jingles/jingles_SAX08.ogg" + }, + { + "id": "jingles_SAX09", + "path": "sounds/jingles/Sax jingles/jingles_SAX09.ogg" + }, + { + "id": "jingles_SAX10", + "path": "sounds/jingles/Sax jingles/jingles_SAX10.ogg" + }, + { + "id": "jingles_SAX11", + "path": "sounds/jingles/Sax jingles/jingles_SAX11.ogg" + }, + { + "id": "jingles_SAX12", + "path": "sounds/jingles/Sax jingles/jingles_SAX12.ogg" + }, + { + "id": "jingles_SAX13", + "path": "sounds/jingles/Sax jingles/jingles_SAX13.ogg" + }, + { + "id": "jingles_SAX14", + "path": "sounds/jingles/Sax jingles/jingles_SAX14.ogg" + }, + { + "id": "jingles_SAX15", + "path": "sounds/jingles/Sax jingles/jingles_SAX15.ogg" + }, + { + "id": "jingles_SAX16", + "path": "sounds/jingles/Sax jingles/jingles_SAX16.ogg" + }, + { + "id": "jingles_STEEL00", + "path": "sounds/jingles/Steel jingles/jingles_STEEL00.ogg" + }, + { + "id": "jingles_STEEL01", + "path": "sounds/jingles/Steel jingles/jingles_STEEL01.ogg" + }, + { + "id": "jingles_STEEL02", + "path": "sounds/jingles/Steel jingles/jingles_STEEL02.ogg" + }, + { + "id": "jingles_STEEL03", + "path": "sounds/jingles/Steel jingles/jingles_STEEL03.ogg" + }, + { + "id": "jingles_STEEL04", + "path": "sounds/jingles/Steel jingles/jingles_STEEL04.ogg" + }, + { + "id": "jingles_STEEL05", + "path": "sounds/jingles/Steel jingles/jingles_STEEL05.ogg" + }, + { + "id": "jingles_STEEL06", + "path": "sounds/jingles/Steel jingles/jingles_STEEL06.ogg" + }, + { + "id": "jingles_STEEL07", + "path": "sounds/jingles/Steel jingles/jingles_STEEL07.ogg" + }, + { + "id": "jingles_STEEL08", + "path": "sounds/jingles/Steel jingles/jingles_STEEL08.ogg" + }, + { + "id": "jingles_STEEL09", + "path": "sounds/jingles/Steel jingles/jingles_STEEL09.ogg" + }, + { + "id": "jingles_STEEL10", + "path": "sounds/jingles/Steel jingles/jingles_STEEL10.ogg" + }, + { + "id": "jingles_STEEL11", + "path": "sounds/jingles/Steel jingles/jingles_STEEL11.ogg" + }, + { + "id": "jingles_STEEL12", + "path": "sounds/jingles/Steel jingles/jingles_STEEL12.ogg" + }, + { + "id": "jingles_STEEL13", + "path": "sounds/jingles/Steel jingles/jingles_STEEL13.ogg" + }, + { + "id": "jingles_STEEL14", + "path": "sounds/jingles/Steel jingles/jingles_STEEL14.ogg" + }, + { + "id": "jingles_STEEL15", + "path": "sounds/jingles/Steel jingles/jingles_STEEL15.ogg" + }, + { + "id": "jingles_STEEL16", + "path": "sounds/jingles/Steel jingles/jingles_STEEL16.ogg" + }, + { + "id": "beltHandle1", + "path": "sounds/rpg/beltHandle1.ogg" + }, + { + "id": "beltHandle2", + "path": "sounds/rpg/beltHandle2.ogg" + }, + { + "id": "bookClose", + "path": "sounds/rpg/bookClose.ogg" + }, + { + "id": "bookFlip1", + "path": "sounds/rpg/bookFlip1.ogg" + }, + { + "id": "bookFlip2", + "path": "sounds/rpg/bookFlip2.ogg" + }, + { + "id": "bookFlip3", + "path": "sounds/rpg/bookFlip3.ogg" + }, + { + "id": "bookOpen", + "path": "sounds/rpg/bookOpen.ogg" + }, + { + "id": "bookPlace1", + "path": "sounds/rpg/bookPlace1.ogg" + }, + { + "id": "bookPlace2", + "path": "sounds/rpg/bookPlace2.ogg" + }, + { + "id": "bookPlace3", + "path": "sounds/rpg/bookPlace3.ogg" + }, + { + "id": "chop", + "path": "sounds/rpg/chop.ogg" + }, + { + "id": "cloth1", + "path": "sounds/rpg/cloth1.ogg" + }, + { + "id": "cloth2", + "path": "sounds/rpg/cloth2.ogg" + }, + { + "id": "cloth3", + "path": "sounds/rpg/cloth3.ogg" + }, + { + "id": "cloth4", + "path": "sounds/rpg/cloth4.ogg" + }, + { + "id": "clothBelt", + "path": "sounds/rpg/clothBelt.ogg" + }, + { + "id": "clothBelt2", + "path": "sounds/rpg/clothBelt2.ogg" + }, + { + "id": "creak1", + "path": "sounds/rpg/creak1.ogg" + }, + { + "id": "creak2", + "path": "sounds/rpg/creak2.ogg" + }, + { + "id": "creak3", + "path": "sounds/rpg/creak3.ogg" + }, + { + "id": "doorClose_1", + "path": "sounds/rpg/doorClose_1.ogg" + }, + { + "id": "doorClose_2", + "path": "sounds/rpg/doorClose_2.ogg" + }, + { + "id": "doorClose_3", + "path": "sounds/rpg/doorClose_3.ogg" + }, + { + "id": "doorClose_4", + "path": "sounds/rpg/doorClose_4.ogg" + }, + { + "id": "doorOpen_1", + "path": "sounds/rpg/doorOpen_1.ogg" + }, + { + "id": "doorOpen_2", + "path": "sounds/rpg/doorOpen_2.ogg" + }, + { + "id": "drawKnife1", + "path": "sounds/rpg/drawKnife1.ogg" + }, + { + "id": "drawKnife2", + "path": "sounds/rpg/drawKnife2.ogg" + }, + { + "id": "drawKnife3", + "path": "sounds/rpg/drawKnife3.ogg" + }, + { + "id": "dropLeather", + "path": "sounds/rpg/dropLeather.ogg" + }, + { + "id": "footstep00", + "path": "sounds/rpg/footstep00.ogg" + }, + { + "id": "footstep01", + "path": "sounds/rpg/footstep01.ogg" + }, + { + "id": "footstep02", + "path": "sounds/rpg/footstep02.ogg" + }, + { + "id": "footstep03", + "path": "sounds/rpg/footstep03.ogg" + }, + { + "id": "footstep04", + "path": "sounds/rpg/footstep04.ogg" + }, + { + "id": "footstep05", + "path": "sounds/rpg/footstep05.ogg" + }, + { + "id": "footstep06", + "path": "sounds/rpg/footstep06.ogg" + }, + { + "id": "footstep07", + "path": "sounds/rpg/footstep07.ogg" + }, + { + "id": "footstep08", + "path": "sounds/rpg/footstep08.ogg" + }, + { + "id": "footstep09", + "path": "sounds/rpg/footstep09.ogg" + }, + { + "id": "handleCoins", + "path": "sounds/rpg/handleCoins.ogg" + }, + { + "id": "handleCoins2", + "path": "sounds/rpg/handleCoins2.ogg" + }, + { + "id": "handleSmallLeather", + "path": "sounds/rpg/handleSmallLeather.ogg" + }, + { + "id": "handleSmallLeather2", + "path": "sounds/rpg/handleSmallLeather2.ogg" + }, + { + "id": "knifeSlice", + "path": "sounds/rpg/knifeSlice.ogg" + }, + { + "id": "knifeSlice2", + "path": "sounds/rpg/knifeSlice2.ogg" + }, + { + "id": "metalClick", + "path": "sounds/rpg/metalClick.ogg" + }, + { + "id": "metalLatch", + "path": "sounds/rpg/metalLatch.ogg" + }, + { + "id": "metalPot1", + "path": "sounds/rpg/metalPot1.ogg" + }, + { + "id": "metalPot2", + "path": "sounds/rpg/metalPot2.ogg" + }, + { + "id": "metalPot3", + "path": "sounds/rpg/metalPot3.ogg" + } + ] +} diff --git a/core/src/main/resources/catalogs/examples.json b/core/src/main/resources/catalogs/examples.json new file mode 100644 index 0000000..602e19a --- /dev/null +++ b/core/src/main/resources/catalogs/examples.json @@ -0,0 +1,1603 @@ +{ + "schemaVersion": 1, + "libraryVersion": "5.8.0", + "browserVersion": "5.8.0-browser.1", + "examples": [ + { + "id": "demo/cat", + "kind": "demo", + "source": "src/examples/java/demos/cat", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "CatSketch.java", + "sha256": "720ccf8f24d9c87beaf05c0e130dee65da5c8e2a31d98352a21ea319577df3ea" + }, + { + "path": "sprites/cat.png", + "sha256": "0423f61671a086906d972b266241d557934f86bdb8ec5ad6f50b08f3474efa0f" + } + ] + }, + { + "id": "demo/catPlatformer", + "kind": "demo", + "source": "src/examples/java/demos/catPlatformer", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "cat", + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": "Bean.java", + "sha256": "e711aead57857c6d25ff96f5e0de6a969ffd9c1b33f359e3f2bb8a36428f5a10" + }, + { + "path": "Bug.java", + "sha256": "6a6e39b0925985b93f9e5e1c509fe898a9cd13a5dc2cba3f46b3c58eae58677a" + }, + { + "path": "Cat.java", + "sha256": "40752d42d41e75295bbea5463ae5f574b58ddc4a888cde56b319cf57a4484c40" + }, + { + "path": "CatPlatformer.java", + "sha256": "bbe3fe14eee8152747818462485beb514870dc2a5f57a6bec9c164a2c294ecb2" + }, + { + "path": "Goal.java", + "sha256": "a0ab034b3dbf2835a1b85dd1edbb32b67a7774dd8e41b3a493194ba778b97572" + }, + { + "path": "Ground.java", + "sha256": "9515a80cf4c830e9646a64b61c2d3f9eca9fad899438f83fec8566c439643032" + }, + { + "path": "Heart.java", + "sha256": "bd423d745bd2b5ccbc0e765a6b838946411e044e4f51972e325f4cfe21e2d31c" + }, + { + "path": "Ladder.java", + "sha256": "d133f3365cc26cccb4c1c29bdce907bc28b41f2de158cb8b59d869a5e1367d1e" + }, + { + "path": "Platform.java", + "sha256": "7b42871f874fb59bb1849760af9fcd2963540c7b541326a5d2e9631fb21eb1fd" + } + ] + }, + { + "id": "demo/clock", + "kind": "demo", + "source": "src/examples/java/demos/clock", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "ClockSprite.java", + "sha256": "498b9a3b87b2863f054895e9cc4d668274f15e7b555cc82025e3715fc68dc79b" + }, + { + "path": "ClockStage.java", + "sha256": "1b1a9a5cfbec16b86956258fad2e1243df6f8d70d20a9570a5152a513371577b" + }, + { + "path": "HourHandSprite.java", + "sha256": "afbdbddccfa8e4e2faa0e498d13d8175fb8ccca82f38a6792a9e7b4fe3e9e54b" + }, + { + "path": "MinuteHandSprite.java", + "sha256": "654e62b72e7e03b1df52077eefac3b077894f1a64a9f2176c9b72c1fac32a6ef" + }, + { + "path": "SecondHandSprite.java", + "sha256": "1404a90a1da7fb355b662b7ae5d6d46c4b370d99ea4888cacc3be93e5bb653dd" + }, + { + "path": "sprites/clock.png", + "sha256": "4aa62eaede42134ec9cbc0d22290a82d3c2b6deb9c064f56c34be7af124c41b7" + }, + { + "path": "sprites/clock.svg", + "sha256": "3566b50f76e74e035e68f89df03302fb4887f13ce67d873a497224091e4501d2" + }, + { + "path": "sprites/hour.png", + "sha256": "86dc71146074f166e783459b2c5252bfccc37d54a384d90e604adb4ed0e048ac" + }, + { + "path": "sprites/minute.png", + "sha256": "9023359e8e1273e72dae86678f4f0d1b860e32277b09d8e24977107c60021ad7" + }, + { + "path": "sprites/second.png", + "sha256": "0fa19932a82e616e71b6af073b360cf2dd8939ba73da037ed94bc815b5843241" + } + ] + }, + { + "id": "demo/coinCollector", + "kind": "demo", + "source": "src/examples/java/demos/coinCollector", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": "Coin.java", + "sha256": "968265215317ce300737ad31da7e07d0b3aff9f09d98f783e5a599bf28203957" + }, + { + "path": "CoinCollector.java", + "sha256": "f8100c3e5db0378bb30a3ff74e7c455e4de3a1781dd23e565ff8c604404c3688" + }, + { + "path": "Ground.java", + "sha256": "6599317ccac9c3c7535da8dd63e4ffa3aed4e59d02a331ae810aec7c5fb54e3a" + }, + { + "path": "Player.java", + "sha256": "7727f61aba83dfc7e368f0f924d313571d7030af54a587eba2c72ba1236129af" + } + ] + }, + { + "id": "demo/donutIO", + "kind": "demo", + "source": "src/examples/java/demos/donutIO", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "Background.java", + "sha256": "1309869222dd8488b6215aa09da058dfafc753d741584c73dfcd33e50a59adfe" + }, + { + "path": "Donut.java", + "sha256": "0b4f61e3f7d46d341c2002ebabe8f5039878c2ce189f0621880fa77bfcc71a41" + }, + { + "path": "FollowDonut.java", + "sha256": "07e45838abc4aa1053b1b3cef7e85850924cbd668ff601c1691063e27875a136" + }, + { + "path": "Game.java", + "sha256": "74d613db1055f1bbcdf4e90b26c7edeb971066be49614ef3b8f5036330649190" + }, + { + "path": "GameOverStage.java", + "sha256": "913c81a99e0a8f3b92c8c7bf8889def04cd765a3ec563fdbba9057a45cfc5ab6" + }, + { + "path": "PlayerDonut.java", + "sha256": "dbb1026901d854e2c728ecec7f8d49d83e31e75db93c56a755f7d0d93a9bed97" + }, + { + "path": "StartStage.java", + "sha256": "f8419017ad70bb40949a78b17888188b091e57f347898ca495a6dc80c649c896" + }, + { + "path": "WinStage.java", + "sha256": "c4c9fa066d10fc19215d56763ec5a67e09f296764dc1f1d57c7023dda269e86f" + }, + { + "path": "WorldStage.java", + "sha256": "2143d816a12266a4a1f3cf244e1ecc42201275718187975002499777396817d1" + }, + { + "path": "assets/donut.png", + "sha256": "1a3106071f180d9f484eaf82c8567d759fa94689f9ee9ba7b122c6daf99bf6db" + }, + { + "path": "assets/donut.svg", + "sha256": "1fb30404f57873f363b2e47711831e7d460df57575946bcb9e626e1f0a71c58c" + }, + { + "path": "assets/grid.png", + "sha256": "4b91fff890e34ddb540e1be514eee580dc138fcaaa9ca41ef2b633344c22467b" + } + ] + }, + { + "id": "demo/glide", + "kind": "demo", + "source": "src/examples/java/demos/glide", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": "Glide.java", + "sha256": "ae653f7ce351b21cbed2e71f1a02bac9cc31ac37881fd59c2783a45652df4f16" + } + ] + }, + { + "id": "demo/pipes", + "kind": "demo", + "source": "src/examples/java/demos/pipes", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "PenSprite.java", + "sha256": "d582f5bc29738b2d69f9433c4b7a40b9fae7d6451b8f938fba2768b028a9b736" + }, + { + "path": "Pipes.java", + "sha256": "3026f03ca92b00776cccd363d0dafa2e15801dc6578279b0c4cc1ca508c155d1" + }, + { + "path": "backdrops/chalk_board.jpg", + "sha256": "72e78e95fd5a3225b6beb7f681cbc78dcc49e1c3b51ec2d1d140105cadd33389" + }, + { + "path": "sounds/bensound-enigmatic.ogg", + "sha256": "a41a57516dfea5f0a8e0c857bef66ce698197c923d6468992f23d7e94fa34a19" + }, + { + "path": "sprites/pen.png", + "sha256": "dc1c56c00f27c97ba4059f98e7fd3d7f9db8f4b33f2779c461568e09aac9b1dc" + } + ] + }, + { + "id": "demo/quiz", + "kind": "demo", + "source": "src/examples/java/demos/quiz", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": "Quiz.java", + "sha256": "e7d5e15ce5a8ae60f4f19bda5942784f1a6a3d23e21f0e86f4def2117ca6c9ff" + } + ] + }, + { + "id": "demo/rainbowVine", + "kind": "demo", + "source": "src/examples/java/demos/rainbowVine", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "RainbowVine.java", + "sha256": "a6fc438d97c957b62e0499fb63fbdd970cab0abd744374049158f233693593bb" + } + ] + }, + { + "id": "demo/randomDot", + "kind": "demo", + "source": "src/examples/java/demos/randomDot", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "RandomDot.java", + "sha256": "ea0ad9068e6bc875f94aaee7c5e15528c8409b4d4d0b3f819ae795a541cdb0bc" + } + ] + }, + { + "id": "demo/robot", + "kind": "demo", + "source": "src/examples/java/demos/robot", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "RobotSprite.java", + "sha256": "ae603a01374a9838a2430ebd7d9de573df7f9fd5d83780c17c3c24966b2ce3a2" + }, + { + "path": "RobotStage.java", + "sha256": "587f25bbe2b14b6cece3ca64df11c4aad6adac66739a0b8ae02354c11110d81b" + }, + { + "path": "sprites/robot.png", + "sha256": "e3426e0f0fbcd9f472326a39f45089ce074797d85c6ce8a42ca6fbf21a1b92a0" + } + ] + }, + { + "id": "demo/saving", + "kind": "demo", + "source": "src/examples/java/demos/saving", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "ExampleSettings.java", + "sha256": "45cefc5bb42d659e1d077f6cb08d5a61b64b05d80fc65e8d71b8e4aad740b75d" + }, + { + "path": "Saving.java", + "sha256": "083c69f9950f753e83a21bc722b4d91bdf476d6bb5d73f41d939c27d4ff60ac6" + } + ] + }, + { + "id": "demo/sensing", + "kind": "demo", + "source": "src/examples/java/demos/sensing", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "Sensing.java", + "sha256": "fb506f93964443ada7a50cdda42c0aea955b1c76886108d9bec59c18fd282394" + }, + { + "path": "sprites/hero.png", + "sha256": "c2c48af7fae8913bbe5b175296e07e1b2c05d7b0e557a403c7c7055f0eaafbc7" + }, + { + "path": "sprites/hero2.png", + "sha256": "fc49e2ed1f0e7546c2f5fb7250447b7ca1ca8be70ed74469ab4d97a12e7b8a88" + } + ] + }, + { + "id": "demo/shader", + "kind": "demo", + "source": "src/examples/java/demos/shader", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "LightSprite.java", + "sha256": "3e8e37f53699f06e7d6c1e9838670b9a52f4eeab8289cabf94e5e7f86a5d2bd0" + }, + { + "path": "MySprite.java", + "sha256": "fbc85f8ec07d603cc62e7fcf2d47a8eb1a9e6e17ccc60bab4508f6feab2ce60f" + }, + { + "path": "MyStage.java", + "sha256": "d4cfacd6f2749b5e703b3f2f6668d46f30340356d6787f629b744b833a7899a1" + }, + { + "path": "NormalSprite.java", + "sha256": "e645c87cb21f235ad255eec06ca4558b019b5f9f773182b12d3bfc8df29ba612" + }, + { + "path": "ShaderExample.java", + "sha256": "df96b2c473b62166e2ac533ac4daac394ec3bd9ced8cebf3b431dc524b75ba93" + }, + { + "path": "blobby.frag", + "sha256": "384933079eec3bb08beb0b141bec7cd59ff7ef17c4a8fa706e3c4f1640dba55b" + }, + { + "path": "cat.png", + "sha256": "0423f61671a086906d972b266241d557934f86bdb8ec5ad6f50b08f3474efa0f" + }, + { + "path": "default.vert", + "sha256": "74b864ff74fb681af02ede001826b988ec94edcbb2c3b3377cd08975edca7cbf" + }, + { + "path": "glitch.frag", + "sha256": "cc97afe4a6df211c95abf0dead361f05d32cf4e42d042d78ad47f22a3c1fdb5d" + }, + { + "path": "halftone.frag", + "sha256": "64e2eb806ed07b091fa5d9c15329cf776d2950832021fb985172edebd0c0df71" + }, + { + "path": "light.frag", + "sha256": "cbb7e7c862a6944b620919c8643b40f8986a6dcc389e2308966fa5f50694e551" + }, + { + "path": "light.png", + "sha256": "8e64a24aedd5860c5573d818d708d8ba8ba2772d33ec86175eca26acb8ecb631" + }, + { + "path": "neon.frag", + "sha256": "8e875c5eb0cc2884d3470ae96797bf3708e01eb1725a98ad560414d5c9493f75" + }, + { + "path": "pixel.frag", + "sha256": "3b3d471cd76f42313008ffaa3019fd382e80916ddc990c48b748786a54f5796f" + }, + { + "path": "pixelate.frag", + "sha256": "7d0842e4fc000f92a2ac9cf113fce083b7c2c5e5bb43c2cb2edfbf0bc045075b" + } + ] + }, + { + "id": "demo/shakespeare", + "kind": "demo", + "source": "src/examples/java/demos/shakespeare", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "DNA.java", + "sha256": "d7fb514623ec03739084107481332ee1e68f24f288ac10cf278266100ba52e1a" + }, + { + "path": "Population.java", + "sha256": "1225987f167ca4db84acb4be8b3f1e57f089c122617409b09dcf13e0fd851eb8" + }, + { + "path": "Shakespeare.java", + "sha256": "bc83a9c98e6bc68976626c097e8058fd1bacb30bf43e5fdc91851b7a0fddeb3b" + }, + { + "path": "assets/Singkong.ttf", + "sha256": "0e4ccf7a12fe3282f2f8622ff1612206675d283f2881582f81ebba4702c4e0c2" + } + ] + }, + { + "id": "demo/smartRocket", + "kind": "demo", + "source": "src/examples/java/demos/smartRocket", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "DNA.java", + "sha256": "a032039dcd704fd3d7cabc8899cd3f94938aa74e767f0211560124612b38f59b" + }, + { + "path": "Level.java", + "sha256": "6d65f2fda636d2f51f9184cfc87650491e0f31690cf374c9fff7ef6cfd48aa59" + }, + { + "path": "Population.java", + "sha256": "eb21b9da4d7c03a1e6b8b5042a7d48ec5d16c80417915d80710d9ef011df7203" + }, + { + "path": "Rocket.java", + "sha256": "a6245304fc1ae2d9824e5c325ff2dcc697e61eb498d8808df165836ad46514b8" + }, + { + "path": "SmartRocket.java", + "sha256": "865b4f7ecd65133e52d9e00d0a94ef248eee2ce1462af6109ca307d4aaaff9be" + }, + { + "path": "Ziel.java", + "sha256": "e82ad1e3accf297c08135a588a3765e270857dc76ff70df91751f79321cc71f5" + }, + { + "path": "assets/rocket.png", + "sha256": "e459d96e8fb8c399efe9205796da70d2b652e584c82ecff5a2bb8a1963bdc428" + }, + { + "path": "assets/target.png", + "sha256": "d56b2aa9d5a9dac9bec50487138341ec3d16d703ab83eda47fbb2d6203d4c57d" + } + ] + }, + { + "id": "demo/stressTest", + "kind": "demo", + "source": "src/examples/java/demos/stressTest", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "Dino.java", + "sha256": "d65f08c55ec15351ff77d625e3d8797d12dc24e877ea7dfe2c05ba576153c7d1" + }, + { + "path": "Figure.java", + "sha256": "345693eb286fb99f5fdb74a6f892130362b3eb9c973004434a38c172dc3e2a3e" + }, + { + "path": "FigureState.java", + "sha256": "5dcedf8f434d2d16809700a117377e7a527feecc48c4267d61206c2c0cf72a69" + }, + { + "path": "Knight.java", + "sha256": "5984f9ce9d6ce09247f0b5ae45b752e809e7fe1bffdf0a0f2b468cd2360470f3" + }, + { + "path": "Ninja.java", + "sha256": "cf6cf2d953366cd7b11c186a1fe01103788a2c9ad221c9ad58531ba402e9dbb5" + }, + { + "path": "StressTest.java", + "sha256": "e8566d3630cd0b6767c5fab6d4e774bd8d3d857fbd4a0f6517f4dcf36fba9bf4" + }, + { + "path": "assets/dino/Idle (1).png", + "sha256": "5a5507544b8bd548d21107ae9cfaa9adedf1d8ca893e67e0c5598fd2b5c154d6" + }, + { + "path": "assets/dino/Idle (10).png", + "sha256": "da4d5bbb19dcf39d249e498ca96e11bddada2a84af48a5f1ca2089a490573c77" + }, + { + "path": "assets/dino/Idle (2).png", + "sha256": "983cee1459218c3840f025ff11dd9471bbe0f236486ebae1d8c282628ddd6539" + }, + { + "path": "assets/dino/Idle (3).png", + "sha256": "5a57aa76e9a3ed48cc4c98842c2c11f286001fa5de44abe3763b7b353b76d18f" + }, + { + "path": "assets/dino/Idle (4).png", + "sha256": "745e0448bbeb086dcf534a1c7c1e1e3430c195f5da6455a194e0699c18cdd0d3" + }, + { + "path": "assets/dino/Idle (5).png", + "sha256": "3cfd09a9fe8e3bb57cb6e7ebff89335dd77082a7c4e541659c65f99094dc3647" + }, + { + "path": "assets/dino/Idle (6).png", + "sha256": "114b32b8ac4a3298a3fa904371140476fb642224905932e2d3f8b1888b209a11" + }, + { + "path": "assets/dino/Idle (7).png", + "sha256": "562ef3c99b1272535b25929c70bb1e85fc73f7d57d99f5cb2a87eaf9f29b90f3" + }, + { + "path": "assets/dino/Idle (8).png", + "sha256": "5e065cc1c4011cbbd94b0de89ad0cca66c8d6daf8a9cb499c45993508e3f2f75" + }, + { + "path": "assets/dino/Idle (9).png", + "sha256": "b9749fe9651f851dc668ab6799282bc840f921681e41632428bc5a2196df141b" + }, + { + "path": "assets/dino/LICENSE", + "sha256": "41ddb588901b4a011ec2c39dc469619fc39dbf24cd9d3d3e705a8d6d9c057a48" + }, + { + "path": "assets/dino/Run (1).png", + "sha256": "7c9413292b23282208285ce71572f15530f1b8006169f4d5c71945bd5f33c348" + }, + { + "path": "assets/dino/Run (2).png", + "sha256": "ed19846de2252f3acbe08f0db10b24830d0293c3abf11c94124da7a177cd7099" + }, + { + "path": "assets/dino/Run (3).png", + "sha256": "4defb15ffe20561b77d3a3120d6d822fea184907f651be13bd78de20907bbdd8" + }, + { + "path": "assets/dino/Run (4).png", + "sha256": "379025216e878055da8a488a0e90979a563425c8e85ad5886caea37bdd9d9ec4" + }, + { + "path": "assets/dino/Run (5).png", + "sha256": "6f68b216e7528402ab1f0328760af4afdd2689d47b561dde067df38303ba1561" + }, + { + "path": "assets/dino/Run (6).png", + "sha256": "7765bae61c2c89866f0ac5f77bed070e3768a557654072c38d9b2d2326f8665e" + }, + { + "path": "assets/dino/Run (7).png", + "sha256": "bfbdd6350d890a0a95183f2d92319328caa36dd4c5bca0436b2448d3907fe009" + }, + { + "path": "assets/dino/Run (8).png", + "sha256": "c877c9363595e93597b303d776b966c5dc4a08ecb4ec6fce2b618ac2d8fd09b8" + }, + { + "path": "assets/dino/Walk (1).png", + "sha256": "03eaac74a29a8275e08813a04274a55d6d048952d52afa21bfa9c1885a53288b" + }, + { + "path": "assets/dino/Walk (10).png", + "sha256": "c4d281e972230304095ef3739d5fe3b6432666cc715e5fa17e768cf6bea0e6aa" + }, + { + "path": "assets/dino/Walk (2).png", + "sha256": "1c3388e5a87aa73e76ed423c007f412146e6e5ccd8f3d02411e3616ce273d59e" + }, + { + "path": "assets/dino/Walk (3).png", + "sha256": "b5df437fea73b909af59869828ad11dd5c4e41f5f7f2e138bcf489d40ebeffc7" + }, + { + "path": "assets/dino/Walk (4).png", + "sha256": "536aba6c1b2e8629c5c252c9bd9dfe4db24865a69ff9a8e3f0c895bb4f68b6f4" + }, + { + "path": "assets/dino/Walk (5).png", + "sha256": "8aaca1f70101d07c303f6a9a585d6c8cd982af151269fcf7e9819d83d700337e" + }, + { + "path": "assets/dino/Walk (6).png", + "sha256": "cc549f0864920a1a91d0871ff0d4d183d1cf17d83a27ba173b8a0f92e72ffc7f" + }, + { + "path": "assets/dino/Walk (7).png", + "sha256": "59a842c2ec44dfe826e2f21b3fd1dfc2963835add460085b275619eb04f83adb" + }, + { + "path": "assets/dino/Walk (8).png", + "sha256": "3ae05a7c2aaccd4619d55743f07f8ec1fd5c070bba90fedfc7583467f5ccd372" + }, + { + "path": "assets/dino/Walk (9).png", + "sha256": "7346764788de8d010edc91fb22c569ec68305f5238278621115ccf060b31ab0b" + }, + { + "path": "assets/knight/Idle (1).png", + "sha256": "4b6d4d9dbf5e776ec29182e49f10a502706005f4ff16906f9e946c4f58df9a00" + }, + { + "path": "assets/knight/Idle (10).png", + "sha256": "7b9820b9548b1fd8295dc41d1dfdc80f640b3265394828916e8abb9583237303" + }, + { + "path": "assets/knight/Idle (2).png", + "sha256": "8383c766cece063cddad8ff222c75ee2c281a73f4b2ef19f050c5f4a4eef87b0" + }, + { + "path": "assets/knight/Idle (3).png", + "sha256": "2398b3f7adb8dbbdc842905875554d7534544b0b8a5ed5f43365d39fab3dd9a9" + }, + { + "path": "assets/knight/Idle (4).png", + "sha256": "1dba5fc199c72e4b64a46335de38564cb31e3040473acdcfee15d80d5240cfb3" + }, + { + "path": "assets/knight/Idle (5).png", + "sha256": "880d23363c9f98439be163902d33bb22b8e7badb74417c2b4c3e33b2aa43abc9" + }, + { + "path": "assets/knight/Idle (6).png", + "sha256": "98f0596f2e217b30954f387e87158f5f84ba240a8dd7cbbb4317eff0f5cd226a" + }, + { + "path": "assets/knight/Idle (7).png", + "sha256": "9fef5f0f6979017e9ec57c76e2ae5bfb113ec1e94058b1045725144fd1cbb2a9" + }, + { + "path": "assets/knight/Idle (8).png", + "sha256": "ff3607f8ec62a73f2a50701f3bfa0eaf23ccd54b51895f88dbc7faa933e8b539" + }, + { + "path": "assets/knight/Idle (9).png", + "sha256": "87290c26d989986ad165714e66b96f91b13a9e186457703e1c31b4dae5f16daa" + }, + { + "path": "assets/knight/LICENSE", + "sha256": "41ddb588901b4a011ec2c39dc469619fc39dbf24cd9d3d3e705a8d6d9c057a48" + }, + { + "path": "assets/knight/Run (1).png", + "sha256": "583cb89513c8751b93aebb5fb90f1361a6289b38bc7e4edba9daff5211084359" + }, + { + "path": "assets/knight/Run (10).png", + "sha256": "f5a0f7a74f3488e0a653f3755b4c31dde6f271cf38223a78023cadc0b1f6c256" + }, + { + "path": "assets/knight/Run (2).png", + "sha256": "8f28f129a99478b4047680cfd610d1639b02b080a5cbc6e4e43899944af4f807" + }, + { + "path": "assets/knight/Run (3).png", + "sha256": "d15180f29cf929491321fd2cb8dcd4e9070d907e433be3189b3f4126c9d70764" + }, + { + "path": "assets/knight/Run (4).png", + "sha256": "301411a800855e958327dbad85fc03a61b9a8d48c6b498cf5e04edf9a4f2c4cd" + }, + { + "path": "assets/knight/Run (5).png", + "sha256": "ad4364d8efbdf3ebe1f39027db941f132c07f503e2e135a6e0e7e1f425d609bd" + }, + { + "path": "assets/knight/Run (6).png", + "sha256": "277bdd09098e59e931e4cae2725960e2ff043ff4e18723b6a90c164bfb7d77d9" + }, + { + "path": "assets/knight/Run (7).png", + "sha256": "1a29dcc0e4af930e79aa323b6ba6c3389285b385007be1b73b6d155e6fe4128a" + }, + { + "path": "assets/knight/Run (8).png", + "sha256": "12135dad389f2c3e960fcebe8c93a1b63fdd5e31336b0d785ea494e22cb4a2ee" + }, + { + "path": "assets/knight/Run (9).png", + "sha256": "e343327bcf5b00affa1aa3a106a0226d3583fdd189e44c3b80a387572091efc4" + }, + { + "path": "assets/knight/Walk (1).png", + "sha256": "955c15b659e10ed4cebc643c54103b6a44f6416a6939dc5b6d5cc557cb75f9ad" + }, + { + "path": "assets/knight/Walk (10).png", + "sha256": "59ffbc390b816191c77ed43a0413fc787b1f7b8351bf23d4417f999765790392" + }, + { + "path": "assets/knight/Walk (2).png", + "sha256": "5de5cccce717a475601ad3ea15c1be72521c9440510d1b282185c3e1c129e13b" + }, + { + "path": "assets/knight/Walk (3).png", + "sha256": "cf19653994521807a80130ffe57040bc64a5a25389497b6ae959d9e94e8f7d7c" + }, + { + "path": "assets/knight/Walk (4).png", + "sha256": "d7369d0871f658488c771df762559848068677aebe61580e48360e2966eedfac" + }, + { + "path": "assets/knight/Walk (5).png", + "sha256": "4d61315a5b709747e87ef1579e08511a8646b63d19006de627def0685359fcab" + }, + { + "path": "assets/knight/Walk (6).png", + "sha256": "c2085e09e60c936c025c16fb0ff77a2cd5eb652c40d7a057ef57b2abb210f901" + }, + { + "path": "assets/knight/Walk (7).png", + "sha256": "1d142843fc0ac6db840a0914cfdfb5baaf2633af36f11329a28a9d98e5b1a174" + }, + { + "path": "assets/knight/Walk (8).png", + "sha256": "f22d91ce3e47ff33897063f7e968f685233c34718baf0cc567867d43ea6a6798" + }, + { + "path": "assets/knight/Walk (9).png", + "sha256": "ee09f04c688e818aaeac1f1981d492120f92c94a823d3ca0d77f90e5a5721cfe" + }, + { + "path": "assets/ninja/Idle (1).png", + "sha256": "0e8d98d16b056815c84f15bd095d47087c4dceac5880218b0466d37c573b8435" + }, + { + "path": "assets/ninja/Idle (10).png", + "sha256": "d402a6f4ad672e9f010764a426f90ab3ddfe04f924eed09c6eeded42ed98ca82" + }, + { + "path": "assets/ninja/Idle (2).png", + "sha256": "e7089bff695efef7bb2a62e0ead0d2f3334adca21a9adfc61e273010605c1142" + }, + { + "path": "assets/ninja/Idle (3).png", + "sha256": "8573a41086a0b6db1cc4f8f26ff4f525361d1e5a1483159996d7a3f385a6d83c" + }, + { + "path": "assets/ninja/Idle (4).png", + "sha256": "ae706a981eaa808fa29459e73a2f5b783de316f089284295a5857fce0f0c28ba" + }, + { + "path": "assets/ninja/Idle (5).png", + "sha256": "2952a1475585b3577f0643b01c3f713b36416354d5f6dbfb2d3f699fe6df4671" + }, + { + "path": "assets/ninja/Idle (6).png", + "sha256": "45d5e685296a7e1369bd107f0a474efcfca66a86eb0702f58c768b32056b847d" + }, + { + "path": "assets/ninja/Idle (7).png", + "sha256": "ef22c61ee05024cb3eee41a9844f04104f90d650c99038d6463107a5623ae125" + }, + { + "path": "assets/ninja/Idle (8).png", + "sha256": "4b337b7fe5364464b6cc28159609d0931d7d58004c45a59a2051326b4c753aa1" + }, + { + "path": "assets/ninja/Idle (9).png", + "sha256": "8c5805a5174380fc5aba30907c0d3170c91dc014879610cb5e9e6b2c0331983d" + }, + { + "path": "assets/ninja/Run (1).png", + "sha256": "166c069c125c24647cf1ddf8125be7596ff0e343bd672931f4260f4a8adc87ad" + }, + { + "path": "assets/ninja/Run (10).png", + "sha256": "c675b3bb8d58abd12cdc14dbd17f850024938ee747b225d0c8b3f7d4306e18a9" + }, + { + "path": "assets/ninja/Run (2).png", + "sha256": "199ed64724fec0582fa23290f54d6bb81b6f470078cf9d714cf84e75426b530e" + }, + { + "path": "assets/ninja/Run (3).png", + "sha256": "d92601cbae9825843712a2bac073424523910fa50d598f3b989a179d7c4b44a6" + }, + { + "path": "assets/ninja/Run (4).png", + "sha256": "c98bb0e654454674d4a73dda2f0255136a7ddd21424294a3a4ebe69dbb8c3f19" + }, + { + "path": "assets/ninja/Run (5).png", + "sha256": "f4491b94c618545aed63cf6571ddd9cd3b376ae0517653cd5b2a7761e89d0daa" + }, + { + "path": "assets/ninja/Run (6).png", + "sha256": "9003fa5099305f05b5fb269ffdf2f4b961d72353fedad946b05594f5e4c7a939" + }, + { + "path": "assets/ninja/Run (7).png", + "sha256": "fe2bd878b84d0db115dae64656904cf7ac70afdbe1ef70b3acbeb4da797085a9" + }, + { + "path": "assets/ninja/Run (8).png", + "sha256": "b4ab32fd8497c1d9938a97a02705a49da439239261da56d024c9e2eb4a5c994d" + }, + { + "path": "assets/ninja/Run (9).png", + "sha256": "9cec762184ecc45d6f6280dd2fd902d7a3717b77e4f06155ea3923756b8fe31a" + }, + { + "path": "assets/ninja/Walk (1).png", + "sha256": "cdef02a5555f3cd4ef85ad76a6efbf7c91f7b9b1ec78ef65c662db684e7529a0" + }, + { + "path": "assets/ninja/Walk (10).png", + "sha256": "4355a26cad8e9aebe6577d81a387daf0802a7da520e655db93343f568d7a3ebb" + }, + { + "path": "assets/ninja/Walk (2).png", + "sha256": "8013fddefb284075164858edb2ceee216347e265fcff69b374ce4a4264b30897" + }, + { + "path": "assets/ninja/Walk (3).png", + "sha256": "707ddc7fb87b4ddc18c81352cc653b89c3b942ebcb4d9256dea6ba5d2685f00e" + }, + { + "path": "assets/ninja/Walk (4).png", + "sha256": "03d8cd607dc37de0aef1883919bc0313bffee85b445658b18411f52e47ad81e8" + }, + { + "path": "assets/ninja/Walk (5).png", + "sha256": "c5ec5152a19b8fc1ce23ea55dbaa5e293538f09b5b8238ce2717bfdd199c7e85" + }, + { + "path": "assets/ninja/Walk (6).png", + "sha256": "0350f8d5c31c235b79337152908446853245b6b2b2e384b21cb212837794065d" + }, + { + "path": "assets/ninja/Walk (7).png", + "sha256": "1eed321418b4c20c3be3be89ed033d4e02e7fff9c4c637b51bfbdfda9d700a92" + }, + { + "path": "assets/ninja/Walk (8).png", + "sha256": "964d5a8e793750dc800650612a9480e2da91c3d223e7cdcab25f3169469bde40" + }, + { + "path": "assets/ninja/Walk (9).png", + "sha256": "ff8863152a575ef1e1a890006c217585458046cf7f4091c0cf5186c2a74be879" + }, + { + "path": "assets/outback.png", + "sha256": "b4d02cf557f6bdfbd59fd384160a5d583d4adf8b1610d25d1ceeafcb98f26766" + } + ] + }, + { + "id": "demo/tiled", + "kind": "demo", + "source": "src/examples/java/demos/tiled", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer" + ], + "files": [ + { + "path": "Bamboo.java", + "sha256": "46ec44f8d28c5a0eaec1fb30f5c42d35ed9b6962b75a9c08105f770e4ee2df08" + }, + { + "path": "Enemy.java", + "sha256": "936060f67fbea9d35ce80ea0c829c120b7863eca6d775d97aea9fd5b7b7365cf" + }, + { + "path": "Fireball.java", + "sha256": "9064b7fc0b8f286026ed08125db9c5b4fb77bc15c7add1dc51760732e346ecb2" + }, + { + "path": "GameState.java", + "sha256": "816c40b0209a5f9dafd418e98238cb1d1f3296998e33b2e5eb397cc1a3be88ae" + }, + { + "path": "I18n.java", + "sha256": "c430cf0eb4d31e17a702971553b6f6bc629085fd197d7ac3bb3444a683920e55" + }, + { + "path": "Item.java", + "sha256": "17b9d7b4679d4ffd6f66d0ea0a83cb6e4fb8674b05e0091347bec523add6e276" + }, + { + "path": "Level1.tmx", + "sha256": "d0313669a472f49b6f1caa8d4effc390278176644339b7513819b44bac2c80be" + }, + { + "path": "Level2.tmx", + "sha256": "d3d104297fd78a7c1c85699d295b645ae21b7c8ff0ff0d9e11d556aca88641e3" + }, + { + "path": "Player.java", + "sha256": "8731b294011650eb0f9f8e89562a820972c0a0457de6c2e21a73a5560310cc74" + }, + { + "path": "Tiled.java", + "sha256": "97c8631d9f363d1939987c86353cb2e34a4e530187fc93231864ba7a8a5bf5d3" + }, + { + "path": "UIItem.java", + "sha256": "f1177f7cfd7c7147ed3ef2e10b475c53c5de228c8ba2ab118bd9058563c17479" + }, + { + "path": "Wall.java", + "sha256": "b226bdddba1cc32e7ccabbe3c686161a2b04060acff79b769c34f6af53487bb0" + }, + { + "path": "Warp.java", + "sha256": "5749bb006f674e1a3aab8c3bb14933dd517edadb4ab1a38d213e7040c9791eab" + }, + { + "path": "Water.java", + "sha256": "aee560ddb396dd81e10d84dfa4769b31dbf3cd8433955068886c436581c03b17" + }, + { + "path": "World.java", + "sha256": "3f0965034fd75e1d6c16501172bd72e53566b1dd8894cd7e8f46cf53ef7576a9" + }, + { + "path": "assets/Bamboo.png", + "sha256": "767a9fe9f5a386fb095471c2e934be15c6725be114a00c731500746ba98247fd" + }, + { + "path": "assets/Fireball.png", + "sha256": "366f2d49d9456c32c0eec2ce96e5487011af35da8007a0ef7cf82788e93a7b75" + }, + { + "path": "assets/Retro Gaming.ttf", + "sha256": "dfd827142124c0fab4b916a4c72dbf4c91a9069a150aa8be71d0566f6d612066" + }, + { + "path": "assets/ScrollFire.png", + "sha256": "899b4bc72a4a95e7c93ba481bfda2c2fd9990159db86523eb33a6dbcc260b69b" + }, + { + "path": "assets/ScrollWater.png", + "sha256": "274a12dd4ec4ccf2a4a4884d647c3880f7a3d7cb499aa573e7ad8d58fa5a3e0e" + }, + { + "path": "assets/Skeleton.png", + "sha256": "81fc368cb542892934400f7e3350433ff506ed966f5b9c95543e2745899ce2fe" + }, + { + "path": "assets/TilesetField.png", + "sha256": "b482b0b257baf09648db4d507ca255231fc4bff2dff89e59a9f70ba66b9e1845" + }, + { + "path": "assets/TilesetFloor.png", + "sha256": "5a4b0208e732a48f16fbe50ced54910cf0cb7ccc5552f426e5fb586829819681" + }, + { + "path": "assets/TilesetWater.png", + "sha256": "3d37d9581179c746fb55bc5e9eb83ed7f2ca6e0ee892cb9c0627250833b02277" + }, + { + "path": "save.json", + "sha256": "ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356" + } + ] + }, + { + "id": "demo/timedDot", + "kind": "demo", + "source": "src/examples/java/demos/timedDot", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "TimedDot.java", + "sha256": "439ceeabb6aeb4997221ad6b862c2e3707954caba15a181998bae51f304bddf3" + } + ] + }, + { + "id": "demo/timer", + "kind": "demo", + "source": "src/examples/java/demos/timer", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "TimerStage.java", + "sha256": "aca34300457121b32f740e294eb0e1589cf487cbe0cad5c431fb0de63402a608" + } + ] + }, + { + "id": "demo/ui", + "kind": "demo", + "source": "src/examples/java/demos/ui", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "UI.java", + "sha256": "864245b75532369c5e9115043ad8615214770401307c3f68611f62f9b1f2a5b2" + }, + { + "path": "bar_round_gloss_large.png", + "sha256": "44fea9186b56afe4c1cfc676b0dcf64fdee42c18ef4843389acc294b5666cbf0" + }, + { + "path": "bar_round_gloss_large_gray.png", + "sha256": "4f5c4d98f462cb38b7e81ad1f45a529a63f224fb032e430eec0df53da1f8fb46" + }, + { + "path": "crosshair_color_c.png", + "sha256": "53ad72c48a8fdb550b1e4cf2b6cf97e2de7a892cdbcb098e73263d804b530127" + }, + { + "path": "metalPanel_greenCorner.png", + "sha256": "8f8b0f856a0da0abb1aad33497331eb1f892bf7ea9f97e945882c8dd83164c70" + } + ] + }, + { + "id": "demo/volume", + "kind": "demo", + "source": "src/examples/java/demos/volume", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": "Volume.java", + "sha256": "ff6b1b109ab36acb97181fe2309bc0966da5487629ba33815c1a15b483b8d89e" + } + ] + }, + { + "id": "tutorial/Halloween", + "kind": "tutorial", + "source": "docs/archives/Halloween", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "GhostSprite.java", + "sha256": "0384d2d29fd627071a580ffdb91b3ebec648f6a210ba6bce3ffb7959941c3652" + }, + { + "path": "HalloweenStage.java", + "sha256": "b9a53144da5c0108e71af7c34b05094239c67d786923ed239fc0fa16f314e5e8" + }, + { + "path": "HouseSprite.java", + "sha256": "58e61a14d64b70fb3e4b98337a5ce347ee8441af6a39bb0496156c2813e21812" + }, + { + "path": "PumpkinSprite.java", + "sha256": "2437b012ead25f8fdcb8297c0e94b1bbc4ec37037226f5aa8b5113d669e8b27b" + }, + { + "path": "package.bluej", + "sha256": "a9623d91bd998d884124ed3815a659d2195e71377b797edba9b97a0afc15e558" + }, + { + "path": "sounds/background.wav", + "sha256": "36fa67c1a4c199dccfe608b1ff64170551949c73003fb26b9da708cc2e2114b7" + }, + { + "path": "sounds/door.wav", + "sha256": "ee087d54d051f29102b3ea941b37761970780ece13dc11d7aa8a23d68e6d5b0f" + }, + { + "path": "sounds/ghost.wav", + "sha256": "edc570c66f778ea33affa5ab73ea96f059943bcfe412b266295a769ace824e6d" + }, + { + "path": "sprites/background.jpg", + "sha256": "4fe64d2bcdbdbccaeb385e609517fc403a0376f4edce2278000e54c9028b8988" + }, + { + "path": "sprites/castle_off.png", + "sha256": "d269553f298a33879f87523e012ad02d28deead9bf243b55b5df3de4bce49cc6" + }, + { + "path": "sprites/castle_on.png", + "sha256": "24085f67d62563a9aef4c6f0fb2f8a39d17cf2cd1ebecb4320cce0196e30e781" + }, + { + "path": "sprites/ghost/ghost_01.png", + "sha256": "c5347db7381e24b302ec5645672ee51246fa385849f5cc2ff26601eb87fa40dd" + }, + { + "path": "sprites/ghost/ghost_02.png", + "sha256": "cabbc13b4ae8d8c7af666393a780d86b00591bc52022cee4d435c739a388dff0" + }, + { + "path": "sprites/ghost/ghost_03.png", + "sha256": "f2b7f233412b4b71b4cb2917233ff811f75108dbf8efe5adc17e044063b319c6" + }, + { + "path": "sprites/ghost/ghost_04.png", + "sha256": "5640a6c6f320c86ace35f3715ae673580160d6423fc8d109d970180ee936aaa0" + }, + { + "path": "sprites/ghost/ghost_05.png", + "sha256": "d7a7243abf5d99728511d80123d1126f4383f558f1f908c697101417c50ff618" + }, + { + "path": "sprites/ghost/ghost_06.png", + "sha256": "ec2e02c3d1bedcf66f4c1c780f053d9cef17b89e14dcb1a1a5b754597398e90a" + }, + { + "path": "sprites/ghost/ghost_07.png", + "sha256": "042d23019bc143786c00ba551153ab5eb36be365a1252a93467d5922706a81cb" + }, + { + "path": "sprites/ghost/ghost_08.png", + "sha256": "785e28befc1dba98421e4c45e19870b903700963a915a07b7d4c547565373ecd" + }, + { + "path": "sprites/ghost/ghost_09.png", + "sha256": "f83b5c359c13dfcacddd4bc6987bf073fba96f06e080e4f4b2d690e8cd57807c" + }, + { + "path": "sprites/ghost/ghost_10.png", + "sha256": "e155c4ed62aed589a1378613e850ff05ba86e57e82a1e33944efd28b661efc10" + }, + { + "path": "sprites/pumpkin/pumpkin_01.png", + "sha256": "0b2df0a538510e7f6dc941db10e83dafe3ebde7eb23fb0ff3334bd0b427ca3a9" + }, + { + "path": "sprites/pumpkin/pumpkin_02.png", + "sha256": "5db69c37a0bcffbbd81690d1fe0d2e75aea9773bfdec6f64fcfb9c109f9b6a3c" + } + ] + }, + { + "id": "tutorial/bluej-starter", + "kind": "tutorial", + "source": "docs/archives/bluej-starter", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "Cat.java", + "sha256": "f5e71d1da4812c7810701eeaf23bc2d8bb455b8c8d607fa0ab04fcebd8df9f2b" + }, + { + "path": "MyStage.java", + "sha256": "cbe0c5ef6165e8ac0194090a50b5085a0b59b22d2b91633980953823aab1152a" + }, + { + "path": "MyWindow.java", + "sha256": "8056b03a70774938863b829c750300549323c4287eb9f9e6350cd77ccb101005" + }, + { + "path": "assets/.gitkeep", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "assets/cat.png", + "sha256": "0423f61671a086906d972b266241d557934f86bdb8ec5ad6f50b08f3474efa0f" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ] + }, + { + "id": "tutorial/bouncy-hedgehog", + "kind": "tutorial", + "source": "docs/archives/bouncy-hedgehog", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": ".vscode/extensions.json", + "sha256": "5d6b599db5e395f6c21b38697c7d9d8768f67dbd0eebc36a6e610cc0a3786ef0" + }, + { + "path": ".vscode/settings.json", + "sha256": "516b1cf9e9ebc68be9b9e4df0b89c6c43beaa6b8f75be6ed7f1fadae2d5c8ce9" + }, + { + "path": "BouncyHedgehogStage.java", + "sha256": "483de7f13ab0903792bafecb7be0048edf9c2eb7244ac3493459bfd8a0cb7fda" + }, + { + "path": "HedgehogSprite.java", + "sha256": "8e14206fda7f43637aff1e8b7a43e6c42de2ae14de97af2b86dd6f4ad5d50d7b" + }, + { + "path": "README.md", + "sha256": "a52e43821ba57c053e89735bb8f0fab2cd9f1e039e1f16380405ab14f8654e78" + }, + { + "path": "TrampolineSprite.java", + "sha256": "a7fdb464a46167825abcefb161b93d3560b0bc8a09c0204879791ddb4e8b988f" + }, + { + "path": "hedgehog.png", + "sha256": "731e677d38912bf339a16cda8c61035db1db52489c462181e9be4874bd310db7" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "playground.jpg", + "sha256": "c68f76ab3c5ac54be427706d571cd5b268141c4448b88e7277ebae45c347f0dd" + }, + { + "path": "trampoline.png", + "sha256": "ca11b0fbb8ec2f002f30659bda64a3d979d65f8d0f465629cd19b57c81e18df8" + } + ] + }, + { + "id": "tutorial/bouncy-hedgehog-100", + "kind": "tutorial", + "source": "docs/archives/bouncy-hedgehog-100", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": ".vscode/extensions.json", + "sha256": "5d6b599db5e395f6c21b38697c7d9d8768f67dbd0eebc36a6e610cc0a3786ef0" + }, + { + "path": ".vscode/settings.json", + "sha256": "516b1cf9e9ebc68be9b9e4df0b89c6c43beaa6b8f75be6ed7f1fadae2d5c8ce9" + }, + { + "path": "BouncyHedgehogStage.java", + "sha256": "f28090be3f0aabf674ebe1870740440d7573773256cae63450517262261f5f59" + }, + { + "path": "HedgehogSprite.java", + "sha256": "ec727a72eac0f5d5ef58ff7093c0852a2031aeb5ea40702b3e7c50af928c8cbf" + }, + { + "path": "README.md", + "sha256": "a52e43821ba57c053e89735bb8f0fab2cd9f1e039e1f16380405ab14f8654e78" + }, + { + "path": "TrampolineSprite.java", + "sha256": "a5f262e0116c12f34e18bdcad56395ac0a1da5f8517266f6b1eaf69321ce9fbc" + }, + { + "path": "hedgehog.png", + "sha256": "731e677d38912bf339a16cda8c61035db1db52489c462181e9be4874bd310db7" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "playground.jpg", + "sha256": "c68f76ab3c5ac54be427706d571cd5b268141c4448b88e7277ebae45c347f0dd" + }, + { + "path": "trampoline.png", + "sha256": "ca11b0fbb8ec2f002f30659bda64a3d979d65f8d0f465629cd19b57c81e18df8" + } + ] + }, + { + "id": "tutorial/cat", + "kind": "tutorial", + "source": "docs/archives/cat", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": "CatSprite.java", + "sha256": "f21ff0ec0c7ffa8c269d91fbac2ac0dbce1154ac6ac41cefe9e2cae198c20d3f" + }, + { + "path": "CatStage.java", + "sha256": "59d5a5e628e9e285d9af9462ed37dbb23ca613af0b46d315461ba763c0aad64f" + }, + { + "path": "cat.png", + "sha256": "0423f61671a086906d972b266241d557934f86bdb8ec5ad6f50b08f3474efa0f" + }, + { + "path": "package.bluej", + "sha256": "d18f1b5e976159b105ce08a72f95f98dffc64cec82f0d618460e73d710040604" + } + ] + }, + { + "id": "tutorial/catch-the-coins-100", + "kind": "tutorial", + "source": "docs/archives/catch-the-coins-100", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": ".vscode/settings.json", + "sha256": "76219b6f95a73b8052dd10130e5ebb34aa319e8ab534890c0a2240651c307e7a" + }, + { + "path": "Basket.java", + "sha256": "7f7aa0c5a52ed0db3e39e1b97f0817103d27d43fd424c16539ed1063bf90657d" + }, + { + "path": "CatchStage.java", + "sha256": "81f4c96b7e2015b381d5845d995d1fcf00369f11197def706b950a86d5f9b630" + }, + { + "path": "Coin.java", + "sha256": "bc0752b8e5509455422e7625613f83bbe0dc4f5c2d8e83cb2d312532a313489f" + }, + { + "path": "README.md", + "sha256": "7867d20f01bf95412d4b307e34210e9a62e0850b2db0eb7453a82c011deab634" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ] + }, + { + "id": "tutorial/dodge-the-rocks-100", + "kind": "tutorial", + "source": "docs/archives/dodge-the-rocks-100", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": ".vscode/settings.json", + "sha256": "76219b6f95a73b8052dd10130e5ebb34aa319e8ab534890c0a2240651c307e7a" + }, + { + "path": "Alien.java", + "sha256": "27311fafd34fdba30e4aa0f92d058d3ae6127d8fb48dd82837302ac6bd512be7" + }, + { + "path": "DodgeWindow.java", + "sha256": "2bcec14f90ff80f49281d0baf142d538f1853a14d78d1f299f1161cbfb975732" + }, + { + "path": "GameStage.java", + "sha256": "ab21802ccf2c2a3fe04e1aacadfe02731a8f1a417cb42b1b5b9b54b1442f2956" + }, + { + "path": "README.md", + "sha256": "2222d201aea0e8f6b0531e5344e0ac69a424a45c969f2ad1e29c869d6d7de3bd" + }, + { + "path": "Rock.java", + "sha256": "4d3905160b6a34d732a477a37c74e06edcbc4222440c8d743200de9d382e6318" + }, + { + "path": "TitleStage.java", + "sha256": "370fe74347c426309e2fd77c10589bb71e2c18ced5d638db7a3f8a67922c000d" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ] + }, + { + "id": "tutorial/getting-started-100", + "kind": "tutorial", + "source": "docs/archives/getting-started-100", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "jumper", + "tappy_plane" + ], + "files": [ + { + "path": ".vscode/settings.json", + "sha256": "76219b6f95a73b8052dd10130e5ebb34aa319e8ab534890c0a2240651c307e7a" + }, + { + "path": "Bunny.java", + "sha256": "a6de1d1ff1505cd507406533201239c548d715e9deb59604e702ae5c49974662" + }, + { + "path": "MyStage.java", + "sha256": "d8b26cf64078f1a2dcc95b033df292282e8271b2b1c14212582b39ed15b6fc10" + }, + { + "path": "README.md", + "sha256": "1cf7971612162c7486cd95894fa740ec9f3e8f8268e01790ef5cb48ed37a0507" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ] + }, + { + "id": "tutorial/guess-the-number-100", + "kind": "tutorial", + "source": "docs/archives/guess-the-number-100", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": ".vscode/settings.json", + "sha256": "76219b6f95a73b8052dd10130e5ebb34aa319e8ab534890c0a2240651c307e7a" + }, + { + "path": "GuessStage.java", + "sha256": "9fac29bde01fcfe5248d25e5f069e2a992508f53fd54ee364fb6fc9d8a548e7d" + }, + { + "path": "README.md", + "sha256": "2e83410662b1d66e3b506bc668ecb59ee2651b9fe5344a1b16e0c43b6e0c6d27" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ] + }, + { + "id": "tutorial/make-it-walk-100", + "kind": "tutorial", + "source": "docs/archives/make-it-walk-100", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": ".vscode/settings.json", + "sha256": "76219b6f95a73b8052dd10130e5ebb34aa319e8ab534890c0a2240651c307e7a" + }, + { + "path": "README.md", + "sha256": "fabacace7e210742909cd107a230f3e4c47ca68197963b619c1e932fa1464cc0" + }, + { + "path": "WalkStage.java", + "sha256": "c2e5518d8b29b623fd9e85ca5570df179aa1043fcfc13669719cb13bd8ff1414" + }, + { + "path": "Walker.java", + "sha256": "1811c6b4ea7c206ca0d78be206c377cdd470bc9092884f3a94ff8e023d04d1b3" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ] + }, + { + "id": "tutorial/red-light-green-light-100", + "kind": "tutorial", + "source": "docs/archives/red-light-green-light-100", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [ + "platformer", + "tappy_plane" + ], + "files": [ + { + "path": ".vscode/settings.json", + "sha256": "76219b6f95a73b8052dd10130e5ebb34aa319e8ab534890c0a2240651c307e7a" + }, + { + "path": "README.md", + "sha256": "343be5278ad1ba4f7f23205363319e90239a1b4a4c5f85340d7af3430e5943d3" + }, + { + "path": "RaceStage.java", + "sha256": "a1d264b816b4accf9740b2ed0c8b1e053accc8bee1c2a55c4e74c264f490dee4" + }, + { + "path": "Racer.java", + "sha256": "e5e157f62c18400e22e2eb8aa7aed4020542e45fecca31757e8c3f7c456cc304" + }, + { + "path": "Referee.java", + "sha256": "989580b24499248a299e09d0b5c2ea0fef733a0577a750d5a2fb840bb4792ef2" + }, + { + "path": "package.bluej", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ] + }, + { + "id": "tutorial/vs-code-starter", + "kind": "tutorial", + "source": "docs/archives/vs-code-starter", + "libraryVersion": "5.8.0", + "flavour": "standard", + "requiredSheets": [], + "files": [ + { + "path": ".vscode/extensions.json", + "sha256": "c31c30ca102830cd851010c0cd32527c8b943e248a3f73512ee4da7586021183" + }, + { + "path": ".vscode/settings.json", + "sha256": "5ab65d6d595d057a9124aa7fe85e76a3f5bb128f1c7b04a7f49aebd0631a4b0a" + }, + { + "path": "Cat.java", + "sha256": "f5e71d1da4812c7810701eeaf23bc2d8bb455b8c8d607fa0ab04fcebd8df9f2b" + }, + { + "path": "MyStage.java", + "sha256": "cbe0c5ef6165e8ac0194090a50b5085a0b59b22d2b91633980953823aab1152a" + }, + { + "path": "MyWindow.java", + "sha256": "8056b03a70774938863b829c750300549323c4287eb9f9e6350cd77ccb101005" + }, + { + "path": "assets/.gitkeep", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "assets/cat.png", + "sha256": "0423f61671a086906d972b266241d557934f86bdb8ec5ad6f50b08f3474efa0f" + } + ] + } + ] +} diff --git a/core/src/main/resources/images/cat.png b/core/src/main/resources/images/cat.png new file mode 100644 index 0000000..c176766 Binary files /dev/null and b/core/src/main/resources/images/cat.png differ diff --git a/core/src/main/resources/images/jumper.png b/core/src/main/resources/images/jumper.png new file mode 100644 index 0000000..d319f4f Binary files /dev/null and b/core/src/main/resources/images/jumper.png differ diff --git a/core/src/main/resources/images/platformer.png b/core/src/main/resources/images/platformer.png new file mode 100644 index 0000000..2a76271 Binary files /dev/null and b/core/src/main/resources/images/platformer.png differ diff --git a/core/src/main/resources/images/space_shooter.png b/core/src/main/resources/images/space_shooter.png new file mode 100644 index 0000000..8c58b86 Binary files /dev/null and b/core/src/main/resources/images/space_shooter.png differ diff --git a/core/src/main/resources/images/tappy_plane.png b/core/src/main/resources/images/tappy_plane.png new file mode 100644 index 0000000..79efca4 Binary files /dev/null and b/core/src/main/resources/images/tappy_plane.png differ diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Bean.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Bean.java new file mode 100644 index 0000000..92135fc --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Bean.java @@ -0,0 +1,16 @@ +import org.openpatch.scratch.AnimatedSprite; + +/** A spinning coffee bean to collect. */ +public class Bean extends AnimatedSprite { + + public Bean(double x, double y) { + this.addAnimation("spin", "coffee_bean_%d", 4); + this.setAnimationInterval(120); + this.setX(x); + this.setY(y); + } + + public void run() { + this.playAnimation("spin"); + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Bug.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Bug.java new file mode 100644 index 0000000..456c5fb --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Bug.java @@ -0,0 +1,52 @@ +import org.openpatch.scratch.AnimatedSprite; +import org.openpatch.scratch.RotationStyle; + +/** A bug walking to and fro. Jump on it or punch it - but do not walk into it. */ +public class Bug extends AnimatedSprite { + + /** The costume is 32 pixels high, the legs end 3 pixels above its bottom. */ + private static final double FEET = 13; + + private final double minX; + private final double maxX; + private boolean squished = false; + private int squishedFrames = 0; + + public Bug(double minX, double maxX, double floor) { + this.addAnimation("walk", "bug_walk_%d", 4); + this.addAnimation("squished", "bug_squished_%d", 2); + this.setAnimationInterval(120); + this.setRotationStyle(RotationStyle.LEFT_RIGHT); + this.minX = minX; + this.maxX = maxX; + this.setX(minX); + this.setY(floor + FEET); + } + + public boolean isSquished() { + return this.squished; + } + + public void squish() { + this.squished = true; + this.resetAnimation(); + } + + public void run() { + if (this.squished) { + this.playAnimation("squished", true); + this.squishedFrames += 1; + if (this.squishedFrames > 30) { + this.remove(); + } + return; + } + this.playAnimation("walk"); + this.move(1); + if (this.getX() > this.maxX) { + this.setDirection(-90); + } else if (this.getX() < this.minX) { + this.setDirection(90); + } + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Cat.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Cat.java new file mode 100644 index 0000000..1435ade --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Cat.java @@ -0,0 +1,255 @@ +import org.openpatch.scratch.AnimatedSprite; +import org.openpatch.scratch.KeyCode; +import org.openpatch.scratch.RotationStyle; + +/** The Scratch for Java cat. Every one of its animations is on the built-in cat sheet. */ +public class Cat extends AnimatedSprite { + + /** The costumes are 64 pixels high with the feet on the bottom row. */ + private static final double FEET = 32; + + private static final double SPEED = 3; + private static final double CLIMB_SPEED = 2; + private static final double JUMP_STRENGTH = 10.5; + private static final double GRAVITY = 0.5; + + private double fallSpeed = 0; + private boolean onGround = true; + private boolean climbing = false; + private boolean punching = false; + private boolean dead = false; + private boolean won = false; + /** Frames left until the cat can be hurt again. */ + private int hurtFrames = 0; + /** Frames left of the landing squat. */ + private int landFrames = 0; + private String animation = ""; + + public Cat() { + // "cat_walk_%d" stands for cat_walk_1 to cat_walk_6. + this.addAnimation("idle", "cat_idle_%d", 26); + this.addAnimation("walk", "cat_walk_%d", 6); + this.addAnimation("crouch", "cat_crouch_%d", 4); + this.addAnimation("jump", "cat_jump_%d", 3); + this.addAnimation("fall", "cat_fall_%d", 2); + this.addAnimation("land", "cat_land_%d", 2); + this.addAnimation("punch", "cat_punch_%d", 6); + this.addAnimation("hurt", "cat_hurt_%d", 3); + this.addAnimation("ko", "cat_ko_%d", 5); + this.addAnimation("cheer", "cat_cheer_%d", 4); + this.addAnimation("climb", "cat_climb_%d", 4); + this.setAnimationInterval(100); + this.addSound("footstep_grass_000"); + this.addSound("impactPunch_medium_004"); + this.addSound("impactSoft_heavy_000"); + this.addSound("handleCoins"); + + this.setRotationStyle(RotationStyle.LEFT_RIGHT); + this.setX(-360); + this.setY(CatPlatformer.GROUND_TOP + FEET); + } + + /** Plays an animation, starting it from its first frame when it changes. */ + private void play(String name, boolean once) { + if (!name.equals(this.animation)) { + this.animation = name; + this.resetAnimation(); + } + this.playAnimation(name, once); + } + + private CatPlatformer level() { + return (CatPlatformer) this.getStage(); + } + + private double feet() { + return this.getY() - FEET; + } + + public void whenKeyPressed(KeyCode keyCode) { + if (this.dead || this.won) { + return; + } + if (keyCode == KeyCode.SPACE && (this.onGround || this.climbing)) { + this.fallSpeed = JUMP_STRENGTH; + this.onGround = false; + this.climbing = false; + this.playSound("footstep_grass_000"); + } + if (keyCode == KeyCode.X && this.onGround && !this.punching) { + this.punching = true; + } + } + + public void run() { + if (this.dead) { + this.fall(); + this.play("ko", true); + return; + } + if (this.won) { + this.play("cheer", false); + return; + } + + boolean walking = this.walk(); + if (!this.climb()) { + this.fall(); + } + this.meetBugs(); + + Bean bean = this.getTouchingSprite(Bean.class); + if (bean != null) { + this.playSound("handleCoins"); + bean.remove(); + this.level().collectBean(); + } + if (this.isTouchingSprite(Goal.class) && this.onGround) { + this.won = true; + this.setTransparency(0); + this.level().win(); + } + + this.animate(walking); + } + + /** Left and right; returns whether the cat is walking. */ + private boolean walk() { + if (this.punching || this.isKeyPressed(KeyCode.DOWN) && this.onGround && !this.isTouchingSprite(Ladder.class)) { + return false; + } + if (this.isKeyPressed(KeyCode.LEFT)) { + this.setDirection(-90); + this.changeX(-SPEED); + } else if (this.isKeyPressed(KeyCode.RIGHT)) { + this.setDirection(90); + this.changeX(SPEED); + } else { + return false; + } + this.climbing = false; + this.setX(Math.max(-380, Math.min(380, this.getX()))); + return true; + } + + /** Up and down a ladder; returns whether the cat is on one. */ + private boolean climb() { + boolean onLadder = this.isTouchingSprite(Ladder.class); + boolean up = this.isKeyPressed(KeyCode.UP); + boolean down = this.isKeyPressed(KeyCode.DOWN); + if (onLadder && (up || down) && !this.punching) { + this.climbing = true; + } + if (!onLadder) { + this.climbing = false; + } + + if (this.climbing) { + this.fallSpeed = 0; + if (up) { + this.changeY(CLIMB_SPEED); + } else if (down) { + this.changeY(-CLIMB_SPEED); + } + // At the top of the ladder the cat steps onto the platform, at the + // bottom onto the ground. + if (this.feet() >= CatPlatformer.LADDER_TOP) { + this.setY(CatPlatformer.LADDER_TOP + FEET); + this.climbing = false; + this.onGround = true; + } else if (this.feet() <= CatPlatformer.GROUND_TOP) { + this.setY(CatPlatformer.GROUND_TOP + FEET); + this.climbing = false; + this.onGround = true; + } else { + this.onGround = false; + } + } + return this.climbing; + } + + /** Falls until the feet meet a platform or the ground. */ + private void fall() { + double before = this.feet(); + this.fallSpeed -= GRAVITY; + this.changeY(this.fallSpeed); + double landing = this.level().landingHeight(this.getX(), before, this.feet()); + if (!Double.isNaN(landing) && this.fallSpeed <= 0) { + if (!this.onGround && this.fallSpeed < -4) { + this.landFrames = 8; + } + this.setY(landing + FEET); + this.fallSpeed = 0; + this.onGround = true; + } else { + this.onGround = false; + } + } + + private void meetBugs() { + if (this.hurtFrames > 0) { + this.hurtFrames -= 1; + // blink while it cannot be hurt + this.setTransparency(this.hurtFrames / 5 % 2 == 0 ? 0 : 60); + } + for (Bug bug : this.getTouchingSprites(Bug.class)) { + if (bug.isSquished()) { + continue; + } + boolean inFront = (bug.getX() - this.getX()) * (this.getDirection() > 0 ? 1 : -1) > 0; + if (this.fallSpeed < 0 && this.feet() > bug.getY()) { + // landed on it + bug.squish(); + this.fallSpeed = 6; + this.playSound("impactPunch_medium_004"); + } else if (this.punching && inFront && this.getAnimationFrame() >= 3) { + bug.squish(); + this.playSound("impactPunch_medium_004"); + } else if (this.hurtFrames == 0) { + this.getHurt(bug); + } + } + } + + private void getHurt(Bug bug) { + this.playSound("impactSoft_heavy_000"); + this.punching = false; + this.hurtFrames = 60; + // knocked back, away from the bug + this.changeX(this.getX() < bug.getX() ? -24 : 24); + this.fallSpeed = 5; + this.onGround = false; + if (this.level().loseHeart() == 0) { + this.dead = true; + this.setTransparency(0); + this.level().lose(); + } + } + + private void animate(boolean walking) { + if (this.hurtFrames > 40) { + this.play("hurt", true); + } else if (this.punching) { + this.play("punch", true); + if (this.isAnimationPlayed()) { + this.punching = false; + } + } else if (this.climbing) { + // only move the arms and legs while climbing + if (this.isKeyPressed(KeyCode.UP) || this.isKeyPressed(KeyCode.DOWN)) { + this.play("climb", false); + } + } else if (!this.onGround) { + this.play(this.fallSpeed > 0 ? "jump" : "fall", true); + } else if (this.landFrames > 0) { + this.landFrames -= 1; + this.play("land", true); + } else if (this.isKeyPressed(KeyCode.DOWN)) { + this.play("crouch", false); + } else if (walking) { + this.play("walk", false); + } else { + this.play("idle", false); + } + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/CatPlatformer.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/CatPlatformer.java new file mode 100644 index 0000000..b5351b2 --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/CatPlatformer.java @@ -0,0 +1,159 @@ +import java.util.ArrayList; +import java.util.List; + +import org.openpatch.scratch.Stage; +import org.openpatch.scratch.Text; + +/** + * The Scratch for Java cat in a small platformer: collect the coffee beans, + * jump on the bugs (or punch them) and climb up to the steaming mug. + * + *

+ * Arrow keys walk, climb and crouch, space jumps, X punches. Like the coin + * collector, it only uses assets built into Scratch for Java - the cat, the + * beans, the bugs, the mug and the hearts are on the built-in cat sheet, the + * tiles and the sounds are Kenney's. + */ +public class CatPlatformer extends Stage { + + /** The height the ground reaches up to. */ + public static final double GROUND_TOP = -176; + + /** Where the ladder ends: the top of the platform with the mug. */ + public static final double LADDER_TOP = 112; + + private final List platforms = new ArrayList<>(); + private final Heart[] hearts = new Heart[3]; + + private Text score; + private int beans = 0; + private int totalBeans = 0; + + public CatPlatformer() { + super(800, 480); + this.addBackdrop("background"); + + // The ground, one grass tile at a time. + for (int x = -400; x < 400; x += 64) { + this.add(new Ground(x + 32)); + } + + // A ladder from the ground up to the highest platform, added before the + // platform so it is drawn behind it. + for (double y = GROUND_TOP + 32; y < LADDER_TOP - 32; y += 64) { + this.add(new Ladder(232, y, false)); + } + this.add(new Ladder(232, LADDER_TOP - 32, true)); + + // Three platforms, each from its left edge, its top and a number of tiles. + this.addPlatform(-260, -80, 2); + this.addPlatform(-40, 16, 2); + this.addPlatform(200, LADDER_TOP, 3); + + this.addBean(-330, GROUND_TOP + 40); + this.addBean(-60, GROUND_TOP + 40); + this.addBean(-196, -80 + 40); + this.addBean(24, 16 + 40); + this.addBean(232, -40); + this.addBean(300, LADDER_TOP + 40); + + this.add(new Bug(-170, -20, GROUND_TOP)); + this.add(new Bug(40, 160, GROUND_TOP)); + this.add(new Bug(280, 340, LADDER_TOP)); + + this.add(new Goal(372, LADDER_TOP)); + this.add(new Cat()); + + for (int i = 0; i < this.hearts.length; i++) { + this.hearts[i] = new Heart(-370 + i * 34, 210); + this.add(this.hearts[i]); + } + this.score = new Text(); + this.score.setPosition(-180, 210); + this.score.setTextSize(24); + this.add(this.score); + this.showScore(); + } + + private void addPlatform(double left, double top, int tiles) { + for (int i = 0; i < tiles; i++) { + String costume = i == 0 ? "grassHalf_left" : i == tiles - 1 ? "grassHalf_right" : "grassHalf_mid"; + Platform tile = new Platform(costume, left + 32 + i * 64, top); + this.platforms.add(tile); + this.add(tile); + } + } + + private void addBean(double x, double y) { + this.add(new Bean(x, y)); + this.totalBeans += 1; + } + + private void showScore() { + this.score.showText("Beans: " + this.beans + " / " + this.totalBeans); + } + + /** + * Finds what a falling sprite lands on. Between two frames its feet went + * from feetBefore down to feetAfter; if a platform top (or the ground) lies + * in between, below x, that is where it stands. + * + * @return the height of what it lands on, or NaN while it is still falling + */ + public double landingHeight(double x, double feetBefore, double feetAfter) { + double best = Double.NaN; + for (Platform platform : this.platforms) { + boolean above = x > platform.getLeft() && x < platform.getRight(); + double top = platform.getTop(); + if (above && feetBefore >= top && feetAfter <= top && !(best >= top)) { + best = top; + } + } + if (Double.isNaN(best) && feetAfter <= GROUND_TOP) { + best = GROUND_TOP; + } + return best; + } + + /** Called by a bean when the cat picks it up. */ + public void collectBean() { + this.beans += 1; + this.showScore(); + } + + /** Called by the cat when it gets hurt; returns how many hearts are left. */ + public int loseHeart() { + int left = 0; + for (Heart heart : this.hearts) { + if (heart.isFull()) { + left += 1; + } + } + if (left > 0) { + this.hearts[left - 1].empty(); + left -= 1; + } + return left; + } + + public void win() { + this.playSound("jingles_NES00"); + this.showMessage("You made it! " + this.beans + " / " + this.totalBeans + " beans"); + } + + public void lose() { + this.showMessage("Game over"); + } + + private void showMessage(String message) { + Text text = new Text(); + text.setPosition(0, 60); + text.setTextSize(40); + text.showText(message); + this.add(text); + } + + public static void main(String[] args) { + new CatPlatformer(); + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Goal.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Goal.java new file mode 100644 index 0000000..f5836d9 --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Goal.java @@ -0,0 +1,17 @@ +import org.openpatch.scratch.AnimatedSprite; + +/** The steaming mug at the end of the level. */ +public class Goal extends AnimatedSprite { + + public Goal(double x, double floor) { + this.addAnimation("steam", "goal_mug_%d", 4); + this.setAnimationInterval(150); + this.setX(x); + // the mug stands on the bottom two rows of its 32 pixel costume + this.setY(floor + 14); + } + + public void run() { + this.playAnimation("steam"); + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Ground.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Ground.java new file mode 100644 index 0000000..23365a4 --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Ground.java @@ -0,0 +1,13 @@ +import org.openpatch.scratch.Sprite; + +/** One grass tile of the ground. */ +public class Ground extends Sprite { + + public Ground(double x) { + this.addCostume("grassMid"); + this.setSize(50); + this.setX(x); + // The tile is 64 pixels high at size 50, so its middle sits 32 below its top. + this.setY(CatPlatformer.GROUND_TOP - 32); + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Heart.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Heart.java new file mode 100644 index 0000000..124dbbb --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Heart.java @@ -0,0 +1,20 @@ +import org.openpatch.scratch.Sprite; + +/** One of the cat's lives, shown in the top left corner. */ +public class Heart extends Sprite { + + public Heart(double x, double y) { + this.addCostume("heart_full"); + this.addCostume("heart_empty"); + this.setX(x); + this.setY(y); + } + + public boolean isFull() { + return this.getCurrentCostumeName().equals("heart_full"); + } + + public void empty() { + this.switchCostume("heart_empty"); + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Ladder.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Ladder.java new file mode 100644 index 0000000..82b2702 --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Ladder.java @@ -0,0 +1,12 @@ +import org.openpatch.scratch.Sprite; + +/** One piece of the ladder. Touching it, the cat can climb with the up and down keys. */ +public class Ladder extends Sprite { + + public Ladder(double x, double y, boolean top) { + this.addCostume(top ? "ladderTop" : "ladderMid"); + this.setSize(50); + this.setX(x); + this.setY(y); + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Platform.java b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Platform.java new file mode 100644 index 0000000..ac4f53e --- /dev/null +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-catPlatformer/Platform.java @@ -0,0 +1,28 @@ +import org.openpatch.scratch.Sprite; + +/** One tile of a platform the cat can stand on. */ +public class Platform extends Sprite { + + private final double top; + + public Platform(String costume, double x, double top) { + this.addCostume(costume); + this.setSize(50); + this.top = top; + this.setX(x); + // The grass of a half tile starts at the top of its 64 pixel costume. + this.setY(top - 32); + } + + public double getTop() { + return this.top; + } + + public double getLeft() { + return this.getX() - 32; + } + + public double getRight() { + return this.getX() + 32; + } +} diff --git a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-shader/blobby.frag b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-shader/blobby.frag index f064494..17b80b0 100644 --- a/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-shader/blobby.frag +++ b/core/src/main/resources/org/openpatch/scratch4j/core/templates/demo-shader/blobby.frag @@ -15,17 +15,17 @@ uniform float rate; #define N 16 void main( void ) { - vec2 p = vertTexCoord.st; - vec4 col = texture2D(texture, p).rgba; + vec2 p = vertTexCoord.st; + vec4 col = texture2D(texture, p).rgba; - vec2 v=(gl_FragCoord.xy-(resolution*0.5))/min(resolution.y,resolution.x)*10.0; - float t=time * 0.3,r=2.0; - for (int i=1;i assertThat(method.params()).containsExactly("double steps")); + } + + @Test void projectLocalCatalogWinsOverBundledHelpWithoutANetworkRequest() throws Exception { + Path project = root.resolve("game"); + Files.createDirectories(project.resolve("+libs")); + String metadata = """ + {"schemaVersion":1,"libraryVersion":"4.1.0","methods":[ + {"className":"Sprite","methodName":"legacyMethod","returnType":"void","params":[], + "summary":"Local release help","description":"Local release help","scratchblock":null, + "docsUrl":"https://scratch4j.openpatch.org/reference/Sprite/legacyMethod","paramDocs":[]} + ]} + """; + try (var jar = new JarOutputStream(Files.newOutputStream(project.resolve("+libs/scratch-4.1.0-all.jar")))) { + jar.putNextEntry(new JarEntry("catalogs/api.json")); + jar.write(metadata.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + } + ApiIndex index = ApiIndex.load(); + index.useProject(ScratchProject.open(project)); + assertThat(index.libraryVersion()).isEqualTo("4.1.0"); + assertThat(index.first("legacyMethod")).isPresent(); + assertThat(index.first("clone")).isEmpty(); + } +} diff --git a/core/src/test/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndexContractTest.java b/core/src/test/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndexContractTest.java index 8c51939..d811215 100644 --- a/core/src/test/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndexContractTest.java +++ b/core/src/test/java/org/openpatch/scratch4j/core/assets/BuiltinAssetIndexContractTest.java @@ -8,24 +8,38 @@ /** * Contract test: the IDE reads the library's internal asset registries - * (pinned scratch 5.7.0). If the library moves or renames them, this fails and + * (pinned scratch 5.8.0). If the library moves or renames them, this fails and * the pin must be revisited. */ class BuiltinAssetIndexContractTest { private final BuiltinAssetIndex index = BuiltinAssetIndex.get(); + @Test void sharedCatalogCoordinatesAndAliasesMatchThePinnedRuntimeRegistry() { + for (var entry : org.openpatch.scratch.internal.BuiltinAssets.getEntries()) { + assertThat(index.image(entry.sheet + "/" + entry.name)).hasValueSatisfying(image -> { + assertThat(image.x()).isEqualTo(entry.x); + assertThat(image.y()).isEqualTo(entry.y); + assertThat(image.width()).isEqualTo(entry.width); + assertThat(image.height()).isEqualTo(entry.height); + assertThat(image.direction()).isEqualTo(entry.direction); + assertThat(image.referenceName()).isEqualTo(org.openpatch.scratch.internal.BuiltinAssets.getReferenceName(entry)); + }); + } + assertThat(index.sounds()).containsExactlyElementsOf(org.openpatch.scratch.internal.BuiltinSounds.getNames()); + } + @Test - void shipsTheFourKenneySheets() { + void shipsTheKenneyAndCatSheets() { assertThat(index.images().stream().map(BuiltinImage::sheet).distinct().toList()) - .containsExactlyInAnyOrder("platformer", "jumper", "space_shooter", "tappy_plane"); + .containsExactlyInAnyOrder("platformer", "jumper", "space_shooter", "tappy_plane", "cat"); } @Test void hasTheDocumentedBuiltinImageAndSoundCounts() { - // 841 sprite entries on 4 sheets and 266 sounds, verified against the jar. - assertThat(index.images()).hasSize(841); - assertThat(index.imageNames()).hasSize(841); + // 922 sprite entries on 5 sheets and 266 sounds, verified against the jar. + assertThat(index.images()).hasSize(922); + assertThat(index.imageNames()).hasSize(922); assertThat(index.sounds().stream().distinct().count()).isEqualTo(266); } diff --git a/core/src/test/java/org/openpatch/scratch4j/core/project/BundledTemplatesTest.java b/core/src/test/java/org/openpatch/scratch4j/core/project/BundledTemplatesTest.java index dba57c6..818ee6b 100644 --- a/core/src/test/java/org/openpatch/scratch4j/core/project/BundledTemplatesTest.java +++ b/core/src/test/java/org/openpatch/scratch4j/core/project/BundledTemplatesTest.java @@ -23,7 +23,12 @@ void shipsEveryFinishedTutorialAndDemo() { .containsExactly("getting-started-100", "make-it-walk-100", "catch-the-coins-100", "red-light-green-light-100", "guess-the-number-100", "bouncy-hedgehog-100", "dodge-the-rocks-100"); - assertThat(all.stream().filter(t -> !t.isTutorial())).hasSize(21); + try (var in = BundledTemplates.class.getResourceAsStream("/catalogs/examples.json")) { + var catalog = tools.jackson.databind.json.JsonMapper.builder().build().readTree(in); + long demos = java.util.stream.StreamSupport.stream(catalog.path("examples").spliterator(), false) + .filter(entry -> entry.path("kind").asText().equals("demo")).count(); + assertThat(all.stream().filter(t -> !t.isTutorial())).hasSize((int) demos); + } catch (java.io.IOException e) { throw new java.io.UncheckedIOException(e); } assertThat(all).allSatisfy(t -> assertThat(t.startClass()).isNotBlank()); } @@ -31,7 +36,19 @@ void shipsEveryFinishedTutorialAndDemo() { void everyTemplateCreatesACompilingProjectWithItsStartClass() throws Exception { Path jar = NewProject.classpathJar(org.openpatch.scratch.internal.BuiltinAssets.class); for (BundledTemplates.Template template : BundledTemplates.list()) { - Path root = BundledTemplates.create(template.id(), tmp, template.id(), jar); + boolean available; + try (var archive = new java.util.zip.ZipFile(jar.toFile())) { + available = template.requiredSheets() == null || template.requiredSheets().stream() + .allMatch(sheet -> archive.getEntry("images/" + sheet + ".png") != null); + } + if (!available) { + org.assertj.core.api.Assertions.assertThatIOException() + .isThrownBy(() -> BundledTemplates.create(template.id(), tmp, template.id(), jar)) + .withMessageContaining("Update"); + assertThat(tmp.resolve(template.id())).doesNotExist(); + } + Path root = BundledTemplates.create(template.id(), tmp, template.id(), available ? jar : null); + if (!available) Files.copy(jar, root.resolve("+libs").resolve(jar.getFileName())); ScratchProject project = ScratchProject.open(root); assertThat(project.startStage()).as(template.id()).isEqualTo(template.startClass()); assertThat(root.resolve("+libs").resolve(jar.getFileName())).isRegularFile(); diff --git a/core/src/test/java/org/openpatch/scratch4j/core/project/PortableProjectTest.java b/core/src/test/java/org/openpatch/scratch4j/core/project/PortableProjectTest.java new file mode 100644 index 0000000..cce4ddf --- /dev/null +++ b/core/src/test/java/org/openpatch/scratch4j/core/project/PortableProjectTest.java @@ -0,0 +1,58 @@ +package org.openpatch.scratch4j.core.project; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.Path; +import java.nio.file.Files; +import static org.assertj.core.api.Assertions.*; + +class PortableProjectTest { + @TempDir Path tmp; + + @Test + void workspaceImportPreservesImportsCompactMainMetadataAndBinaryAssets() throws Exception { + Path input = tmp.resolve("game.json"); + Files.writeString(input, """ + {"name":"Game", "settings":{"language":"Java","libraries":["scratch"], + "scratchProject":{"version":1,"lesson":"course","customSetting":{"kept":true}}}, + "modules":[ + {"id":1,"name":"assets","isFolder":true,"text":""}, + {"id":2,"name":"Main.java","text":"import java.time.Instant;\\nvoid main() { System.out.println(\\"ok\\"); }"}, + {"id":3,"parent_folder_id":1,"name":"image.png","text":"data:image/png;base64,AAECA/8="}, + {"id":4,"name":"identity.frag","text":"uniform sampler2D texture;"}]} + """); + Path root = PortableProject.importWorkspace(input, tmp.resolve("projects")); + assertThat(Files.readAllBytes(root.resolve("assets/image.png"))).containsExactly(0, 1, 2, 3, (byte)255); + assertThat(root.resolve("Main.java")).content().contains("import java.time.Instant;", "void main()", "import org.openpatch.scratch.*;"); + assertThat(root.resolve("identity.frag")).hasContent("uniform sampler2D texture;"); + ScratchProject project = ScratchProject.open(root); + assertThat(project.startStage()).isEqualTo("Main"); + assertThat(project.settings().lesson).isEqualTo("course"); + project.settings().save(root); + assertThat(root.resolve(".scratch4j/project.json")).content().contains("customSetting", "kept"); + } + + @Test + void invalidAssetsAndPathsNeverPublishPartialProjects() throws Exception { + for (String name : new String[] { "../escape.java", "CON.java", "C:/Main.java" }) { + Path input = tmp.resolve("invalid.json"); + Files.writeString(input, """ + {"settings":{"language":"Java","libraries":["scratch"]},"modules":[{"name":"%s","text":"class Main {}"}]} + """.formatted(name)); + assertThatIOException().isThrownBy(() -> PortableProject.importWorkspace(input, tmp.resolve("projects"))); + assertThat(tmp.resolve("projects/invalid")).doesNotExist(); + assertThat(tmp.resolve("escape.java")).doesNotExist(); + } + } + + @Test + void nrwImportsKeepCourseListSelectionAndRejectUnadaptedLibraries() throws Exception { + Path input = tmp.resolve("nrw.json"); + Files.writeString(input, """ + {"settings":{"language":"Java","libraries":["scratch","nrw"]},"modules":[{"name":"Welt.java","text":"class Welt extends Stage {}"}]} + """); + Path root = PortableProject.importWorkspace(input, tmp.resolve("projects")); + assertThat(ProjectSettings.load(root).flavour).isEqualTo("nrw"); + assertThat(root.resolve("Welt.java")).content().doesNotContain("import java.util.*;"); + } +} diff --git a/core/src/test/java/org/openpatch/scratch4j/core/project/Sb3ScriptsTest.java b/core/src/test/java/org/openpatch/scratch4j/core/project/Sb3ScriptsTest.java index dcd946a..c678f04 100644 --- a/core/src/test/java/org/openpatch/scratch4j/core/project/Sb3ScriptsTest.java +++ b/core/src/test/java/org/openpatch/scratch4j/core/project/Sb3ScriptsTest.java @@ -131,6 +131,27 @@ private Path sb3(String projectJson) throws Exception { return file; } + @Test + void migrationTasksPreserveBlocksArchiveAndTrackEditedLines() throws Exception { + Path archive = sb3(); + var imported = Sb3Importer.importProject(archive, tmp, "migration", null, null); + assertThat(Files.readAllBytes(imported.root().resolve(".scratch4j/original.sb3"))) + .isEqualTo(Files.readAllBytes(archive)); + var tasks = ScratchMigration.load(imported.root()); + var timed = tasks.stream().filter(t -> t.blockId().equals("f3")).findFirst().orElseThrow(); + assertThat(timed.opcode()).isEqualTo("looks_sayforsecs"); + assertThat(timed.originalBlock()).contains("Hello!", "SECS"); + assertThat(timed.lessonUrl()).endsWith("#timing"); + assertThat(tasks).anyMatch(t -> t.blockId().equals("r3") && t.lessonUrl().endsWith("#unsupported-blocks")); + assertThat(tasks).anyMatch(t -> t.blockId().equals("g1") && t.lessonUrl().endsWith("#shared-state")); + Path source = imported.root().resolve(timed.javaFile()); + String text = Files.readString(source); + assertThat(text.lines().toList().get(timed.line() - 1)).contains(timed.markerId()); + Files.writeString(source, "\n\n" + text); + assertThat(ScratchMigration.load(imported.root()).stream().filter(t -> t.id().equals(timed.id())).findFirst().orElseThrow().line()) + .isEqualTo(timed.line() + 2); + } + @Test void scriptsBecomeEventMethodsRunAndTimersAndCompile() throws Exception { Path jar = NewProject.classpathJar(org.openpatch.scratch.internal.BuiltinAssets.class); diff --git a/core/src/test/java/org/openpatch/scratch4j/core/region/AssetCallsTest.java b/core/src/test/java/org/openpatch/scratch4j/core/region/AssetCallsTest.java index 0572411..1a70dd1 100644 --- a/core/src/test/java/org/openpatch/scratch4j/core/region/AssetCallsTest.java +++ b/core/src/test/java/org/openpatch/scratch4j/core/region/AssetCallsTest.java @@ -60,6 +60,8 @@ void everySpriteOfTheTutorialsAndDemosHasALook() throws Exception { BuiltinAssetIndex builtins = BuiltinAssetIndex.get(); List missing = new ArrayList<>(); for (var template : BundledTemplates.list()) { + if (template.requiredSheets() != null && template.requiredSheets().stream() + .anyMatch(sheet -> builtins.images().stream().noneMatch(image -> image.sheet().equals(sheet)))) continue; Path root = BundledTemplates.create(template.id(), tmp, template.id(), null); ScratchProject project = ScratchProject.open(root); for (String sprite : project.spriteClasses()) { @@ -81,6 +83,13 @@ void everySpriteOfTheTutorialsAndDemosHasALook() throws Exception { continue; // a base class that is never made itself (Figure) } String look = SpriteLook.of(root, sprite); + if (look == null && !inheritsAssets && AssetCalls.of(source).stream() + .filter(c -> !c.method().equals("addSound")) + .allMatch(c -> c.args().stream().noneMatch(String.class::isInstance))) { + // A computed constructor argument, such as the platform's loop-selected + // tile, cannot be resolved without running the student's Java. + continue; + } String image = look == null ? null : look.replaceFirst("#.*$", ""); boolean found = image != null && (Files.isRegularFile(root.resolve(image)) || builtins.image(image).isPresent()); @@ -95,6 +104,15 @@ void everySpriteOfTheTutorialsAndDemosHasALook() throws Exception { .isEqualTo("bee"); } + @Test + void conditionalCostumeUsesTheKnownConstructorArgument() { + List sources = List.of( + "class Ladder extends Sprite { Ladder(boolean top) { addCostume(top ? \"ladderTop\" : \"ladderMid\"); } }", + "class Stage { void build() { new Ladder(false); } }"); + assertThat(SpriteLook.of(sources, "Ladder")).isEqualTo("ladderMid"); + assertThat(SpriteLook.of(List.of(sources.getFirst()), "Ladder")).isNull(); + } + @Test void builtInCostumeBecomesAFileInPlace() { String sprite = """ diff --git a/core/src/test/java/org/openpatch/scratch4j/core/region/DesignerRegionsTest.java b/core/src/test/java/org/openpatch/scratch4j/core/region/DesignerRegionsTest.java index b54b706..5163556 100644 --- a/core/src/test/java/org/openpatch/scratch4j/core/region/DesignerRegionsTest.java +++ b/core/src/test/java/org/openpatch/scratch4j/core/region/DesignerRegionsTest.java @@ -124,11 +124,50 @@ public static void main(String[] args) { + " new Game();"); } + @Test + void windowsSourcesGetRegionsAndKeepTheirLineEndings() { + for (String source : List.of(""" + public class Bean extends AnimatedSprite { + public Bean() { + this.addAnimation("spin", "coffee_bean_%d", 4); + this.setAnimationInterval(120); + this.setX(12); + } + } + """, """ + public class World extends Stage { + public World() { + super(640, 360); + } + } + """, """ + public class Game extends Window { + public Game() { + super(640, 360, "assets"); + this.setStage(new World()); + } + public static void main(String[] args) { + Window.useFullScreen(); + new Game(); + } + } + """)) { + String windows = source.replace("\n", "\r\n"); + String managed = DesignerRegions.ensure(windows); + assertThat(managed).isEqualTo(DesignerRegions.ensure(source).replace("\n", "\r\n")); + assertThat(RegionParser.has(managed, source.contains("extends Window") ? "window" : "setup")) + .isTrue(); + assertThat(DesignerRegions.ensure(managed)).isEqualTo(managed); + } + } + @Test void everyBundledTemplateGetsRegionsAndStillCompiles() throws Exception { Path jar = NewProject.classpathJar(org.openpatch.scratch.internal.BuiltinAssets.class); for (var template : BundledTemplates.list()) { - Path root = BundledTemplates.create(template.id(), tmp, template.id(), jar); + // Region generation and Java compilation also cover examples requiring newer artwork. + // Runtime asset availability is checked separately by BundledTemplatesTest. + Path root = BundledTemplates.create(template.id(), tmp, template.id(), null); ScratchProject project = ScratchProject.open(root); for (Path source : project.javaSources()) { String text = Files.readString(source); diff --git a/docs/ecosystem-plan.md b/docs/ecosystem-plan.md new file mode 100644 index 0000000..8fd1d9c --- /dev/null +++ b/docs/ecosystem-plan.md @@ -0,0 +1,673 @@ +# Scratch for Java ecosystem plan + +Created: 2026-10-07 + +## Goal + +Make Scratch for Java a dependable learning path: start from Scratch or a browser +lesson, continue the same project in Studio, and use ordinary Java tools as the +student progresses. Prioritize compatibility, reproducible validation, project +transfer, and classroom use. + +## Current status (2026-10-07) + +All repository implementation items are complete. Milestones 1.1–1.3, 2, 3 and +5 are implemented and validated; Milestone 4's documentation and offline course +are implemented. Linux packaged validation passes with bundled Java and both +flavors. Two acceptance activities remain open because they require external +evidence: native Windows/macOS execution and a student/teacher classroom pilot. +The OS smoke matrix and pilot protocol are prepared. Neither is recorded as a +passing check. Detailed commands/results follow in Batches 4–7. + +Release progress: the embedded browser build `v2.2.1-hyperbook.26` and Hyperbook +`0.112.0` are published. Hyperbook Informatik is deployed with that version; +its CI passed 10 static checks, compiled 141 pages / 331 Java blocks, and ran +the portable teaching checks. Library `5.8.0` is published to Maven Central +and GitHub, including standard/NRW JARs, shared catalogs, and the offline course +pack. Studio `0.1.0-alpha.7` publication is in progress. + +## Repositories and responsibilities + +| Repository | Responsibility | +| --- | --- | +| `scratch-for-java` | Java API, desktop runtime, reference documentation, shared release metadata | +| `scratch-for-java-ide` | Desktop authoring, visual editors, Scratch import, project/application export | +| `online-ide` | Browser compiler/runtime, embedded exercises, browser implementation of the API | +| `hyperbook-informatik` | Curriculum, lesson projects, checkpoints, teacher resources | + +Keep student projects as ordinary Java source and asset files. Metadata should +remain optional for running them in Java. Use the existing standard/NRW library +flavors and preserve both through all transfer and validation workflows. + +## Investigation baseline + +- Library and Studio currently use Scratch for Java 5.7.0. +- The browser port lacks the new clone lifecycle, variable monitors, and game + pause/speed APIs. Its current clone implementation creates a base Sprite. +- Thirteen generated interactive reference pages call APIs missing from the + browser port. Compilation coverage against desktop Java does not catch this. +- The browser release/playground workflows and curriculum deployment workflow + build without running the existing test suites or lesson checkers. +- The curriculum browser checker defaults to OOP and Fotofilter pages and misses + Spielwerkstatt. It relies on fixed delays and reading the compiler error tab. +- Studio exchanges Java folders/ZIPs; the embedded IDE saves workspace JSON. + Curriculum checkpoints bridge prepared examples, but a supported round trip + for a student's edited project is still needed. +- Several generation and synchronization tools already exist. Studio bundles + seven tutorials and 21 demos; the API index contains 488 entries. The generated + browser parity fixture covers 32 of the desktop probe's 82 values. +- Setup documentation omits Studio and some descriptions of missing editor + functionality have become outdated across the ecosystem. + +Completed baseline validation: 19 Studio core tests, 72 browser runtime unit +tests, all 18 Spielwerkstatt archives, the static Java lesson checker across +158 pages, tutorial template comparison, and parity-fixture freshness check. +The broader browser compiler/interpreter test run stalled and was stopped. +Full interactive lesson execution remains to be validated. + +## Milestone 1 — Compatibility and publishing gates + +Priority: immediate. Start implementation here. + +### 1.1 Reliable compiler and runtime checks + +- [x] Diagnose the stalled browser compiler/interpreter test run and make the + test harness fail clearly on missing compiler output, unexpected errors, + assertion failures, or tests that cannot finish. +- [x] Add a noninteractive browser test command suitable for CI. +- [x] Run browser unit/compiler tests and relevant build checks on pull requests. +- [x] Require passing validation before publishing the embedded IDE/playground. +- [x] Run the Java lesson and desktop checkpoint static checks before publishing. +- [x] Extend the curriculum publishing gate to the remaining static checks and + the full interactive Java page check after resolving existing failures. +- [x] Discover every built page containing an embedded Java IDE, including + Spielwerkstatt, rather than maintaining a short list of project folders. +- [x] Pin the curriculum's Hyperbook and browser-test toolchain and provide a + documented, reproducible local/CI setup. + +Acceptance: a broken runtime test or invalid lesson stops publishing; a newly +added Java project is included automatically; the same checks run locally and +in CI without a personal `/tmp/pw` installation. + +### 1.2 Explicit compatibility contract + +- [x] Publish a machine-readable contract identifying the desktop library + version, browser implementation version/revision, standard/NRW support, and + API availability (implemented, desktop-only, or awaiting browser support). +- [x] Give the browser port an actual compatibility version instead of returning + a descriptive label from `Window.getLibraryVersion()`. +- [x] Generate a human-readable compatibility table from the contract. +- [x] Compile generated interactive reference examples with the browser + compiler. Distinguish code examples from runnable examples when an API is + unavailable, and explain availability clearly. +- [x] Make parity-fixture checks strict in CI when a required checkout is missing. + +Acceptance: a newly documented API cannot silently become a broken embedded +example; intentional desktop limitations are visible; compatibility information +is available to documentation, Studio, and support reports. + +### 1.3 Close the current 5.7.0 browser gaps + +- [x] Port clone behavior: preserve the student's subclass and instance fields, + initialize independent mutable runtime state, register the clone on the + original stage, call `whenStartsAsClone`, and support clone deletion/status. +- [x] Port stage/sprite variable monitors with callable value suppliers. +- [x] Port game pause/resume/step/speed and game-time semantics consistently + across timers, gliding, animation, and timed speech. +- [x] Test behavior in a real browser/WebGL environment as well as unit tests. +- [x] Add matched behavioral probes for clones, timers, broadcasts, and sprite + removal; compare behavior and geometry across runtimes, allowing renderer + differences where appropriate. +- [x] Review the additional overload gaps exposed by the contract, including + Pen/Text constructors, the Shaders copy constructor, Color.hashCode, and the + HtmlColor/Sorting constructors. Keep individual examples runnable only when + their used overloads compile and their demonstrated behavior is supported. + +Acceptance: the current 13 incompatible reference pages compile and their +demonstrated behaviors work in the browser; clone fields and event order match +the library; stepping advances one game frame while preserving input/drawing. + +### 1.4 Packaged applications + +- [ ] Smoke-test starting the packaged Studio and running a first project on + each supported operating system, complementing existing export tests. +- [x] Verify offline creation/running with the bundled runtime and both library + flavors, and verify recovery after an interrupted save. + +## Milestone 2 — Transfer a student's project between environments + +Depends on the compatibility contract and publishing checks. + +- [x] Specify a portable ZIP with ordinary Java files, assets, and optional + metadata: schema version, start class, required library version/flavor, + required browser features, and lesson/checkpoint identity. +- [x] Reuse or extend Studio's optional metadata where practical; support older + projects through adapters rather than requiring a new proprietary source format. +- [x] Add embedded IDE workspace-to-project ZIP export and project ZIP import. +- [x] Add Studio workspace JSON/project import and browser-compatible export. +- [x] Preserve imports, filenames, folders, assets, supported settings, and entry + points. Decode binary assets into real files and record external dependencies. +- [x] Handle unsupported APIs, library flavors, assets, and malformed archives + with useful messages and recoverable behavior. +- [x] Update curriculum checkpoints to use the supported adapters. + +Acceptance: edit a Spielwerkstatt project in the browser, continue it in Studio, +then reopen it in the browser with its code and assets preserved. Test standard +and NRW projects, custom image/audio files, shaders, and compact source files. + + +## Milestone 3 — Shared release metadata and example catalog + +- [x] Publish API, asset, and example catalogs with each library release. +- [x] Use Javadoc/doclet output as the source for API signatures, documentation + identifiers, Scratch block mappings, version requirements, and availability. +- [x] Preserve translated descriptions through stable identifiers and explicit + translation overrides. +- [x] Consume the shared catalogs in Studio, the browser port, and documentation. +- [x] Make Studio help/palette entries reflect the project's chosen library. +- [x] Replace manual source-copy assumptions with versioned artifacts and + freshness checks. Preserve readable generated diffs and offline distribution. + +Acceptance: a library API/example/asset change propagates through consumers or +fails a required check; a project pinned to an older library gets appropriate +help; consumers do not require a particular sibling checkout layout. + + +## Milestone 4 — Coherent onboarding and one classroom course + +- [x] Introduce three entry points: try in the browser, create with Studio, or + use an existing Java IDE. Reuse the same first project and vocabulary. +- [x] Update Setup and Differences to Scratch to describe current ecosystem + features and the frame-based Java execution model accurately. +- [x] Explain Java 17 library compatibility versus Java 25 compact source/Studio + requirements and explain standard versus NRW selection. +- [x] Add German getting-started material linked directly to Hyperbook Informatik. +- [x] Keep published documentation, downloads, and compatibility information + aligned with tested releases. +- [x] Assemble a course pack from the seven introductory tutorials and selected + Spielwerkstatt activities: starters, checkpoints, assets, teacher notes, + assessment criteria, and tested version requirements. +- [x] Support importing the course pack into Studio and working offline. +- [ ] Pilot installation, first run, saving, transfer, and recovery with students + and teachers; record observed friction and prioritize fixes from those results. + +Acceptance: a teacher can prepare the course on a school computer and students +can complete the first task, save/recover work, and continue on another supported +environment. Existing reflection activities remain part of the course. + + +## Milestone 5 — Portable teaching tests and guided Scratch migration + +- [x] Specify reusable behavioral checks with browser and desktop JUnit adapters. +- [x] Use existing headless costume support, seeded randomness, and frame + control for deterministic checks of movement, collisions, score, and clones. +- [x] Make curriculum test projects usable in Studio/desktop workflows instead + of excluding browser-format test classes from desktop validation. +- [x] Present Scratch import warnings as clickable migration tasks connected to + the original block and generated Java. +- [x] Explain changed timing and unsupported blocks with lessons on `run()`, + timers, shared state, and sequencing. Preserve original information. + +Acceptance: students can transfer a project with its behavioral checks and run +them in both environments; importing a project with a waiting/concurrent Scratch +script produces an understandable migration task rather than an unnoticed +behavior change. + + +## Implementation tracking + +Update this section and the checkboxes after each validated implementation batch. +Record exact commands, relevant test counts, remaining failures, and any scope +changes. A skipped or incomplete check is not a passing check. + +### Batch 1 — Publishing gates and lesson discovery + +Status: implemented and locally validated. Milestone 1 remains in progress. + +Implemented in `online-ide`: + +- Shared Java/assembly fixture loading now rejects missing or malformed inputs. + Compilation diagnostics, missing expected errors, runtime exceptions, Java + assertions, unreached assertions, and output mismatches fail explicitly. + Empty expected output is checked and blank output lines are preserved. +- The interpreter has a bounded execution loop and rejects asynchronous waits + in synchronous fixtures. The original stall was caused by a shader constructor + loading files asynchronously in a fixture that still called it desktop-only. + Its signatures remain compiled; two dedicated asynchronous constructor tests + cover successful loading and failure reporting. Real WebGL shader execution + remains part of later browser validation. +- Removed mutation of `context.task.fails`: in Vitest this marks an expected + failure and can invert the result. Seven harness regressions exercise failure + paths, including an endless Java loop. +- `npm run test:ci` runs the whole suite without watch mode, with bounded workers. + Pull-request CI checks the suite and embedded build. Embedded release and + playground deployment jobs now run the same suite before their builds. + +Implemented in `hyperbook-informatik`: + +- Pinned Hyperbook 0.111.3 and Playwright Core 1.62.1 with an npm lockfile, + documented local/CI setup, and local dependency lookup before the legacy + `/tmp/pw` fallback. The orchestration script uses the pinned npm commands. +- Pages publishing now sets up Node, Python, and JDK 25, installs via `npm ci`, + and requires `npm run check:java` before building. +- Java browser discovery walks all generated lesson HTML, including glossary, + AI, and projects. Internal Hyperbook asset templates are excluded. Missing or + empty builds fail explicitly. Two discovery tests cover new project folders, + Spielwerkstatt, class matching, internal assets, and missing builds. +- Browser checks wait for actual compiler-result rows instead of fixed delays, + read error categories independently of interface language, and reject HTTP + failures, pages without Java blocks, and blocks without compiler results. + +Validation performed: + +| Repository | Command | Result | +| --- | --- | --- | +| `online-ide` | `npm run test:ci` | 193 tests in 18 files passed, including 102 Java fixtures, one assembly fixture, seven harness regressions, and two async shader regressions | +| `online-ide` | `node node_modules/typescript/bin/tsc --noEmit` | passed | +| `online-ide` | `npm run build-embedded` | passed; existing bundle-size warning remains | +| `hyperbook-informatik` | `npm ci --cache /tmp/scratch4j-ecosystem-npm-cache` | pinned dependencies installed successfully | +| `hyperbook-informatik` | `PYTHONDONTWRITEBYTECODE=1 npm run check:java` | 158 Java lesson pages, 18 desktop archives, and two discovery tests passed | +| `hyperbook-informatik` | `npm run build` | passed; existing warning in a Python/Turtle exercise remains | +| `hyperbook-informatik` | `node tools/java-lernpfad/pruefe_seiten.js --liste` | discovered 168 pages, including all four Spielwerkstatt pages | +| `hyperbook-informatik` | `HYPERBOOK_URL=http://127.0.0.1:4183 npm run check:java:browser -- projekte/spielwerkstatt/00-werkstatt.html oberstufe/oop/01-grundlagen/01-erste-schritte/01-das-erste-programm.html glossary/boolean.html` | three pages/five blocks passed in Chromium, including a page with an intentionally invalid example | +| Both changed repositories | `git diff --check` | passed | + +Limitations at the end of Batch 1 (superseded where addressed in Batch 2): + +- Full interactive compilation/execution across all 168 discovered pages has + not yet been run. The publishing gate covers Java static checks and desktop + archives; the full browser lesson check is not yet a required CI gate. +- The wider static run (`python3 tools/pruefe-alles.py --schnell --ausfuehrlich`) + passed nine checks and failed `tools/check_permaids.py` on two existing long + spreadsheet lesson permaids. Preserve published links while resolving this: + `mittelstufe-calc-zwischencheck-mittelwerte` (42 characters) and + `mittelstufe-calc-zwischencheck-gruppenrabatt` (44 characters). Browser/build + checks intentionally skipped by `--schnell` are not passing checks. +- GitHub-hosted workflows have been edited and their local commands validated; + remote workflow runs have not been triggered. +- API availability/version contracts, the 5.7.0 browser API gaps, portable + project transfer, packaged application checks, and classroom pilots remain + unchecked in the milestones above. + +Planned next batch at the end of Batch 1: complete the browser lesson publishing coverage, then implement +Milestone 1.2's compatibility contract and generated reference compilation. + +### Batch 2 — Full curriculum gate and compatibility contract + +Status: implemented and locally validated. Milestones 1.1 and 1.2 are complete; +behavioral parity work in Milestone 1.3 remains. + +Implemented in `hyperbook-informatik`: + +- Builds remove stale `.hyperbook/out` output before invoking the pinned CLI. + The earlier 168-page discovery included deleted HTML. A fresh build contains + **141 Java pages and 331 embedded blocks**, including Spielwerkstatt. +- The complete browser run exposed four invalid blocks. Messenger's Brot and + Flaecheninhalt starters now declare the types/constructor used by their main + programs while retaining exercise TODOs. OneMax builds its repeated target + with a character array supported in both Java runtimes. The protected static + field probe uses a subclass and documents the browser package-access limit. +- The two existing long spreadsheet permaids remain valid published links via + an exact allowlist; new permaids retain the 40-character limit and all other + checks still apply. `--statisch` selects the static suite with a normal success + exit code; `--schnell` continues to report intentionally skipped checks. +- Pages publishing requires all ten static checks, a fresh build and compilation + of every embedded Java page. CI installs OpenSCAD, a pinned BOSL2 revision and + the pinned Chromium. `--serve` supplies and closes a temporary local server. +- Local development and publishing commands are documented in both READMEs. + +Implemented in `scratch-for-java` and `online-ide`: + +- The Javadoc doclet emits structured owners and overloads. The generated + versioned contract covers **467 documented API groups**: 398 implemented by + declaration coverage, 48 desktop-only, and 21 awaiting browser support. + It records full desktop parameter/return types, missing browser signatures, + reviewed semantic exceptions, standard/NRW library selection and limitations. +- `Window.getLibraryVersion()` reports **5.7.0-browser.1**, separately from the + desktop library's 5.7.0. The contract is included in browser build artifacts + and documentation assets. A generated compatibility table links each API. +- All **408 reference examples** are compiled by the browser test suite. The 13 + known failures have explicit diagnostic IDs/ranges and reviewed availability + reasons. New diagnostics and resolved exceptions both fail until reviewed. + Both flavors' declaration inventories are checked against current code. +- Documentation renders 18 unavailable examples as readable source, including + compiling clone examples whose lifecycle is incomplete and intentional + desktop operations. The other 390 retain their interactive runners. A page + with missing overloads can still run an example using supported overloads. +- Library CI and documentation publishing require a browser checkout, artifact + freshness, strict parity-fixture checks and reference compilation. Scripts + accept an explicit checkout path. Standalone documentation generation uses + the committed browser snapshot; ordinary browser tests need no sibling repo. + +Validation performed: + +| Repository | Command/check | Result | +| --- | --- | --- | +| `hyperbook-informatik` | `PYTHONDONTWRITEBYTECODE=1 npm run check:static` | ten static checks and two discovery tests passed; local OpenSCAD compilation included | +| `hyperbook-informatik` | `npm run build` | fresh build passed | +| `hyperbook-informatik` | `npm run check:java:browser -- --serve` | all 141 pages / 331 blocks passed in Chromium | +| `hyperbook-informatik` | temporary-server check of a nonexistent page | failed with exit 1 and closed the server/browser | +| `online-ide` | `npm run test:ci` | 604 tests in 19 files passed, including 408 reference compilations | +| `online-ide` | `node node_modules/typescript/bin/tsc --noEmit` | passed | +| `online-ide` | `npm run build-embedded` | passed; published contract matches the canonical artifact | +| `scratch-for-java` | `mvn -q -DskipTests prepare-package` | doclet metadata generation passed | +| `scratch-for-java` | `mvn -q test` | 225 tests passed, zero skipped | +| `scratch-for-java` | `python3 scripts/browser-compatibility.py --check --online-ide ../online-ide` | all generated artifacts current | +| `scratch-for-java` | `python3 scripts/parity-fixture.py --check --strict --online-ide ../online-ide` | current | +| `scratch-for-java` | documentation build using installed Hyperbook 0.111.3 | passed; inspected unavailable pages have source and no Java runner, supported pages retain runners | +| Compatibility/parity scripts | missing checkouts and a deliberately stale temporary fixture | fail as required, including automatic strictness under `CI=true`; read-only check preserves the stale file | +| All three changed repositories | `git diff --check` | passed | + +Limitations and next work: + +- Availability is a documented source/declaration inventory with explicit + semantic exceptions, not proof of complete behavioral or binary parity. + Reference compilation currently targets the standard flavor; existing NRW + runtime fixtures and its separate declaration inventory cover NRW. +- Clone lifecycle, variable monitors and pause/game-time speed remain unported. + Additional constructor/overload gaps are now visible in the contract. +- Curriculum Java checks exercise the IDE bundled with pinned Hyperbook; + reference tests exercise this `online-ide` checkout. Updating browser behavior + will also require propagating its tested artifact into Hyperbook. +- SQL/Web browser checks remain available in `npm run check` but are not yet + Pages publishing gates. Existing bundle-size and Python/Turtle build warnings + remain. GitHub-hosted workflow execution has not been triggered. +- The shared library CI action checks `openpatch/online-ide`'s default branch. + These changes require coordinated merges: the synchronized browser artifacts + must reach that branch before the library freshness gate can pass remotely. + +Next batch: Milestone 1.3, starting with matched clone lifecycle behavior and +tests, then variable monitors and consistent pause/game-time speed semantics. + +No commits, releases, or deployments are implied by this plan. + +### Batch 3 — Browser lifecycle, monitors and game time + +Status: implemented and locally validated; Milestone 1.3 complete. + +- Browser revision **5.7.0-browser.2** preserves subclass fields in clones, + independently copies mutable runtime helpers, registers events and calls the + clone hook synchronously. Deletion detaches before the removal hook and + permits re-adding an original sprite. Broadcast handlers run in caller order. +- Variable suppliers update drawn monitors, including boxed numbers, arrays and + failing suppliers. Removed sprites detach monitors; clones start without them. +- A shared game clock controls pause/resume, single stepping and speed. Timers, + animations, gliding and timed speech use game time. Invalid speeds advance + zero frames in both runtimes. Extra constructor/overload gaps were ported. +- The canonical Java lifecycle probe runs in desktop Java and actual Chromium + WebGL for both flavors, with identical printed behavior and checked geometry. + Browser checks cover paused drawing, supplier failure, seven frame steps, + timer deadlines and speech removal. CI now requires these checks. +- Committed the browser npm lockfile by removing its ignore rule, enabling + reproducible npm ci in a fresh checkout. + +Validation: browser test suite **613 tests / 21 files** passed; desktop library +**226 tests** passed with zero skipped; TypeScript and embedded build passed; +matched desktop lifecycle and both Chromium flavor checks passed. All 408 +reference examples compile with **zero diagnostic exceptions**. The contract +now records 419 implemented and 48 desktop-only groups, with +zero awaiting browser support. Compilation is not certification of every +reference example's full interactive behavior. Cross-platform packaged Studio +checks and the classroom pilot remain separate work. + +The subsequent batches completed project transfer, shared catalogs, the offline +course, portable teaching tests and guided Scratch migration. + + +### Batch 4 — Portable project transfer + +Status: implemented and validated; Milestone 2 complete. + +- Specified schema-1 ZIP/metadata in `scratch-for-java/compatibility/portable-project.md`. + Java sources and image/audio/font/shader assets are ordinary files. Library + flavor/version, entry point, lesson, checkpoint and external dependencies travel + in optional metadata; unknown Studio settings are retained. +- The embedded IDE imports/exports ZIPs through its actual UI and stores an atomic + workspace snapshot for reload recovery. Invalid archives fail before replacement. + Path, CRC, file/count/size and metadata checks have unit coverage. +- Studio imports legacy workspace JSON and portable ZIPs through staging folders, + decodes binary assets, adapts implicit browser imports and compact mains, and + exports browser-compatible ZIPs without bundled JARs/caches. Course-provided NRW + sources are retained without edits and do not conflict with browser NRW classes. +- All 14 Spielwerkstatt checkpoint JSONs include source, assets and metadata; + generated ZIP downloads use the same files. Repeated imports dispose old Monaco + models. Sources, custom image/audio, shaders, fonts and nested/empty folders have + round-trip coverage. Legacy spritesheets and unsupported dependencies produce + explicit messages instead of disappearing. +- A real edited score checkpoint travels browser > Studio > browser: viewport + changes survive, every ordinary source body/existing import is preserved, NRW + source and asset bytes are identical, and four transferred tests pass in Studio. + This scenario is now required in Studio Linux CI. + +Commands/results: + +- `online-ide`: `npm run test:browser` — Chromium lifecycle plus actual embedded + import/edit/cache/reload/export/rejected-archive checks pass. With + `SCRATCH_CHECKPOINT_DIR=../hyperbook-informatik/book/projekte/spielwerkstatt/checkpoints`, + all 14 actual checkpoints also compile through the embedded UI. +- `online-ide`: `node scripts/test-curriculum-transfer.mjs + ../hyperbook-informatik/book/projekte/spielwerkstatt/checkpoints/spielwerkstatt-q-07-testen.json + ../scratch-for-java-ide` — full edited checkpoint round trip and transferred + checks pass (use `SCRATCH_TRANSFER_LIBRARIES` for a different bundled JAR folder). +- `scratch-for-java-ide`: `mvn -q -pl export -am test + -Dtest=ProjectFormatsTest,PortableProjectTest + -Dsurefire.failIfNoSpecifiedTests=false` — malformed archives, metadata/assets, + JSON adapters and unmodified NRW source regression pass. + +### Batch 5 — Shared catalogs and project-aware help + +Status: implemented and validated; Milestone 3 complete. + +- Javadoc/doclet metadata drives **564 public overloads**, parameter/return docs, + Scratch mappings, stable documentation IDs, since tags and availability. + **441 explicit German overrides** use stable overload identities. Browser + comments use these overrides with existing translations as fallback. +- Asset catalog: **922 unique atlas images and 266 sounds**. Duplicate resolution + matches the library registry, including qualified/bare names and geometry. + Browser atlas geometry and Studio asset/help panels consume the shared files. + Chromium checks load all 922 atlas frames and verify dimensions after facing normalization. +- Example catalog: **34 projects** with ordinary files and SHA-256 checksums. + Release ZIPs contain catalogs and examples; library JAR/docs/browser/Studio + contain offline catalog copies. Consumers need no particular sibling layout. +- Studio uses project-local release metadata first, then an older sources-JAR + adapter or actual binary overload filtering. Removed newer overloads disappear + for older projects. Tests cover an older binary and a project-local catalog. + Binary fallback can only retain documented methods it can resolve; a legacy + sources JAR/catalog provides fuller historical descriptions. + Atlas additions use the library registry lookup order automatically. The new + cat atlas/demo were added during validation: 81 frames are synchronized to the + browser; Studio filters assets against its pinned runtime and refuses a demo + whose required atlas is absent, with an actionable library-update message. +- `sync-templates.py --artifact --check` validates the versioned example artifact + and all **29 bundled templates**. Shader whitespace is normalized. Catalog, + template and parity freshness are required CI checks; explicit missing checkouts + fail. Release publishing attaches the catalog/example archive. + +Commands/results: + +- `scratch-for-java`: `mvn -q -DskipTests prepare-package` — doclet metadata generated. +- `python3 scripts/browser-compatibility.py --check --online-ide ../online-ide` — current. +- `python3 scripts/parity-fixture.py --check --strict --online-ide ../online-ide` — current. +- `python3 scripts/release-catalogs.py --check --studio ../scratch-for-java-ide + --online-ide ../online-ide` — all copies current. +- `python3 scripts/release-catalogs.py --archive target/scratch-5.7.0-catalogs.zip` + and Studio `python3 scripts/sync-templates.py --artifact + ../scratch-for-java/target/scratch-5.7.0-catalogs.zip --check` — all 29 templates current. + +### Batch 6 — Onboarding, offline course and packaged Linux validation + +Status: implementation complete; Windows/macOS execution and classroom observations pending. + +- Setup/first tutorial share browser, Studio and existing-Java-IDE entry points. + Documentation explains named Java 17 projects, Java 25 Studio/compact files, + standard/NRW selection, frames, transfer and tested browser revision requirements. + German onboarding links directly to Hyperbook Informatik. New classroom and + migration guides are built with the documentation. +- Deterministic course ZIP: **18 projects / 620 files** (seven tutorial starters, + seven checkpoints and four selected Spielwerkstatt activities), real assets, + original reflection material, tasks, teacher notes, assessment and a pilot form. + A standalone library checkout can build the 14-project tutorial subset. +- Studio validates/imports the entire pack atomically, installs the chosen bundled + library into each folder and permits offline work. All 18 projects compile after + actual import; the score checkpoint's four JUnit tests pass. CI requires this + check; release automation assembles the complete course artifact. +- Packaging now chooses the exact pinned standard JAR and requires the NRW JAR. + The native Linux launcher opens Studio, uses its bundled compiler/runtime/JUnit, + renders first projects with both flavors, runs costume/movement teaching checks, + and verifies save/reopen with a simulated orphaned partial temporary write. + This tests recovery before an atomic rename; it is not an actual killed save process. +- Native smoke checks are wired into Windows, Intel/ARM macOS and Linux packaging. + Linux passes both the host JDK 25 jlink fallback (`SCRATCH4J_BUNDLE_JBR=0`) + and the default JetBrains Runtime 25.0.4.1 package. Windows/macOS have not run here. + +Commands/results: + +- `scratch-for-java`: `python3 scripts/build-course-pack.py --curriculum + ../hyperbook-informatik --output target/scratch-to-java-course.zip` — complete pack generated. +- Studio: `python3 scripts/check-course-pack.py --library ../scratch-for-java + --curriculum ../hyperbook-informatik --libraries + 'target/package/Scratch for Java Studio/lib/app/library'` — all 18 imported + projects compile offline; four score checks pass. +- Studio: `SCRATCH4J_BUNDLE_JBR=0 bash scripts/package-ide.sh app-image`, then + `xvfb-run -a python3 scripts/smoke-packaged.py 'target/package/Scratch for Java Studio'` + — native packaged Linux smoke passes with both flavors. Repeating packaging + with the default settings also passes using bundled JetBrains Runtime 25.0.4.1. +- Library: `PATH=/path/to/hyperbook-informatik/node_modules/.bin:$PATH bash build.sh` + — reference, onboarding, German, classroom and migration documentation plus the + tutorial course download build successfully with pinned Hyperbook 0.111.3. + +### Batch 7 — Portable behavior checks and Scratch migration tasks + +Status: implemented and validated; Milestone 5 complete. + +- Schema-1 check manifest and ordinary Java bodies are documented in + `compatibility/behavioral-checks.md`. The same movement/collision/score/clone/ + seeded-randomness body runs in desktop headless JUnit and real browser WebGL + with both flavors. Existing clock/lifecycle probes validate actual frame control. +- Studio adapts browser class annotations in memory, bundles JUnit console 1.11.4, + compiles all project sources and runs checks in a bounded separate JVM. Run > + Run behavior checks shows results and supports stopping. Source files remain + unchanged; failures and zero tests fail the run. +- Curriculum desktop validation includes its browser-format test class instead + of excluding it. Pinned JUnit is SHA-256 verified/cached for offline use. All + **18 archives** compile, including the test class; **four score tests** execute. + Unchanged source snapshots execute in the browser interpreter as well, with an + incorrect-score negative control. Publishing checks snapshot freshness and execution. +- Scratch imports preserve the complete original .sb3 and original block data. + Clickable migration tasks identify unsupported statements/reporters/events, + timed sequences and concurrent scripts, linking original block IDs to Java + markers/lines and lessons on run(), timers, shared state and sequencing. + Marker locations are recomputed when reopening edited files. Runtime caches + are excluded from transfers; migration/check metadata and original archives survive. + +Final validation summary (local): + +| Repository | Command | Result | +| --- | --- | --- | +| Studio | `SCRATCH4J_ALL_JAR=/path/to/pinned-all.jar mvn -q verify` | 300 normal unit tests pass, zero failures/errors/skips; opt-in integration tests are reported separately | +| Library | `mvn -q test` | 228 tests pass, zero failures/errors/skips | +| Browser | `npm run test:ci` | 631 tests / 24 files pass, including 408 reference examples and portable score checks | +| Browser | `node node_modules/typescript/bin/tsc --noEmit` | passes | +| Browser | `npm run build-embedded` | passes; existing bundle-size warning remains | +| Browser | `npm run test:browser` with checkpoint directory | both WebGL flavors and all 14 checkpoint imports pass | +| Curriculum | `PYTHONDONTWRITEBYTECODE=1 npm run check:static` | ten checks and two discovery tests pass | +| Curriculum | `npm run build` | fresh build passes; existing duplicate Python directive warning remains | +| Curriculum | `npm run check:java:browser -- --serve` | 141 pages / 331 blocks compile in Chromium | +| All four repositories | `git diff --check` | passes | +| All changed workflows | YAML parse | passes | + +The final Studio verification uses the existing pinned all-JAR explicitly to +avoid a Java URL download that failed to resolve github.com. The local cached +artifact is the same 5.7.0 library, and no tests are skipped. + +Validation logs are in `/tmp/scratch-ecosystem-review/`; the complete local course +artifact is `scratch-for-java/target/scratch-to-java-course.zip`. Browser checks +compile/reference-check the current checkout, while curriculum page checks use +pinned Hyperbook's embedded build. Propagating the updated browser into a published +Hyperbook artifact requires coordinated releases. No remote workflows, commits, +releases or deployments were performed. + +## Remaining acceptance evidence + +| Activity | Prepared implementation | Evidence still needed | +| --- | --- | --- | +| Native Windows/macOS packaged execution | Native launcher/offline standard+NRW smoke in the packaging matrix | Successful real runs on the supported OS/architecture combinations | +| Student/teacher classroom pilot | Complete offline pack, tasks, teacher notes, assessment, observation form | Actual installation/first run/save/transfer/recovery observations, then fixes based on those results | + +These remain unchecked because automated Linux repository validation cannot +provide observations from other operating systems or a classroom. All remaining plan work is acceptance evidence and any fixes it reveals. + + +### Final follow-up — Asset additions during validation + +The library gained the cat atlas and CatPlatformer demo while this work was +running. The catalog generator now discovers atlas order from the library +registry and synchronizes PNG bytes, including all 81 cat frames. The browser +loads atlas URLs from Vite's file discovery; geometry, direction and aliases +come from the shared catalog. Freshness checks cover the binary assets too. +Catalog artifacts include PNG/XML/license files as well as examples. + +The example catalog now contains 34 projects and the Studio artifact adapter +produces 29 templates. Required atlas metadata stops Studio creating an example +with a bundled library that lacks its artwork. The pinned released 5.7.0 library +does not yet contain the new cat atlas, so Studio's asset index filters it out +and the new demo reports that the library needs updating. The demo's sources +and designer regions compile; runtime preview coverage applies to templates +available in the pinned library. Releasing the new library and updating the +Studio pin enables the new artwork there. Browser WebGL checks cover all 922 +catalog textures with both flavors. No unrelated cat artwork/source was edited. + +Final rechecks pass with 300 Studio tests, 228 library tests and 631 browser +tests, with no failures/errors/skips. The explicit cached-JAR override avoids a +network-only download in export tests. JetBrains Runtime 25.0.4.1 and the jlink +fallback both passed native Linux smoke. Windows/macOS execution and classroom +observations remain the two external acceptance activities above. + +The final teaching-run UI also cancels work started before Stop or a new run, +so a delayed compilation cannot launch an old test process or reset a newer run. +The final Studio package compilation passes after this guard. + + +## Coordinated release (2026-10-07) + +Release work is authorized and in progress. The existing library 5.7.1 release +was merged into the implementation branch. Shared metadata now targets library +5.8.0 and browser 5.8.0-browser.1. Studio is prepared as 0.1.0-alpha.7 and +Hyperbook will embed browser build 26 in 0.112.0. The curriculum will pin that +Hyperbook release. + +Release verification found and fixed local .class/.ctxt files being included in +example catalogs; clean CI checkouts now use the same source-only file list. +Studio's legacy API index and registry counts are updated for the new library. +Known boolean costume choices resolve in the designer; loop-computed costume +arguments remain unavailable to static previews. Packaged standard/NRW teaching +checks also load a real cat costume. + +Local release validation: 301 Studio tests, 228 library tests, 631 browser tests, +all 18 offline course projects and four course behavior checks pass. The native +Linux package smoke passes with library 5.8.0. The initial browser CI run passes; +final release workflows and cross-platform smoke evidence are still pending. + +The plan is also tracked in Studio at docs/ecosystem-plan.md. + +### Release reliability follow-up + +- Pinned release Maven to 3.9.16 with a verified SHA-512 download. Reproduced + Maven 3.10 adding `maven-metadata-local.xml` to the Central bundle; the entry + is absent with 3.9.16. +- Release retries reuse existing Maven Central components and wait for new + publication to complete. The initial 5.8.0 attempt had already published to + Central before a later download-assembly failure; all 378 published source + and resource files match the current tree. +- Release Javadoc now uses the same Java 25 toolchain as catalog validation. + A clean build passes compatibility/catalog checks and still produces Java 17 + class files (`major version: 61`). +- Curriculum checkpoint generation pins MIME types for Java, PNG, OGG, and text + files. CI passes 10 static checks, 141 pages / 331 embedded Java blocks, and + portable teaching checks. Pages deployment succeeded, and the live checkpoint + and browser contract report 5.8.0 and 5.8.0-browser.1. +- Studio release CI exposed CRLF sources on Windows. Designer region insertion + now preserves Windows line endings; the regression covers sprite, stage, and + window classes. The Linux catalog check now builds Javadoc metadata with the + canonical Maven/Java toolchain before comparing a fresh library checkout. + Local region tests and clean-checkout catalog/template comparisons pass. diff --git a/export/pom.xml b/export/pom.xml index 5fe7771..845f71d 100644 --- a/export/pom.xml +++ b/export/pom.xml @@ -7,7 +7,7 @@ org.openpatch.scratch4j scratch4j-ide - 0.1.0-alpha.6 + 0.1.0-alpha.7 export diff --git a/export/src/main/java/org/openpatch/scratch4j/export/CoursePack.java b/export/src/main/java/org/openpatch/scratch4j/export/CoursePack.java new file mode 100644 index 0000000..0aab191 --- /dev/null +++ b/export/src/main/java/org/openpatch/scratch4j/export/CoursePack.java @@ -0,0 +1,67 @@ +package org.openpatch.scratch4j.export; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Files; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.HashSet; +import org.openpatch.scratch4j.core.project.PortableProject; +import org.openpatch.scratch4j.core.project.ScratchProject; + +/** Validated offline course packs, published only after all project folders are ready. */ +public final class CoursePack { + private CoursePack() {} + public record Imported(Path root, List projects) {} + + public static Imported importZip(Path archive, Path parent, Map libraries) throws IOException { + String name = PortableProject.path(archive.getFileName().toString().replaceFirst("(?i)\\.zip$", "")); + Path root = parent.toAbsolutePath().resolve(name); + if (Files.exists(root)) throw new IOException("Folder already exists: " + root); + Files.createDirectories(parent); + Path staging = Files.createTempDirectory(parent, ".scratch4j-course-"); + try { + Path unpacked = ProjectFormats.importZip(archive, staging); + Path manifestFile = unpacked.resolve(".scratch4j/course.json"); + if (!Files.isRegularFile(manifestFile)) throw new IOException("This ZIP has no course manifest"); + var manifest = tools.jackson.databind.json.JsonMapper.builder().build().readTree(manifestFile.toFile()); + if (manifest.path("schemaVersion").asInt() != 1 || manifest.path("libraryVersion").asText().isBlank() + || !manifest.path("projects").isArray() + || manifest.path("projects").isEmpty() || manifest.path("projects").size() > 100) { + throw new IOException("Unsupported or empty course manifest"); + } + List paths = new ArrayList<>(); + HashSet unique = new HashSet<>(); + for (var entry : manifest.path("projects")) { + String path = PortableProject.path(entry.path("path").asText()); + if (!path.startsWith("projects/") || !unique.add(path.toLowerCase(java.util.Locale.ROOT))) { + throw new IOException("Invalid course project: " + path); + } + for (String previous : paths) if (previous.startsWith(path + "/") || path.startsWith(previous + "/")) { + throw new IOException("Course project folders overlap: " + path); + } + Path directory = unpacked.resolve(path); + if (!Files.isDirectory(directory)) throw new IOException("Missing course project: " + path); + ScratchProject project = ScratchProject.open(directory); + if (project.javaSources().isEmpty()) throw new IOException("Course project contains no Java: " + path); + String flavour = project.settings().flavour; + if (!project.settings().libraryVersion.equals(manifest.path("libraryVersion").asText())) { + throw new IOException("Course library version mismatch: " + path); + } + if (!flavour.equals(entry.path("flavour").asText())) throw new IOException("Course flavor mismatch: " + path); + Path library = libraries.get(flavour); + if (library == null || !Files.isRegularFile(library)) throw new IOException("Prepare the bundled " + flavour + " library before importing"); + Files.createDirectories(project.libsDir()); + Files.copy(library, project.libsDir().resolve(library.getFileName())); + if (!project.settings().libraryVersion.equals(org.openpatch.scratch4j.core.project.LibraryCheck.projectVersion(project))) { + throw new IOException("Bundled library does not match course version " + project.settings().libraryVersion); + } + paths.add(path); + } + Files.move(unpacked, root); + return new Imported(root, paths.stream().map(root::resolve).toList()); + } catch (RuntimeException e) { throw new IOException("Invalid course pack: " + e.getMessage(), e); } + finally { if (Files.exists(staging)) PortableProject.deleteTree(staging); } + } +} diff --git a/export/src/main/java/org/openpatch/scratch4j/export/ProjectFormats.java b/export/src/main/java/org/openpatch/scratch4j/export/ProjectFormats.java index 445b6f8..e564002 100644 --- a/export/src/main/java/org/openpatch/scratch4j/export/ProjectFormats.java +++ b/export/src/main/java/org/openpatch/scratch4j/export/ProjectFormats.java @@ -2,6 +2,8 @@ import org.openpatch.scratch4j.core.compile.CompilerService; import org.openpatch.scratch4j.core.project.ScratchProject; +import org.openpatch.scratch4j.core.project.PortableProject; +import org.openpatch.scratch4j.core.project.ProjectSettings; import org.openpatch.scratch4j.runner.LauncherSource; import java.io.IOException; @@ -80,6 +82,30 @@ public static Path exportShareZip(ScratchProject project, Path zipFile) throws I ProjectFormats::generated); } + /** Source and real assets, with optional metadata understood by the browser. */ + public static Path exportBrowserZip(ScratchProject project, Path zipFile) throws IOException { + ProjectSettings settings = project.settings(); + settings.portableVersion = 1; + settings.startStage = project.startStage(); + Path source = project.sourceOf(settings.startStage); + if (source != null) settings.startFile = project.root().relativize(source).toString().replace('\\', '/'); + if (settings.libraryVersion.isBlank()) settings.libraryVersion = settings.libraryPin.isBlank() + ? org.openpatch.scratch4j.runner.LibraryJarSource.SCRATCH_VERSION : settings.libraryPin.replaceFirst("-nrw$", ""); + settings.sourceEnvironment = "studio"; + if ("nrw".equals(settings.flavour)) { + java.util.Set courseClasses = org.openpatch.scratch4j.core.project.Abiturklassen.present(project); + settings.desktopFiles = project.javaSources().stream() + .filter(path -> courseClasses.contains(path.getFileName().toString().replaceFirst("\\.java$", ""))) + .map(path -> project.root().relativize(path).toString().replace('\\', '/')).toList(); + } + settings.externalDependencies = project.libs().stream().map(path -> path.getFileName().toString()) + .filter(name -> !name.startsWith("scratch-")).toList(); + settings.save(project.root()); + return Zip.zipDirectoryAs(project.root(), project.name() + "/", zipFile, + path -> generated(path) || path.getName(0).toString().equals("+libs") + || path.getName(0).toString().equals(".git") || path.toString().endsWith(".jar")); + } + /** * Unpacks a shared project zip into {@code parentDir}: a zip with one top * folder becomes that folder, a flat zip gets a folder named after it. @@ -95,6 +121,7 @@ public static Path importZip(Path zipFile, Path parentDir) throws IOException { if (name.startsWith(MAC_METADATA + "/")) { continue; // Finder's resource forks, not part of the project } + PortableProject.path(name.endsWith("/") ? name.substring(0, name.length() - 1) : name); int slash = name.indexOf('/'); if (slash < 0) { flat = true; @@ -103,7 +130,7 @@ public static Path importZip(Path zipFile, Path parentDir) throws IOException { } } } - String base = zipFile.getFileName().toString().replaceFirst("(?i)\\.zip$", ""); + String base = PortableProject.path(zipFile.getFileName().toString().replaceFirst("(?i)\\.zip$", "")); Path root; Path target; if (!flat && tops.size() == 1) { @@ -116,18 +143,58 @@ public static Path importZip(Path zipFile, Path parentDir) throws IOException { if (Files.exists(root)) { throw new IOException("Folder already exists: " + root); } - Files.createDirectories(target); - Path macMetadata = target.resolve(MAC_METADATA); - boolean hadMacMetadata = Files.exists(macMetadata); - Zip.unzip(zipFile, target); - if (!hadMacMetadata && Files.isDirectory(macMetadata)) { - try (var files = Files.walk(macMetadata)) { - for (Path file : files.sorted(java.util.Comparator.reverseOrder()).toList()) { - Files.deleteIfExists(file); + Files.createDirectories(parentDir); + Path staging = Files.createTempDirectory(parentDir, ".scratch4j-zip-"); + try { + java.util.Set names = new java.util.HashSet<>(); + long total = 0; + int count = 0; + try (ZipInputStream zip = new ZipInputStream(Files.newInputStream(zipFile))) { + ZipEntry entry; + byte[] buffer = new byte[8192]; + while ((entry = zip.getNextEntry()) != null) { + String name = entry.getName(); + if (name.startsWith(MAC_METADATA + "/")) continue; + String normalized = PortableProject.path(name.endsWith("/") ? name.substring(0, name.length() - 1) : name); + if (!names.add(normalized.toLowerCase(java.util.Locale.ROOT))) throw new IOException("Conflicting project filename: " + name); + Path file = staging.resolve(normalized); + if (entry.isDirectory()) { Files.createDirectories(file); continue; } + if (++count > 2000) throw new IOException("Archive has more than 2,000 files"); + Files.createDirectories(file.getParent()); + long size = 0; + try (OutputStream output = Files.newOutputStream(file)) { + int read; + while ((read = zip.read(buffer)) != -1) { + size += read; + total += read; + if (size > 128L * 1024 * 1024 || total > 256L * 1024 * 1024) throw new IOException("Project archive exceeds size limits"); + output.write(buffer, 0, read); + } + } } } - } - return root; + if (count == 0) throw new IOException("Project archive is empty"); + Path imported = !flat && tops.size() == 1 ? staging.resolve(tops.iterator().next()) : staging; + Path metadataFile = imported.resolve(".scratch4j/project.json"); + if (Files.isRegularFile(metadataFile)) { + ProjectSettings settings; + try { settings = tools.jackson.databind.json.JsonMapper.builder().build().readValue(metadataFile.toFile(), ProjectSettings.class); } + catch (RuntimeException e) { throw new IOException("Invalid project metadata", e); } + if (settings == null || settings.version != 1 || settings.portableVersion != 1 + || !java.util.List.of("standard", "nrw").contains(settings.flavour)) throw new IOException("Unsupported project metadata"); + if ("browser".equals(settings.sourceEnvironment)) { + for (Path source : ScratchProject.open(imported).javaSources()) { + String name = imported.relativize(source).toString().replace('\\', '/'); + if (settings.desktopFiles != null && settings.desktopFiles.contains(name)) continue; + Files.writeString(source, PortableProject.implicitImports(Files.readString(source), settings.flavour)); + } + settings.sourceEnvironment = "studio"; + settings.save(imported); + } + } + Files.move(imported, root); + return root; + } finally { if (Files.exists(staging)) PortableProject.deleteTree(staging); } } /** The folder macOS Finder adds to every zip it creates. */ diff --git a/export/src/main/java/org/openpatch/scratch4j/export/ProjectTransferCli.java b/export/src/main/java/org/openpatch/scratch4j/export/ProjectTransferCli.java new file mode 100644 index 0000000..82278dc --- /dev/null +++ b/export/src/main/java/org/openpatch/scratch4j/export/ProjectTransferCli.java @@ -0,0 +1,44 @@ +package org.openpatch.scratch4j.export; + +import java.nio.file.Path; +import org.openpatch.scratch4j.core.project.PortableProject; +import org.openpatch.scratch4j.core.project.ScratchProject; + +/** Local adapters used by course-pack generation and cross-runtime transfer checks. */ +public final class ProjectTransferCli { + private ProjectTransferCli() {} + public static void main(String[] args) throws Exception { + if (args.length == 5 && args[0].equals("course")) { + var imported = CoursePack.importZip(Path.of(args[1]), Path.of(args[2]), java.util.Map.of( + "standard", Path.of(args[3]), "nrw", Path.of(args[4]))); + for (Path directory : imported.projects()) { + ScratchProject project = ScratchProject.open(directory); + var compiled = new org.openpatch.scratch4j.core.compile.CompilerService().compile( + project.javaSources(), project.libs(), directory.resolve(".scratch4j/build/course-check")); + if (!compiled.success()) throw new java.io.IOException(directory + ": " + compiled.errors()); + if (java.nio.file.Files.isRegularFile(directory.resolve(".scratch4j/checks.json"))) { + var handle = new org.openpatch.scratch4j.runner.TeachingTestRunner().run(project, + new org.openpatch.scratch4j.runner.RunListener() { + public void onStdout(String line) { System.out.println(line); } + public void onStderr(String line) { System.err.println(line); } + }); + try { + if (handle.exitFuture().get(30, java.util.concurrent.TimeUnit.SECONDS) != 0) + throw new java.io.IOException("Behavior check failed: " + directory); + } finally { handle.stop(); } + } + System.out.println("Course project compiled offline: " + directory.getFileName()); + } + System.out.println("Course pack imported and checked: " + imported.projects().size() + " projects"); + return; + } + if (args.length != 3 || !(args[0].equals("import") || args[0].equals("export"))) { + throw new IllegalArgumentException("Usage: ProjectTransferCli import | export | course "); + } + Path input = Path.of(args[1]); + Path output = Path.of(args[2]); + if (args[0].equals("export")) System.out.println(ProjectFormats.exportBrowserZip(ScratchProject.open(input), output)); + else System.out.println(input.toString().toLowerCase(java.util.Locale.ROOT).endsWith(".json") + ? PortableProject.importWorkspace(input, output) : ProjectFormats.importZip(input, output)); + } +} diff --git a/export/src/test/java/org/openpatch/scratch4j/export/CoursePackTest.java b/export/src/test/java/org/openpatch/scratch4j/export/CoursePackTest.java new file mode 100644 index 0000000..2ab30c0 --- /dev/null +++ b/export/src/test/java/org/openpatch/scratch4j/export/CoursePackTest.java @@ -0,0 +1,50 @@ +package org.openpatch.scratch4j.export; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.Path; +import java.nio.file.Files; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import static org.assertj.core.api.Assertions.*; + +class CoursePackTest { + @TempDir Path temporary; + + private Path archive(String projectPath) throws Exception { + Path archive = temporary.resolve("course.zip"); + try (var zip = new ZipOutputStream(Files.newOutputStream(archive))) { + Map files = Map.of( + ".scratch4j/course.json", "{\"schemaVersion\":1,\"libraryVersion\":\"5.7.0\",\"projects\":[{\"path\":\"" + projectPath + "\",\"flavour\":\"nrw\"}]}", + "projects/game/.scratch4j/project.json", "{\"version\":1,\"libraryVersion\":\"5.7.0\",\"flavour\":\"nrw\",\"lesson\":\"course\",\"checkpoint\":\"start\"}", + "projects/game/Main.java", "void main() {}", + "projects/game/assets/custom.frag", "uniform sampler2D texture;"); + for (var entry : files.entrySet()) { + zip.putNextEntry(new ZipEntry(entry.getKey())); + zip.write(entry.getValue().getBytes(java.nio.charset.StandardCharsets.UTF_8)); + zip.closeEntry(); + } + } + return archive; + } + + @Test void importsAnOfflineCourseWithTheChosenBundledFlavorAndAssets() throws Exception { + Path library = temporary.resolve("scratch-5.7.0-nrw-all.jar"); + Files.write(library, new byte[] {1, 2, 3}); + var imported = CoursePack.importZip(archive("projects/game"), temporary.resolve("import"), Map.of("nrw", library)); + assertThat(imported.projects()).hasSize(1); + Path project = imported.projects().get(0); + assertThat(Files.readAllBytes(project.resolve("+libs/" + library.getFileName()))).containsExactly(1, 2, 3); + assertThat(Files.readString(project.resolve("assets/custom.frag"))).contains("sampler2D"); + assertThat(org.openpatch.scratch4j.core.project.ScratchProject.open(project).settings().checkpoint).isEqualTo("start"); + } + + @Test void invalidManifestOrMissingOfflineLibraryPublishesNoPartialPack() throws Exception { + Path parent = temporary.resolve("import"); + assertThatThrownBy(() -> CoursePack.importZip(archive("../outside"), parent, Map.of())).isInstanceOf(java.io.IOException.class); + assertThat(parent.resolve("course")).doesNotExist(); + assertThatThrownBy(() -> CoursePack.importZip(archive("projects/game"), parent, Map.of())).isInstanceOf(java.io.IOException.class); + try (var files = Files.list(parent)) { assertThat(files.toList()).isEmpty(); } + } +} diff --git a/export/src/test/java/org/openpatch/scratch4j/export/ProjectFormatsTest.java b/export/src/test/java/org/openpatch/scratch4j/export/ProjectFormatsTest.java index ead5955..9ea5575 100644 --- a/export/src/test/java/org/openpatch/scratch4j/export/ProjectFormatsTest.java +++ b/export/src/test/java/org/openpatch/scratch4j/export/ProjectFormatsTest.java @@ -98,4 +98,55 @@ void zipRoundTripPreservesFiles() throws IOException { assertThat(unpacked.resolve("MyStage.java")).hasContent("class X {}"); assertThat(unpacked.resolve("assets/sounds/beep.wav")).hasContent("beep"); } + + @Test + void browserZipPreservesSourceAssetsAndMetadataWithoutBundledJars() throws Exception { + ScratchProject project = project(); + project.settings().lesson = "roundtrip"; + Files.write(project.root().resolve("assets/image.png"), new byte[] {0, 1, 2, (byte)255}); + Files.writeString(project.root().resolve("identity.frag"), "shader source"); + Path archive = ProjectFormats.exportBrowserZip(project, tmp.resolve("out/browser.zip")); + assertThat(Zip.readEntry(archive, "game/MyStage.java")).contains("class MyStage"); + assertThat(Zip.readEntry(archive, "game/identity.frag")).isEqualTo("shader source"); + assertThat(Zip.readEntry(archive, "game/.scratch4j/project.json")).contains("roundtrip", "libraryVersion", "startFile"); + try (var zip = new java.util.zip.ZipFile(archive.toFile())) { + assertThat(zip.stream().map(java.util.zip.ZipEntry::getName).toList()).noneMatch(name -> name.endsWith(".jar")); + } + Path imported = ProjectFormats.importZip(archive, tmp.resolve("imported")); + assertThat(Files.readAllBytes(imported.resolve("assets/image.png"))).containsExactly(0, 1, 2, (byte)255); + assertThat(ScratchProject.open(imported).settings().lesson).isEqualTo("roundtrip"); + } + + @Test + void browserImportKeepsCourseProvidedDesktopSourcesUnchanged() throws Exception { + Path archive = tmp.resolve("course.zip"); + String list = "/// School-provided course class\npublic class List {}\n"; + try (var zip = new java.util.zip.ZipOutputStream(Files.newOutputStream(archive))) { + var files = java.util.Map.of("List.java", list, "Main.java", "void main() {}\n", + ".scratch4j/project.json", "{\"version\":1,\"sourceEnvironment\":\"browser\",\"flavour\":\"nrw\",\"desktopFiles\":[\"List.java\"]}"); + for (var entry : files.entrySet()) { + zip.putNextEntry(new java.util.zip.ZipEntry(entry.getKey())); + zip.write(entry.getValue().getBytes(StandardCharsets.UTF_8)); + zip.closeEntry(); + } + } + Path imported = ProjectFormats.importZip(archive, tmp.resolve("import")); + assertThat(Files.readString(imported.resolve("List.java"))).isEqualTo(list); + assertThat(Files.readString(imported.resolve("Main.java"))).contains("import org.openpatch.scratch.*;"); + } + + @Test + void unsafeOrBrokenArchivesNeverPublishPartialProjects() throws Exception { + Path archive = tmp.resolve("bad.zip"); + try (var zip = new java.util.zip.ZipOutputStream(Files.newOutputStream(archive))) { + zip.putNextEntry(new java.util.zip.ZipEntry("game/Main.java")); + zip.write("class Main {}".getBytes(StandardCharsets.UTF_8)); + zip.closeEntry(); + zip.putNextEntry(new java.util.zip.ZipEntry("../escape.java")); + zip.write("bad".getBytes(StandardCharsets.UTF_8)); + } + org.assertj.core.api.Assertions.assertThatIOException().isThrownBy(() -> ProjectFormats.importZip(archive, tmp.resolve("imported"))); + assertThat(tmp.resolve("escape.java")).doesNotExist(); + assertThat(tmp.resolve("imported/game")).doesNotExist(); + } } diff --git a/pom.xml b/pom.xml index 53d209b..fda4fd8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.openpatch.scratch4j scratch4j-ide - 0.1.0-alpha.6 + 0.1.0-alpha.7 pom Scratch for Java Studio @@ -25,7 +25,7 @@ 25 UTF-8 - 5.7.0 + 5.8.0 25 5.11.4 3.27.3 diff --git a/runner/pom.xml b/runner/pom.xml index 927cef0..de4c3d5 100644 --- a/runner/pom.xml +++ b/runner/pom.xml @@ -7,7 +7,7 @@ org.openpatch.scratch4j scratch4j-ide - 0.1.0-alpha.6 + 0.1.0-alpha.7 runner diff --git a/runner/src/main/java/org/openpatch/scratch4j/runner/LauncherSource.java b/runner/src/main/java/org/openpatch/scratch4j/runner/LauncherSource.java index 3389b78..9aad4e2 100644 --- a/runner/src/main/java/org/openpatch/scratch4j/runner/LauncherSource.java +++ b/runner/src/main/java/org/openpatch/scratch4j/runner/LauncherSource.java @@ -64,12 +64,23 @@ public static void main(String[] args) throws Exception { try { main = start.getDeclaredMethod("main", String[].class); } catch (NoSuchMethodException e) { - // no main: instantiate the stage (or window) like BlueJ's new MyStage() + try { + main = start.getDeclaredMethod("main"); + } catch (NoSuchMethodException noMain) { + // no main: instantiate the stage or window + } } - if (main != null && java.lang.reflect.Modifier.isStatic(main.getModifiers())) { + if (main != null) { // the class's own main may prepare things first (fonts, settings) main.setAccessible(true); - main.invoke(null, (Object) new String[0]); + Object receiver = null; + if (!java.lang.reflect.Modifier.isStatic(main.getModifiers())) { + java.lang.reflect.Constructor constructor = start.getDeclaredConstructor(); + constructor.setAccessible(true); + receiver = constructor.newInstance(); + } + if (main.getParameterCount() == 0) main.invoke(receiver); + else main.invoke(receiver, (Object) new String[0]); } else { java.lang.reflect.Constructor constructor = start.getDeclaredConstructor(); constructor.setAccessible(true); diff --git a/runner/src/main/java/org/openpatch/scratch4j/runner/LibraryJarSource.java b/runner/src/main/java/org/openpatch/scratch4j/runner/LibraryJarSource.java index 5414e53..191a56b 100644 --- a/runner/src/main/java/org/openpatch/scratch4j/runner/LibraryJarSource.java +++ b/runner/src/main/java/org/openpatch/scratch4j/runner/LibraryJarSource.java @@ -20,7 +20,7 @@ */ public final class LibraryJarSource { - public static final String SCRATCH_VERSION = "5.7.0"; + public static final String SCRATCH_VERSION = "5.8.0"; private static final String RELEASE_URL = "https://github.com/openpatch/scratch-for-java/releases/download/v" diff --git a/runner/src/main/java/org/openpatch/scratch4j/runner/TeachingTestRunner.java b/runner/src/main/java/org/openpatch/scratch4j/runner/TeachingTestRunner.java new file mode 100644 index 0000000..7b3c46c --- /dev/null +++ b/runner/src/main/java/org/openpatch/scratch4j/runner/TeachingTestRunner.java @@ -0,0 +1,68 @@ +package org.openpatch.scratch4j.runner; + +import java.nio.file.Path; +import java.nio.file.Files; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; +import org.openpatch.scratch4j.core.compile.*; +import org.openpatch.scratch4j.core.project.ScratchProject; + +/** The same student checks run through JUnit in an isolated, bounded desktop JVM. */ +public final class TeachingTestRunner { + public RunHandle run(ScratchProject project, RunListener listener) throws IOException { + List sources = project.javaSources(); + List classes = new ArrayList<>(); + boolean graphics = false; + Path manifest = project.root().resolve(".scratch4j/checks.json"); + if (Files.isRegularFile(manifest)) { + var metadata = tools.jackson.databind.json.JsonMapper.builder().build().readTree(manifest.toFile()); + if (metadata.path("schemaVersion").asInt() != 1) throw new IOException("Unsupported behavioral check schema"); + String mode = metadata.path("mode").asText("logic"); + if (!mode.equals("logic") && !mode.equals("graphics")) throw new IOException("Unknown behavior check mode: " + mode); + graphics = mode.equals("graphics"); + metadata.path("classes").forEach(value -> classes.add(value.asText())); + } else { + for (Path source : sources) { + String text = Files.readString(source); + if (!TeachingTests.hasTests(text)) continue; + var pkg = Pattern.compile("(?m)^\\s*package\\s+([\\w.]+)\\s*;").matcher(text); + classes.add((pkg.find() ? pkg.group(1) + "." : "") + source.getFileName().toString().replaceFirst("\\.java$", "")); + } + } + if (classes.isEmpty() || classes.stream().anyMatch(name -> !name.matches("[\\w$]+(?:\\.[\\w$]+)*"))) { + throw new IOException("No valid @Test classes. Add checks or a .scratch4j/checks.json manifest."); + } + Path out = project.root().resolve(".scratch4j/build/checks"); + List classpath = new ArrayList<>(project.libs()); + classpath.add(project.root()); + CompileResult compiled = new CompilerService().compile(sources, classpath, out); + if (!compiled.success()) { listener.onCompileFailed(compiled); throw new ProjectRunner.CompilationFailedException(compiled); } + classpath.add(0, out); + List command = new ArrayList<>(List.of( + Path.of(System.getProperty("java.home"), "bin", System.getProperty("os.name").toLowerCase().contains("win") ? "java.exe" : "java").toString())); + if (!graphics) command.add("-Djava.awt.headless=true"); + command.addAll(List.of("-jar", TeachingTests.junitJar().toString(), "execute", "--disable-banner", "--fail-if-no-tests", + "--class-path", String.join(java.io.File.pathSeparator, classpath.stream().map(Path::toString).toList()))); + classes.forEach(name -> command.addAll(List.of("--select-class", name))); + Process process = new ProcessBuilder(command).directory(project.root().toFile()).start(); + CompletableFuture exit = new CompletableFuture<>(); + RunHandle handle = new RunHandle(process, exit); + RunHandle.pump(process, listener, exit); + exit.whenComplete((code, error) -> listener.onExit(code == null ? -1 : code)); + return handle; + } + + public static void main(String[] args) throws Exception { + if (args.length != 1) throw new IllegalArgumentException("Usage: TeachingTestRunner "); + RunHandle handle = new TeachingTestRunner().run(ScratchProject.open(Path.of(args[0]).toAbsolutePath()), new RunListener() { + public void onStdout(String line) { System.out.println(line); } + public void onStderr(String line) { System.err.println(line); } + }); + try { System.exit(handle.exitFuture().get(30, TimeUnit.SECONDS)); } + catch (java.util.concurrent.TimeoutException e) { handle.stop(); throw new IOException("Behavior checks exceeded 30 seconds", e); } + } +} diff --git a/runner/src/test/java/org/openpatch/scratch4j/runner/LauncherSourceTest.java b/runner/src/test/java/org/openpatch/scratch4j/runner/LauncherSourceTest.java index 64842e3..5e819ba 100644 --- a/runner/src/test/java/org/openpatch/scratch4j/runner/LauncherSourceTest.java +++ b/runner/src/test/java/org/openpatch/scratch4j/runner/LauncherSourceTest.java @@ -55,4 +55,21 @@ public enum TextureSampling { POINT } assertThat(new CompilerService().compile(List.of(file, window, sampling), List.of(), root.resolve("classes")).success()).isTrue(); } + + @Test + void launcherStartsJava25CompactSourceMain() throws Exception { + Path launcher = root.resolve("Scratch4JLauncher.java"); + Path main = root.resolve("Main.java"); + Path classes = root.resolve("classes"); + Files.writeString(launcher, LauncherSource.generate(new ProjectSettings())); + Files.writeString(main, "void main() { System.out.println(\"COMPACT_STARTED\"); }\n"); + Path jar = LibraryJarSource.allJar(root.resolve("bundled")); + assertThat(new CompilerService().compile(List.of(launcher, main), List.of(jar), classes).success()).isTrue(); + Process process = new ProcessBuilder(Path.of(System.getProperty("java.home"), "bin", "java").toString(), + "-cp", classes + java.io.File.pathSeparator + jar, "Scratch4JLauncher", "Main").redirectErrorStream(true).start(); + assertThat(process.waitFor(20, java.util.concurrent.TimeUnit.SECONDS)).isTrue(); + String output = new String(process.getInputStream().readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + assertThat(process.exitValue()).as(output).isZero(); + assertThat(output).contains("COMPACT_STARTED"); + } } diff --git a/runner/src/test/java/org/openpatch/scratch4j/runner/TeachingTestRunnerTest.java b/runner/src/test/java/org/openpatch/scratch4j/runner/TeachingTestRunnerTest.java new file mode 100644 index 0000000..de47739 --- /dev/null +++ b/runner/src/test/java/org/openpatch/scratch4j/runner/TeachingTestRunnerTest.java @@ -0,0 +1,25 @@ +package org.openpatch.scratch4j.runner; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.Path; +import java.nio.file.Files; +import java.util.concurrent.TimeUnit; +import org.openpatch.scratch4j.core.project.ScratchProject; +import static org.assertj.core.api.Assertions.assertThat; + +class TeachingTestRunnerTest { + @TempDir Path root; + @Test void browserTestClassesRunUnchangedAndFailOnWrongBehavior() throws Exception { + Path source = root.resolve("ScoreTest.java"); + String original = "@Test\nclass ScoreTest {\n @Test void startsAtZero() { assertEquals(0, new Score().points); }\n}\n"; + Files.writeString(source, original); + Files.writeString(root.resolve("Score.java"), "class Score { int points = 0; }"); + var project = ScratchProject.open(root); + var runner = new TeachingTestRunner(); + assertThat(runner.run(project, new RunListener() {}).exitFuture().get(20, TimeUnit.SECONDS)).isZero(); + assertThat(Files.readString(source)).isEqualTo(original); + Files.writeString(root.resolve("Score.java"), "class Score { int points = 1; }"); + assertThat(runner.run(project, new RunListener() {}).exitFuture().get(20, TimeUnit.SECONDS)).isNotZero(); + } +} diff --git a/scripts/check-course-pack.py b/scripts/check-course-pack.py new file mode 100644 index 0000000..14aaac3 --- /dev/null +++ b/scripts/check-course-pack.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +"""Build the complete course artifact, import it, compile all projects and run checks.""" +import argparse +import json +import os +from pathlib import Path +import subprocess +import tempfile +import urllib.request +import zipfile + +ROOT = Path(__file__).resolve().parents[1] +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("--library", type=Path, required=True) +parser.add_argument("--curriculum", type=Path, required=True) +parser.add_argument("--libraries", type=Path, help="Existing standard/NRW all-JAR folder for fully offline validation") +args = parser.parse_args() +version = json.loads((args.library / "catalogs/examples.json").read_text())["libraryVersion"] +cache = args.libraries or ROOT / "runner/target/bundled" +cache.mkdir(parents=True, exist_ok=True) +jars = [] +for flavour in ("", "-nrw"): + name = f"scratch-{version}{flavour}-all.jar" + jar = cache / name + if not jar.is_file(): + if args.libraries: + raise SystemExit("Missing offline course library: " + str(jar)) + with urllib.request.urlopen(f"https://github.com/openpatch/scratch-for-java/releases/download/v{version}/{name}", + timeout=60) as response: + content = response.read(64 * 1024 * 1024) + jar.write_bytes(content) + with zipfile.ZipFile(jar) as archive: + if "org/openpatch/scratch/Stage.class" not in archive.namelist(): + raise SystemExit("Not a Scratch for Java library: " + str(jar)) + jars.append(jar.resolve()) + +classpath = [ROOT / module / "target/classes" for module in ("core", "runner", "export")] +classpath.extend(sorted((ROOT / "app/target/libs").glob("*.jar"))) +if not classpath[-1].is_file(): + raise SystemExit("Build Studio with mvn verify before checking the course pack") +with tempfile.TemporaryDirectory(prefix="scratch-course-check-") as directory: + temporary = Path(directory) + archive = temporary / "scratch-to-java-course.zip" + subprocess.run(["python3", str(args.library / "scripts/build-course-pack.py"), "--curriculum", + str(args.curriculum), "--output", str(archive)], check=True) + subprocess.run(["java", "-cp", os.pathsep.join(map(str, classpath)), + "org.openpatch.scratch4j.export.ProjectTransferCli", "course", str(archive), + str(temporary / "import"), *map(str, jars)], check=True, timeout=180) diff --git a/scripts/package-ide.sh b/scripts/package-ide.sh index e62329b..93dbe78 100755 --- a/scripts/package-ide.sh +++ b/scripts/package-ide.sh @@ -35,8 +35,11 @@ mvn ${MVN_ARGS:-} --batch-mode --no-transfer-progress -DskipTests package # the library jar students' projects carry in +libs ALL_JAR="${2:-${SCRATCH4J_ALL_JAR:-}}" +V="$(grep -o 'SCRATCH_VERSION = "[^" ]*"' runner/src/main/java/org/openpatch/scratch4j/runner/LibraryJarSource.java | cut -d'"' -f2)" if [ -z "$ALL_JAR" ]; then - ALL_JAR="$(ls runner/target/bundled/scratch-*-all.jar 2>/dev/null | head -1 || true)" + if [ -f "runner/target/bundled/scratch-$V-all.jar" ]; then + ALL_JAR="runner/target/bundled/scratch-$V-all.jar" + fi fi if [ -z "$ALL_JAR" ]; then V="$(grep -o 'SCRATCH_VERSION = "[^"]*"' runner/src/main/java/org/openpatch/scratch4j/runner/LibraryJarSource.java | cut -d'"' -f2)" @@ -55,7 +58,7 @@ if [ ! -f "$NRW_JAR" ]; then NRW_JAR="$OUT/$(basename "$ALL_JAR" -all.jar)-nrw-all.jar" V="$(basename "$ALL_JAR" -all.jar | sed 's/^scratch-//')" curl -fsSL -o "$NRW_JAR" "https://github.com/openpatch/scratch-for-java/releases/download/v$V/scratch-$V-nrw-all.jar" \ - || { echo "warning: no NRW jar bundled (offline?)"; rm -f "$NRW_JAR"; } + || { echo "error: packaging requires the NRW jar; provide SCRATCH4J_NRW_ALL_JAR for offline packaging" >&2; exit 1; } fi [ -f "$NRW_JAR" ] && cp "$NRW_JAR" "$INPUT/library/" MAIN_JAR="app-$MAVEN_VERSION.jar" diff --git a/scripts/smoke-packaged.py b/scripts/smoke-packaged.py new file mode 100644 index 0000000..d5a8e00 --- /dev/null +++ b/scripts/smoke-packaged.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +"""Launch the native packaged Studio and verify its disposable offline smoke report.""" +import argparse +import os +from pathlib import Path +import subprocess +import tempfile + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("image", type=Path) +args = parser.parse_args() +image = args.image.resolve() +if os.name == "nt": + launcher = image / "Scratch for Java Studio.exe" +elif (image / "Contents").is_dir(): + launcher = image / "Contents/MacOS/Scratch for Java Studio" +else: + launcher = image / "bin/Scratch for Java Studio" +if not launcher.is_file(): + raise SystemExit("Native launcher missing: " + str(launcher)) +with tempfile.TemporaryDirectory(prefix="scratch-studio-smoke-") as temporary: + result = subprocess.run([str(launcher), "--smoke", temporary], capture_output=True, text=True, timeout=120) + report = Path(temporary) / "report.txt" + message = report.read_text() if report.is_file() else "No packaged smoke report" + if result.returncode or not message.startswith("PASS:"): + raise SystemExit(message + "\n" + result.stdout[-2000:] + result.stderr[-4000:]) + print(message.strip()) diff --git a/scripts/sync-templates.py b/scripts/sync-templates.py index 8e4f124..3baa190 100755 --- a/scripts/sync-templates.py +++ b/scripts/sync-templates.py @@ -11,7 +11,11 @@ flat default-package projects whose asset paths are relative to the project root, which is the runner's working directory. """ +import argparse +import hashlib import json +import tempfile +import zipfile import re import shutil import sys @@ -40,6 +44,8 @@ def copy_tree(src: Path, dst: Path, convert=None): target.parent.mkdir(parents=True, exist_ok=True) if convert and f.suffix == ".java": target.write_text(convert(f.read_text(encoding="utf-8")), encoding="utf-8") + elif f.suffix in {".vert", ".frag", ".glsl"}: + target.write_text("\n".join(line.expandtabs(2).rstrip() for line in f.read_text().splitlines()).rstrip() + "\n") else: shutil.copyfile(f, target) files.append(rel.as_posix()) @@ -85,10 +91,9 @@ def demo_title(name: str): return TITLES.get(name) or re.sub(r"(?<=[a-z])(?=[A-Z])", " ", name).title() -def main(): - if len(sys.argv) != 2: - sys.exit(__doc__) - library = Path(sys.argv[1]).resolve() +def generate(library): + catalog = json.loads((library / "catalogs/examples.json").read_text()) + requirements = {example["id"]: example.get("requiredSheets", []) for example in catalog["examples"]} if OUT.exists(): shutil.rmtree(OUT) OUT.mkdir(parents=True) @@ -100,7 +105,8 @@ def main(): (dst / "package.bluej").write_text("#BlueJ package file\n", encoding="utf-8") files.append("package.bluej") index.append({"id": name, "kind": "tutorial", "title": TITLES.get(name) or tutorial_title(src), - "startClass": start_class(dst), "files": sorted(files)}) + "startClass": start_class(dst), "files": sorted(files), + "requiredSheets": requirements.get("tutorial/" + name, [])}) demos = library / "src/examples/java/demos" for src in sorted(p for p in demos.iterdir() if p.is_dir()): name = src.name @@ -120,10 +126,57 @@ def convert(text, name=name, prefix=prefix): if leftovers: sys.exit(f"unconverted demo paths in {leftovers}") index.append({"id": f"demo-{name}", "kind": "demo", "title": demo_title(name), - "startClass": start_class(dst), "files": sorted(files)}) + "startClass": start_class(dst), "files": sorted(files), + "requiredSheets": requirements.get("demo/" + name, [])}) (OUT / "index.json").write_text(json.dumps(index, indent=2) + "\n", encoding="utf-8") print(f"{len(index)} templates written to {OUT}") +def main(): + global OUT + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("library", nargs="?", type=Path, help="Explicit library checkout (legacy adapter)") + parser.add_argument("--artifact", type=Path, help="Versioned scratch-catalogs.zip; no sibling checkout required") + parser.add_argument("--check", action="store_true", help="Check generated templates without writing") + args = parser.parse_args() + if bool(args.library) == bool(args.artifact): + parser.error("Choose a library checkout or --artifact") + committed = OUT + with tempfile.TemporaryDirectory(prefix="scratch-templates-") as temporary: + temporary = Path(temporary) + library = args.library.resolve() if args.library else temporary / "library" + if args.artifact: + with zipfile.ZipFile(args.artifact) as archive: + catalog = json.loads(archive.read("catalogs/examples.json")) + (library / "catalogs").mkdir(parents=True, exist_ok=True) + (library / "catalogs/examples.json").write_text(json.dumps(catalog)) + if catalog["schemaVersion"] != 1: + raise ValueError("Unsupported example catalog") + for example in catalog["examples"]: + folder = library / example["source"] + if not folder.resolve().is_relative_to(library.resolve()): + raise ValueError("Unsafe example folder") + for entry in example["files"]: + target = folder / entry["path"] + if not target.resolve().is_relative_to(folder.resolve()): + raise ValueError("Unsafe example file") + contents = archive.read("examples/" + example["id"] + "/" + entry["path"]) + if hashlib.sha256(contents).hexdigest() != entry["sha256"]: + raise ValueError("Corrupt example: " + example["id"] + "/" + entry["path"]) + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(contents) + if args.check: + OUT = temporary / "generated" + generate(library) + if args.check: + expected = {p.relative_to(OUT): p.read_bytes() for p in OUT.rglob("*") if p.is_file()} + actual = {p.relative_to(committed): p.read_bytes() for p in committed.rglob("*") if p.is_file()} + stale = sorted(set(expected) ^ set(actual) | {p for p in expected.keys() & actual.keys() if expected[p] != actual[p]}) + if stale: + sys.exit("Stale templates: " + ", ".join(map(str, stale))) + print("Bundled templates are current") + OUT = committed + + if __name__ == "__main__": main() diff --git a/sound/pom.xml b/sound/pom.xml index d8fa76d..207b5d0 100644 --- a/sound/pom.xml +++ b/sound/pom.xml @@ -7,7 +7,7 @@ org.openpatch.scratch4j scratch4j-ide - 0.1.0-alpha.6 + 0.1.0-alpha.7 sound diff --git a/ui/pom.xml b/ui/pom.xml index e5e4700..c58fb8a 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -7,7 +7,7 @@ org.openpatch.scratch4j scratch4j-ide - 0.1.0-alpha.6 + 0.1.0-alpha.7 ui diff --git a/ui/src/main/java/org/openpatch/scratch4j/ui/BlockPalette.java b/ui/src/main/java/org/openpatch/scratch4j/ui/BlockPalette.java index a6ecb16..6682bc0 100644 --- a/ui/src/main/java/org/openpatch/scratch4j/ui/BlockPalette.java +++ b/ui/src/main/java/org/openpatch/scratch4j/ui/BlockPalette.java @@ -167,6 +167,8 @@ private static String categoryLabel(String category) { } } + void refresh() { refill(); } + private void refill() { String query = search.getText() == null ? "" : search.getText().trim().toLowerCase(Locale.ROOT); diff --git a/ui/src/main/java/org/openpatch/scratch4j/ui/PackagedSmoke.java b/ui/src/main/java/org/openpatch/scratch4j/ui/PackagedSmoke.java new file mode 100644 index 0000000..0fd4934 --- /dev/null +++ b/ui/src/main/java/org/openpatch/scratch4j/ui/PackagedSmoke.java @@ -0,0 +1,83 @@ +package org.openpatch.scratch4j.ui; + +import java.nio.file.Path; +import java.nio.file.Files; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import org.openpatch.scratch4j.core.project.*; +import org.openpatch.scratch4j.core.io.AtomicFiles; +import org.openpatch.scratch4j.runner.*; + +/** Starts from the installed native launcher; every project and report is disposable. */ +final class PackagedSmoke { + private PackagedSmoke() {} + static void start(StudioApp app, javafx.stage.Stage stage, Path output) { + if (!stage.isShowing()) throw new IllegalStateException("Studio window did not open"); + Thread worker = new Thread(() -> { + try { + Files.createDirectories(output); + Path bundled = StudioApp.bundledLibraryDir(); + Path java = Path.of(System.getProperty("java.home"), "bin", isWindows() ? "java.exe" : "java"); + for (LibraryFlavour flavour : LibraryFlavour.values()) { + String suffix = flavour == LibraryFlavour.NRW ? "-nrw" : ""; + Path jar = bundled.resolve("scratch-" + LibraryJarSource.SCRATCH_VERSION + suffix + "-all.jar"); + if (!Files.isRegularFile(jar)) throw new IllegalStateException("Missing offline library " + jar); + String name = "first-" + flavour.id(); + NewProject.create(ProjectTemplate.CLASSES_FIRST, output, name, jar); + ScratchProject project = ScratchProject.open(output.resolve(name)); + project.settings().flavour = flavour.id(); + project.settings().save(project.root()); + if (flavour == LibraryFlavour.NRW) { + // The school's own List is not bundled for licensing reasons; no List operation is used here. + Files.writeString(project.root().resolve("List.java"), "public class List {}\n"); + } + List errors = new java.util.concurrent.CopyOnWriteArrayList<>(); + AtomicLong frames = new AtomicLong(-1); + RunHandle handle = new ProjectRunner().run(project, + RunConfig.of(project.startStage()).withJava(java).withControl().withExitAfter(4), + new RunListener() { + public void onStderr(String line) { errors.add(line); } + public void onFrames(long count) { frames.set(count); } + }); + int code; + try { code = handle.exitFuture().get(40, TimeUnit.SECONDS); } + catch (Exception e) { handle.stop(); throw e; } + if (code != 0 || frames.get() <= 0) throw new IllegalStateException(name + " did not draw: " + code + " " + errors); + Path source = project.root().resolve("MyStage.java"); + String saved = Files.readString(source); + AtomicFiles.writeString(source, saved + "\n// saved in packaged Studio\n"); + // Reproduce a writer dying before its atomic rename; old saved code must survive. + Path partial = Files.createTempFile(source.getParent(), source.getFileName().toString(), ".tmp"); + Files.writeString(partial, "interrupted"); + ScratchProject reopened = ScratchProject.open(project.root()); + if (!Files.readString(source).equals(saved + "\n// saved in packaged Studio\n") + || reopened.javaSources().contains(partial)) throw new IllegalStateException("Save recovery failed"); + Files.delete(partial); + Files.writeString(project.root().resolve("ScoreTest.java"), + "import org.openpatch.scratch.*;\n@Test\nclass ScoreTest { @Test void movesWithRealCostume() { " + + "Sprite sprite = new Sprite(\"slime\", \"slimeGreen\"); sprite.changeX(3); " + + "assertEquals(3.0, sprite.getX()); assertTrue(sprite.getWidth() > 0); " + + "Sprite cat = new Sprite(\"cat\", \"cat_idle_1\"); assertTrue(cat.getWidth() > 0); } }\n"); + RunHandle checks = new TeachingTestRunner().run(project, new RunListener() { + public void onStderr(String line) { errors.add(line); } + }); + try { + if (checks.exitFuture().get(30, TimeUnit.SECONDS) != 0) + throw new IllegalStateException("Packaged offline teaching tests failed: " + errors); + } finally { checks.stop(); } + } + Files.writeString(output.resolve("report.txt"), + "PASS: native Studio window; bundled Java/compiler/JUnit; offline standard/NRW project creation and teaching checks; rendered first projects; save/reopen and interrupted temporary write recovery\n"); + javafx.application.Platform.runLater(() -> { stage.close(); javafx.application.Platform.exit(); }); + } catch (Throwable error) { + error.printStackTrace(); + try { Files.writeString(output.resolve("report.txt"), "FAIL: " + error); } catch (Exception ignored) {} + System.exit(1); + } + }, "packaged-studio-smoke"); + worker.setDaemon(false); + worker.start(); + } + private static boolean isWindows() { return System.getProperty("os.name").toLowerCase().contains("win"); } +} diff --git a/ui/src/main/java/org/openpatch/scratch4j/ui/ScratchMigrationPane.java b/ui/src/main/java/org/openpatch/scratch4j/ui/ScratchMigrationPane.java new file mode 100644 index 0000000..323d999 --- /dev/null +++ b/ui/src/main/java/org/openpatch/scratch4j/ui/ScratchMigrationPane.java @@ -0,0 +1,58 @@ +package org.openpatch.scratch4j.ui; + +import javafx.scene.control.*; +import javafx.scene.layout.*; +import java.nio.file.Path; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import org.openpatch.scratch4j.core.project.ScratchMigration.Task; + +/** Clickable review tasks show the generated Java and the preserved Scratch block. */ +final class ScratchMigrationPane extends ListView { + private Path root; + ScratchMigrationPane(BiConsumer open, Consumer browse) { + setPlaceholder(new Label(I18n.t("migration.empty"))); + setCellFactory(view -> new ListCell<>() { + { setPrefWidth(0); } + protected void updateItem(Task task, boolean empty) { + super.updateItem(task, empty); + setText(null); + if (empty || task == null) { setGraphic(null); return; } + Label message = new Label(task.target() + ": " + task.message()); + message.setWrapText(true); + Button java = new Button(task.javaFile() + ":" + task.line()); + java.setOnAction(e -> open.accept(root.resolve(task.javaFile()), (long) task.line())); + Button original = new Button(I18n.t("migration.original")); + original.setOnAction(e -> { + TextArea text = new TextArea(task.originalBlock()); + text.setEditable(false); + text.setWrapText(true); + Dialog dialog = new Dialog<>(); + dialog.setTitle(task.target() + " / " + task.blockId() + " / " + task.opcode()); + dialog.getDialogPane().setContent(text); + dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE); + Theme.style(dialog); + dialog.showAndWait(); + }); + Hyperlink lesson = new Hyperlink(I18n.t("migration.lesson")); + lesson.setOnAction(e -> { + // Imported metadata cannot launch a different URL scheme or domain. + if (task.lessonUrl().startsWith("https://scratch4j.openpatch.org/migration#")) + browse.accept(task.lessonUrl()); + }); + VBox content = new VBox(6, message, new HBox(8, java, original, lesson)); + content.setMinWidth(0); + setGraphic(content); + } + }); + setOnMouseClicked(e -> { + Task task = getSelectionModel().getSelectedItem(); + if (task != null && root != null) open.accept(root.resolve(task.javaFile()), (long) task.line()); + }); + } + void setTasks(Path root, List tasks) { + this.root = root; + getItems().setAll(tasks); + } +} diff --git a/ui/src/main/java/org/openpatch/scratch4j/ui/StudioApp.java b/ui/src/main/java/org/openpatch/scratch4j/ui/StudioApp.java index 3473e9b..037eefc 100644 --- a/ui/src/main/java/org/openpatch/scratch4j/ui/StudioApp.java +++ b/ui/src/main/java/org/openpatch/scratch4j/ui/StudioApp.java @@ -83,6 +83,7 @@ public class StudioApp extends javafx.application.Application { private final ApiIndex apiIndex = ApiIndex.load(); private final ProjectRunner runner = new ProjectRunner(); private final AtomicReference currentRun = new AtomicReference<>(); + private final java.util.concurrent.atomic.AtomicLong teachingRunGeneration = new java.util.concurrent.atomic.AtomicLong(); private final AtomicReference project = new AtomicReference<>(); private final BooleanProperty running = new SimpleBooleanProperty(false); private final ToggleButton debugToggle = new ToggleButton(null, Icons.of("fth-target")); @@ -123,6 +124,7 @@ public class StudioApp extends javafx.application.Application { private TabPane bottomTabs; private Tab problemsTab; private Tab consoleTab; + private ScratchMigrationPane migrationPane; private Tab debuggerTab; private Tab searchTab; private SearchResultsView searchResults; @@ -178,7 +180,10 @@ public void start(Stage stage) { stopProgram(); }); stage.show(); - openFromArguments(); + List startupArgs = getParameters().getRaw(); + if (startupArgs.size() == 2 && startupArgs.get(0).equals("--smoke")) { + PackagedSmoke.start(this, stage, Path.of(startupArgs.get(1)).toAbsolutePath()); + } else openFromArguments(); } // --- layout -------------------------------------------------------------------- @@ -299,7 +304,9 @@ private void buildUi() { : "unpin " + owner + " " + field)); variablesTab = new Tab(I18n.t("variables.title"), variablesView); variablesTab.setGraphic(Icons.of("fth-eye")); - bottomTabs = new TabPane(problemsTab, consoleTab, variablesTab, searchTab, debuggerTab); + migrationPane = new ScratchMigrationPane((file, line) -> editor.openAt(file, line), this::browse); + Tab migrationTab = new Tab(I18n.t("migration.title"), migrationPane); + bottomTabs = new TabPane(problemsTab, consoleTab, variablesTab, searchTab, debuggerTab, migrationTab); bottomTabs.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); bottomTabs.getStyleClass().add("bottom-tabs"); bottomTabs.setMinHeight(90); @@ -588,7 +595,8 @@ private MenuBar menuBar() { }), item("menu.run.step", "fth-skip-forward", new KeyCodeCombination(KeyCode.F8), this::stepFrame), - item("menu.run.check", "fth-check-circle", null, this::checkProject)); + item("menu.run.check", "fth-check-circle", null, this::checkProject), + item("menu.run.tests", "fth-check-square", null, this::runTeachingTests)); Menu exportMenu = new Menu(I18n.t("menu.export")); exportMenu.getItems().addAll( @@ -886,6 +894,8 @@ private void open(ScratchProject p) { saveAll(); stopProgram(); project.set(p); + try { apiIndex.useProject(p); palette.refresh(); } + catch (IOException e) { console.err(e.getMessage()); } Prefs.addRecentProject(p.root()); stage.setTitle(p.name() + " — Scratch for Java Studio"); projectTitle.setText(p.name()); @@ -943,6 +953,8 @@ private void open(ScratchProject p) { updatePaletteContext(); console.clear(); problems.setProblems(List.of()); + try { migrationPane.setTasks(p.root(), org.openpatch.scratch4j.core.project.ScratchMigration.load(p.root())); } + catch (IOException e) { migrationPane.setTasks(p.root(), List.of()); console.err(e.getMessage()); } setStatus(I18n.t("status.opened", p.name())); try { String start = p.firstStage(); @@ -2469,6 +2481,46 @@ private DiagnosticsExplanations.Language explanationLanguage() { // --- run ------------------------------------------------------------------------- + private void runTeachingTests() { + ScratchProject p = project.get(); + if (p == null) return; + saveAll(); + stopProgram(); + long generation = teachingRunGeneration.incrementAndGet(); + running.set(true); + bottomTabs.getSelectionModel().select(consoleTab); + Thread.ofVirtual().start(() -> { + RunHandle handle = null; + try { + handle = new org.openpatch.scratch4j.runner.TeachingTestRunner().run(p, new RunListener() { + public void onStdout(String line) { Platform.runLater(() -> console.info(line)); } + public void onStderr(String line) { Platform.runLater(() -> console.err(line)); } + }); + if (teachingRunGeneration.get() != generation || !currentRun.compareAndSet(null, handle)) { + handle.stop(); + return; + } + if (teachingRunGeneration.get() != generation) { + currentRun.compareAndSet(handle, null); + handle.stop(); + return; + } + int code = handle.exitFuture().get(30, java.util.concurrent.TimeUnit.SECONDS); + Platform.runLater(() -> { + if (teachingRunGeneration.get() == generation) setStatus(I18n.t("tests.result", code)); + }); + } catch (Exception error) { + if (handle != null) handle.stop(); + Platform.runLater(() -> console.err(error.getMessage())); + } finally { + currentRun.compareAndSet(handle, null); + Platform.runLater(() -> { + if (teachingRunGeneration.get() == generation) running.set(false); + }); + } + }); + } + private void runProgram() { ScratchProject p = project.get(); if (p == null) { @@ -2856,6 +2908,7 @@ private void showCrash(org.openpatch.scratch4j.core.lint.RuntimeErrors.Explanati } private void stopProgram() { + teachingRunGeneration.incrementAndGet(); endDebugSession(); closeLiveSession(liveSession); RunHandle handle = currentRun.getAndSet(null); @@ -3059,7 +3112,9 @@ private Menu projectMenu() { new SeparatorMenuItem(), library, new SeparatorMenuItem(), item("menu.project.sharezip", "fth-share-2", null, this::shareZip), + item("menu.project.browserzip", "fth-share-2", null, this::shareBrowserZip), item("menu.project.openzip", "fth-archive", null, this::openSharedZip), + item("menu.project.course", "fth-book-open", null, this::importCoursePack), new SeparatorMenuItem(), item("menu.project.snippet.import", "fth-clipboard", null, this::importSnippet), item("menu.project.snippet.export", "fth-copy", null, this::exportCompact)); @@ -3155,6 +3210,7 @@ private void offerLibrarySwap(ScratchProject p, LibraryCheck.Status status, Platform.runLater(() -> { fileTree.reload(); setStatus(I18n.t("library.installed", jar.getFileName())); + try { apiIndex.useProject(p); palette.refresh(); } catch (IOException e) { console.err(e.getMessage()); } scheduleCheck(); }); } catch (IOException e) { @@ -3264,6 +3320,7 @@ private void checkLibraryUpdate() { Platform.runLater(() -> { fileTree.reload(); setStatus(I18n.t("library.installed", jar.getFileName())); + try { apiIndex.useProject(p); palette.refresh(); } catch (IOException e) { console.err(e.getMessage()); } scheduleCheck(); }); } catch (IOException e) { @@ -3296,10 +3353,35 @@ private void shareZip() { } } + private void importCoursePack() { + javafx.stage.FileChooser chooser = new javafx.stage.FileChooser(); + chooser.setTitle(I18n.t("menu.project.course")); + chooser.getExtensionFilters().add(new javafx.stage.FileChooser.ExtensionFilter("Course pack ZIP", "*.zip")); + File archive = chooser.showOpenDialog(stage); + if (archive == null) return; + DirectoryChooser parent = new DirectoryChooser(); + parent.setTitle(I18n.t("sb3.target")); + File folder = parent.showDialog(stage); + if (folder == null) return; + try { + var libraries = new java.util.HashMap(); + for (LibraryFlavour flavour : LibraryFlavour.values()) { + libraries.put(flavour.id(), LibraryJarSource.jar(flavour, libraryDirFor(flavour))); + } + var imported = org.openpatch.scratch4j.export.CoursePack.importZip(archive.toPath(), folder.toPath(), libraries); + var names = imported.projects().stream().map(path -> imported.root().relativize(path).toString()).toList(); + javafx.scene.control.ChoiceDialog choose = new javafx.scene.control.ChoiceDialog<>(names.get(0), names); + choose.setTitle(I18n.t("menu.project.course")); + choose.setHeaderText(I18n.t("course.choose")); + Theme.style(choose); + choose.showAndWait().ifPresent(name -> openProjectAt(imported.root().resolve(name))); + } catch (IOException e) { alert(e.getMessage()); } + } + private void openSharedZip() { javafx.stage.FileChooser chooser = new javafx.stage.FileChooser(); chooser.setTitle(I18n.t("menu.project.openzip")); - chooser.getExtensionFilters().add(new javafx.stage.FileChooser.ExtensionFilter("Zip", "*.zip")); + chooser.getExtensionFilters().add(new javafx.stage.FileChooser.ExtensionFilter("Project ZIP / workspace JSON", "*.zip", "*.json")); File zip = chooser.showOpenDialog(stage); if (zip == null) return; javafx.stage.DirectoryChooser parent = new javafx.stage.DirectoryChooser(); @@ -3308,13 +3390,32 @@ private void openSharedZip() { File folder = parent.showDialog(stage); if (folder == null) return; try { - openProjectAt(org.openpatch.scratch4j.export.ProjectFormats.importZip(zip.toPath(), - folder.toPath())); + Path imported = zip.getName().toLowerCase(java.util.Locale.ROOT).endsWith(".json") + ? org.openpatch.scratch4j.core.project.PortableProject.importWorkspace(zip.toPath(), folder.toPath()) + : org.openpatch.scratch4j.export.ProjectFormats.importZip(zip.toPath(), folder.toPath()); + openProjectAt(imported); + ScratchProject opened = project.get(); + if (opened != null && "nrw".equals(opened.settings().flavour) + && !org.openpatch.scratch4j.core.project.Abiturklassen.present(opened).contains("List")) { + alert(I18n.t("project.transfer.nrw")); + } } catch (IOException e) { alert(e.getMessage()); } } + private void shareBrowserZip() { + ScratchProject p = project.get(); + if (p == null) return; + saveAll(); + try { + Path zip = org.openpatch.scratch4j.export.ProjectFormats.exportBrowserZip(p, + p.root().resolve("export").resolve(p.name() + "-browser.zip")); + fileTree.reload(); + setStatus(I18n.t("export.done", zip)); + } catch (IOException e) { alert(I18n.t("export.failed", e.getMessage())); } + } + /** Online IDE / docs example: paste it, get normal classes. */ private void importSnippet() { ScratchProject p = project.get(); diff --git a/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_de.properties b/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_de.properties index ac59fe1..66a224f 100644 --- a/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_de.properties +++ b/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_de.properties @@ -505,7 +505,9 @@ library.update.found=Scratch for Java {0} ist verf\u00fcgbar (dieses Projekt nut library.update.get=Herunterladen library.update.offline=GitHub war nicht erreichbar, um nach einer neueren Bibliothek zu suchen. menu.project.sharezip=Als .zip teilen -menu.project.openzip=Geteilte .zip \u00f6ffnen... +menu.project.openzip=Projekt-ZIP / Workspace-JSON \u00f6ffnen... +project.transfer.nrw=Dieses NRW-Projekt benötigt List.java aus den Abiturklassen Ihres Kurses. Ergänzen Sie die Datei vor dem Start über Projekt > Abiturklassen; der Browser stellt diese Klasse automatisch bereit. +menu.project.browserzip=Projekt-ZIP f\u00fcr den Browser exportieren menu.project.snippet.import=Code-Schnipsel einf\u00fcgen (Online-IDE / Doku)... menu.project.snippet.export=Als eine kompakte Datei kopieren (Online-IDE) snippet.hint=F\u00fcge ein Beispiel mit void main() und seinen Klassen ein. Jede Klasse bekommt eine eigene Datei mit den n\u00f6tigen Importen. @@ -859,3 +861,14 @@ abitur.failed=Die Abiturklassen konnten nicht importiert werden: {0}\n\nLade die abitur.driver.downloading=Lade den SQLite-JDBC-Treiber herunter... abitur.driver.added={0} zu +libs hinzugef\u00fcgt (die Datenbankklassen brauchen ihn zum Ausf\u00fchren) abitur.driver.failed=Der SQLite-JDBC-Treiber konnte nicht heruntergeladen werden ({0}). Die Datenbankklassen lassen sich \u00fcbersetzen, brauchen zum Ausf\u00fchren aber sqlite-jdbc in +libs. + +menu.project.course=Kurspaket importieren... +course.choose=Wähle ein Projekt. Alle Projekte sind jetzt offline im Kursordner verfügbar. + +menu.run.tests=Verhaltenstests ausführen +tests.result=Verhaltenstests: Rückgabewert {0} + +migration.title=Scratch-Übernahme +migration.empty=Keine Scratch-Blöcke zu prüfen. +migration.original=Originalblock +migration.lesson=Erklärung diff --git a/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_en.properties b/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_en.properties index 800f3cd..501837d 100644 --- a/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_en.properties +++ b/ui/src/main/resources/org/openpatch/scratch4j/ui/messages_en.properties @@ -505,7 +505,9 @@ library.update.found=Scratch for Java {0} is available (this project uses {1}). library.update.get=Download library.update.offline=Could not reach GitHub to look for a newer library. menu.project.sharezip=Share as .zip -menu.project.openzip=Open a shared .zip... +menu.project.openzip=Open project ZIP / workspace JSON... +project.transfer.nrw=This NRW project needs List.java from your course's Abiturklassen. Add it using Project > Abiturklassen before running; the browser supplies this class automatically. +menu.project.browserzip=Export project ZIP for the browser menu.project.snippet.import=Paste a code snippet (Online IDE / docs)... menu.project.snippet.export=Copy as one compact file (Online IDE) snippet.hint=Paste an example with void main() and its classes. Each class gets its own file with the imports it needs. @@ -859,3 +861,14 @@ abitur.failed=The Abiturklassen could not be imported: {0}\n\nDownload the zip y abitur.driver.downloading=Downloading the SQLite JDBC driver... abitur.driver.added=Added {0} to +libs (the database classes need it to run) abitur.driver.failed=The SQLite JDBC driver could not be downloaded ({0}). The database classes compile, but need sqlite-jdbc in +libs to run. + +menu.project.course=Import course pack... +course.choose=Choose a project to open. All projects are now available offline in the course folder. + +menu.run.tests=Run behavior checks +tests.result=Behavior checks: exit code {0} + +migration.title=Scratch migration +migration.empty=No Scratch blocks need review. +migration.original=Original block +migration.lesson=Explanation