/**
* Copyright ohisama ( http://wonderfl.net/user/ohisama )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/rsBH
*/
//http://triple-c.sakura.ne.jp/hatena_dl/each_hatena_show.php?id=182830
package
{
import Box2D.Collision.*;
import Box2D.Common.Math.*;
import Box2D.Dynamics.*;
import Box2D.Collision.Shapes.*;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
[SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x0")]
public class Main extends Sprite
{
private var iterations:int = 10;
private var timeStep:Number = 1.0 / 30.0;
private var world:b2World;
private const SCALE:Number = 100;
private var degree:Number = 0;
private var player:Player;
private var colorNUM:int = 0;
public function Main()
{
player = new Player();
addChild(player);
init();
world.SetContactListener(new ContactListener());
stage.addEventListener(MouseEvent.CLICK, onMouseClick);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function init():void
{
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, 1);
var doSleep:Boolean = true;
world = new b2World(worldAABB, gravity, doSleep);
createPolygon(0, 0, 465, 1, 0, "Wall");
createPolygon(0, 464, 465, 1, 0, "Wall");
createPolygon(0, 0, 1, 465, 0, "Wall");
createPolygon(465, 0, 1, 465, 0, "Wall");
}
private function onMouseClick(event:Event = null):void
{
var radius:int = (Math.random() >= 0.5) ? 20 : 40;
createCircle(mouseX, mouseY, radius, String(colorNUM), colorNUM, true, 1.0, 0.3);
colorNUM++;
colorNUM %= Color.COLORS.length;
player.draw(Color.COLORS[colorNUM][0]);
}
private function createCircle(posX:Number, posY:Number, radius:Number, name:String = "", color:int = 0, setMass:Boolean = false, density:Number = 0.0, restitution:Number = 0.0):void
{
var bodydef:b2BodyDef = new b2BodyDef();
bodydef.position.Set(posX / SCALE, posY / SCALE);
var shape:b2CircleDef = new b2CircleDef();
shape.radius = radius / SCALE;
shape.density = density;
shape.restitution = restitution;
bodydef.userData = new Data(color, radius);
bodydef.userData.name = name;
var body:b2Body = world.CreateBody(bodydef);
body.CreateShape(shape);
body.SetLinearVelocity(new b2Vec2(Math.cos(degree * Math.PI / 180) * 800 / SCALE, Math.sin(degree * Math.PI / 180) * 800 / SCALE));
if (setMass) body.SetMassFromShapes();
addChild(body.GetUserData());
}
private function createPolygon(posX:Number, posY:Number, hx:Number, hy:Number, degree:Number, name:String = "", setMass:Boolean = false, density:Number = 0.0, restitution:Number = 0.0):void
{
var blockBodyDef:b2BodyDef = new b2BodyDef();
blockBodyDef.position.Set(posX / SCALE, posY / SCALE);
blockBodyDef.angle = degree * Math.PI / 180;
blockBodyDef.userData = new Data(0);
blockBodyDef.userData.name = name;
var blockShape:b2PolygonDef = new b2PolygonDef();
blockShape.SetAsBox(hx / SCALE, hy / SCALE);
blockShape.density = density;
var blockBody:b2Body = world.CreateBody(blockBodyDef);
blockBody.CreateShape(blockShape);
if (setMass) blockBody.SetMassFromShapes();
}
private function onEnterFrame(event:Event):void
{
degree += 2;
player.x = mouseX;
player.y = mouseY;
player.rotation = degree;
for (var body:b2Body = world.GetBodyList(); body; body = body.m_next)
{
var canvas:Sprite = body.GetUserData() as Sprite;
if (canvas)
{
canvas.x = body.GetWorldCenter().x * SCALE;
canvas.y = body.GetWorldCenter().y * SCALE;
canvas.rotation = body.GetAngle() * Math.PI / 180;
}
if (body.m_userData)
{
if (body.m_userData.name == "delete")
{
addChild(new Effect(body.GetUserData()));
world.DestroyBody(body);
}
}
}
world.Step(timeStep, iterations);
}
}
}
import flash.display.Sprite;
import flash.display.Graphics;
import Box2D.Dynamics.b2ContactListener;
import Box2D.Collision.b2ContactPoint;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import org.libspark.betweenas3.BetweenAS3;
class Color
{
public static var COLORS:Array =
[
[0xffef98, 0xffcc01],
[0xf26b53, 0xef4123],
[0x00d27e, 0x00B16B],
[0x09bbff, 0x009AD6],
/*[0xfacfde, 0xF6ADC6],
[0xffae28, 0xf39800],
[0xb672b6, 0xA757A8],
[0x5993d2, 0x3170b9],
[0xf25773, 0xED1A3D]*/
]
}
class Player extends Sprite
{
public function Player()
{
draw(Color.COLORS[0][0]);
}
public function draw(color:int):void
{
graphics.lineStyle(3.0, color);
graphics.moveTo(90, -10);
graphics.lineTo(70, 10);
graphics.moveTo(90, 10);
graphics.lineTo(70, -10);
}
}
class ContactListener extends b2ContactListener
{
public override function Add(point:b2ContactPoint):void
{
var shape1:Sprite = point.shape1.GetBody().m_userData;
var shape2:Sprite = point.shape2.GetBody().m_userData;
if (shape1.name == "Wall" || shape2.name == "Wall") return;
if (shape1.name == shape2.name) shape1.name = shape2.name = "delete";
}
}
class Data extends Sprite
{
public var colorNUM:int;
public var radius:Number;
public function Data(colorNUM:int, radius:Number = 0):void
{
this.colorNUM = colorNUM;
this.radius = radius;
var matrix:Matrix = new Matrix();
matrix.createGradientBox(radius * 2, radius * 2, 45 * Math.PI / 180, -radius / 2, -radius / 2);
graphics.beginGradientFill("linear", Color.COLORS[colorNUM], [1.0, 1.0], [0, 255], matrix);
graphics.drawCircle(0, 0, radius);
graphics.endFill();
}
}
class Effect extends Sprite
{
private var data:Data;
public function Effect(data:Data)
{
for (var degree:Number = 0; degree < 360; degree += 360 / 6)
{
var star:Star = new Star(Color.COLORS[data.colorNUM][0]);
star.x = data.x;
star.y = data.y;
addChild(star);
BetweenAS3.serial
(
BetweenAS3.tween(star, { alpha:0.0, x:star.x + Math.cos(degree * Math.PI / 180) * 30, y:star.y + Math.sin(degree * Math.PI / 180) * 30 }, 0.5),
BetweenAS3.removeFromParent(star)
).play();
}
var tf:TextField = createTextField("+" + data.radius, data.radius * 0.8, Color.COLORS[data.colorNUM][0]);
tf.x = data.x;
tf.y = data.y;
BetweenAS3.serial
(
BetweenAS3.parallel
(
BetweenAS3.tween(tf, {y:data.y - 20}),
BetweenAS3.tween(data, { alpha:0.0 }, null, 0.3)
),
BetweenAS3.removeFromParent(data),
BetweenAS3.removeFromParent(tf)
).play();
}
private function createTextField(text:String, size:int, color:int):TextField
{
var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat("Courier New", size, color, true);
tf.text = text;
tf.autoSize = TextFieldAutoSize.CENTER;
tf.selectable = false;
addChild(tf);
return tf;
}
}
class Star extends Sprite
{
public function Star(color:int)
{
const pi:Number = 0.017453;
var g:Graphics = this.graphics;
for (var degree:int = 0; degree < 360; degree += 72)
{
var rot:Number = degree;
g.beginFill(color);
g.moveTo(0,0 );
g.lineTo( Math.cos( (rot + 36) *pi) * 10 , Math.sin( (rot +36) *pi) * 10 );
g.lineTo(Math.cos( rot *pi) * 22.85, Math.sin( rot *pi) * 22.85);
g.lineTo( Math.cos( (rot -36) *pi) * 10 ,Math.sin( (rot -36) *pi) * 10 );
g.lineTo(0,0 );
g.endFill();
this.scaleX = this.scaleY = 0.3;
}
}
}