Talking about Word Game game, Actionscript 3, Box2D, Contests, Flash and Game development.
The final deadline for “Word Play” Flash Game Contest ran by MochiMedia is September 18 and if you did not submit any entry, here it is a prototype you can use to make something better out of it.
The concept is based upon How to use an embedded text file in Flash and some concepts from SamePhysics.
Letters are falling (very quickly in this example), click on them to make a word, click on a previously clicked letter to submit a word and make letters disappear, or click outside to reset the word.
If a letter falls outside the stage, then it’s game over.
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
public class HelloWorld extends Sprite {
public var words:embedded_text = new embedded_text();
public var m_world:b2World;
public var m_iterations:int=10;
public var m_timeStep:Number=1.0/30.0;
public var body:b2Body;
public var bodyDef:b2BodyDef;
public var boxDef:b2PolygonDef;
public var word:String="";
public var letters:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public var words_array:Array = new Array();
public var remove:Boolean=false;
public var release_letters:Boolean=false;
public var game_over:Boolean=false;
public function HelloWorld() {
words_array=words.toString().split(",");
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
var gravity:b2Vec2=new b2Vec2(0.0,10.0);
var doSleep:Boolean=true;
m_world=new b2World(worldAABB,gravity,doSleep);
add_walls();
var time_count:Timer=new Timer(1000);
time_count.start();
time_count.addEventListener(TimerEvent.TIMER, on_time);
addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
stage.addEventListener(MouseEvent.MOUSE_DOWN, on_mouse_down);
}
public function add_walls() {
bodyDef = new b2BodyDef();
bodyDef.position.Set(10.5, 15.75);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(10.5, 0.25);
boxDef.friction=0.3;
boxDef.density=0;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
bodyDef = new b2BodyDef();
bodyDef.position.Set(0.25, 12);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(0.25, 4);
boxDef.friction=0.3;
boxDef.density=0;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
bodyDef = new b2BodyDef();
bodyDef.position.Set(20.75, 12);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(0.25, 4);
boxDef.friction=0.3;
boxDef.density=0;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
var the_walls:walls=new walls();
addChild(the_walls);
}
public function on_time(event:TimerEvent) {
if (! game_over) {
var lett=letters.charAt(Math.floor(Math.random()*26));
bodyDef = new b2BodyDef();
bodyDef.position.x=Math.random()*19+1;
bodyDef.position.y=-2;
boxDef = new b2PolygonDef();
boxDef.SetAsBox(0.75,0.75);
boxDef.density=1.0;
boxDef.friction=0.5;
boxDef.restitution=0.2;
bodyDef.userData = new letter();
bodyDef.userData.lettertext.text=lett;
bodyDef.userData.width=1.5*30;
bodyDef.userData.height=1.5*30;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
addChild(bodyDef.userData);
bodyDef.userData.x=bodyDef.position.x*30;
bodyDef.userData.y=bodyDef.position.y*30;
}
}
public function on_mouse_down(evt:MouseEvent):void {
remove=false;
if (! game_over) {
var body:b2Body=GetBodyAtMouse();
var position:int;
if (body) {
if (body.m_userData.alpha==1) {
body.m_userData.alpha=0.5;
word+=body.m_userData.lettertext.text.toLowerCase();
} else {
position=words_array.indexOf(word);
if (position>-1) {
word="";
remove=true;
}
}
} else {
word="";
release_letters=true;
}
}
}
public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body {
var real_x_mouse = (stage.mouseX)/30;
var real_y_mouse = (stage.mouseY)/30;
var mousePVec:b2Vec2 = new b2Vec2();
mousePVec.Set(real_x_mouse, real_y_mouse);
var aabb:b2AABB = new b2AABB();
aabb.lowerBound.Set(real_x_mouse - 0.001, real_y_mouse - 0.001);
aabb.upperBound.Set(real_x_mouse + 0.001, real_y_mouse + 0.001);
var k_maxCount:int=10;
var shapes:Array = new Array();
var count:int=m_world.Query(aabb,shapes,k_maxCount);
var body:b2Body=null;
for (var i:int = 0; i 500) {
game_over=true;
}
bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
if (remove&&bb.m_userData.alpha==0.5) {
removeChild(bb.m_userData);
bb.m_userData=null;
m_world.DestroyBody(bb);
}
if (release_letters&&bb.m_userData.alpha==0.5) {
bb.m_userData.alpha=1;
}
}
}
release_letters=false;
}
}
}
where embedded_text.as
is coded as follows:
package {
import flash.utils.ByteArray;
[Embed(source="words.txt",mimeType="application/octet-stream")]
public class embedded_text extends ByteArray {
public function embedded_text() {
}
}
}
And this is the result… (a bit shrinked to make it fit in the blog)
Download the source code… four days left…
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.