Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/meyfa/scratchlib

Java library for working with Scratch/BYOB stage files
https://github.com/meyfa/scratchlib

binary byob generator java java-library library reader scratch scratch-extension

Last synced: 10 days ago
JSON representation

Java library for working with Scratch/BYOB stage files

Awesome Lists containing this project

README

        

# scratchlib

[![Build Status](https://travis-ci.com/meyfa/scratchlib.svg?branch=master)](https://travis-ci.com/meyfa/scratchlib)
[![Test Coverage](https://api.codeclimate.com/v1/badges/2906ba15e9327520e462/test_coverage)](https://codeclimate.com/github/meyfa/scratchlib/test_coverage)
[![Maintainability](https://api.codeclimate.com/v1/badges/2906ba15e9327520e462/maintainability)](https://codeclimate.com/github/meyfa/scratchlib/maintainability)

This is a Java library for working with
[Scratch](https://scratch.mit.edu/scratch_1.4/) (up to v1.4) and
[BYOB](http://snap.berkeley.edu/old-byob.html) project files. You can load
projects created in those applications or create them with code, change all
objects they contain, and also write them out to files.

## Loading a project

```java
ScratchReader r = new ScratchReader();
try {
ScratchProject scratchProject = r.read(new File("project.sb"));
ScratchProject byobProject = r.read(new File("project.ypr"));
} catch (IOException e) {
e.printStackTrace();
}
```

## Creating a project

```java
ScratchProject project = new ScratchProject(ScratchVersion.SCRATCH14);
// project is a fully working, albeit empty, Scratch project
// the following actions are examples of what's possible

// set metadata
project.setInfoProperty(ScratchProject.INFO_COMMENT, new ScratchObjectUtf8("My awesome project!"));

// get the stage
ScratchObjectStageMorph stage = project.getStage();

// add a sprite
ScratchObjectSpriteMorph sprite = new ScratchObjectSpriteMorph();
stage.addSprite(sprite);

// ...
```

## Saving a project

```java
ScratchProject project = new ScratchProject(ScratchVersion.SCRATCH14);
// ... or load it from somewhere

ScratchWriter w = new ScratchWriter(new File("project.sb"));
try {
w.write(project);
} catch (IOException e) {
e.printStackTrace();
}
```

## Image to form conversion

Sprite costumes and stage backgrounds require images to be given as "forms"
(either `ScratchObjectForm` or `ScratchObjectColorForm`). Conversion to those
formats is rather involved, which is why `ScratchFormEncoder` exists:

```java
BufferedImage img = /* obtain source image here */;
// convert to form
ScratchObjectForm form = ScratchFormEncoder.encode(img);

// create media object
ScratchObjectImageMedia cos = new ScratchObjectImageMedia();
cos.setField(ScratchObjectMedia.FIELD_MEDIA_NAME, new ScratchObjectUtf8("costume name"));
cos.setField(ScratchObjectImageMedia.FIELD_FORM, form);

// use media object - add to sprite, for example
ScratchObjectSpriteMorph sprite = new ScratchObjectSpriteMorph();
sprite.setField(ScratchObjectSpriteMorph.FIELD_MEDIA, new ScratchObjectOrderedCollection(Arrays.asList(cos)));
sprite.setField(ScratchObjectSpriteMorph.FIELD_COSTUME, cos);
```

## Classes

### Inline: Constants

| ID | Package | Constant Name |
| --: | ------------------------- | -------------------------- |
| 1 | scratchlib.objects | ScratchObject.NIL |
| 2 | scratchlib.objects.inline | ScratchObjectBoolean.TRUE |
| 3 | scratchlib.objects.inline | ScratchObjectBoolean.FALSE |

### Inline: Numbers

Package: `scratchlib.objects.inline`

Use the general `ScratchObjectAbstractNumber` for access, the other classes for
creation.

| ID | Class Name | Use for |
| --: | ----------------------------------- | ---------------------------- |
| 4 | `ScratchObjectSmallInteger` | `int` values |
| 5 | `ScratchObjectSmallInteger16` | `short` values |
| 6 | `ScratchObjectLargePositiveInteger` | positive `BigDecimal` values |
| 7 | `ScratchObjectLargeNegativeInteger` | negative `BigDecimal` values |
| 8 | `ScratchObjectFloat` | `double` values |

----

### Fixed format: data

Package: `scratchlib.objects.fixed.data`

For the string classes below, use the general `ScratchObjectAbstractString` for
access, the other classes for creation.

| ID | Class Name | Use for |
| --: | -------------------------- | ------------------------------ |
| 9 | `ScratchObjectString` | ASCII strings |
| 10 | `ScratchObjectSymbol` | ASCII strings fixed by Scratch |
| 11 | `ScratchObjectByteArray` | `byte[]` data |
| 12 | `ScratchObjectSoundBuffer` | sound data |
| 13 | `ScratchObjectBitmap` | image data |
| 14 | `ScratchObjectUtf8` | UTF-8 strings |

### Fixed format: collections

Package: `scratchlib.objects.fixed.collections`

For array, ordered collection, set and identity set, use the general
`ScratchObjectAbstractCollection` for access, the other classes for creation.
For dictionary and identity dictionary, use `ScratchObjectAbstractDictionary`.

| ID | Class Name | Use for |
| --: | --------------------------------- | -------------------------------- |
| 20 | `ScratchObjectArray` | lists of objects |
| 21 | `ScratchObjectOrderedCollection` | lists of objects |
| 22 | `ScratchObjectSet` | lists of objects |
| 23 | `ScratchObjectIdentitySet` | lists of objects |
| 24 | `ScratchObjectDictionary` | maps of objects to other objects |
| 25 | `ScratchObjectIdentityDictionary` | maps of objects to other objects |

### Fixed format: colors

Package: `scratchlib.objects.fixed.colors`

| ID | Class Name | Use for |
| --: | ------------------------------- | -------------------------------- |
| 30 | `ScratchObjectColor` | colors without transparency |
| 31 | `ScratchObjectTranslucentColor` | colors with transparency (alpha) |

### Fixed format: dimensions

Package: `scratchlib.objects.fixed.dimensions`

| ID | Class Name | Use for |
| --: | ------------------------ | ----------------------------------- |
| 32 | `ScratchObjectPoint` | 2D points (x, y) |
| 33 | `ScratchObjectRectangle` | 2D rectangles (x, y, width, height) |

### Fixed format: forms

Package: `scratchlib.objects.fixed.forms`

| ID | Class Name | Use for |
| --: | ------------------------ | ------------------------ |
| 34 | `ScratchObjectForm` | images |
| 35 | `ScratchObjectColorForm` | images with lookup table |

----

### User-class: morphs

Package: `scratchlib.objects.user.morphs`

| ID | Class Name | Description |
| --: | -------------------------- | -------------------------------------- |
| 100 | `ScratchObjectMorph` | base class for all morphs |
| 124 | `ScratchObjectSpriteMorph` | sprites |
| 125 | `ScratchObjectStageMorph` | the stage |
| 125 | `ScratchObjectListMorph` | user-created list displayable on stage |

### User-class: media

Package: `scratchlib.objects.user.media`

| ID | Class Name | Description |
| --: | --------------------------- | -------------------------- |
| 109 | `ScratchObjectSampledSound` | a sound split into samples |
| 162 | `ScratchObjectImageMedia` | media container for images |
| 164 | `ScratchObjectSoundMedia` | media container for sounds |

### User-class: UI

Package: `scratchlib.objects.user.morphs.ui`

| ID | Class Name | Description |
| --: | --------------------------------------- | ---------------------------- |
| 104 | `ScratchObjectAlignmentMorph` | lays out other morphs stage |
| 105 | `ScratchObjectStringMorph` | fixed string display |
| 106 | `ScratchObjectUpdatingStringMorph` | dynamic string display |
| 107 | `ScratchObjectSimpleSliderMorph` | slider |
| 110 | `ScratchObjectImageMorph` | slider knob |
| 155 | `ScratchObjectWatcherMorph` | variable watcher |
| 173 | `ScratchObjectWatcherReadoutFrameMorph` | variable watcher readout |
| 174 | `ScratchObjectWatcherSliderMorph` | slider extension for watcher |

### User-class: BYOB objects

Package: `scratchlib.objects.user`

| ID | Class Name | Description |
| --: | ------------------------------------ | ----------------------------- |
| 201 | `ScratchObjectCustomBlockDefinition` | BYOB's custom blocks |
| 205 | `ScratchObjectVariableFrame` | required for script variables |