つみふら (How do you like flash?)
@OKASUKE
* 2010/4/24 #Geeks67をみてやっぱFlash好きだなーと思いつつ
* つみふら(How do you like flash?)
* 100回以上クリックすればFlash愛情度がわかるらしい
* 連打するもよし、慎重にクリックするもよし!
* 詳しくは終了後twitterへ
* (100回以上クリックすればボタンがでます。)
* たまに
* http://twitpic.com/1i0lvc になりますが、えっと…た、高く積み上げる
* ための…し、仕様デス!(逃亡)
* 物理エンジン・・・あうあ(ノД`)・゜・。
/**
* Copyright OKASUKE ( http://wonderfl.net/user/OKASUKE )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/kcii
*/
/*
* @OKASUKE
* 2010/4/24 #Geeks67をみてやっぱFlash好きだなーと思いつつ
* つみふら(How do you like flash?)
* 100回以上クリックすればFlash愛情度がわかるらしい
* 連打するもよし、慎重にクリックするもよし!
* 詳しくは終了後twitterへ
* (100回以上クリックすればボタンがでます。)
* たまに
* http://twitpic.com/1i0lvc になりますが、えっと…た、高く積み上げる
* ための…し、仕様デス!(逃亡)
* 物理エンジン・・・あうあ(ノД`)・゜・。
*/
package {
import alternativ5.engine3d.materials.*;
import alternativ5.engine3d.core.*;
import alternativ5.engine3d.materials.FillMaterial
import alternativ5.engine3d.primitives.Box;
import alternativ5.engine3d.primitives.Plane;
import alternativ5.engine3d.core.Sprite3D;
import alternativ5.types.Texture;
import alternativ5.types.Point3D;
import alternativ5.utils.MathUtils;
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.BlendMode;
import flash.geom.Matrix;
import flash.net.*;
import flash.system.*;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.escapeMultiByte;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.Event;
import flash.events.MouseEvent;
import alternativ5.utils.FPS;
import com.bit101.components.*;
[SWF(width = 465, height = 465, frameRate = 40)]
public class Main extends Sprite {
private var _ball:Vector.<Ball> = new Vector.<Ball>;
private var template:BasicTemplate = new BasicTemplate();
private var _count:Number;
private var _prevball:Ball;
private var _data:Array;
private var image:BitmapData;
private var flasan:BitmapData
private var loader:Loader;
private var _fla:TextField;
private var _ochifla:TextField;
private var _ochi:Number = 0;
private var delno:Number = 0;
private var myTimer:Timer = new Timer(5000, 1);
public function Main():void {
loader = new Loader();
loader.load(new URLRequest("http://assets.wonderfl.net/images/related_images/c/c2/c2c2/c2c21a50b73c055320ce2408ed43699ac6fc342e"), new LoaderContext(true));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaded2);
_fla = new TextField();
_fla.text = "0/100" + " ";
_fla.x = 10;
_fla.y = 10;
addChild(_fla);
_fla.selectable = false;
_ochifla = new TextField();
_ochifla.text = "落ちたfl: " + "??" + "fl";
_ochifla.x = 80;
_ochifla.y = 10;
addChild(_ochifla);
_ochifla.selectable = false;
}
private function loaded2(e:Event):void {
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loaded2);
flasan = new BitmapData(loader.content.width, loader.content.height, true);
flasan.draw(loader);
loader = new Loader();
loader.load(new URLRequest("http://assets.wonderfl.net/images/related_images/b/b6/b611/b61189e180c5fa3e3824c9b3f67d06f3a90253ae"), new LoaderContext(true));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaded);
}
private var box:Object3D
public var plane:Plane;
private function loaded(e:Event):void {
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loaded);
image = new BitmapData(loader.content.width, loader.content.height, true);
image.draw(loader);
// テンプレートを作成
addChild(template);
FPS.init(stage);
var matimage:TextureMaterial = new TextureMaterial(new Texture(image), 1, false, true, BlendMode.NORMAL, -1, 0xFF0000);
matimage.precision = TextureMaterialPrecision.VERY_LOW;
plane=new Plane(400,400,8,8)
plane.cloneMaterialToAllSurfaces(new FillMaterial(0xFFFFFF,0.1,BlendMode.NORMAL,0,0x000000));
plane.setMaterialToSurface(matimage, "front");
template.scene.root.addChild(plane);
plane.rotationX = MathUtils.toRadian(90)
plane.y = 400
plane.x = this.width / 2;
box = new Object3D()
template.scene.root.addChild(box);
onResize(null);
this.stage.addEventListener(Event.RESIZE, onResize);
_count = 0;
this.stage.addEventListener(MouseEvent.CLICK, onMouseClick);
template.onPreRender = function():void {
if (_count >= 0) endcnt();
var rateY:Number = mouseY / stage.stageHeight;
template.camera.y += ( - 8000 * rateY - template.camera.y) * 0.01;
template.cameraContoller.lookAt(new Point3D());
}
function onResize(e:Event):void {
this.width = stage.stageWidth;
this.height = stage.stageHeight
var bgMatrix:Matrix = new Matrix();
bgMatrix.rotate(90 * Math.PI / 180);
graphics.clear();
graphics.beginGradientFill("linear", [0xFFFFFF, 0x0000FF], [1, 0], [127, 255], bgMatrix);
graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
}
function onMouseClick(e:MouseEvent):void {
createBall();
}
var me:Main=this //as Main;
function createBall():void {
if (_count >= 100) {
if (button != null) return;
myTimer.start();
//myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, completeHandler);
return;
}
_ball.push(new Ball(me, template.scene, box, 100, 100, 100, flasan, _count));
_count += 1;
_fla.text = _count + "/100 ";
}
function completeHandler(e:TimerEvent):void {
TwitterGo(n);
}
}
private var n:Number = 0;
private function endcnt():void {
//if (_count >= 100) {
n = 0;
for (var i:Number = 0; i < _ball.length - 1; i++) {
if (_ball[i].coords.y >= 400) {
n += 1
}
}
//_ochifla.text = "Falling flash : " + (n) + "fl"
_ochifla.text = "Falling flash : " + "???" + " fl"
return
//}
}
//参考 http://wonderfl.net/c/uUEA
// twitterのurl
private var twitter :String = "http://twitter.com/home?status=";
// メッセージ
private var message :String = "post message";
// 誘導したいurl
private var targetURL:String = "http://wonderfl.net/c/kcii";
// ハッシュタグ
private var hashTag :String = "%23wonderfl"
// ボタン
private var button:PushButton;
private function TwitterGo(test:Number):void {
message = "あなたは" + test + "フラを奈落の底に落としました・・・" + "flash愛情度" + (100-test) + "%"
button = new PushButton( this, 340, 15, "twitter")
addChild(button);
button.addEventListener( MouseEvent.CLICK, clickHandler );
}
/**
* クリック
* @param e
*/
private function clickHandler( e:MouseEvent ):void {
postTweet();
}
/**
* Twitterのサイトに行き、ポストする用意をする。
*/
private function postTweet():void {
navigateToURL( new URLRequest( twitter + escapeMultiByte( message ) + " " + targetURL + " " + hashTag ) );
}
}
}
import alternativ5.engine3d.core.Mesh;
import alternativ5.engine3d.primitives.Plane;
import alternativ5.engine3d.primitives.Box;
import alternativ5.types.Set;
import alternativ5.engine3d.physics.Collision
import alternativ5.engine3d.physics.EllipsoidCollider
import alternativ5.types.Point3D;
import alternativ5.engine3d.materials.TextureMaterial;
import alternativ5.types.Texture;
import flash.geom.Point;
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.text.TextField;
class Ball extends Box {
private var collider:EllipsoidCollider;
//private var collider2:EllipsoidCollider;
private var collision:Collision;
private var nowPoint:Point3D; //現在の位置
private var newPoint:Point3D; //移動位置
private var speed:Point3D; //スピード
private var deceleration:Number; //跳ね
private var acceleration:Point3D; //加速
private var tempPoint:Point3D;
private var _pball:Ball;
public var _cnt:Number=0;
private var box:Ball;
private var parent3D:Object3D;
private var parentMc:Sprite;
private var ochita:TextField;
private var tempBall:Mesh;
public function Ball(mc:Sprite, scene:Scene3D, mc3D:Object3D, w:Number, h:Number, l:Number, img:BitmapData, cnt:Number = 0 ) {
super(w,h,l);
parentMc=mc
parent3D = mc3D
_cnt = cnt;
this.cloneMaterialToAllSurfaces(new TextureMaterial(new Texture(img),1,false,true));
parent3D.addChild(this);
tempPoint= new Point3D();
newPoint = new Point3D();
nowPoint = new Point3D (0, -800 - (120 * _cnt), 0);
this.coords = nowPoint;
speed=new Point3D(); //スピード
deceleration = 0.1; //減速
//どうっすかなー。。
var n:Number = 0;
if (Math.random() * 10 >= 5) {
n = 0.01
} else {
n = -0.01
}
acceleration=new Point3D(n,0.3,0); //加速
//衝突判定に使う球の作成
collider = new EllipsoidCollider (scene,w/2,h/2,l/2);
collision = new Collision();
collider.collisionSet=new Set()
speed = new Point3D();
parentMc.addEventListener(Event.ENTER_FRAME, onRenderTick);
}
//public function init():void {
//スピードの初期化
//speed = new Point3D();
//位置の初期化
//nowPoint = new Point3D (0, -800 - (100 * _cnt), 0);
//}
private function onRenderTick(e:Event):void {
speed.add(acceleration);
//何かに衝突したかどうかをcheckし、真なら衝突情報をcollisionに返す
if (collider.getCollision (nowPoint, speed, collision)) {
//if (tempBall != collision.face.mesh) {
//tempBall=collision.face.mesh
//衝突方向と進行方向の内積をとり、新たな方向を割り出す。
tempPoint=collision.normal
tempPoint.multiply(2 * Point3D.dot(tempPoint, speed));
speed.subtract(tempPoint);
speed.multiply(deceleration);
//} else {
// collider.calculateDestination(nowPoint, speed , newPoint);
//}
} else {
//現在地(nowPoint)から移動分(speed ベクトル)を移動させ、衝突を判定した上で、新しい移動座標をdestinationPointに返します
collider.calculateDestination(nowPoint, speed ,newPoint);
}
nowPoint.copy(newPoint);
this.coords = nowPoint;
if (this.nowPoint.y >= 8000) {
del();
}
//this.rotationY += 0.1 * Math.PI / 180;
}
private function del():void {
parentMc.removeEventListener(Event.ENTER_FRAME, onRenderTick);
parent3D.removeChild(this);
delete this;
}
}
//////////////////////////////////////////////////////////////////////////////////
/**
* BasicTemplate for Alternativa3D
* Alternativa3Dを扱いやすくするためのテンプレートです
* @author Yasu
*/
import alternativ5.engine3d.controllers.CameraController;
import alternativ5.engine3d.core.Camera3D;
import alternativ5.engine3d.core.Object3D;
import alternativ5.engine3d.core.Scene3D;
import alternativ5.engine3d.display.View;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import alternativ5.engine3d.materials.FillMaterial
class BasicTemplate extends Sprite{
/**
* シーンインスタンスです。
*/
public var scene:Scene3D;
/**
* ビューインスタンスです。
*/
public var view:View;
/**
* カメラインスタンスです。
*/
public var camera:Camera3D;
/**
* カメラコントローラーです。
*/
public var cameraContoller:CameraController;
private var _viewWidth:int;
private var _viewHeight:int;
private var _scaleToStage:Boolean;
/**
* 新しい BasicTemplate インスタンスを作成します。
* @param viewWidth
* @param viewHeight
* @param scaleToStage
*/
public function BasicTemplate(viewWidth:int=640, viewHeight:int=480, scaleToStage:Boolean = true) {
_viewWidth = viewWidth;
_viewHeight = viewHeight;
_scaleToStage = scaleToStage;
// Creating scene
scene = new Scene3D();
scene.splitAnalysis = false; // not analysis for performance
scene.root = new Object3D();
// Adding camera
camera = new Camera3D();
camera.z = -1000;
scene.root.addChild(camera);
// camera contoller
cameraContoller = new CameraController(this);
cameraContoller.camera = camera;
// set view
view = new View();
view.camera = camera;
addChild(view);
// stage
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
/**
* 初期化されたときに実行されるイベントです。
* 初期化時に実行したい処理をオーバーライドして記述します。
*/
protected function atInit():void {}
/**
* 初期化されたときに実行されるイベントです。
* 初期化時に実行したい処理を記述します。
*/
private var _onInit:Function = function():void { };
public function get onInit():Function { return _onInit; }
public function set onInit(value:Function):void {
_onInit = value;
}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング前に実行したい処理をオーバーライドして記述します。
*/
protected function atPreRender():void {}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング前に実行したい処理を記述します。
*/
private var _onPreRender:Function = function():void{};
public function get onPreRender():Function { return _onPreRender; }
public function set onPreRender(value:Function):void {
_onPreRender = value;
}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング後に実行したい処理をオーバーライドして記述します。
*/
protected function atPostRender():void {
}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング後に実行したい処理を記述します。
*/
protected var _onPostRender:Function = function():void{};
public function get onPostRender():Function { return _onPostRender; }
public function set onPostRender(value:Function):void {
_onPostRender = value;
}
/**
* レンダリングを開始します。
*/
public function startRendering():void {
addEventListener(Event.ENTER_FRAME, onRenderTick);
}
/**
* レンダリングを停止します。
*/
public function stopRendering():void {
removeEventListener(Event.ENTER_FRAME, onRenderTick);
}
/**
* シングルレンダリング(レンダリングを一回だけ)を実行します。
*/
public function singleRender():void {
onRenderTick();
}
/**
* @private
*/
private function init(e:Event = null):void {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.HIGH;
// resize
stage.addEventListener(Event.RESIZE, onResize);
onResize(null);
// render
startRendering();
atInit();
_onInit();
}
/**
* @private
*/
private function onRenderTick(e:Event = null):void {
atPreRender();
_onPreRender();
scene.calculate();
atPostRender();
_onPostRender();
}
/**
* public
*/
protected function onResize(event:Event = null):void {
if (_scaleToStage) {
view.width = stage.stageWidth;
view.height = stage.stageHeight;
}else {
view.width = _viewWidth;
view.height = _viewHeight;
}
}
}