forked from: Frocessing3D あそび
/**
* Copyright atsushi015 ( http://wonderfl.net/user/atsushi015 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/eZTR
*/
// forked from keim_at_Si's Frocessing3D あそび
package {
import flash.display.*;
import flash.geom.*;
import frocessing.display.*;
import org.si.sion.*;
import org.si.sion.events.*;
public class FlashTest extends F5MovieClip3D {
public var blocks:Vector.<Block> = new Vector.<Block>(54);
public var ball:Ball = new Ball();
public var padle:Padle = new Padle();
private var ax;
private var ay;
public function setup() : void {
$ = this;
ax = Math.floor(Math.random() * 9);
ay = Math.floor(Math.random() * 6);
stage.frameRate = 30;
colorMode(HSV, 1, 1, 1, 1);
imageMode(CENTER);
_createTexture();
for (var i:int = 0; i<9; i++) {
for (var j:int = 0; j<6; j++) {
if (i == ax && j == ay)
blocks[i+j*9] = new Block(i*40-160, j*24-150, 1);
else
blocks[i+j*9] = new Block(i*40-160, j*24-150, j/7);
}
}
breakSound = driver.compile("%5@7@v32,16l32o7gd");
reflectSound = driver.compile("%5@7@v32,16l32o6cfe-b-");
ball.reset(-10, 0, -1, 6);
driver.addEventListener(SiONTrackEvent.BEAT, _onBeat);
driver.play("t150;#EFFECT1{delay};%5@0s24,-128v24o2l8q0$[c.c.cr|crc]c16c16rc;%2@f64,1@1l4q0s32$rc;%2@3l16v3s40q0$c;%5@2l16v6@f80,2o3q0s20$crfb-");
}
public function draw() : void {
var b:Block;
background(0, 0, 0);
translate(232.5, 232.5);
rotateX(0.5);
ball.update();
padle.update();
for each (b in blocks) {
switch (b.eval(ball.x, ball.y)) {
case 0: break;
case 1: if (ball.vx>0) ball.vx = -ball.vx; break;
case 2: if (ball.vx<0) ball.vx = -ball.vx; break;
case 3: if (ball.vy>0) ball.vy = -ball.vy; break;
case 4: if (ball.vy<0) ball.vy = -ball.vy; break;
}
}
if (padle.eval(ball.x, ball.y)) {
driver.sequenceOn(reflectSound, null, 0, 0, 1);
ball.reflect(padle.angle);
}
stroke(0, 0, 0.5);
strokeWeight(1);
padle.draw();
for each (b in blocks) b.draw();
noStroke();
Particle.drawAll();
ball.draw();
}
public function mousePressed() : void {
padle.hold();
}
public function mouseReleased() : void {
padle.release();
}
private function _onBeat(e:SiONTrackEvent) : void {
ball.size = 32;
}
public var tex:Vector.<BitmapData> = new Vector.<BitmapData>(16);
private function _createTexture() : void {
for (var i:int=0; i<16; i++) {
var t:BitmapData = tex[i] = new BitmapData(32, 32, true, 0),
c:uint = color(i*0.0625, 1, 1);
t.draw(_radialGradientShape(32, [c,c], [1, 0], [0,255]));
}
}
private function _radialGradientShape(size:Number, color:Array, alpha:Array, ratio:Array) : Shape {
mat.createGradientBox(size, size, 0, 0, 0);
shp.graphics.clear();
shp.graphics.beginGradientFill(GradientType.RADIAL, color, alpha, ratio, mat);
shp.graphics.drawRect(0, 0, size, size);
shp.graphics.endFill();
return shp;
}
private var shp:Shape = new Shape(), mat:Matrix = new Matrix();
}
}
import org.libspark.betweenas3.*;
import org.libspark.betweenas3.tweens.*;
import org.libspark.betweenas3.easing.*;
import org.si.sion.*;
import frocessing.core.F5C;
var $:FlashTest;
var driver:SiONDriver = new SiONDriver();
var breakSound:SiONData;
var reflectSound:SiONData;
class Background {
public var scroll:Number;
function Background() {
}
public function draw() : void {
}
}
class Block {
static public var w:Number=38, h:Number=20;
static public var hw:Number=w*0.5, hh:Number=h*0.5;
public var x:Number, y:Number, hue:Number, isAlive:Boolean;
function Block(x:Number, y:Number, hue:Number){
this.x = x;
this.y = y;
this.hue = hue;
isAlive = true;
}
public function draw() : void {
if (isAlive) {
$.pushMatrix();
$.translate(x, y);
$.fill(hue, 0.5, 1, 0.75);
$.box(w, h, h);
$.popMatrix();
}
}
public function eval(bx:Number, by:Number) : int {
if (isAlive && x-hw<bx && bx<x+hw && y-hh<by && by<y+hh) {
driver.sequenceOn(breakSound, null, 0, 0, 1);
isAlive = false;
for (var i:int=0; i<8; i++) Particle.alloc(x, y, hue);
if (bx<x-18) return 1;
if (x+18<bx) return 2;
if (by<y) return 3;
return 4;
}
return 0;
}
}
class Particle {
public var x:Number, y:Number, z:Number, hue:Number;
public var angle:Number, rot:Number, alpha:Number, da:Number;
function Particle() {}
public function draw() : void {
$.pushMatrix();
$.fill(hue, 0.5, 1, alpha);
$.beginShape(F5C.TRIANGLES);
$.translate(x, y, z);
$.rotateZ(angle);
$.vertex3d(10,-5,-5);
$.vertex3d(-5,10,-5);
$.vertex3d(-5,-5,10);
$.endShape();
$.popMatrix();
angle += rot;
alpha -= da;
z -= 1;
}
static private var _freeList:Array = [], _activeList:Array = [];
static public function alloc(x:Number, y:Number, hue:Number) : void {
var inst:Particle = _freeList.pop() || new Particle();
var time:Number = $.random(1,2);
x+=$.random(-10,10);
y+=$.random(-5,5);
inst.x = x;
inst.y = y;
inst.z = 0;
inst.hue = hue;
inst.alpha = 0.6;
inst.da = 0.58/(time*30);
inst.rot = $.random(-0.1,0.1);
inst.angle = $.random(-3.14,3.14);
var t:ITween = BetweenAS3.to(inst, {x:x+$.random(-40,40), y:y+$.random(-20,20)}, time, Expo.easeOut);
t.onComplete = inst.free;
t.play();
_activeList.push(inst);
}
public function free() : void {
_activeList.splice(_activeList.indexOf(this), 1);
_freeList.push(this);
}
static public function drawAll() : void {
for each (var p:Particle in _activeList) {
p.draw();
}
}
}
class Ball {
public var x:Number=0, y:Number=0, vx:Number, vy:Number, size:Number=16;
function Ball() {
}
public function reset(x:Number, y:Number, vx:Number, vy:Number) : void {
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
}
public function draw() : void {
$.pushMatrix();
$.translate(x, y);
$.image2d($.tex[0], 0, 0, 0, size, size);
$.popMatrix();
size *= 0.9;
}
public function update() : void {
x += vx;
y += vy;
if (x<-200 && vx<0) { x=-200; vx=-vx; }
if (x> 200 && vx>0) { x= 200; vx=-vx; }
if (y<-230 && vy<0) { y=-230; vy=-vy; }
if (y> 200 && vy>0) { y= 200; vy=-vy; }
}
public function reflect(angle:Number) : void {
var nx:Number = -Math.cos(angle), ny:Number = Math.sin(angle),
r:Number = (vx*ny + vy*nx) * 2;
vx = vx - r * ny;
vy = vy - r * nx;
vx *= 1.05;
vy *= 1.05;
x += vx;
y += vy;
}
}
class Padle {
public var x:Number=0, vx:Number=0, len:Number=50;
public var angle:Number=0, power:Number=0, isHolding:Boolean=false;
function Padle() {
}
public function draw() : void {
$.pushMatrix();
$.translate(x, 160);
$.rotateZ(angle);
$.translate(0, -power);
$.noFill();
$.box(len*2, 10, 10);
$.popMatrix();
}
public function update() : void {
vx = (($.pmouseX - 232.5) - x) * 0.1;
if (!isHolding) x += vx;
angle = vx * 0.02;
}
public function eval(bx:Number, by:Number) : Boolean {
return (150 < by && by < 170 && x-len < bx && bx < x+len);
}
public function hold() : void { isHolding = true; }
public function release() : void { isHolding = false; }
}