forked from: google image
... @author lizhi
♥0 |
Line 403 |
Modified 2011-09-25 01:13:44 |
MIT License
archived:2017-03-20 03:07:21
| (replaced)
ActionScript3 source code
/**
* Copyright salmonboy11 ( http://wonderfl.net/user/salmonboy11 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/x8a5
*/
// forked from lizhi's google image
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.geom.Point;
import flash.net.URLRequest;
import flash.system.Security;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
/**
* ...
* @author lizhi
*/
[SWF(width=465,height=465,backgroundColor=0xffffff,frameRate=60)]
public class GoogleTest extends Sprite
{
private var sprite:BitmapDataSprite;
private var numcols:int;
private var numrows:int;
private var isMouseDown:Boolean = false;
private var loader:Loader;
private var info:TextField
public function GoogleTest()
{
Security.loadPolicyFile("http://assets.wonderfl.net/crossdomain.xml");
loader = new Loader();
loader.load(new URLRequest("http://assets.wonderfl.net/images/related_images/4/4e/4e97/4e973c0b6096cdf13fa71af7c6836caecac9514d"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loader_progress);
info = new TextField;
addChild(info);
info.autoSize = TextFieldAutoSize.LEFT;
}
private function loader_progress(e:ProgressEvent):void
{
info.text = e.bytesLoaded + "/" + e.bytesTotal;
}
private function loader_complete(e:Event):void
{
var bmd:BitmapData = (loader.content as Bitmap).bitmapData;
var world:World = new World;
world.start();
sprite = new BitmapDataSprite(world);
var sw:int = bmd.width / 6;
var sh:int = bmd.height / 3;
var offest:Point = new Point(-int(bmd.width / 12), -int(bmd.height / 6));
var gap:int = 10;
numcols = 6;
numrows = 3;
for (var y:int = 0; y < numrows;y++ ){
for (var x:int = 0; x < numcols/2;x++ ) {
sprite.addAnimation(AnimationParser.parserByIndexs(bmd,sw , sh, gap, Vector.<uint>([y*numcols+x]),offest, (y*numcols+x)+""));
sprite.addAnimation(AnimationParser.parserByIndexs(bmd,sw , sh, gap, Vector.<uint>([y*numcols+x,y*numcols+x+3]),offest,y*numcols+x+3+""));
}
}
sprite.play("7");
world.add(sprite);
sprite.x = stage.stageWidth / 2;
sprite.y = stage.stageHeight / 2;
addChild(world);
stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
stage.addEventListener(MouseEvent.MOUSE_DOWN, stage_mouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
}
private function stage_mouseUp(e:MouseEvent):void
{
isMouseDown = false;
stage_mouseMove(null);
}
private function stage_mouseDown(e:MouseEvent):void
{
isMouseDown = true;
stage_mouseMove(null);
}
private function stage_mouseMove(e:MouseEvent):void
{
var dx:Number = mouseX - sprite.x;
var dy:Number = mouseY - sprite.y;
var w:Number = 50;
var x:int = 1;
if (dx<-w) {
x = 0;
}else if (dx>w) {
x = 2;
}
var y:int = 1;
if (dy<-w) {
y = 0;
}else if (dy>w) {
y = 2;
}
sprite.play((y*numcols+x+(isMouseDown?3:0))+"",sprite.frame);
}
}
}
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
class AnimationData
{
public var name:String;
public var frames:Vector.<uint>;
public var bmds:Vector.<BitmapData>;
public var offset:Point;
public var wh:Point;
public function AnimationData()
{
}
public function updateWH():void {
if (wh == null) wh = new Point;
for each(var bmd:BitmapData in bmds) {
wh.x = wh.x < bmd.width?bmd.width:wh.x;
wh.y = wh.y < bmd.height?bmd.height:wh.y;
}
}
}
class AnimationParser
{
/**
* 最基本的生成函数
*/
static public function parser(bmds:Vector.<BitmapData>,frames:Vector.<uint>, offset:Point,name:String):AnimationData {
var ani:AnimationData = new AnimationData;
ani.bmds = bmds;
ani.updateWH();
ani.frames = frames;
ani.name = name;
ani.offset = offset;
return ani;
}
/**
* 动态间隔生成
*/
static public function parserDynamicGap(bmds:Vector.<BitmapData>, gap:int, offset:Point, name:String):AnimationData {
var frames:Vector.<uint> = new Vector.<uint>;
for (var i:int = 0; i < bmds.length;i++ ) {
for (var j:int = 0; j <= gap;j++ ) {
frames.push(i);
}
}
return parser(bmds,frames,offset,name);
}
/**
* 根据rect生成
*/
static public function parserByRectsAndGap(bmd:BitmapData, rects:Vector.<Rectangle>, gap:int, offset:Point, name:String):AnimationData {
var bmds:Vector.<BitmapData> = new Vector.<BitmapData>;
for (var i:int = 0; i < rects.length; ++i)
{
var rect:Rectangle = rects[i];
var bmd1:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
bmd1.setVector(bmd1.rect, bmd.getVector(rect));
bmds.push(bmd1);
}
return parserDynamicGap(bmds, gap, offset, name);
}
static public function parserByIndexs(bmd:BitmapData, sw:int, sh:int, gap:int, indexs:Vector.<uint>,offset:Point, name:String):AnimationData {
var numCols:int = int(bmd.width / sw);
var bmds:Vector.<BitmapData> = new Vector.<BitmapData>;
var rect:Rectangle = new Rectangle(0, 0, sw, sh);
for each(var i:int in indexs) {
var x:int = i % numCols;
var y:int = i / numCols;
var bmd1:BitmapData = new BitmapData(sw, sh, true, 0);
rect.x = x * sw;
rect.y = y * sh;
bmd1.setVector(bmd1.rect, bmd.getVector(rect));
bmds.push(bmd1);
}
return parserDynamicGap(bmds, gap, offset, name);
}
static public function parserByMovieClip(mc:MovieClip, name:String, gap:int = 0):AnimationData {
var rects:Array = [];
var w:Sprite = new Sprite;
w.addChild(mc);
var bmds:Vector.<BitmapData> = new Vector.<BitmapData>;
var minX:int = int.MAX_VALUE;
var minY:int = int.MAX_VALUE;
for (var i:int = 0; i < mc.totalFrames;i++ ) {
mc.gotoAndStop(i + 1);
var r:Rectangle = w.getBounds(w);
minX = Math.min(minX, r.x);
minY = Math.min(minY, r.y);
rects.push(r);
}
for (i = 0; i < mc.totalFrames; i++ ) {
mc.gotoAndStop(i + 1);
r = rects[i];
r.left = minX;
r.top = minY;
var bmd:BitmapData = new BitmapData(Math.max(1, r.width), Math.max(1, r.height), true, 0);
bmd.draw(w, new Matrix(1, 0, 0, 1, -r.x, -r.y));
bmds.push(bmd);
}
return parserDynamicGap(bmds,gap,new Point(minX,minY),name);
}
}
class BitmapDataSprite extends Sprite
{
public var next:BitmapDataSprite;
public var pre:BitmapDataSprite;
private var image:Bitmap;
private var isPlaying:Boolean = false;
private var currentAnimationName:String;
public var currentAnimationBitmapData:BitmapData;
private var currentAnimationData:AnimationData;
private var _frame:int;
private var animations:Array;
public var bound:Rectangle;
public var gridindexs:Array;
public var onMouseOver:Function;
public var onMouseOut:Function;
private var world:World;
public var scaleGap:Number = 1;
public function BitmapDataSprite(world:World)
{
this.world = world;
}
public function update():void {
if (isPlaying && currentAnimationData) {
if (frame*scaleGap >= currentAnimationData.frames.length) _frame = 0;
currentAnimationBitmapData = currentAnimationData.bmds[currentAnimationData.frames[int(frame*scaleGap)]];
image.bitmapData = currentAnimationBitmapData;
_frame++;
}
}
public function play(name:String, frame:int = 0):void {
isPlaying = true;
_frame = frame;
currentAnimationName = name;
currentAnimationData = animations[name];
if (image == null) image = new Bitmap;
addChild(image);
image.x = currentAnimationData.offset.x;
image.y = currentAnimationData.offset.y;
}
public function stop(name:String, frame:int=0):void {
isPlaying = false;
}
public function addAnimation(ani:AnimationData):AnimationData {
if (bound == null) bound = new Rectangle;
if (bound.left > ani.offset.x) bound.left = ani.offset.x;
if (bound.top > ani.offset.y) bound.top = ani.offset.y;
if (bound.right < ani.offset.x + ani.wh.x) bound.right = ani.offset.x + ani.wh.x;
if (bound.bottom < ani.offset.y + ani.wh.y) bound.bottom = ani.offset.y + ani.wh.y;
if (animations==null) animations = [];
animations[ani.name] = ani;
return ani;
}
public function get frame():int
{
return _frame;
}
}class World extends BitmapDataSprite
{
private var sprite:BitmapDataSprite;
private var endSprite:BitmapDataSprite;
private var sprites:Array;
private var mouseSprites:Vector.<BitmapDataSprite>;
private var grid:Array;
private var _gridWidth:Number = 123;
private var _gridHeight:Number = 58;
private var firstPoint:Point = new Point;
private var secondObject:Point = new Point;
private var lastMouseSprite:BitmapDataSprite;
public function World()
{
super(null);
sprites = [];
mouseChildren = false;
}
public function add(sprite:BitmapDataSprite,enableMouse:Boolean=false):BitmapDataSprite {
addChild(sprite);
if (this.sprite == null) {
this.sprite = sprite;
}else {
endSprite.next = sprite;
sprite.pre = endSprite;
}
endSprite = sprite;
if (enableMouse) {
addToGrid(sprite);
addEventListener(MouseEvent.MOUSE_MOVE, testGrid);
addEventListener(MouseEvent.MOUSE_OUT, testGrid);
if (mouseSprites == null) mouseSprites = new Vector.<BitmapDataSprite>;
mouseSprites.push(sprite);
}
sprites.push(sprite);
return sprite;
}
public function sortByY():void {
sprites.sortOn("y", Array.NUMERIC);
while (numChildren > 0) {
removeChildAt(0);
}
for each(var s:BitmapDataSprite in sprites) {
addChild(s);
}
}
public function resetGridNoSort():void {
grid = [];
for each(var sprite:BitmapDataSprite in mouseSprites) {
for (var y:int = (sprite.y+sprite.bound.top)/ _gridHeight; y < int((sprite.y+sprite.bound.bottom) / _gridHeight) + 1;y++ ) {
if (grid[y] == null) grid[y] = [];
for (var x:int = (sprite.x+sprite.bound.left) / _gridWidth; x < int((sprite.x+sprite.bound.right) / _gridWidth) + 1;x++ ) {
if (grid[y][x] == null) grid[y][x] = [];
grid[y][x].unshift(sprite);
}
}
}
}
public function addToGrid(sprite:BitmapDataSprite):void {
if (grid == null) grid = [];
if (sprite.gridindexs) {
for (var i:int = 0; i < sprite.gridindexs.length;i+=2 ) {
var x:int = sprite.gridindexs[i];
var y:int = sprite.gridindexs[i + 1];
if (grid[y] && grid[y][x]) {
var index:int = grid[y][x].indexOf(sprite);
if (index != -1) grid[y][x].splice(index, 1);
}
}
}
sprite.gridindexs = [];
for (y = (sprite.y+sprite.bound.top)/ _gridHeight; y < int((sprite.y+sprite.bound.bottom) / _gridHeight) + 1;y++ ) {
if (grid[y] == null) grid[y] = [];
for (x = (sprite.x+sprite.bound.left) / _gridWidth; x < int((sprite.x+sprite.bound.right) / _gridWidth) + 1;x++ ) {
if (grid[y][x] == null) grid[y][x] = [];
var flag:Boolean = true;
for (i = 0; i < grid[y][x].length;i++ ) {
var temp:BitmapDataSprite = grid[y][x][i];
if (getChildIndex(temp)<getChildIndex(sprite)) {
grid[y][x].splice(i, 0, sprite);
flag = false;
break;
}
}
if (flag) grid[y][x].push(sprite);
sprite.gridindexs.push(x, y);
}
}
}
//格子鼠标碰撞检测类
private function testGrid(e:MouseEvent):void
{
var x:int = mouseX / _gridWidth;
var y:int = mouseY / _gridHeight;
var flag:Boolean = false;
if (grid && grid[y] && grid[y][x]) {
for each(var sprite:BitmapDataSprite in grid[y][x]){
var bmd:BitmapData = sprite.currentAnimationBitmapData;
firstPoint.x = sprite.x;
firstPoint.y = sprite.y;
secondObject.x = mouseX;
secondObject.y = mouseY;
if (bmd.hitTest(firstPoint,0,secondObject)) {
if (sprite == lastMouseSprite) {
}else {
if (lastMouseSprite) {
if (lastMouseSprite.onMouseOut!=null) lastMouseSprite.onMouseOut(lastMouseSprite);
}
lastMouseSprite = sprite;
if (lastMouseSprite.onMouseOver!=null) lastMouseSprite.onMouseOver(lastMouseSprite);
}
flag = true;
break;
}
}
}
if (!flag&&lastMouseSprite) {
if (lastMouseSprite.onMouseOut!=null) lastMouseSprite.onMouseOut(lastMouseSprite);
lastMouseSprite = null;
}
}
public function remove(sprite:BitmapDataSprite):BitmapDataSprite {
return null;
}
override public function update():void {
super.update();
var temp:BitmapDataSprite = sprite;
while (temp) {
temp.update();
temp = temp.next;
}
}
public function start():void {
addEventListener(Event.ENTER_FRAME, enterFrame);
}
public function pause():void {
removeEventListener(Event.ENTER_FRAME, enterFrame);
}
private function enterFrame(e:Event):void {
update();
trace("HAHAHA FRANCIAS!!!");
}
public function set gridWidth(value:Number):void
{
_gridWidth = value;
}
public function set gridHeight(value:Number):void
{
_gridHeight = value;
}
}
