tokyo3.0

actionscript3.0 develop log written by s26

diary

bound

2010522

ボールを跳ね返らせたい。って時の
物理的な考察をしていきます。
ActionSCript3.0です。
※下記のサンプルはball,btnという2つのクラスに関しては省略して記載してあります。
(ライブラリに用意しているだけ。)

 

01.ボールを落とす。
物理運動に習ったものなので、とりあえず、ボールを落とす運動を書いてみます。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class bound1 extends Sprite {
		var _ball:MovieClip
		var _ballVelocityY:Number;
		public function bound1() {
			init();
		}
		private function init():void {
			makeball();
		}
		private function makeball():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10; _btn.y = 10;
			_btn.addEventListener(MouseEvent.CLICK,function(){
				_ball= new ball();
				addChild(_ball);
				_ball.x = stage.stageWidth / 2;
				_ball.y = stage.stageHeight / 4;
				_ballVelocityY = 0;
				putVelocity();
			});
		}
		private function putVelocity():void {
			_ballVelocityY = 0;
			addEventListener(Event.ENTER_FRAME,moving);
		}
		private function moving(e:Event):void {
			_ballVelocityY += 9.8 / 60;
			_ball.y += _ballVelocityY;
		}
	}
}

 

では、落ちた時に、
つまり、ボールがステージの外に出た瞬間に、
ボールの速度を反対方向にしてあげれば
ボールがぶつかった速度で跳ね返ります。
02.ボールを跳ね返す。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class bound2 extends Sprite {
		var _ball:MovieClip
		var _ballVelocityY:Number;
		public function bound2() {
			init();
		}
		private function init():void {
			makeball();
		}
		private function makeball():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;
			_btn.y = 10;
			_btn.addEventListener(MouseEvent.CLICK,function(){
				_ballVelocityY = 0;
				_ball= new ball();
				addChild(_ball);
				_ball.x = stage.stageWidth / 2;
				_ball.y = stage.stageHeight / 4;
				putVelocity()
			});
		}
		private function putVelocity():void {
			_ballVelocityY = 0;
			addEventListener(Event.ENTER_FRAME,moving);
		}
		private function moving(e:Event):void {
			_ballVelocityY += 9.8 / 60;
			_ball.y += _ballVelocityY;
			if (_ball.y+_ball.height/2 > stage.stageHeight) {
				_ballVelocityY = -_ballVelocityY;
			}
		}
	}
}

 

上の記述は一見ただしそうですが、
ぶつかった瞬間にボールが壁に埋もれている。
_ball.y+_ball.height/2 > stage.stageHeight
埋まってた分だけこの瞬間に跳ね返してしまいます。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class bound3 extends Sprite {
		var _ball:MovieClip
		var _ballVelocityY:Number = 0;
		public function bound3() {
			init();
		}
		private function init():void {
			makeball();
		}
		private function makeball():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			_btn.addEventListener(MouseEvent.CLICK,function(){
				_ballVelocityY = 0;
				_ball= new ball();
				addChild(_ball);
				_ball.x = stage.stageWidth / 2;
				_ball.y = stage.stageHeight / 4;
				putVelocity()
			});
		}
		private function putVelocity():void {
			_ballVelocityY = 0;
			addEventListener(Event.ENTER_FRAME,moving);
		}
		private function moving(e:Event):void {
			_ballVelocityY += 9.8 / 60;
			_ball.y += _ballVelocityY;
			if (_ball.y + _ball.height / 2 > stage.stageHeight) {
				//めりこまない
				_ball.y -= (_ball.y + _ball.height / 2 - stage.stageHeight);
				_ballVelocityY = -_ballVelocityY;
			}
		}
	}
}

 

