May 25, 2009

I've been experimenting with the Javascript port of processing by John Resig and it seems like it could be quite good for rapidly prototyping games on the web. One of the great things about it is that it doesn't require any plugins or proprietary technologies like Flash, relying instead on the canvas element. There are some awesome demos of it in action on the website. I made a little fork which is optimised for the task of writing object oriented game code, which you can see in action below. Try clicking on the spinning asteroids.

My fork implements a basic mainloop into which you can inject new game entities with the function addEntity(); and a bunch of convenience methods which you can implement to draw your entities, or capture events like mouse clicks. As per processingjs, you can use processing's Java style syntax, or Javascript syntax instead. Here's the source to the above example:

size(400, 225);

function Asteroid(radius, x, y) {
    // variables
    this.x = x || random(0, width);
    this.y = y || random(0, height);
    this.angle = random(0, PI);
    this.radius = radius || 40;
    // velocities
    this.angleV = random(-0.1, 0.1);
    this.xV = random(-0.5, 0.5);
    this.yV = random(-0.5, 0.5);
    // structure of this shape
    this.points = [];
    this.randomPoint = function() {
        return random(-this.radius/2, this.radius/2);
    }
    for (i=0; i<round(this.radius / 5); i++)
        this.points.push([this.radius * Math.sin(i * PI / round(this.radius / 10)) + this.randomPoint(),
            this.radius * Math.cos(i * PI / round(this.radius / 10)) + this.randomPoint()]);
    this.poly = [];

    this.collisionPoly = function() {
        return this.poly;
    }

    this.mouseDown = function() {
        if (this.radius > 25) {
            addEntity(new Asteroid(this.radius / 3 * 2, this.x + this.randomPoint(), this.y + this.randomPoint()));
            addEntity(new Asteroid(this.radius / 3 * 2, this.x + this.randomPoint(), this.y + this.randomPoint()));
        }
        delEntity(this);
    }

    this.update = function() {
        // update all our state variables
        this.angle += this.angleV;
        this.x = (this.x + this.xV + width) % width;
        this.y = (this.y + this.yV + height) % height;
        // update our shape definition
        for (n=0; n<this.points.length; n++) {
            this.poly[n] = [this.points[n][0] * cos(this.angle) - this.points[n][1] * sin(this.angle) + this.x,
                this.points[n][0] * sin(this.angle) + this.points[n][1] * cos(this.angle) + this.y];
        }
    }

    this.draw = function() {
        stroke(255);
        noFill();
        beginShape();
        for (n=0; n<this.poly.length; n++) {
            vertex(this.poly[n][0], this.poly[n][1]);
        }
        endShape(CLOSE);
    }
}

addEntity(new Asteroid());
addEntity(new Asteroid());
addEntity(new Asteroid());
addEntity(new Asteroid());
addEntity(new Asteroid());

I you want to check out all of the code, including my modified version of processingjs, I've put my bzr repository online and you can get it like this:

bzr co http://mccormick.cx/dev/gameprocjs/

Or you can click here to download a zipfile of the source.

The main thing to be aware of is that any object added with addentity() should have an update() method, which will get called once per game loop to update your object's state, and a draw() method where you should put the code to draw your object. Other useful methods which you can implement include mouseDown() and mouseUp(), both of which require that you provide a method called collisionPoly() which returns a list of points that define a collision polygon for your game entity. Later I hope to add my Javascript recursive dimensional clustering implementation which will make it really simple to detect in-game collisions and will also require a method called getBoundingBox() which will make the collision detection and mouse-click-detection much more efficient.

Anyway, if you're interested in using this I'd love to hear from you!

May 22, 2009

Here are some programmy things I have been exploring recently.

google-mobwrite is a framework for synchronising human edited text. It all integrates nicely with web pages through Javascript and the HTML textarea element (also other elements too), and also on the server side there are Python and other implementations of the protocol, including a ready-to-launch app-engine version. Very nice. I have implemented a very basic etherpad clone called txtfish using mobwrite.

processingjs.org is a basic Javascript and canvas element port of some of the Java-based proce55ing multimedia language/framework, magically called into being by the ultimate Javascript ninja, John Resig. This is cool because with the speedup in modern Javascript engines, it demonstrates the possible death of flash in the not too distant future, if we're lucky. Another cool and vaguely similar project is Raphael, although I haven't tried it yet myself.

May 17, 2009

GameJam0509

This screenshot is as far as I got during the latest GameJam, which has been running in my home town, Perth. I joined remotely from here in London, but unfortunately I just didn't manage to squeeze in the time to make the game I was hoping to. I did manage to advance the MinimalistPlatformer codebase quite a bit further than it was towards the larger platformer game I have cooking away in the back of my mind though, so that's quite positive. Hopefully I'll get some more time to continue this work, and maybe even produce some binaries of my GameJam entry at some point.

May 8, 2009

Woooooooooooooooo, I am pretty excited that my talk has been accepted for EuroPython 2009! It's in Birmingham, UK, at the end of June. My talk is called "RjDj + Python = Reality morph for the iPhone" and is about how we've used Python at RjDj to break out of the iPhone jail[1], somewhat.

There are a ton of really fascinating talks happening, and every one of the keynote speakers is a tech luminary. I am especially excited about seeing both Professor Sir Tony Hoare, and Cory Doctorow speak.

Good times!

[1] Note that I am an independent contractor and my views do not reflect those of Reality Jockey Ltd. :)

April 24, 2009

If yr in London, come check this out tommorrow. I am playing a set using Pd, during the performances section, which should be a lot of fun.

OpenLab 5 : Cafe OTO, 25th April 2009

Openlab are providing a day of workshops & presentations about opensource software, and performances in the evening at Cafe OTO, Dalston. There is a venerable lineup of OpenLab members providing some in depth knowledge during the day and some great performances at night. The preliminary line up goes like this:

DAY: Workshops & Presentations : 12 - 5pm (free entry).

NIGHT: Performances : 7:30pm - 12:30am (5 pounds entry) - doors 7pm

Presentations

Workshops

  • Fluxus (Dave Griffiths) : (free, 1-2hrs, max 10) The venerable OpenGL/scheme environment. http://www.pawfal.org/dave/index.cgi?Projects/Fluxus

  • APODIO (Julien Ottavi) : (1hrs, max 20) Gnu/Linux multimedia distribution LiveDVD

  • Introducing Processing for Visual Artists (Evan Raskob) : (10 pounds, 2hrs, max 20)

Performances

You are all very welcome - see you there.

MORE INFO : openlab