Word Play contest prototype, four days to make something decent out of it

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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 <count; ++i) {
				if (shapes[i].m_body.IsStatic()==false||includeStatic) {
					var tShape:b2Shape=shapes[i] as b2Shape;
					var inside:Boolean=tShape.TestPoint(tShape.m_body.GetXForm(),mousePVec);
					if (inside) {
						body=tShape.m_body;
						break;
					}
				}
			}
			return body;
		}
		public function Update(e:Event):void {
			m_world.Step(m_timeStep, m_iterations);
			for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
				if (bb.m_userData is Sprite) {
					bb.m_userData.x=bb.GetPosition().x*30;
					bb.m_userData.y=bb.GetPosition().y*30;
					if (bb.m_userData.y>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:

1
2
3
4
5
6
7
8
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…

Rate this post: 1 Star2 Stars3 Stars4 Stars5 Stars (7 votes, average: 4.00 out of 5)
Loading ... Loading ...
If you found this post useful, please consider a small donation.
» Flash Templates provided by Template Monster are pre-made web design products developed using Flash technology.
They can be easily customized to meet the unique requirements of your project.

2 Responses

  1. Guest says:

    I like it, but it should have more vowels since there are too many consonants

  2. Merve says:

    You could use the scrabble ratio of tiles to make sure there are enough vowels.

Leave a Reply

flash games company