forked from: RasterTransition
Copyright Event ( http://wonderfl.net/user/Event )
MIT License ( http://www.opensource.org/licenses/mit-license.php )
Downloaded from: http://wonderfl.net/c/eVwY
RasterEffectのRasterImageクラスをちょっといじって流用
http://wonderfl.net/c/lTDX
クリックしたY座標の位置を頂点にしてラスタースクロールします
※フルスクリーンだと表示イマイチ(手抜き)
/**
* Copyright hkdh ( http://wonderfl.net/user/hkdh )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/dSRX
*/
// forked from sakusan393's RasterTransition
/**
* Copyright Event ( http://wonderfl.net/user/Event )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/eVwY
*/
/*
* RasterEffectのRasterImageクラスをちょっといじって流用
* http://wonderfl.net/c/lTDX
*
*
* クリックしたY座標の位置を頂点にしてラスタースクロールします
*
* ※フルスクリーンだと表示イマイチ(手抜き)
*
* */
package {
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.net.URLRequest;
import flash.events.Event;
import flash.net.URLLoader;
import flash.display.*;
import flash.system.LoaderContext;
import flash.text.TextField;
[SWF(width="465", height="465", backgroundColor="0x0", frameRate="60")]
public class MediaRSSReader2 extends Sprite {
private var _feed:String = "http://api.flickr.com/services/feeds/photos_public.gne?tags=Pablo Picasso&format=rss_200";
private var media:Namespace = new Namespace("http://search.yahoo.com/mrss/");
private var _loaderArray:Array = [];
private var _loadCount:int;
private var _maxCount:int;
private var _sourceBmd:BitmapData;
private var _W:int = 465;
private var _H:int = 465;
private var _point:Point;
private var _currentPage:int;
private var _left:Sprite;
private var _right:Sprite;
private var _imageNum:int;
private var _tf:TextField;
public function MediaRSSReader2() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
//_W = stage.stageWidth;
//_H = stage.stageHeight;
var ldr:URLLoader = new URLLoader;
ldr.addEventListener(Event.COMPLETE, ldrCompleteHandler)
ldr.load(new URLRequest(_feed));
_tf = new TextField();
_tf.textColor = 0xFFFFFF;
_imageNum = 0;
_tf.text = "image:loading...";
addChild(_tf);
_tf.x = 10;
_tf.y = 10;
}
private function ldrCompleteHandler(e:Event):void
{
var ldr:URLLoader = URLLoader(e.target);
var xl : XMLList = XML(ldr.data)..media::content;
var len : uint = xl.length();
var urlArray:Array = [];
for(var i : uint = 0;i < len;i++){
if(xl[i].@height * xl[i].@width <= 1000 * 1000){
urlArray.push(xl[i].@url.toXMLString());
}
}
ldr.removeEventListener(Event.COMPLETE, ldrCompleteHandler);
//var xml:String = XML(ldr.data)..media::content.@url.toXMLString();
//var array:Array = xml.split('\n');
_maxCount = urlArray.length;
_currentPage = (0 | _maxCount / 2);
trace("_maxCount : " + _maxCount);
if (_maxCount % 2 == 0) _maxCount -= 1;
if (_maxCount > 15) _maxCount = 15;
onImageLoaded(urlArray);
}
private function onImageLoaded($images:Array):void {
var ldr:Loader;
for (var i:int = 0; i < _maxCount; ++i) {
ldr = new Loader;
ldr.load(new URLRequest($images[i]), new LoaderContext(true) );
_loaderArray.push(ldr);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
}
}
private function completeHandler(e:Event):void
{
_imageNum++;
_tf.text = "image:" + _imageNum + " / "+ _maxCount;
_loadCount++;
if (_loadCount == _maxCount) setSourceBitmapData();
}
private function setSourceBitmapData():void
{
_point = new Point();
_sourceBmd = new BitmapData(_W * _maxCount, _H, false, 0x0);
var i:int;
for (i = 0; i < _maxCount; i++)
{
var loader:Loader = _loaderArray[i];
_sourceBmd.draw(_loaderArray[i], new Matrix(_W / loader.width, 0, 0, _H / loader.height, _W * i, 0));
trace("_sourceBmd.height : " + _sourceBmd.height);
trace("_sourceBmd.width : " + _sourceBmd.width);
}
_sourceBmd.height
var img:RasterImage = addChild(new RasterImage(_sourceBmd, _point,.02,.93,5,2000,100)) as RasterImage;
img.width
trace("img.width : " + img.width);
img.x = -_W*(0|_maxCount/2)
stage.addEventListener(MouseEvent.CLICK, clickHandler);
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
_left = new Sprite();
_left.graphics.beginFill(0x0,.4);
_left.graphics.moveTo(0, 0);
_left.graphics.lineTo(80, 150);
_left.graphics.lineTo(0, 300);
_left.graphics.lineTo(0, 0);
_left.x = _W - _left.width - 10;
_left.y = _H / 2 - _left.height / 2;
addChild(_left).visible = false;
_right = new Sprite();
_right.graphics.beginFill(0x0,.4);
_right.graphics.moveTo(80, 0);
_right.graphics.lineTo(0, 150);
_right.graphics.lineTo(80, 300);
_right.graphics.lineTo(80, 0);
addChild(_right).visible = false;
_right.x = 10;
_right.y = _H / 2 - _right.height / 2;
}
private function clickHandler(e:MouseEvent):void
{
trace("mouseX : " + mouseX);
if (mouseX > _W / 2)
{
if (_currentPage == _maxCount-1) return;
_currentPage++;
}
else
{
if (_currentPage == 0) return;
_currentPage--;
}
_point.x = 465 * (_currentPage)+ 465/2
_point.y = mouseY;
}
private function enterFrameHandler(e:Event):void
{
if (mouseX < _W / 2)
{
_right.visible = false;
_left.visible = false;
if (_currentPage != 0) _right.visible = true;
}
else
{
_left.visible = false;
if (_currentPage != _maxCount - 1)_left.visible = true;
_right.visible = false;
}
}
}
}
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;
class RasterImage extends Sprite
{
private var _pointVector:Vector.<PhysicalPoint>;
private var _isHorizon:Boolean;
private var _target:Point;
private var _sourceBmd:BitmapData;
private var _canvasBmd:BitmapData;
private var _sourceH:int;
private var _sourceW:int;
private var _length:int;
private var _friction:Number;
private var _spring:Number;
private var _copyRect:int;
private var _startPoint:int;
private var _pointOffset:int;
private var _frequency:int = 10;
private var _elasticity:int = 100;
private var _elasticSpeed:int = 1000;
private var _elasticSpeedPosition:int = 0;
public function RasterImage(sourceBmd:BitmapData,target:Point,spring:Number = 0.1,friction:Number = 0.99,frequency:int = 100,elasticity:int =40,elasticitySpeed:int = 1000,isHorizon:Boolean = true,isRepeat:Boolean = false )
{
this.addEventListener(Event.ADDED_TO_STAGE , init);
_target = target;
_friction = friction;
_spring = spring;
_frequency = frequency;
_elasticity = elasticity;
_elasticSpeed = elasticitySpeed;
//ビットマップデータの大きさを保持
_sourceW = sourceBmd.width;
_sourceH = sourceBmd.height;
var i:int;
//画像リピート
//画像をリピートする
if (isRepeat)
{
//振れ方向が横の場合
if (isHorizon)
{
_copyRect = _sourceW * 3;
_startPoint = _sourceW * 1.5;
_sourceBmd = new BitmapData(sourceBmd.width * 3, sourceBmd.height * 3);
for(i = 0; i< 3; i++)
{
_sourceBmd.copyPixels(sourceBmd,new Rectangle(0,0,sourceBmd.width,sourceBmd.height),new Point(sourceBmd.width*i,0));
}
}
//振れ方向が縦の場合
else
{
_copyRect = _sourceH * 3;
_startPoint = _sourceH * 1.5;
_sourceBmd = new BitmapData(sourceBmd.width * 3, sourceBmd.height * 3);
for(i = 0; i< 3; i++)
{
_sourceBmd.copyPixels(sourceBmd,new Rectangle(0,0,sourceBmd.width,sourceBmd.height),new Point(0,sourceBmd.height*i));
}
}
}
//画像をリピートしない
else
{
_copyRect = _sourceW;
_startPoint = _sourceW / 2;
_sourceBmd = sourceBmd;
}
//振れ方向
//横方向
if (isHorizon)
{
_pointOffset = _sourceW / 2;
this.addEventListener(Event.ENTER_FRAME, horizonEnterFrameHandler);
_length = _sourceH;
//幅分のポイントデータ格納用
_pointVector = new Vector.<PhysicalPoint>(_length);
for (i = 0; i < _length; i++)
{
_pointVector[i] = new PhysicalPoint(_pointOffset, i, spring, friction);
}
}
//縦方向
else
{
_pointOffset = _sourceH / 2;
this.addEventListener(Event.ENTER_FRAME, verticalEnterFrameHandler);
_length = _sourceW;
//幅分のポイントデータ格納用
_pointVector = new Vector.<PhysicalPoint>(_length);
for (i = 0; i < _length; i++)
{
_pointVector[i] = new PhysicalPoint(i,_pointOffset, spring, friction);
}
}
}
private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
this.addEventListener(Event.REMOVED_FROM_STAGE, removeFromStageHandler);
//転写用のBitmapDataを生成
_canvasBmd = new BitmapData(_sourceW, _sourceH);
_canvasBmd.copyPixels(_sourceBmd, new Rectangle(0, 0, _sourceBmd.width, _sourceBmd.height), new Point());
var _bm:Bitmap = new Bitmap(_canvasBmd);
addChild(_bm);
}
private function removeFromStageHandler(e:Event):void
{
removeEventListener(Event.REMOVED_FROM_STAGE, removeFromStageHandler);
destroy();
}
//オブジェクトの削除
public function destroy():void
{
this.removeEventListener(Event.ENTER_FRAME, horizonEnterFrameHandler);
this.removeEventListener(Event.ENTER_FRAME, verticalEnterFrameHandler);
_sourceBmd.dispose();
_canvasBmd.dispose();
for (var i:int = 0; i < pointVector.length; i++)
{
pointVector[i] = null;
}
}
//横揺れ時のエンターフレーム処理
private function horizonEnterFrameHandler(e:Event):void
{
_canvasBmd.lock();
_elasticSpeedPosition += _elasticSpeed;
for (var i:int = 0,j:int = _elasticSpeedPosition; i < _sourceH; i++,j+= _elasticity)
{
//伸縮の計算
var offsetPoisition:Number = _frequency * Math.sin(j * 3.141592 / 180 / 100);
var v:int;
var num:Number = (i + offsetPoisition);
if (num > _sourceH) v = num - _sourceH;
else if (num < 0) v = num + _sourceH;
else v = num;
//位置移動の計算
var friction:Number = Math.sin( Math.PI /2/ (_target.y) * i)*.2 + .8;
if (_target.y == 0) friction = 0;
if (i > _target.y)
{
friction = Math.cos(Math.PI / 2/(_sourceH - _target.y) * (i - _target.y))*.2 + .8;
}
if ( _target.y == 0) friction = 0;
friction *= _friction;
_pointVector[i].friction = friction;
_pointVector[i].spring = spring;
_pointVector[i].ax = _target.x - _pointVector[i].posX;
_canvasBmd.copyPixels(_sourceBmd, new Rectangle(0, v, _copyRect, 1), new Point(-_startPoint +_pointVector[i].posX, i));
}
_canvasBmd.unlock();
}
//縦揺れ時のエンターフレーム処理
private function verticalEnterFrameHandler(e:Event):void
{
_canvasBmd.lock();
_elasticSpeedPosition += _elasticSpeed;
for (var i:int = 0,j:int = _elasticSpeedPosition; i < _sourceH; i++,j+= _elasticity)
{
//伸縮の計算
var offsetPoisition:Number = _frequency * Math.sin(j * 3.141592 / 180 / 100);
var v:int;
var num:Number = (i + offsetPoisition);
if (num > _sourceW) v = num - _sourceW;
else if (num < 0) v = num + _sourceW;
else v = num;
//位置移動の計算
var friction:Number = Math.sin( -Math.PI / 2 + Math.PI / (_target.x) * i)*.5 + .5;
if (i > _target.x)
{
friction = Math.sin(Math.PI / 2 + Math.PI / (_sourceH - _target.x) * (i - _target.x))*.5 + .5;
}
if ( _target.x == 0) friction = 0;
if ( _target.x == _sourceW) friction = 0;
friction *= _friction;
_pointVector[i].friction = friction;
_pointVector[i].spring = spring;
_pointVector[i].ay = _target.y - _pointVector[i].posY;
_canvasBmd.copyPixels(_sourceBmd, new Rectangle(v, 0, 1, _copyRect), new Point(i,-_startPoint +_pointVector[i].posY));
}
_canvasBmd.unlock();
}
public function get pointVector():Vector.<PhysicalPoint> { return _pointVector; }
public function get friction():Number { return _friction; }
public function set friction(value:Number):void
{
_friction = value;
}
public function get spring():Number { return _spring; }
public function set spring(value:Number):void
{
_spring = value;
}
public function set frequency(value:int):void
{
_frequency = value;
}
public function set elasticity(value:int):void
{
_elasticity = value;
}
public function set elasticSpeed(value:int):void
{
_elasticSpeed = value;
}
}
import flash.display.*;
import flash.events.TimerEvent;
class PhysicalPoint {
private var _posX:Number = 0;
private var _posY:Number = 0;
private var _spring:Number = 0;
private var _friction:Number;
private var _vx:Number = 0;
private var _vy:Number = 0;
private var _ax:Number = 0;
private var _ay:Number = 0;
private var _gravityX:Number = 0;
private var _gravityY:Number = 0;
public function PhysicalPoint(posX:Number = 0, posY:Number = 0, spring:Number = .06, friction:Number = .8)
{
this._spring = spring;
this._friction = friction;
_posX = posX;
_posY = posY;
}
public function get posX():Number {
_ax = _ax * _spring;
_vx += _ax;
_vx += _gravityX;
_vx *= _friction;
_posX += _vx;
return _posX;
}
public function get posY():Number {
_ay = _ay * _spring;
_vy += _ay;
_vy += _gravityY;
_vy *= _friction;
_posY += _vy;
return _posY;
}
public function set ax(value:Number):void
{
_ax = value;
}
public function set spring(value:Number):void
{
_spring = value;
}
public function set friction(value:Number):void
{
_friction = value;
}
public function set ay(value:Number):void
{
_ay = value;
}
}