npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

codecab

v2.3.2

Published

A simple but powerful Scratch-live game engine for JavaScript but with physics, auto vectorize, tet and graphics

Downloads

26

Readme

CodeCab

A small but powerful Scratch -like game engine for JavaScript but with physics, auto vectorize, text and graphics.

CodeCab has a quick-start online developer environment for learning JavaScript at code.cab/ide.html.

Contents

Scratch based API

When you're familiar with Scratch and want to learn JavaScript, CodeCab is the place to start.

Scratch code 1

CodeCab equivalent:

let stage = new CStage();

let cat = new CSprite('cat.png');

cat.onStart(async function() {
    this.pen.down();
    for (let count = 0; count < 10; count += 1) {
        this.move(10);
        await this.say("CodeCab", 2);
        await this.sound.play('meow.mp3');
        this.turn(15);
    }
});

Check out code.cab/ide.html to learn how to translate Scratch blocks to JavaScript code.

CodeCab features

Fast graphics

CodeCab makes use of the high performance PixiJS WebGL graphics library. The integration is transparent to allow direct usage of PIXI.JS when needed.

Behaviour controllers

Scratch has a lot of logic in one (Sprite) class. To avoid having huge JavaScript classes the logic is spread out over multiple controller classes. As shown in the CodeCab example above we have a CSprite.pen for the pen logic, CSprite.sound controller for sound and CSprite.body for physics.

Physics

Wouldn't it be fun to have real Physics in Scratch ?

Gravity, collisions, motors and stuff like that?

It available with CodeCab! Thanks to the fast Turbulenz physics library.

Just set the Sprite body type to 'dynamic' and your sprite will be a victim of gravity:

let stage = new CStage();

let cab = new CSprite('cab.png');
cab.body.type = 'dynamic';

The physics world can be configured during creation of the CStage object. The physics related options are:

| Option | Description | | --- | --- | | gravity | Amount of gravity in m/s. Defaults to 10. | | gravityDirection | Direction of the gravity in degrees. Defaults to 180 which is pointing down. | | pixelsPerMeter | Indicate how much pixels compares to 1 meter in Physics world coordinates. Default value is 60 | | enableDragging | When set to true dynamic objects can be grabbed and dragged by the mouse. Default is true. | | border | Shape of the physical border around the screen. Valid values are 'bottom', 'bowl' (default), 'box' or 'none'. Alternatively an object can be provided with left, top, bottom, right values. | | showShapes | Show the vector shapes of physic objects. Can be useful for debugging | | showConstraints | Show the constraints (like joints and forces) between objects. Can be useful for debugging. |

Example:

let stage = new CStage({
    gravity: 5,
    pixelsPerMeter: 20,
    enableDragging: false
    border: 'bottom'
});

Implementation note: the Turbulenz library is the fastest around for JavaScript, but sometimes complex shapes may get stuck with each other. When this is a problem for your project, try using simple shapes like circles instead:

let sprite = new CSprite('ball.svg');
sprite.onStart(function() {
   // Create circle shape (note that sprite.width is only valid after the 'start' event.)
   this.setCircleShape(sprite.width / 2);
});

Physics demo's:

Auto vectorize

Physics and collision detection in JavaScript is only possible when the (vectorized) shape of an object is known. CodeCab automatically converts all used PNG or SVG images with transparent background to vector shapes. For that a very fast algorithm is developed and running in a background worker thread in CodeCab.

You can configure CodeCab to show the rendered shapes:

let stage = new CStage({
    showShapes: true
});

let cab = new CSprite('cab.png');
cab.body.type = 'dynamic';

CodeCab even allows you to create a new (vectorized) sprite from the pen drawing you made:

let stage = new CStage();
showShapes.showShapes = true;

... // Draw something with sprite.pen

// Create a Sprite from pen!
let penSprite = new CSprite(stage.pen);
penSprite.body.type = 'static';
penSprite.opacity = 0; // Make it invisible since we already have the pen layer

Vectorize demo:

Graphics

TODO

Text and Google font support

CodeCab has a separate CText class to display multi-line text. And use Google web fonts immediately:

Here is an example using Google's Righteous font:

let stage = new CStage();

CStage.loadFont('google', 'Righteous');

let text = new CText("CodeCab", 150, 'Righteous');
text.setLineColor(51, 54, 128);
text.setFillColor(109, 184, 253);
text.lineWidth = 40;

Events

CodeCab supports all PIXI.js events.

Start event

The start event is emitted once after startup when all images have been loaded and vectorized.

When a CSprite is created after the first start event has occured, the new CSprite will get a start event as soon as it's image is available. Therefore the start event is guaranteed to be fired for every CStage, CSprite, CGraphics or CText object.

Mouse/touch events

CodeCab recommends using the Pointer events for handling mouse and touch movements. Although other mouse and touch events are available (by using the on('eventname') command) direct support is avaiable for:

  • onClick(callback)
  • onPointerDown(callback)
  • onPointerUp(callback)
  • onPointerMove(callback)

The callback's first argument is a PIXI InteractionEvent enriched with extra information:

| Property | Description | | --- | --- | | event.point.x event.point.y | Stage coordinates of the event in pixels | | event.worldPoint.x event.worldPoint.y | Physics coordinates of the event in meters | | event.data.sprites | Array of sprites related to the event. |

Resource loader

CodeCab makes use of the PIXI resource loader. In the CodeCab Editor the required resources are automatically added to the resource loader and will be available when the 'start' event is fired. When you create your own implementation you can use CStage.load('myresource.ext') to add resources:

import {CStage, CSprite} from 'codecab';

let stage = new CStage();

CStage.load('ball.svg');
CStage.load('cat.png');
CStage.load('meow.mp3');

stage.onStart(function() {
    // All resources are available on 'start'
}};