上のだとずっと同じ繰り返しです。
frictionっていう名前で
跳ね返りの瞬間に速度を削ってあげると以下になります。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class bound4 extends Sprite {
		var _ball:MovieClip
		var _ballVelocityY:Number = 0;
		static var _friction:Number = 0.9
		public function bound4() {
			init();
		}
		private function init():void {
			makeball();
		}
		private function makeball():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			_btn.addEventListener(MouseEvent.CLICK,function(){
				_ball= new ball();
				_ballVelocityY = 0
				addChild(_ball);
				_ball.x = stage.stageWidth / 2;
				_ball.y = stage.stageHeight / 4;
				putVelocity()
			});
		}
		private function putVelocity():void {
			_ballVelocityY = 0;
			addEventListener(Event.ENTER_FRAME,moving);
		}
		private function moving(e:Event):void {
			_ballVelocityY += 9.8 / 60;
			_ball.y += _ballVelocityY;
			if (_ball.y + _ball.height / 2 > stage.stageHeight) {
				_ball.y -= (_ball.y + _ball.height / 2 - stage.stageHeight) * _friction;
				_ballVelocityY = -_ballVelocityY*_friction;
			}
		}
	}
}

 

固い感じがします。
あたった瞬間に「ぐにゅ」って縮めてあげればいいのではないかな。
しかも速度に応じての必要があるよね。
下記の式は
_ball.scaleX = 1/_ball.scaleY
常に玉の面積(2次なので)が一定になるようにする事で、
縦に短くすると同時に横も伸びるようにしています。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class bound5 extends Sprite {
		var _ball:MovieClip
		var _ballVelocityY:Number = 0;
		static var _friction:Number = 0.6
		public function bound5() {
			init();
		}
		private function init():void {
			makeball();
		}
		private function makeball():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10; _btn.y = 10;
			_btn.addEventListener(MouseEvent.CLICK,function(){
				_ball= new ball();
				addChild(_ball);
				_ball.x = stage.stageWidth / 2;
				_ball.y = stage.stageHeight / 4;
				putVelocity()
				_ballVelocityY = 0;
			});
		}

		private function putVelocity():void {
			_ballVelocityY = 0;
			addEventListener(Event.ENTER_FRAME,moving);
		}

		private function moving(e:Event):void {
			_ballVelocityY += 9.8 / 60;
			_ball.y += _ballVelocityY;
			_ball.scaleY += (1 - _ball.scaleY)/5
			if (_ball.y + _ball.height / 2 > stage.stageHeight) {
				_ball.scaleY = 1/(_ballVelocityY/30+1);
				_ball.y -= (_ball.y + _ball.height / 2 - stage.stageHeight) * _friction;
				_ballVelocityY = -_ballVelocityY*_friction;
			}
			_ball.scaleX = 1/_ball.scaleY
		}
	}
}

 

大きさが戻る時に妙な違和感がありますよね。
大きさが元に戻るんだけど、
ぽにょぽにょするものって、
横長のものが丸に戻った後に縦長になって。
っていうみたいな動きが必要なので。
伸縮にバネの公式を当てはめてあげます。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class bound6 extends Sprite {
		var _ball:MovieClip
		var _ballVelocityY:Number = 0;
		var _ballVelocityIN:Number = 0
		static var _friction:Number = 0.6;

		public function bound6() {
			init();
		}
		private function init():void {
			makeball();
		}
		private function makeball():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			_btn.addEventListener(MouseEvent.CLICK,function(){
				_ball= new ball();
				addChild(_ball);
				_ball.x = stage.stageWidth / 2;
				_ball.y = stage.stageHeight / 4;
				putVelocity()
				_ballVelocityY = 0;
				_ballVelocityIN = 0;
			});
		}

		private function putVelocity():void {
			_ballVelocityY = 0;
			addEventListener(Event.ENTER_FRAME,moving);
		}

		private function moving(e:Event):void {
			_ballVelocityY += 9.8 / 60;
			_ball.y += _ballVelocityY;
			_ballVelocityIN += (1 - _ball.scaleY) * Math.abs(1 - _ball.scaleY) * 0.9
			_ballVelocityIN *= 0.90
			_ball.scaleY += _ballVelocityIN
			if (_ball.y + _ball.height / 2 > stage.stageHeight) {
				_ball.y -= (_ball.y + _ball.height / 2 - stage.stageHeight) * _friction;

				_ball.scaleY = 1/(_ballVelocityY/30+1);
				_ballVelocityY = -_ballVelocityY*_friction;
			}
			_ball.scaleX = 1/_ball.scaleY
		}
	}
}

 

