as2: 2007年8月アーカイブ
AS2 にて
デバッグ用に作ったもの。
渡されたスコープから辿って3階層以内に見つからなければ null を返します。
デバッグ用に作ったもの。
渡されたスコープから辿って3階層以内に見つからなければ null を返します。
class FunctionUtil
{
public static function getCallerScope( func:Function , scope:Object ):Object
{
if( scope==undefined ) scope = _root;
var maxLevel = 4;
var level = (arguments[2]==undefined)? 0 : arguments[2];
if( func ){
for(var val in scope){
if( typeof( scope[val] )=="function" ){
if( scope[val]==func ){
return { scope:scope , functionName:val };
}
} else {
if(level<maxLevel){
if( typeof( scope[val] )=="movieclip" || typeof( scope[val] )=="object" ){
var res = getCallerScope( func , scope[val] , level+1 );
if( res ) return res;
}
}
}
}
}
return null;
}
}
例:
function calleeFunc()
{
var res = FunctionUtil.getCallerScope( arguments.caller , this._parent );
trace(res.scope);
trace(res.functionName);
}
27日の月曜日に心斎橋にて開催されるTERACOに参加することになったので。
予習ということで EventDispatcher クラスを使って、ステージサイズを取得するためのクラスを作成してみようと。
サンプル
サンプルソースのダウンロード ( 20070825_stageresize.zip )
今回作ったクラスは「StageResizeManager」というクラス。
詳細は省くけども、使えるメソッドはこの5つ。すべて static 。
ルートのタイムラインに下記のスクリプトを書いています。
setup の maxSize と minSize はオプション。
四隅の四角はそれぞれ中のタイムラインに下記のようなスクリプトが書かれてます。
なぜか今日は片言。
月曜日緊張するな~
予習ということで EventDispatcher クラスを使って、ステージサイズを取得するためのクラスを作成してみようと。
サンプル
サンプルソースのダウンロード ( 20070825_stageresize.zip )
今回作ったクラスは「StageResizeManager」というクラス。
詳細は省くけども、使えるメソッドはこの5つ。すべて static 。
setup( width:Number, height:Number, maxSize:Object, minSize:Object ):Void
setup は1回実行すると削除される
addEventListener( type:String , object:Object ):Void リスナーを登録
removeEventListener( type:String , object:Object ):Void 登録したリスナーの削除
eventRequest():Void サイズ変更の有無に関わらず強制的に1回resizeイベントを送信
getSizeInfo():Object ステージのサイズ情報を取得
で、肝心のイベントは
resizedの1つだけ。
ルートのタイムラインに下記のスクリプトを書いています。
setup の maxSize と minSize はオプション。
var defaultWidth:Number = 550;
var defaultHeight:Number = 350;
var maxSize:Object = { width:800 , height:600 };
var minSize:Object = { width:400 , height:300 };
StageResizeManager.setup( defaultWidth , defaultHeight , maxSize , minSize );
function resizeHandler( event:Object )
{
var str = "stage resize ---------------------------------\n" ;
for(var val in event){
str += " "+ val +" => "+ event[val]+"\n";
}
trac.text = str;
trace( str );
}
StageResizeManager.addEventListener( "resized" , resizeHandler );
this.onEnterFrame = function()
{
StageResizeManager.eventRequest();
delete this.onEnterFrame;
}
ちなみに onEnterFrame を使ってるのは、下層の四角4つの、それぞれのスクリプトの処理が終わった後に実行したいから。
四隅の四角はそれぞれ中のタイムラインに下記のようなスクリプトが書かれてます。
var loc = this;
function resizeHandler( event:Object )
{
loc._x = event.left;
loc._y = event.top;
loc.x.text = loc._x;
loc.y.text = loc._y;
}
StageResizeManager.addEventListener( "resized" , resizeHandler );
なぜか今日は片言。
月曜日緊張するな~
for(var i=0; i<Math.PI; i+=0.1)
{
var a = Math.pow( Math.sin( i ) , 2 ) + Math.pow( Math.cos( i ) , 2 );
trace( a );
}
これ今まで知らなかったのは痛いなあ。まだまだ知らないことだらけだ。
何がしたかったかというと。
もっとスマートにならんかな・・・
import flash.geom.Point;
var result = createOrderMatrix( 9 , 9 );
for(var i=0;i<result.length;i++){
trace( result[i] );
}
function createOrderMatrix( xlength:Number , ylength:Number ):Array
{
var p:Point = new Point( 0 , 0 );
var totalLength = xlength*ylength;
var matrix = new Array( ylength );
for(var i=0;i<ylength;i++){
matrix[i] = new Array( xlength );
}
var xh = Math.floor(xlength/2);
var yh = Math.floor(ylength/2);
var xflag = true;
var yflag = false;
var xm:Number, ym:Number, nx:Number, ny:Number;
xm = ym = nx = ny = 1;
matrix[yh][xh] = 0;
for(var i=1;i<totalLength;i++)
{
if( xflag ){
p.x += xm/Math.abs(xm);
if( nx == p.x ){
xm = -(Math.abs(xm)/xm)*(Math.abs(xm)+1);
nx += xm;
yflag = true; xflag = false;
}
}
else if( yflag ){
p.y += ym/Math.abs(ym);
if( ny == p.y ){
ym = -(Math.abs(ym)/ym)*(Math.abs(ym)+1);
ny += ym;
yflag = false; xflag = true;
}
}
if( p.x+xh >= 0 && p.x+xh < xlength &&
p.y+yh >= 0 && p.y+yh < ylength ){
matrix[p.y+yh][p.x+xh] = i;
} else {
i--;
}
}
return matrix;
}
出力結果
72,73,74,75,76,77,78,79,80 71,42,43,44,45,46,47,48,49 70,41,20,21,22,23,24,25,50 69,40,19,6,7,8,9,26,51 68,39,18,5,0,1,10,27,52 67,38,17,4,3,2,11,28,53 66,37,16,15,14,13,12,29,54 65,36,35,34,33,32,31,30,55 64,63,62,61,60,59,58,57,56渦巻き配列
もっとスマートにならんかな・・・
1マスずつ描画する
import flash.geom.Point;
var p:Point = new Point( 0 , 0 );
this.lineStyle( 1 , 0 , 50 );
var xflag = true;
var yflag = false;
var xm = 1;
var ym = 1;
var nx = 1;
var ny = 1;
for(var i=0;i<50;i++)
{
if( xflag ){
p.x += xm/Math.abs(xm);
if( nx == p.x ){
xm = -(Math.abs(xm)/xm)*(Math.abs(xm)+1);
nx += xm;
yflag = true;
xflag = false;
}
}
else if( yflag ){
p.y += ym;
if( ny == p.y ){
ym = -(Math.abs(ym)/ym)*(Math.abs(ym)+1);
ny += ym;
yflag = false;
xflag = true;
}
}
this.lineTo( p.x*10 , p.y*10 );
trace( p.x +" / "+ p.y );
}
/**
r : Number ― r = ( currentTime - startTime ) / durationTime;
*/
function costomEase( r:Number ):Number
{
//return Math.sin( Math.PI*0.7*r )+(1-Math.sin(Math.PI*0.3));
//return 1-Math.cos( Math.PI/2*r );
//return Math.tan( Math.PI*r )+r;
//return r*r*r;
//return 1-Math.pow( 1-r , 5 );
//return r*r*3-r*2;
//return Math.abs( r*r*3-r*2 );
return Math.sin( Math.PI*r )*Math.cos( Math.PI*r )+r;
}
頂点毎に描画する
import flash.geom.Point;
var p:Point = new Point( 0 , 0 );
this.lineStyle( 1 , 0 , 50 );
var xflag = true;
var yflag = false;
var xm = 1;
var ym = 1;
for(var i=0;i<50;i++)
{
if( xflag ){
p.x += xm;
xm = -(Math.abs(xm)/xm)*(Math.abs(xm)+1);
}
if( yflag ){
p.y += ym;
ym = -(Math.abs(ym)/ym)*(Math.abs(ym)+1);
}
xflag = !xflag;
yflag = !yflag;
this.lineTo( p.x*10 , p.y*10 );
trace( p.x +" / "+ p.y );
}
AS2でAbstract
AS3でAbstract
class AbstractClass
{
function AbstractClass()
{
if(arguments.caller.prototype instanceof AbstractClass){
trace("create instance");
} else {
throw new Error("ArgumentError: Error #2012: AbstractClass class cannot be instantiated.");
}
}
}
class SubClass extends AbstractClass
{
function SubClass()
{
super();
}
}
AS3でAbstract
package
{
public class AbstractClass
{
function AbstractClass( access:*=null ):void
{
if( access!=this ){
throw new ArgumentError("Error #2012: AbstractClass class cannot be instantiated.");
}
}
}
}
package
{
public class SubClass extends AbstractClass
{
function SubClass( access:*=null ):void
{
super(this);
}
}
}
