StarLight [RTMFP] Double
////////////////////////////////////////////////////////////////////////////////
// StarLight [RTMFP] Double
//
// [AS3.0] StarLightクラスだ! (1)
// http://www.project-nya.jp/modules/weblog/details.php?blog_id=1783
// [AS3.0] FontLoaderクラスに挑戦! (1)
// http://www.project-nya.jp/modules/weblog/details.php?blog_id=1337
// [AS3.0] RTMFPに挑戦! (2)
// http://www.project-nya.jp/modules/weblog/details.php?blog_id=1712
////////////////////////////////////////////////////////////////////////////////
/**
* Copyright ProjectNya ( http://wonderfl.net/user/ProjectNya )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/uauP
*/
////////////////////////////////////////////////////////////////////////////////
// StarLight [RTMFP] Double
//
// [AS3.0] StarLightクラスだ! (1)
// http://www.project-nya.jp/modules/weblog/details.php?blog_id=1783
// [AS3.0] FontLoaderクラスに挑戦! (1)
// http://www.project-nya.jp/modules/weblog/details.php?blog_id=1337
// [AS3.0] RTMFPに挑戦! (2)
// http://www.project-nya.jp/modules/weblog/details.php?blog_id=1712
////////////////////////////////////////////////////////////////////////////////
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.net.NetConnection;
import flash.net.NetGroup;
import flash.net.GroupSpecifier;
import flash.events.NetStatusEvent;
import net.hires.debug.Stats;
[SWF(backgroundColor="#000000", width="465", height="465", frameRate="30")]
public class Main extends Sprite {
private var image:ImageLoader;
private var particle:BitmapData;
private var loader:FontLoader;
//private static var basePath:String = "";
private static var basePath:String = "http://www.project-nya.jp/images/wonderfl/";
private static var imagePath:String = "star.png";
private static var fontPath:String = "MyriadProSemibold.swf";
private static var className:String = "MyriadProSemibold";
private var label:Label;
private var connection:NetConnection;
private var group:NetGroup;
private var specifier:GroupSpecifier;
private static var groupName:String = "group/g1";
private var connected:Boolean = false;
private var userName:String = "";
private var lightL:StarLight;
private var lightR:StarLight;
private var _pointL:Point = new Point(300, 200);
private var _pointR:Point = new Point(300, 200);
public function Main() {
//Wonderfl.capture_delay(4);
Wonderfl.disable_capture();
init();
addChild(new Stats());
}
private function init():void {
graphics.beginFill(0x000000);
graphics.drawRect(0, 0, 465, 465);
graphics.endFill();
//
image = new ImageLoader();
image.addEventListener(ImageLoader.COMPLETE, initialize, false, 0, true);
image.load(basePath + imagePath);
}
private function initialize(evt:Event):void {
image.removeEventListener(ImageLoader.COMPLETE, initialize);
//
particle = image.content.bitmapData;
//
loader = new FontLoader();
loader.addEventListener(FontLoader.COMPLETE, complete, false, 0, true);
loader.load(basePath + fontPath, className);
}
private function complete(evt:Event):void {
loader.removeEventListener(FontLoader.COMPLETE, complete);
//
label = new Label(200, 60, 60, Label.CENTER);
addChild(label);
label.x = 132;
label.y = 202;
label.textColor = 0xFFFFFF;
label.alpha = 0.4;
label.text = "StarLight";
//
lightL = new StarLight(new Rectangle(0, 0, 465, 465));
addChild(lightL);
lightL.initialize(particle);
lightL.start();
lightR = new StarLight(new Rectangle(0, 0, 465, 465));
addChild(lightR);
lightR.initialize(particle.clone());
lightR.start();
//
connection = new NetConnection();
connection.addEventListener(NetStatusEvent.NET_STATUS, netStatus, false, 0, true);
connection.connect("rtmfp:");
}
private function setup():void {
specifier = new GroupSpecifier(groupName);
specifier.ipMulticastMemberUpdatesEnabled = true;
specifier.postingEnabled = true;
specifier.routingEnabled = true;
//specifier.serverChannelEnabled = true;
//specifier.multicastEnabled = true;
//specifier.peerToPeerDisabled = true;
//specifier.objectReplicationEnabled = true;
specifier.addIPMulticastAddress("225.225.0.1:30303");
//
group = new NetGroup(connection, specifier.groupspecWithAuthorizations());
group.addEventListener(NetStatusEvent.NET_STATUS, netStatus, false, 0, true);
//
userName = "user" + uint(Math.random()*10000)
}
private function netStatus(evt:NetStatusEvent):void {
//trace(evt.target, evt.info.code);
switch (evt.info.code) {
case "NetConnection.Connect.Success" :
setup();
break;
case "NetConnection.Connect.Failed" :
case "NetConnection.Connect.Closed" :
break;
case "NetGroup.Connect.Success" :
connected = true;
break;
case "NetGroup.Connect.Failed" :
case "NetGroup.Connect.Closed" :
break;
case "NetGroup.Posting.Notify" :
case "NetGroup.SendTo.Notify" :
receive(evt.info.message);
break;
}
}
private function receive(msg:Object):void {
if (msg.xL && msg.yL) {
var pointL:Point = new Point(msg.xL, msg.yL);
if (distanceL(pointL)) {
lightL.setup(pointL);
}
}
if (msg.xR && msg.yR) {
var pointR:Point = new Point(msg.xR, msg.yR);
if (distanceR(pointR)) {
lightR.setup(pointR);
}
}
}
private function distanceL(point:Point):Boolean {
var d:Number = Point.distance(point, _pointL);
_pointL = point;
if (d > 4) {
return true;
} else {
return false;
}
}
private function distanceR(point:Point):Boolean {
var d:Number = Point.distance(point, _pointR);
_pointR = point;
if (d > 4) {
return true;
} else {
return false;
}
}
private function send(x:uint, y:uint):void {
var msg:Object = new Object();
msg.sender = group.convertPeerIDToGroupAddress(connection.nearID);
msg.user = userName;
msg.x = x - 68;
msg.y = y + 32;
msg.date = new Date();
//
group.sendToAllNeighbors(msg);
}
}
}
//////////////////////////////////////////////////
// StarLightクラス
//////////////////////////////////////////////////
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.ColorTransform;
import flash.geom.Point;
import flash.filters.BlurFilter;
class StarLight extends Sprite {
private var rect:Rectangle;
private var particles:Array;
private var bitmapData:BitmapData;
private var bitmap:Bitmap;
private var container:Sprite;
private static var colorTrans:ColorTransform;
private static var point:Point = new Point();
private static var blur:BlurFilter;
public function StarLight(r:Rectangle) {
rect = r;
init();
}
private function init():void {
particles = new Array();
bitmapData = new BitmapData(rect.width, rect.height, true, 0x00000000);
bitmap = new Bitmap(bitmapData);
addChild(bitmap);
container = new Sprite();
addChild(container);
colorTrans = new ColorTransform(1, 1, 1, 0.4, 0, 0, 0, 0);
blur = new BlurFilter(16, 16, 4);
}
public function initialize(particle:BitmapData):void {
StarParticle.particle = particle;
}
public function start():void {
addEventListener(Event.ENTER_FRAME, update, false, 0, true);
}
public function stop():void {
removeEventListener(Event.ENTER_FRAME, update);
}
public function setup(pos:Object):void {
var particle:StarParticle = new StarParticle(pos.x, pos.y);
container.addChild(particle);
particles.push(particle);
}
private function update(evt:Event):void {
for (var n:uint = 0; n < particles.length; n++) {
var particle:StarParticle = particles[n];
particle.update();
if (particle.life < 0 || particle.x < 0 || particle.x >rect.width || particle.y < 0 || particle.y > rect.height) {
container.removeChild(particle);
particles.splice(n, 1);
particle = null;
}
}
draw();
}
private function draw():void {
bitmapData.lock();
bitmapData.draw(container, null, colorTrans);
bitmapData.applyFilter(bitmapData, rect, point, blur);
bitmapData.unlock();
}
}
//////////////////////////////////////////////////
// StarParticleクラス
//////////////////////////////////////////////////
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.ColorTransform;
import flash.display.BlendMode;
import frocessing.color.ColorHSV;
class StarParticle extends Sprite {
public static var particle:BitmapData;
private var time:Number = 0;
private static var max:uint = 250;
private static var unit:Number = 1/max;
public var life:Number = 1;
private var px:Number = 0;
private var py:Number = 0;
private var angle:Number = 0;
private var vx:Number = 0;
private var vy:Number = 0;
private static var speed:Number = 250;
private static var radian:Number = Math.PI/180;
private static var acceleration:Number = -400;
private static var tacceleration:Number = -120;
private var _scale:Number = 1;
private var color:ColorHSV;
private var colorTrans:ColorTransform;
public function StarParticle(sx:Number, sy:Number) {
px = sx;
py = sy;
draw();
init();
}
private function init():void {
angle = Math.random()*360;
vx = speed*Math.cos(angle*radian);
vy = speed*Math.sin(angle*radian);
x = px + vx*0.02;
y = py + vy*0.02;
color = new ColorHSV(- Math.random()*360, 0.5);
colorTrans = new ColorTransform();
colorTrans.color = color.value;
transform.colorTransform = colorTrans;
blendMode = BlendMode.ADD;
}
public function update():void {
if (life < 0) return;
time += unit;
life = 1 - time*8;
//
var dx:Number = x - px;
var dy:Number = y - py;
var distance:Number = Math.sqrt(dx*dx + dy*dy);
if (distance < 0.01) distance = 0.01;
var rx:Number = dx/distance;
var ry:Number = dy/distance;
var tx:Number = rx;
var ty:Number = ry;
rx *= acceleration;
ry *= acceleration;
var _tx:Number = tx;
tx = - ty*tacceleration;
ty = _tx*tacceleration;
vx += (rx + tx)*time;
vy += (ry + ty)*time;
x += vx*time;
y += vy*time;
scale = life;
rotation = 360*time;
}
private function draw():void {
var star:Bitmap = new Bitmap(particle.clone());
addChild(star);
star.x = - uint(star.width/2);
star.y = - uint(star.height/2);
}
private function get scale():Number {
return _scale;
}
private function set scale(value:Number):void {
_scale = value;
scaleX = scaleY = _scale;
}
}
//////////////////////////////////////////////////
// ImageLoaderクラス
//////////////////////////////////////////////////
import flash.events.EventDispatcher;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.net.URLRequest;
import flash.display.Bitmap;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.HTTPStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.system.LoaderContext;
class ImageLoader extends EventDispatcher {
public var id:uint;
private var loader:Loader;
private var info:LoaderInfo;
public var content:Bitmap;
private var smoothing:Boolean;
public static const IO_ERROR:String = IOErrorEvent.IO_ERROR;
public static const HTTP_STATUS:String = HTTPStatusEvent.HTTP_STATUS;
public static const SECURITY_ERROR:String = SecurityErrorEvent.SECURITY_ERROR;
public static const INIT:String = Event.INIT;
public static const COMPLETE:String = Event.COMPLETE;
public function ImageLoader() {
loader = new Loader();
info = loader.contentLoaderInfo;
}
public function load(file:String, s:Boolean = false):void {
smoothing = s;
info.addEventListener(ProgressEvent.PROGRESS, progress, false, 0, true);
info.addEventListener(IOErrorEvent.IO_ERROR, ioerror, false, 0, true);
info.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpstatus, false, 0, true);
info.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityerror, false, 0, true);
info.addEventListener(Event.INIT, initialize, false, 0, true);
info.addEventListener(Event.COMPLETE, complete, false, 0, true);
try {
loader.load(new URLRequest(file), new LoaderContext(true));
} catch (err:Error) {
trace(err.message);
}
}
public function unload():void {
loader.unload();
}
private function progress(evt:ProgressEvent):void {
dispatchEvent(evt);
}
private function ioerror(evt:IOErrorEvent):void {
loader.unload();
dispatchEvent(new Event(ImageLoader.IO_ERROR));
}
private function httpstatus(evt:HTTPStatusEvent):void {
dispatchEvent(new Event(ImageLoader.HTTP_STATUS));
}
private function securityerror(evt:SecurityErrorEvent):void {
dispatchEvent(new Event(ImageLoader.SECURITY_ERROR));
}
private function initialize(evt:Event):void {
content = Bitmap(info.content);
if (smoothing) {
content.smoothing = true;
}
dispatchEvent(new Event(ImageLoader.INIT));
}
private function complete(evt:Event):void {
info.removeEventListener(IOErrorEvent.IO_ERROR, ioerror);
info.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpstatus);
info.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityerror);
info.removeEventListener(Event.INIT, initialize);
info.removeEventListener(Event.COMPLETE, complete);
dispatchEvent(new Event(ImageLoader.COMPLETE));
}
}
//////////////////////////////////////////////////
// FontLoaderクラス
//////////////////////////////////////////////////
import flash.events.EventDispatcher;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.net.URLRequest;
import flash.text.Font;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.HTTPStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.system.ApplicationDomain;
import flash.system.SecurityDomain;
import flash.system.LoaderContext;
import flash.utils.getDefinitionByName;
class FontLoader extends EventDispatcher {
public var id:uint;
private var loader:Loader;
private var info:LoaderInfo;
private var _className:String;
private var _font:Font;
private var _fontName:String;
private var embeded:Boolean = false;
public static const IO_ERROR:String = IOErrorEvent.IO_ERROR;
public static const HTTP_STATUS:String = HTTPStatusEvent.HTTP_STATUS;
public static const SECURITY_ERROR:String = SecurityErrorEvent.SECURITY_ERROR;
public static const INIT:String = Event.INIT;
public static const COMPLETE:String = Event.COMPLETE;
public function FontLoader() {
loader = new Loader();
info = loader.contentLoaderInfo;
}
public function load(file:String, name:String, e:Boolean = false):void {
_className = name;
embeded = e;
info.addEventListener(ProgressEvent.PROGRESS, progress, false, 0, true);
info.addEventListener(IOErrorEvent.IO_ERROR, ioerror, false, 0, true);
info.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpstatus, false, 0, true);
info.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityerror, false, 0, true);
info.addEventListener(Event.INIT, initialize, false, 0, true);
info.addEventListener(Event.COMPLETE, complete, false, 0, true);
try {
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
context.securityDomain = SecurityDomain.currentDomain;
loader.load(new URLRequest(file), context);
} catch (err:Error) {
trace(err.message);
}
}
public function unload():void {
loader.unload();
}
private function progress(evt:ProgressEvent):void {
dispatchEvent(evt);
}
private function ioerror(evt:IOErrorEvent):void {
loader.unload();
dispatchEvent(new Event(FontLoader.IO_ERROR));
}
private function httpstatus(evt:HTTPStatusEvent):void {
dispatchEvent(new Event(FontLoader.HTTP_STATUS));
}
private function securityerror(evt:SecurityErrorEvent):void {
dispatchEvent(new Event(FontLoader.SECURITY_ERROR));
}
private function initialize(evt:Event):void {
dispatchEvent(new Event(FontLoader.INIT));
}
private function complete(evt:Event):void {
info.removeEventListener(IOErrorEvent.IO_ERROR, ioerror);
info.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpstatus);
info.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityerror);
info.removeEventListener(Event.INIT, initialize);
info.removeEventListener(Event.COMPLETE, complete);
var FontClass:Class = Class(ApplicationDomain.currentDomain.getDefinition(className));
if (!embeded) {
Font.registerFont(FontClass);
_font = Font(new FontClass());
} else {
var document:Object = new FontClass();
_font = document.font;
}
_fontName = _font.fontName;
dispatchEvent(new Event(FontLoader.COMPLETE));
}
public function get className():String {
return _className;
}
public function get font():Font {
return _font;
}
public function get fontName():String {
return _fontName;
}
}
//////////////////////////////////////////////////
// Labelクラス
//////////////////////////////////////////////////
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFieldAutoSize;
import flash.text.AntiAliasType;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
class Label extends Sprite {
private var txt:TextField;
private static var fontType:String = "Myriad Pro Semibold";
private var _width:uint = 20;
private var _height:uint = 20;
private var size:uint = 12;
public static const LEFT:String = TextFormatAlign.LEFT;
public static const CENTER:String = TextFormatAlign.CENTER;
public static const RIGHT:String = TextFormatAlign.RIGHT;
public function Label(w:uint, h:uint, s:uint = 12, align:String = LEFT) {
_width = w;
_height = h;
size = s;
draw(align);
}
private function draw(align:String):void {
txt = new TextField();
addChild(txt);
txt.width = _width;
txt.height = _height;
txt.autoSize = align;
txt.type = TextFieldType.DYNAMIC;
txt.selectable = false;
txt.embedFonts = true;
txt.antiAliasType = AntiAliasType.ADVANCED;
var tf:TextFormat = new TextFormat();
tf.font = fontType;
tf.size = size;
tf.align = align;
txt.defaultTextFormat = tf;
textColor = 0x000000;
}
public function set text(param:String):void {
txt.text = param;
}
public function set textColor(param:uint):void {
txt.textColor = param;
}
}