既に気持ちは完成ですが、縦だけじゃつまらないので、
横にも移動する形にします。
大きさに関しては若干見苦しいかと思いますが、
体積が変わらず、ってとこを中心に
調整をしてみました。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class bound7 extends Sprite {
		var _ball:MovieClip
		var _ballVelocityY:Number = 0;
		var _ballVelocityX:Number = 0;
		var _ballweight:Number = 1;
		var _ballVelocityINX:Number = 0;
		var _ballVelocityINY:Number = 0;
		var _friction:Number = 0.9;

		var _ballScaleY:Number = 1;
		var _ballScaleX:Number = 1

		public function bound7() {
			init();
		}
		private function init():void {
			makeball();
		}
		private function makeball():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			_btn.addEventListener(MouseEvent.CLICK,function(){
				_ball= new ball();
				addChild(_ball);
				_ball.x = stage.stageWidth / 2;
				_ball.y = stage.stageHeight / 4;
				putVelocity()
			});
		}

		private function putVelocity():void {
			_ballVelocityY = 0;
			_ballVelocityX = 0;
			addEventListener(Event.ENTER_FRAME, movingY);
			addEventListener(Event.ENTER_FRAME, movingX);
			addEventListener(Event.ENTER_FRAME,movingScale);
		}

		private function movingY(e:Event):void {
			_ballVelocityY += 9.8 / 60*_ballweight;
			_ball.y += _ballVelocityY;
			_ballVelocityINY += (1 - _ballScaleY) * Math.abs(1 - _ballScaleY)
			_ballVelocityINY *= 0.9
			_ballScaleY += _ballVelocityINY
			if (_ball.y + _ball.height/2 > stage.stageHeight) {
				_ball.y -= (_ball.y + _ball.height/2 - stage.stageHeight) * _friction;
				_ballScaleY /= (_ballVelocityY/30+1);
				_ballVelocityY = -_ballVelocityY*_friction;
			}
			//_ball.scaleX = 1/_ball.scaleY
		}

		private function movingX(e:Event):void {
			_ballVelocityX += 9.8 / 60*_ballweight;
			_ball.x += _ballVelocityX;
			_ballVelocityINX += (1 - _ballScaleX) * Math.abs(1 - _ballScaleX)
			_ballVelocityINX *= 0.9
			_ballScaleX += _ballVelocityINX
			if (_ball.x + _ball.width/2 > stage.stageWidth) {
				_ball.x -= (_ball.x + _ball.width/2 - stage.stageWidth) * _friction;
				_ballScaleX /= (_ballVelocityY/30+1);
				_ballVelocityX = -_ballVelocityX*_friction;
			}
			//_ball.scaleY = 1/_ball.scaleX
		}

		private function movingScale(e:Event):void {
			var _rate:Number = _ballScaleX*_ballScaleY
			_ball.scaleX = _ballScaleX / Math.sqrt(_rate);
			_ball.scaleY = _ballScaleY / Math.sqrt(_rate);
		}
	}
}

moving

2010515

動きについての考察。
※下記のサンプルはfish,btnという2つのクラスに関しては省略して記載してあります。
(ライブラリに用意しているだけ。)

 

01.一定の速度で移動
常に一定の数だけを足し続ける。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	public class motion1 extends Sprite {
		public function motion1() {
			moveFish()
		}
		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish) ;
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;
			stage.addEventListener(Event.ENTER_FRAME, function() {
				_fish.x += 5
			});
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_fish.x = 0
				_fish.alpha = 1;
			});
		}
	}
}

 

これだと、動きとしては不自然なので、
02.緩急をつけたい
現在地と目的地の一定を足していく。
(stage.stageWidth – _fish.x)/20
目的地との距離は縮まっていくので、
速度はどんどんゆっくりになる。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class motion2 extends Sprite {

		public function motion2() {
			moveFish()
		}
		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish) ;
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;
			stage.addEventListener(Event.ENTER_FRAME, function() {
				_fish.x += (stage.stageWidth - _fish.x)/20
			})
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_fish.x = 0
				_fish.alpha = 1;
			});
		}
	}
}

 

