CharacterChip Test
キャラクターチップの実装実験 その1 検証内容まとめ http://d.hatena.ne.jp/nenjiru/20110908/charachip
♥0 |
Line 119 |
Modified 2011-09-08 18:05:05 |
MIT License
archived:2017-03-10 14:40:25
| (replaced)
Related images
ActionScript3 source code
/**
* Copyright nenjiru ( http://wonderfl.net/user/nenjiru )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/uO7L
*/
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import net.hires.debug.Stats;
[SWF(frameRate="60", width="465", height="465")]
/**
* キャラクターチップの実装実験 その1
* ステージサイズのビットマップに直接描画
*
* @author nenjiru
*/
public class CharacterChipTest extends Sprite
{
private static const URL:String = "http://assets.wonderfl.net/images/related_images/f/f0/f0d9/f0d908a88f90364e927c41c65ec84590247aeee3";
public function CharacterChipTest():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE , complete);
loader.load(new URLRequest(URL), new LoaderContext(true));
}
private function complete(event:Event):void
{
var loaderInfo:LoaderInfo = event.target as LoaderInfo;
loaderInfo.removeEventListener(Event.COMPLETE , complete);
var source:Bitmap = loaderInfo.content as Bitmap;
draw(source.bitmapData);
}
private function draw(source:BitmapData):void
{
var canvas:BitmapData = new BitmapData(465, 465, false, 0xFFFFFFFF);
addChild(new Bitmap(canvas));
var chara:CharacterChip;
var charas:Vector.<CharacterChip> = new Vector.<CharacterChip>();
//3000体生成
for (var i:int = 0; i < 3000; i++)
{
chara = new CharacterChip(source.width, source.height, 4, 3);
chara.x = 7 * (i % 65);
chara.y = 9 * (i / 65 >> 0);
chara.pattern = 1;
charas.push(chara);
}
stage.addEventListener(Event.ENTER_FRAME, function (e:Event):void
{
canvas.lock();
canvas.fillRect(canvas.rect, 0xFFFFFFFF);
for (var i:int = 0, n:int = charas.length; i < n; i++)
{
charas[i].update();
canvas.copyPixels(source, charas[i].rectangle, charas[i].point);
}
canvas.unlock();
});
addChild(new Stats());
}
}
}
import flash.geom.Point;
import flash.geom.Rectangle;
/**
* キャラクターチップオブジェクト
*
* @author nenjiru
*/
class CharacterChip
{
private var _row:int;
private var _col:int;
private var _frame:int;
private var _pattern:int;
private var _rect:Rectangle;
private var _point:Point;
/**
* キャラクターチップ画像サイズと、行列数を指定
*
* @param width キャラクターチップ画像の横幅
* @param height キャラクターチップ画像の縦幅
* @param row 画像の横列(方向パターン)
* @param col 画像の縦列(アニメーションフレーム)
*/
public function CharacterChip(width:Number, height:Number, row:int, col:int)
{
_row = row;
_col = col;
_rect = new Rectangle(0, 0, width / col >> 0, height / row >> 0);
_point = new Point();
}
/**
* 表示横列を示す
*
* アニメーションパターンに相当する
* 指定行を表示(反映)させるには、 update メソッドを実行する
*/
public function get pattern():int
{
return _pattern;
}
public function set pattern(value:int):void
{
if (0 <= value && _row > value)
{
_pattern = value;
}
}
/**
* X座標
*/
public function get x():Number
{
return _point.x;
}
public function set x(value:Number):void
{
_point.x = value;
}
/**
* Y座標
*/
public function get y():Number
{
return _point.y;
}
public function set y(value:Number):void
{
_point.y = value;
}
/**
* ポイントオブジェクト
*/
public function get point():Point
{
return _point;
}
/**
* 矩形オブジェクト
*/
public function get rectangle():Rectangle
{
return _rect;
}
/**
* クリップ位置の更新
*/
public function update():void
{
_rect.x = (_frame++ % _col) * _rect.width;
_rect.y = (_pattern * _rect.height);
}
}
