Word Play contest prototype, four days to make something decent out of it
2009-10-18 00:00:00 来源:WEB开发网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 <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;
}
}
}
赞助商链接