緩急はつけられるけど、
動きとしては一定の減速運動になってしまうので、
03.sinカーブを使用してみる。
sinのカーブでは-π/2~π/2が使いやすいと思う。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class motion3 extends Sprite {

		public function motion3() {
			moveFish()
		}
		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish);
			//初期の位置
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;
			var _count:int = 0
			stage.addEventListener(Event.ENTER_FRAME, function() {
				var _angle:Number = -Math.PI/2 + _count/100*Math.PI
				_fish.x = (Math.sin(_angle) + 1) / 2 *stage.stageWidth;
				_count++;
			});
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_count = 0
				_fish.alpha = 1;
			});
		}
	}
}

 

次に、
04.速度の概念を明示化する
と加速が簡単に行える。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class motion4 extends Sprite {

		public function motion4() {
			moveFish()
		}
		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish);
			//初期の位置
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;
			var _v:Number = 0.1

			stage.addEventListener(Event.ENTER_FRAME, function() {
				_fish.x += _v;
				_v = _v * 1.1;
			});
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_v = 0.01;
				_fish.x = 0;
				_fish.alpha = 1;
			});
		}
	}

}

 

速度を明示化して、
加速はするけど、
05.目的地にも、ゆっくり到着したいので、
残りの距離の割合(stage.stageWidth-_fish.x)/stage.stageWidth;
を速度に用いてみると

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	public class motion5 extends Sprite {
		public function motion5() {
			moveFish()
		}
		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10; _btn.y = 10;

			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish);
			//初期の位置
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;
			var _v:Number = 0.1

			stage.addEventListener(Event.ENTER_FRAME, function() {
				_fish.x += _v*(stage.stageWidth-_fish.x)/stage.stageWidth;
				_v = _v * 1.1;
			});
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_v = 0.01;
				_fish.x = 0;
				_fish.alpha = 1;
			});
		}
	}

}

 

速度の概念とは別に
06.バネの原理で移動をさせる。
バネの力は距離の2乗に比例をするはず。
バネの力だけだと、運動量保存がされてしまう(とまれない)ので、
減速の運動も加える。

 

– script –

package  {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	public class motion6 extends Sprite {
		public function motion6() {
			moveFish()
		}
		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10; _btn.y = 10;

			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish);
			//初期の位置
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;
			var _v:Number = 0.1
			var _k:Number = 0.0003;
			stage.addEventListener(Event.ENTER_FRAME, function() {
				_fish.x += _v;
				_v += Math.abs(stage.stageWidth*3/4 - _fish.x) * (stage.stageWidth*3/4 - _fish.x) * _k;
				_v *= 0.95
			});
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_fish.x = 0;
				_fish.y = stage.stageHeight / 2;
				_v = 0.1
				_fish.alpha = 1;
			});
		}
	}

}

 

こうして、いくつか見てみるけど、Tweenerの中身ってどうなっているのかという。
07.決まった時間で移動をさせる。
フレームレートが落ちても一定のスピードで動くように、時間と位置の関係を明示化している。

 

– script –

package  {

	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class motion7 extends Sprite {

		public function motion7() {
			moveFish()
		}

		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10; _btn.y = 10;

			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish);
			//初期の位置
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;

			var _time = 3;
			var _startTime:Number = new Date().getTime();
			stage.addEventListener(Event.ENTER_FRAME, function() {
				var _nowTime:Number = new Date().getTime()-_startTime;
				_fish.x = (stage.stageWidth - 0) * _nowTime / (1000 * _time)
			});
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_startTime = new Date().getTime();
				_fish.alpha = 1;
			});
		}
	}

}

 

上のサンプルだと
transitionがlinerだけど、
08.easeInExpoだと下記のようになる。

 

– script –

package  {

	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class motion8 extends Sprite {

		public function motion8() {
			moveFish()
		}

		private function moveFish():void {
			var _btn:MovieClip = new btn();
			addChild(_btn)
			_btn.x = 10;_btn.y = 10;
			var _fish:MovieClip = new fish();
			_fish.alpha = 0;
			addChild(_fish);
			//初期の位置
			_fish.x = 0;
			_fish.y = stage.stageHeight / 2;
			var _time = 2;
			var _startTime:Number = new Date().getTime();
			stage.addEventListener(Event.ENTER_FRAME, function() {
				var _nowTime:Number = new Date().getTime()-_startTime;
				_fish.x = (stage.stageWidth - 0) * _nowTime / (1000 * _time)* _nowTime / (1000 * _time)* _nowTime / (1000 * _time)
			});
			_btn.addEventListener(MouseEvent.CLICK, function() {
				_startTime = new Date().getTime();
				_fish.alpha = 1;
			})
		}
	}

}

 

