あけおめ弾幕 forked from: nengafl
あけおめ弾幕
// forked from nengafl's nengafl
/* あけおめ弾幕 */
package
{
import flash.display.*;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.*;
import flash.geom.Point;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.tweens.ITween;
[SWF(width = 465, height = 465, frameRate = 60)]
/**
* 弾幕に見せかけた新年の挨拶です
*
*
* 内部仕様はグチャグチャですが、数値やら文字列やらさわって遊んでみてください。
*
*
* 本コード作成に当たって、以下のサイトに大変お世話になりました ありがとうございましたm(_ _)m
* http://clockmaker.jp/blog/2009/07/betweenas3/
* http://1ka2ka.com/archives/200807/28_203054.html#extended
* http://www.renowan.com/blog/?p=359
*
* @author satetsu888
*/
public class Main extends Sprite
{
//弾の大きさ
public const BALL_SIZE:int = 2;
//文字の大きさ
public const FONT_SIZE:int = 35;
//武器(?)配列
public const Weapon:Array = new Array("あけおめ", "ことよろ", "謹賀新年","賀正","2010年","迎春");
public var WeaponNum:int = 0;
//算出した座標をおいとく配列
public var zahyo:Array = new Array();
//弾をおいとく配列
public var particles:Array = new Array();
//テキスト
public var label:TextField = new TextField();
//弾の発射地点を決める
public const startArray:Array = new Array(new Point(0,465),new Point(465/2,465),new Point(465,465),new Point(465,465/2),new Point(465,0),new Point(465/2,0),new Point(0,0),new Point(0,465/2));
public function Main():void
{
//説明用テキストボックス
var info:TextField = new TextField();
info.text = "クリック: 弾幕発射";
info.autoSize = TextFieldAutoSize.LEFT;//オートサイズ
addChild(info);
//書式の指定
var format:TextFormat = new TextFormat();
format.font = "_ゴシック"; //フォント
format.size = FONT_SIZE; //文字サイズ
label.setTextFormat(format);
//マウスイベントリスナー
stage.addEventListener(MouseEvent.CLICK, onMouseClick);
}
public function cal():void {
//テキスト変更
label.text = Weapon[WeaponNum]; //テキスト
label.autoSize = TextFieldAutoSize.LEFT;//オートサイズ
//BitmapDataにする
var myBitmapData:BitmapData = new BitmapData(label.width, label.height);
myBitmapData.draw(label);
//色を取得してトレース&座標データ取得
zahyo = new Array();
for (var i:int = 0; i < label.height; i++) {
//var temp:Array = new Array();
for (var j:int = 0; j < label.width; j++) {
if(myBitmapData.getPixel(j, i).toString(16) == "ffffff"){
//temp.push("○");
} else {
//temp.push("●");
zahyo.push(new Point(j,i));
}
}
//trace(temp);
}
//trace(i);
//trace(zahyo);
//パーティクル生成
particles = new Array();
for (var k:int = 0; k < zahyo.length; k++) {
particles[k] = new Sprite();
var g:Graphics = particles[k].graphics;
g.beginFill(0xf00f00,0.5);
g.drawCircle(0, 0, BALL_SIZE);
g.beginFill(0xff4400);
g.drawCircle(0, 0, BALL_SIZE/2);
particles[k].x = -100;
particles[k].y = -100;
addChild(particles[k]);
}
}
public function onMouseClick(e:MouseEvent):void {
//stage.removeEventListener(MouseEvent.CLICK, onMouseClick);
WeaponNum = (int)(Math.random() * Weapon.length);
//テキストから座標を算出する
cal();
//
for (var k:int = 0; k < zahyo.length; k++) {
var goal:Point = new Point(stage.mouseX - label.width * BALL_SIZE + zahyo[k].x * BALL_SIZE * 2 + BALL_SIZE/3 * (Math.random() - 1),stage.mouseY - label.height * BALL_SIZE + zahyo[k].y * BALL_SIZE * 2 + BALL_SIZE/3 * (Math.random() - 1));
//ベースのtween
var baseTween:ITween = BetweenAS3.serial(
BetweenAS3.tween(particles[k], { x: goal.x, y: goal.y,alpha:1 }, { x:startArray[k % startArray.length].x, y:startArray[k % startArray.length].y , alpha:1}, 1),
BetweenAS3.tween(particles[k], { x: goal.x*2-startArray[k%startArray.length].x, y: goal.y*2-startArray[k%startArray.length].y ,alpha:0}, { x:goal.x, y:goal.y ,alpha:1}, 1)
);
// [Step.1] まずはTweenを切り出す
var tw1:ITween = BetweenAS3.slice(baseTween, 0.0, 0.45, true);
var tw2:ITween = BetweenAS3.slice(baseTween, 0.45, 0.495, true);
var tw3:ITween = BetweenAS3.slice(baseTween, 0.495, 0.505, true);
var tw4:ITween = BetweenAS3.slice(baseTween, 0.505, 0.54, true);
var tw5:ITween = BetweenAS3.slice(baseTween, 0.54, 1.0, true);
// [Step.2] Tweenの時間を調整する
tw2 = BetweenAS3.scale(tw2, 5);
tw3 = BetweenAS3.scale(tw3, 50);
tw4 = BetweenAS3.scale(tw4, 4);
tw5 = BetweenAS3.scale(tw5, 0.7);
// [Step.3] 切り出したTweenをがちゃんこする
var myTween:ITween = BetweenAS3.serial(tw1, tw2, tw3,tw4,tw5);
myTween.play();
}
}
}
}