Do you like my tutorials?

Then consider supporting me on Ko-fi

Talking about Toony game, Game development and Users contributions.

It seems Flash Toony prototype is getting quite an interest because some days after the iPhone port made with Corona SDK, it’s the time for Julian Liebl from Nortlight Games to show us the Haxe port of the prototype.

Haxe can be compiled to all popular programming platforms with its fast compiler – JavaScript, Flash, NekoVM, PHP, C++, C# and Java (soon) – which means your apps will support all popular mobile devices, such as iOS, Android, Windows Mobile, webOS and more.

package;

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import haxe.Timer;
import flash.Lib;
import flash.Vector;
import flash.geom.Point;

/**
 * @author Emanuele Feronato ported by Julian Liebl from Flash to Haxe
 */

class Toony extends Sprite {
	
	var timer:Timer;
	var returnPoint:Point;
	var movingToony:Sprite;
	var draggableToonies:Array;
	var fallingToonies:Vector;

	public function new() {
		super();
		init();
		construct();
		create();
	}

	public function init(){
		movingToony = null;
		draggableToonies = new Array();
		fallingToonies = new Vector();

		//init Timer
		timer = new Timer(2000);
		timer.run = newToony;
	}

	public function construct(){
		//lets create a toony with the shape of a circle
		var circle:Sprite = constructShape(0);

		//lets create a toony with the shape of a rectangle
		var rectangle:Sprite = constructShape(1);

		//lets create a toony with the shape of a round rectangle
		var roundRectangle:Sprite = constructShape(2);

		draggableToonies.push(circle);
		draggableToonies.push(rectangle);
		draggableToonies.push(roundRectangle);
	}

	//let's code the shapes ourself. That's badass ;)
	public function constructShape(index:Int):Sprite{
		var returnSprite:Sprite = new Sprite();
		switch(index){
		    case 0:
		    	returnSprite.name = "circle";
				returnSprite.graphics.beginFill(0x0621a9);
				returnSprite.graphics.drawCircle(40, 40, 40);
				returnSprite.graphics.endFill();
			case 1:
				returnSprite.name = "rectangle";
				returnSprite.graphics.beginFill(0xff0000);
				returnSprite.graphics.drawRect(0 , 0, 80, 80);
				returnSprite.graphics.endFill();
			case 2:
				returnSprite.name = "round rectangle";
				returnSprite.graphics.beginFill(0xFFCC00);
				returnSprite.graphics.drawRoundRect(0 , 0, 80, 80,40,40);
				returnSprite.graphics.endFill();
		    default:
		        trace("Not known index. Returing empty Sprite.");
		}
		return returnSprite;
	}

	public function create(){
		// creation of the four draggable toonies
		var loops:Int = 0;

		for (toony in draggableToonies) {
			toony.x=loops*100+80;
			toony.y=370;
			toony.buttonMode=true;

			addChild(toony);
			toony.addEventListener(MouseEvent.MOUSE_DOWN,toonyClicked);

			loops++;
		}
		// main game loop
		addEventListener(Event.ENTER_FRAME,update);

		// event to be triggered when the player releases the mouse button
		Lib.current.addEventListener(MouseEvent.MOUSE_UP,toonyReleased);
	}

	private function newToony():Void {
		// it's simple: I just create a new Toony instance and place it
		// randomly in the game field with a random frame shown
		var toony:Sprite = constructShape(Math.ceil(Math.random()*draggableToonies.length)-1);
		addChild(toony);
		toony.x=Math.random()*580;
		toony.y=-32;
		
		toony.alpha=0.5;
		// pushing the newly created toony into toonies vector
		fallingToonies.push(toony);
	}

	private function toonyClicked(e:MouseEvent):Void {
		returnPoint = new Point(e.target.x, e.target.y);
		// if I am not moving any toony...
		if (movingToony==null) {
			// setting the toony I am about to move to the toony I just pressed the mouse on
			movingToony=e.target;
		}
	}

	private function toonyReleased(e:MouseEvent):Void {
		// if I am moving a toony...
		if (movingToony!=null) {
			// looping through toonies vector
			for (toony in fallingToonies) {
				// if I am touching a falling toony with the same shape as the toony I am currently moving...
				// (that is: if both toonies are showing the same frame...)
				if (toony.hitTestPoint(mouseX,mouseY,true) && movingToony.name==toony.name) {
					// the toonies match!! Highlighting the falling toony
					toony.alpha=1;
				}
			}
			// putting the moved toony back to its place
			movingToony.y=returnPoint.y;
			movingToony.x=returnPoint.x;
			// setting the variable which hold the moving toony to null
			// I am not moving any toony now
			movingToony=null;
		}
	}

	private function update(e:Event):Void {
		// if I am moving a toony...
		if (movingToony!=null) {
			// updating toony position according to mouse position
			movingToony.x=mouseX-movingToony.width/2;
			movingToony.y=mouseY-movingToony.height/2;
		}

		var loop:Int = 0;

		for (toony in fallingToonies) {
			// moving toonies down
			toony.y++;
			// removing toonies from the stage if they are too close to the bottom of the stage
			if (toony.y>280) {
				toony.parent.removeChild(toony);
				fallingToonies.splice(loop,1);
			}
			loop++;
		}
	}

	public static function main () {
		Lib.current.addChild(new Toony ());
	}
}

and the result, compiled as SWF, is:

You should know how to play, drag and drop the shapes in the bottom row to match falling shapes.

In the zipped archive Julian shares with us, you can find the complete source code as well as the Flash and Mac App builds.

Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.