Decorator

2010512

デザインパターン:Decorator
目的:オブジェクトへ要素の追加を行う。(装飾する。)

 

デコレーションを目的としたクラス。
元となるinterfaceを作成

 

package{
	public interface IWidget{
		function getDescription():String{}
	}
}

 

文字列を返す。
この値に対して要素を作成する場合
下記の形になる。

 

package{
	public class WidgetA implement IWidget{
		public function WidgetA(){};
		public function getDescription():String{
			return "widgetA"
		}
	}
}

 

となって文字列「widgetA」を作成できる。
このようにしてwidgetB,widgetCなども作成できる。
ここまでは、decoratorクラスでなくて、ただのinterfaceです。
次に、抽象クラスを作成する。

 

package{
	public class WidgetDecorator implement IWidget{
		protected var decorated:IWidget;
		public function WidgetDecorator(widget:IWidget){
			decorated = widget
		};
		public function getDescription():String{
			return "α-"+decorated.getDescription()
		}
	}
}

 

というクラスを作成した時に
new WidgetDecorator(new WidgetA()).getDescription()
は「α-widgetA」を返す。

 

new WidgetA().getDescription()
は「widgetA」を返す。

 

同様にして
new WidgetDecorator(new WidgetB()).getDescription()
は「α-widgetB」を返す。

 

つまり、装飾(decoration)を
組み合わせで増やす事が出来るようになった。

 

更に、WidgetDecoratorを継承すると
また一つ付加する事ができる。

 

package{
	public class widgetPlus extends WidgetDecorator{
		protected var decorated:IWidget;
		public function widgetPlus(widget:IWidget){
			super(widget)
		};
		public function getDescription():String{
			return decorated.getDescription()+"_1"
		}
	}
}

 

new widgetPlus(new WidgetA()).getDescription()
は「α-widgetA_1」を返す。

 

装飾を行う上で、implementの方向性とextendsの方向性の
2つを持たせてあげる事で、
組み合わせの広がりを与える事が出来る。

参照:いつもの日記帳:Decoratorパターン

Singleton

2010512

デザインパターン:Singleton
目的:複数のクラスからアクセスでき、値を保持してくれるクラスを作る。

 

Singletonは複数のクラスから参照できる値を設定する事で
無駄な生成を抑える事や、値の引渡しを簡単にしてくれます。
コードは下記になります。

 

package {
	public class Singleton {
		public static var _instance:Singleton;
		public static function getInstance():Singleton {
			 if ( _instance == null ) {
				_instance = new Singleton;
			}
		return _instance;
	}
}

 

staticってなんだ?ってなる。
staticは「静的な」となじみのない言葉で表現をされるが、カンタンに言うと
「動的」の反対だから、「その場で生成されるものでない。」ので、
「ずっとそこにいるもの。」なのです。
外部からアクセスした時にも「そこにいる」のです。
つまり「動的」だといない事があるので、いつでもアクセスできる為に
「静的」staticに設定をしています。

 

getInstanceを行うと、Singletonのオブジェクトが生成されます。
一度生成されると、再度実行しても既に生成されたオブジェクトが
取得される設計になります。

 

ここが基本設計で、必要なものを足していきます。

 

package {
	public class Singleton {
		public static var _instance:Singleton;
		public static function getInstance():Singleton {
			if ( _instance == null ) {
				_instance = new Singleton;
			}
			return _instance;
		}
		private var _str:String = "something";
		public function set _str(_write:String):void{
			_str = _write;
		}
		public function get _str():String{
			return _str;
		}
	}
}

 

上記で示した形で、singletonの要素としての_strを用意する事で、
常にアクセスできるString(文字列)を作成できる。
Bitmapだろうと。なんだろうと。
参考:_level0:Singletonパターンを使ってどのシーンからも変数を参照できるようにする。

sidemenu

profile

s26

flasher

category

archive

recently

feed

RSS FEED

search