<div id="game"></div>
html, body {
    padding: 0;
    margin: 0;
}
div#game {
    width:100%;
    height:100%;
}
var w = window.innerWidth,
		h = window.innerHeight;

var game = new Phaser.Game(w, h, Phaser.AUTO, 'game',
		{ preload: preload, create: create, update: update, render: render });

function preload() {
	var bmd = game.add.bitmapData(100,100);
	bmd.ctx.fillStyle = '#00ff00';
	bmd.ctx.arc(50,50,50, 0, Math.PI * 2);
	bmd.ctx.fill();
	game.cache.addBitmapData('good', bmd);

	var bmd = game.add.bitmapData(64,64);
	bmd.ctx.fillStyle = '#ff0000';
	bmd.ctx.arc(32,32,32, 0, Math.PI * 2);
	bmd.ctx.fill();
	game.cache.addBitmapData('bad', bmd);
}

var good_objects,
		bad_objects,
		slashes,
		line,
		scoreLabel,
		score = 0,
		points = [];	

var fireRate = 1000;
var nextFire = 0;


function create() {

	game.physics.startSystem(Phaser.Physics.ARCADE);
	game.physics.arcade.gravity.y = 300;

	good_objects = createGroup(4, game.cache.getBitmapData('good'));
	bad_objects = createGroup(4, game.cache.getBitmapData('bad'));

	slashes = game.add.graphics(0, 0);

	scoreLabel = game.add.text(10,10,'Tip: get the green ones!');
	scoreLabel.fill = 'white';

	emitter = game.add.emitter(0, 0, 300);
	emitter.makeParticles('parts');
	emitter.gravity = 300;
	emitter.setYSpeed(-400,400);

	throwObject();
}

function createGroup (numItems, sprite) {
	var group = game.add.group();
	group.enableBody = true;
	group.physicsBodyType = Phaser.Physics.ARCADE;
	group.createMultiple(numItems, sprite);
	group.setAll('checkWorldBounds', true);
	group.setAll('outOfBoundsKill', true);
	return group;
}

function throwObject() {
	if (game.time.now > nextFire && good_objects.countDead()>0 && bad_objects.countDead()>0) {
		nextFire = game.time.now + fireRate;
		throwGoodObject();
		if (Math.random()>.5) {
			throwBadObject();
		}
	}
}

function throwGoodObject() {
	var obj = good_objects.getFirstDead();
	obj.reset(game.world.centerX + Math.random()*100-Math.random()*100, 600);
	obj.anchor.setTo(0.5, 0.5);
	//obj.body.angularAcceleration = 100;
	game.physics.arcade.moveToXY(obj, game.world.centerX, game.world.centerY, 530);
}

function throwBadObject() {
	var obj = bad_objects.getFirstDead();
	obj.reset(game.world.centerX + Math.random()*100-Math.random()*100, 600);
	obj.anchor.setTo(0.5, 0.5);
	//obj.body.angularAcceleration = 100;
	game.physics.arcade.moveToXY(obj, game.world.centerX, game.world.centerY, 530);
}

function update() {
	throwObject();

	points.push({
		x: game.input.x,
		y: game.input.y
	});
	points = points.splice(points.length-10, points.length);
	//game.add.sprite(game.input.x, game.input.y, 'hit');

	if (points.length<1 || points[0].x==0) {
		return;
	}

	slashes.clear();
	slashes.beginFill(0xFFFFFF);
	slashes.alpha = .5;
	slashes.moveTo(points[0].x, points[0].y);
	for (var i=1; i<points.length; i++) {
		slashes.lineTo(points[i].x, points[i].y);
	} 
	slashes.endFill();

	for(var i = 1; i< points.length; i++) {
		line = new Phaser.Line(points[i].x, points[i].y, points[i-1].x, points[i-1].y);
		game.debug.geom(line);

		good_objects.forEachExists(checkIntersects);
		bad_objects.forEachExists(checkIntersects);
	}
}

var contactPoint = new Phaser.Point(0,0);

function checkIntersects(fruit, callback) {
	var l1 = new Phaser.Line(fruit.body.right - fruit.width, fruit.body.bottom - fruit.height, fruit.body.right, fruit.body.bottom);
	var l2 = new Phaser.Line(fruit.body.right - fruit.width, fruit.body.bottom, fruit.body.right, fruit.body.bottom-fruit.height);
	l2.angle = 90;

	if(Phaser.Line.intersects(line, l1, true) ||
		 Phaser.Line.intersects(line, l2, true)) {

		contactPoint.x = game.input.x;
		contactPoint.y = game.input.y;
		var distance = Phaser.Point.distance(contactPoint, new Phaser.Point(fruit.x, fruit.y));
		if (Phaser.Point.distance(contactPoint, new Phaser.Point(fruit.x, fruit.y)) > 110) {
			return;
		}

		if (fruit.parent == good_objects) {
			killFruit(fruit);
		} else {
			resetScore();	
		}
	}

}

function resetScore() {
	var highscore = Math.max(score, localStorage.getItem("highscore"));
	localStorage.setItem("highscore", highscore);

	good_objects.forEachExists(killFruit);
	bad_objects.forEachExists(killFruit);

	score = 0;
	scoreLabel.text = 'Game Over!\nHigh Score: '+highscore;
	// Retrieve
}

function render() {
}

function killFruit(fruit) {

	emitter.x = fruit.x;
	emitter.y = fruit.y;
	emitter.start(true, 2000, null, 4);
	fruit.kill();
	points = [];
	score++;
	scoreLabel.text = 'Score: ' + score;
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/phaser/2.0.6/phaser.min.js