Adapter

Programming/Design Patterns 2007. 2. 21. 11:08
 1 interface Duck{
2         public function quack():Void;
3         public function fly():Void;
4 }

////////////////////////////////////

 1 class MallardDuck implements Duck{
2         public function quack():Void{
3                 trace("Quack");
4         }
5         public function fly():Void{
6                 trace("I'm flying");
7         }
8 }

/////////////////////////////////////

 1 interface Turkey{
2         public function gobble():Void;
3         public function fly():Void;
4 }

/////////////////////////////////////

class TurkeyAdapter implements Duck{
        private var turkey:Turkey;
        public function TurkeyAdapter(turkey:Turkey){
                this.turkey = turkey;
        }
        public function quack():Void{
                turkey.gobble();
        }
        public function fly():Void{
                for(var i=0;i<5;i++){
                        turkey.fly();
                }
        }
}


//////////////////////////////////////

 1 class WildTurkey implements Turkey{
2         public function gobble():Void{ 3 trace("Gobble gobble");
4         }
5         public function fly():Void{
6                 trace("I'm flying a short distance");
7         }
8 }

//////////////////////////////////////

 1 class DuckTestDrive{
2         public function DuckTestDrive(){
3                 initialize();
4         }
5         public function initialize():Void{
6                 var duck:MallardDuck = new MallardDuck();
7
8                 var turkey:WildTurkey = new WildTurkey();
9                 var turkeyAdapter:Duck = new TurkeyAdapter(turkey);
10
11                 trace("The Turkey says...");
12                 turkey.gobble();
13                 turkey.fly();
14
15                 trace("The Duck says...");
16                 testDuck(duck);
17
18                 trace("The TurkeyAdapter says...");
19                 testDuck(turkeyAdapter);
20         }
21         private function testDuck(duck:Duck):Void{
22                 duck.quack();
23                 duck.fly();
24         }
25
26 }
    

설정

트랙백

댓글

Command

Programming/Design Patterns 2007. 2. 21. 11:08
 1 interface Command{
2         public function execute();
3 }

///////////////////////////////

 1 class Light{
2         private var name:String;
3         public function Light(name:String){
4                 this.name = name;
5         }
6         public function lightOn():Void{
7                 trace(name+" : 불을 켜다");
8         }
9         public function lightOff():Void{
10                 trace(name+" : 불을 끄다");
11         }
12 }

/////////////////////////////////

 1 class LightOffCommand implements Command{
2         private var light:Light;
3
4         public function LightOffCommand(light:Light){
5                 this.light = light;
6         }
7         public function execute(){
8                 light.lightOff();
9         }
10 }

////////////////////////////////////

 1 class LightOnCommand implements Command{
2         private var light:Light;
3
4         public function LightOnCommand(light:Light){
5                 this.light = light;
6         }
7         public function execute(){
8                 light.lightOn();
9         }
10 }

/////////////////////////////////////

 1 class RemoteControl{
2         private var onCommands:Array;
3         private var offCommands:Array;
4
5         public function RemoteControl(){
6                 onCommands = new Array();
7                 offCommands = new Array();
8         }
9         public function setCommand(slot:Number, onCommand:LightOnCommand, offCommand:LightOffCommand):Void{
10                 onCommands[slot] = onCommand;
11                 offCommands[slot] = offCommand;
12         }
13         public function onButtonWasPressed(slot:Number):Void{
14                 onCommands[slot].execute();
15         }
16         public function offButtonWasPressed(slot:Number):Void{
17                 offCommands[slot].execute();
18         }
19 }

//////////////////////////////////////

 1 class RemoteControlTest
2 {
3         public function RemoteControlTest ()
4         {
5                 init ();
6         }
7         public function init () : Void
8         {
9                 var remote : RemoteControl = new RemoteControl ();
10                 var light : Light = new Light ("스텐드");
11                 var lightOn : LightOnCommand = new LightOnCommand (light);
12                 var lightOff : LightOffCommand = new LightOffCommand (light);
13                 remote.setCommand (0, lightOn, lightOff);
14                 remote.onButtonWasPressed (0);
15                 remote.offButtonWasPressed (0);
16         }
17 }

    

설정

트랙백

댓글

Singleton

Programming/Design Patterns 2007. 2. 21. 11:08
 1 class Singleton{
2         private static var uniqueInstance;
3
4         private function Singleton(){
5
6         }
7         public static function getInstance():Singleton{
8                 if(uniqueInstance == null){
9                         uniqueInstance = new Singleton();
10                 }
11                 return uniqueInstance;
12         }
13         public function getName(){
14                 trace("Singleton pattern");
15         }
16 }
    

설정

트랙백

댓글

Factory

Programming/Design Patterns 2007. 2. 21. 11:07
 1 class SimplePizzaFactory{
2         public function createPizza(type:String):Pizza{
3                 var pizza:Pizza = null;
4                 if(type == "cheese"){
5                         pizza = new CheesePizza();
6                 }else if(type == "pepperoni"){
7                         pizza = new PepperoniPizza();
8                 }else if(type == "clam"){
9                         pizza = new ClamPizza();
10                 }else if(type == "veggie"){
11                         pizza = new VeggiePizza();
12                 }
13                 return pizza;
14         }
15 }

////////////////////////////////////////

 1 class CheesePizza extends Pizza{
2         public function CheesePizza(){
3                 pizza_name = "CheesePizza";
4                 dough = "얇게";
5                 sauce = "짜게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

/////////////////////////////////

 1 class VeggiePizza extends Pizza{
2         public function VeggiePizza(){
3                 pizza_name = "VeggiePizza";
4                 dough = "굵게";
5                 sauce = "달게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

/////////////////////////////////////////////

 1 class ClamPizza extends Pizza{
2         public function ClamPizza(){
3                 pizza_name = "ClamPizza";
4                 dough = "굵게";
5                 sauce = "달게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

//////////////////////////////////////

 1 class PepperoniPizza extends Pizza{
2         public function PepperoniPizza(){
3                 pizza_name = "PepperoniPizza";
4                 dough = "굵게";
5                 sauce = "달게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

/////////////////////////////////////////

 1 class Pizza{
2         private var pizza_name:String;
3         private var dough:String;
4         private var sauce:String;
5         private var ary:Array = new Array();
6
7         public function prepare(){
8                 trace("피자이름 : "+pizza_name);
9
10         }
11         public function bake(){
12                 trace("Bake for 25 minutes at 350");
13         }
14         public function cut(){
15                 trace("Cutting the pizza into diagonal slices");
16         }
17         public function box(){
18                 trace("Place pizza in official PizzaStore box");
19         }
20         public function getName():String{
21                 return pizza_name;
22         }
23
24 }

///////////////////////////////////////

 1 class PizzaStore{
2         private var factory:SimplePizzaFactory;
3         public function PizzaStore(factory:SimplePizzaFactory){
4                 this.factory = factory;
5         }
6         public function orderPizza(type:String):Pizza{
7                 var pizza:Pizza; 8 pizza = factory.createPizza(type);
9                 pizza.prepare();
10                 // pizza.bake();
11                 // pizza.cut();
12                 // pizza.box();
13                 return pizza;
14         }
15 }

////////////////////////////////////////
var myPizzaStore:PizzaStore = new PizzaStore(new SimplePizzaFactory());
myPizzaStore.orderPizza("cheese");
myPizzaStore.orderPizza("pepperoni");
myPizzaStore.orderPizza("clam");
myPizzaStore.orderPizza("veggie");


    

설정

트랙백

댓글

Decorator

Programming/Design Patterns 2007. 2. 21. 11:07
 1 class Beverage{
2         private var descriptions:String = "제목없음";
3         public function getDescription():String{
4                 return descriptions;
5         }
6         public function cost():Number{
7                 return 0;
8         }
9 }

////////////////////////////////////

 1 class CondimentDecorator extends Beverage{
2         public function getDepscription(){
3
4         }
5 }

////////////////////////////////////

 1 class DarkRoast extends Beverage{
2         public function DarkRoast(){
3                 descriptions = "다트로스트 커피";
4         }
5         public function cost():Number{
6                 return 2.89;
7         }
8 }

/////////////////////////////////////

 1 class Espresso extends Beverage{
2         public function Espresso(){
3                 descriptions = "에스프레소";
4         }
5         public function cost():Number{
6                 return 1.99;
7         }
8 }

//////////////////////////////////////

 1 class HouseBlend extends Beverage{
2         public function HouseBlend(){
3                 descriptions = "하우스 브렌드 커피";
4         }
5         public function cost():Number{
6                 return .89;
7         }
8 }

//////////////////////////////////////

 1 class Mocha extends CondimentDecorator{
2         private var beverage:Beverage;
3         public function Mocha(beverage:Beverage){
4                 this.beverage = beverage;
5         }
6         public function getDescription():String{
7                 return beverage.getDescription()+", 모카";
8         }
9         public function cost():Number{
10                 return .20+beverage.cost();
11         }
12 }

///////////////////////////////////////

 1 class Whip extends Beverage{
2         private var beverage:Beverage;
3         public function Whip(beverage:Beverage){
4                 this.beverage = beverage; 5 } 6 public function getDescription():String{
7                 return beverage.getDescription()+", 휘핑";
8         }
9         public function cost():Number{
10                 return .20+beverage.cost();
11         }
12 }

///////////////////////////////////////

 1 class Main{
2         public function Main(){
3                 init();
4         }
5         private function init(){
6                 var beverage:Beverage = new Espresso();
7                 trace(beverage.getDescription()+" $"+beverage.cost());
8
9                 var beverage2:Beverage = new DarkRoast();
10                 beverage2 = new Mocha(beverage2);
11                 beverage2 = new Mocha(beverage2);
12                 beverage2 = new Whip(beverage2);
13                 trace(beverage2.getDescription()+" $"+beverage2.cost());
14
15                 var beverage3:Beverage = new HouseBlend();
16                 beverage3 = new Mocha(beverage3);
17                 beverage3 = new Whip(beverage3);
18                 trace(beverage3.getDescription()+" $"+beverage3.cost());
19
20         }
21 }
    

설정

트랙백

댓글

Observer

Programming/Design Patterns 2007. 2. 21. 11:06
 1 class CurrentConditionsDisplay implements Observer, DisplayElement{
2         private var temperature:Number;
3         private var humidity:Number;
4         private var pressure:Number;
5         private var weatherData:Subject;
6
7         public function CurrentConditionsDisplay(weatherData:Subject){
8                 this.weatherData = weatherData;
9                 weatherData.registerObserver(this);
10         }
11         public function update(temperature:Number, humidity:Number, pressure:Number):Void{
12                 this.temperature = temperature;
13                 this.humidity = humidity;
14                 this.pressure = pressure;
15                 display();
16         }
17         public function display():Void{
18                 trace("Temperature: "+temperature);
19                 trace("Humidity: "+humidity);
20                 trace("Pressure: "+pressure);
21                 trace("----------------------");
22         }
23 }

////////////////////////////////////////////////////////////////

 1 interface DisplayElement{
2         public function display():Void;
3 }

////////////////////////////////////////////////////////////////

 1 interface Observer{
2         public function update(temp:Number, humidity:Number, pressure:Number):Void;
3 }

///////////////////////////////////////////////////////////////
 1 interface Subject{
2         public function registerObserver(o:Observer):Void;
3         public function removeObserver(o:Observer):Void;
4         public function notifyObserver():Void;
5 }

///////////////////////////////////////////////////////////////

 1 class WeatherData implements Subject{
2         private var observers:Array;
3         private var temperature:Number;
4         private var humidity:Number;
5         private var pressure:Number;
6
7         public function WeatherData(){
8                 observers = new Array();
9         }
10         public function registerObserver(o:Observer):Void{
11                 observers.push(o);
12         }
13         public function removeObserver(o:Observer):Void{
14                 var lastIndex:Number = observers.length;
15                 for(var i=0;i<lastIndex;i++){
16                         if(observers[i] == o){
17                                 observers.splice(i,1);
18                         }
19                 }
20         }
21         public function notifyObserver():Void{
22                 var lastIndex:Number = observers.length;
23                 for(var i=0;i< lastIndex;i++){
24                         var observer:Observer = Observer(observers[i]);
25                         observer.update(temperature, humidity, pressure);
26                 }
27         }
28         public function measurementsChanged():Void{
29                 notifyObserver();
30         }
31         public function setMeasurements(temperature:Number, humidity:Number, pressure:Number):Void{
32                 this.temperature = temperature;
33                 this.humidity = humidity;
34                 this.pressure = pressure;
35                 measurementsChanged();
36         }
37 }

//////////////////////////////////////////////////////////////

 1 class WeatherStation{
2         public function WeatherStation(){
3                 var weatherData:WeatherData = new WeatherData();
4                 var weatherData2:WeatherData = new WeatherData();
5                 var currentDisplay:CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
6                 var currentDisplay:CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData2);
7                 weatherData.setMeasurements(80,30,23);
8                 weatherData2.setMeasurements(11,22,33);
9                 weatherData.setMeasurements(22,30,23);
10
11         }
12 }

///////////////////////////////////////////////////////////////////


    

설정

트랙백

댓글

StrategyPattern

Programming/Design Patterns 2007. 2. 21. 11:06
class Duck{
        public var flyBehavior:FlyBehavior;
        public var quackBehavior:QuackBehavior;

        public function Duck(){

        }
        public function swim():Void{

        }
        public function display():Void{

        }
        public function performQuack():Void{
                quackBehavior.quack();
        }
        public function performFly():Void{
                flyBehavior.fly();
        }
        public function setFlyBehavior(fb:FlyBehavior):Void{
                flyBehavior = fb;
        }
        public function setQuackBehavior(qb:QuackBehavior):Void{
                quackBehavior = qb;
        }
}

////////////////////////////////////////////////

interface FlyBehavior{
        public function fly():Void;
}
////////////////////////////////////////////////
class FlyNoWay implements FlyBehavior{
        public function fly():Void{
                trace("저 안 날아요");
        }
}
////////////////////////////////////////////////
class FlyWithWings implements FlyBehavior{
        public function fly():Void{
                trace("저 날아요");
        }
}
////////////////////////////////////////////////
class ModelDuck extends Duck{
        public function ModelDuck(){
                flyBehavior = new FlyNoWay();
                quackBehavior = new MuteQuack();
        }
        private function display():Void{
                trace("가짜 오리입니다");
        }
}
////////////////////////////////////////////////
class MuteQuack implements QuackBehavior{
        public function quack():Void{
                trace("나 벙어리");
        }
}
///////////////////////////////////////////////
class Quack implements QuackBehavior{
        public function quack():Void{
                trace("꽥꽥");
        }
}
/////////////////////////////////////////////////
interface QuackBehavior{
        public function quack():Void;
}
/////////////////////////////////////////////////
class Squack implements QuackBehavior{
        public function quack():Void{
                trace("삑삑");
        }
}
/////////////////////////////////////////////////
class Main{
        private var myDuck:Duck;
        public function Main(){
                myDuck = new ModelDuck();
                init();
        }
        private function init():Void{
                myDuck.display();
                myDuck.performFly();
                myDuck.performQuack();
                myDuck.setFlyBehavior(new FlyWithWings());
                myDuck.performFly();

        }
}
/////////////////////////////////////////////////
    

설정

트랙백

댓글

스킨 편집 팁 : 파이어폭스와의 CSS 호환성

Programming/Etc 2007. 2. 21. 11:05
스킨 편집 팁 : 파이어폭스와의 CSS 호환성

이번에 소개해 볼것은 스킨 편집 및 웹페이지 제작 등에 쓰일수 있는 파이어폭스와의 호환성에 관한 간단한 팁입니다.

'파이어폭스와의 호환성' 이라고 예기해 봤습니다만.
사실상 파이어폭스와의 호환성이라 함은 바로 '웹표준' 을 말하는 것입니다.
인터넷 익스플로러(이하 IE)가 대다수인 실정상. 한국에서는 대부분의 웹페이지가 IE에 맞추어져 제작되어 있습니다만.
IE에만 맞추어져 있는 홈페이지는 다른 브라우져에서 그 구조가 깨어지거나 사용이 불가능할 정도까지도 될수 있습니다.
이 문제는 IE가 웹표준을 따르지 않는데서 기인하는 문제인데요.

표준에 맞추었을 경우 IE및 모든 브라우져에서 완벽하게 잘 보이는 것에 반해,
IE에만 맞추었을 경우 다른 모든 브라우져에서는 올바르게 보이지 않는 것에 비추어 보아 이것은 전적으로 IE의 문제라고 볼수 있습니다.

그러나. 웹디자이너가 아닌 이상에야 일반 사용자가,
HTML코드를 짜는데에 있어 표준이고 아니고를 맞추기가 사실 실로 힘든 부분이라 할수 있습니다.
뭐니해도 사실상, 자신이 사용하고 또한 가장 많이 사용하는 IE에서만 잘 보이면 그만이니까요.

하지만. 웹페이지라는 것의 특성상 절대적 대다수만이 아닌 소수들에게도 동일한 서비스를 제공해야 하는 암묵적인 책임이 있을 뿐더러.
IE가 아닌 다른 브라우져 사용자들은 점점 늘어나는 추세라. 비록 일반 사용자임에도 불구하고 이것은 무시하지 못할 정도의 문제라고 생각할수 있습니다.
특히, 스킨 편집을 하고자 하시는 분들은 커스터마이징이나 디자인적 관점에서의 접근을 하게 됩니다만.
다른 브라우져에서 보았을때 그것이 무참하게 깨져 버림으로써 자신의 노력이 물거품이 되는 정신적 충격을 받을수도 있습니다.

이번 기회엔 초보자도 간단히 사용할수 있는 호환성에 관한 간단한 팁을 소개해 보겠습니다.




CSS에서 가장 문제가 되는 것은 다름아닌 '박스모델' 입니다.
특히 이글루스 스킨은 레이아웃을 잡는데에 있어 박스모델이 주로 사용됩니다만.
그 코드를 작성함에 있어 IE위주로 작성한다면 필연적으로 다른 브라우져에서는 깨지게 됩니다.
결론적으로, 이 '박스모델' 만 신경써 준다면 웬만한 브라우져에서는 다 잘 보인다는 것이죠.

IE에서 박스모델이 표준이 아닌 이유는 바로 padding, margin, border 사이즈에 있습니다.
예를들어 가로와 세로가 각각 100px인 박스에 padding 10px, margin 10px, border 1px를 준다고 생각해 봅시다.
간단히 생각해 보자면 다음과 같은 코드를 사용하면 되겠지요.

예제1-IE전용

DIV.TEST{
WIDTH: 100PX;
HEIGHT: 100PX;
PADDING: 10PX;
MARGIN: 10PX;
BORDER: 1PX SOLID #000000;
}


사실, 솔직히 말해 직관적입니다. 그냥 생각한 대로 가로세로 100픽셀에 그냥 padding, margin, border 만 주면 됩니다.
그런데. 이런 식으로 코드를 작성하면 반드시 이것은 다른 브라우져에서 문제가 생깁니다.
왜냐하면, IE의 경우 가로세로 수치가 눈으로 보이는 박스 사이즈에 기준한것에 반해,
다른 브라우져가 사용하는 가로세로 수치는 눈으로 보이는 사이즈가 아닌 내용이 표시되는 부분을 기준으로 하고 있기 때문이죠.

그러니까. 눈으로 보이는 박스 사이즈가 100px라고 하면, IE에서는 그냥 100px을 적어주면 끝납니다만.
표준 브라우져에서는 그 사이즈에서 padding과 border 사이즈를 뺀 사이즈, 위의 경우에서는 78px를 적어줘야 하는 것입니다.


자. 그렇다면 코드를 작성할때 일일히 이것을 계산해서 조심스레 적어야 할까요.
...솔직히 매우 머리아프고 귀찮은 짓임에 분명합니다.
또한 이렇게 적으면 되려 IE에서 잘 보이지 않는 결과가 생길수도 있습니다. (첨부 이미지 참조)

결국 생각해볼수 있는 방법은. 바로 표준과 IE를 따로 적어주는 방법인 것이죠.
위에서 초보자라도 쉽게 할수 있다고 언급했습니다만. 이 방법이야말로 가장 간단한 방법이라고 생각합니다.
왜. 이미 모든 코드를 작성한 상태에서도 각 박스모델에 몇줄씩 추가/수정만 해주는 것으로도 호환성 상승을 노릴수 있기 때문이죠.
자. 가로와 세로가 각각 100px인 박스에 padding 10px, margin 10px, border 1px를 준다면,
표준으로는 이렇게 적어야 다른 브라우져에서 IE와 같은 모델이 보입니다.

예제2-표준

DIV.TEST {
WIDTH: 78PX;
HEIGHT: 78PX;
PADDING: 10PX;
MARGIN: 10px;
BORDER: 1PX SOLID #000000;
}


그러나. 이 박스모델 코드를 해석하는 방식이. IE가 표준이 아니기 때문에 오히려 IE에서 깨지는 현상이 생겨버리는 것입니다.
IE 쪽을 쓰기 위해서는 그냥 가로세로 사이즈를 100px를 적으면 됩니다만 그러자니 다른 브라우져에서 깨지고....
해서, 위의 코드를 적은 뒤 아래에 IE에서만 인식하는 다음의 코드를 추가해 주는 방법으로 해결할수 있습니다.

* html DIV.TEST{
WIDTH: 100PX;
HEIGHT: 100PX;
}



* html ~~ 은 IE에서만 인식되는 특수한 selector라고 합니다. 저도 이유는 잘 모르겠습니다-_-
중요한 사실은 오로지, "* html ~~ 를 적어줌으로써 표준인 코드를 비표준인 IE에도 맞출수 있다" 는 것일 뿐이겠죠.

결론적으로, 가로와 세로가 각각 100px인 박스에 padding 10px, margin 10px, border 1px를 주고 싶을때.
표준과 IE에서 전부 잘 작동하는 코드를 만들고 싶다면 다음과 같이 작성하면 간단하게 해결할수 있습니다.

예제3-절충안

DIV.TEST{
WIDTH: 78PX;
HEIGHT: 78PX;
PADDING: 10PX;
MARGIN: 10px;
BORDER: 1PX SOLID #000000;
}

* html DIV.TEST{
WIDTH: 100PX;
HEIGHT: 100PX;
}



●중요!
이미 써져있는 코드를 수정할 경우, * html ~~ 을 각 박스 아래쪽 라인에 추가한 뒤,
원래의 수치는 * html ~~ 쪽으로 옮기고, 이미 써져 있던 수치는 margin은 제외하고 padding, border 사이즈를 빼서 적어주면 됩니다.
ex) 가로, 세로 100px에 padding 10px, border 1px라면. 100px - (20+2)= 78px 입니다.



<참고 이미지>
사용자 삽입 이미지

왼쪽은 파이어폭스, 오른쪽은 인터넷 익스플로러입니다.
IE전용이 파이어폭스에서는 크게 나오는 반면, 표준은 IE에서 작게 나옵니다.
절충안을 사용하면 두개의 브라우져에서 완전히 같은 박스모델이 구현 가능합니다.




이쪽에 대해서는 사실 크게 깊은 지식이 없기에 다소의 오류를 포함하고 있을수도 있습니다.
하지만. 위에 언급한 방법은 실제 사용해 본 결과, IE및 다른 브라우져에서도 완전히 같이 동작한다는 것을 확인하였기에 이렇게 소개해 봅니다.

이글루스에서 스킨을 직접 만드시는 분들.
특히 기존 스킨의 수정이 아닌 완전히 새로 만들 경우에 한해 호환성이 문제가 될 경우가 가끔 있습니다.
(물론, 이글루스 자체는 다른 브라우져에서 잘 보이는 편이고, 공개 스킨 또한 잘 보입니다만 가끔씩 과격한 모딩이 되어있는 스킨은 깨질때가 있습니다)

실로 간단한 방법입니다만.
이 팁으로 인해 리퍼러에 약 몇%만을 차지하는 소수의 타 브라우져 사용자들에게도 떳떳하게 블로그를 보일수 있었으면 하는 바램입니다.

참고 링크: 한국 모질라 포럼

덧붙임:
이 글은 한국 모질라 포럼의 웹 표준화 프로젝트 계시판에서 CSS 박스 모델 문서를 참조하였습니다.

출처 : 안티에고이스트
    

설정

트랙백

댓글

AS3 API 계층구조도

Programming/ActionScript 2.0 2007. 2. 21. 10:57
AS3 API 계층구조 자료



 = new EXE(new SWF(new JPG(PDF))); 입니다.

    

설정

트랙백

댓글

사용한 모든 인터벌 삭제하기

Programming/ActionScript 2.0 2007. 2. 21. 10:57
class IntervalGroup{


        private var _intervalAry:Array;
        private static var _instance:IntervalGroup;


        private function IntervalGroup(){
                _intervalAry = new Array();
        }


        public static function getInstance():IntervalGroup{
                if(_instance == null){
                        _instance = new IntervalGroup();
                }
                return _instance;
        }


        public function set interval(num:Number):Void{
                _intervalAry.push(num);
        }


        public function clear():Void{
                for(var i=0;i<_intervalAry.length;i++){
                        clearInterval(_intervalAry[i]);
                }
        }
}
    

설정

트랙백

댓글

프레임 모션에 easing 적용하기

Programming/ActionScript 2.0 2007. 2. 21. 10:56
보통 프레임간 이동할 시에는 사용할 클래스를 따로 제작을 하여 사용을 합니다. 저도 GotoPlay.as dynamic class를 만들어서 필요할때마다 사용을 하곤 합니다. 오늘 Tween 클래스를 가지고 놀다가 Tween클래스를 사용하여 프레임 모션에 에싱을 줄수 없을까 생각해 봤습니다. _currentframe 속성의 경우는 read-only 속성이기 때문에 값을 넣을 수가 없어서 Tween 클래스에서 무비클립의 속성으로 사용하여 에싱을 줄 수는 없습니다. 그래서 무비클립에 하나의 변수를 만들어 그것을 통해서 제어를 하도록 해봤습니다.








[Flash] http://jasu.tistory.com/attachment/cfile22.uf@232CFD385880209E219C15.swf


import mx.transitions.Tween;
import mx.transitions.easing.*;

mc._frame = mc._currentframe;
var myTween:Tween = new Tween(mc, "_frame", Strong.easeOut, mc._currentframe, 235, 1, true);
myTween.onMotionChanged = function() {
        mc.gotoAndStop(Math.round(mc._frame));
};
myTween.onMotionFinished = function() {
        this.yoyo();
};

mc라는 무비클립이 있고 그 안에 무비클립을 235 프레임까지 모션을 적용합니다. 엑션을 통한 모션처럼 자연스러운 모션을 적용하기 위해서는 프레임을 많이 필요로 합니다.(프레임간 이동 간격을 통해 esaing이 적용되기 때문)

프레임에 png 동영상 컷들을 넣고 스크롤바를 통해서 원하는 지점으로 이동할 때 프레임에 easing을 넣으면 괜찮을 것 같네요...^^

    

설정

트랙백

댓글

승려의 섬에는 과연 무슨일이 일어났는가?

Programming/Algorithms 2007. 2. 21. 10:56

마이크로 소프트사는 기발한 면접 문제로 유명하다.  아래는 마이크로소프트사에서 면접을볼때 질문했던 문제중에 하나입니다. 여러분도 한번 생각해 보세요


if((생각한 시간 > 2분) || (문제의 답을 이미 알고 있는가?)){
    웃고 넘어감;
}else{
    앞으로 돌아가서 최소한 2분 동안 답을 생각해 볼것;
}
 
"옛날에 어느 나라에  승려들만 모여 사는 섬이 있다. 그들 중에서 어느 사람은 눈이 빨갛고 어느 사람은 눈이 갈색이다. 눈이 빨간 사람은 마법에 걸려 있기 때문에 스스로 눈이 빨갛다는 사실을 깨닫게 되면 그날 밤 12시에 스스로 목숨을 끊어야만 한다(그것은 마법이었기 때문에 눈이 빨갛다는 사실을 깨달은 사람은 예외 없이 목숨을 끊어야 한다). 승려들은 서로의 눈 색깔에 대해 전혀 언급하지 않는다는 불문율이 있었기에 상대방의 눈 색깔을 알려줄 수도 없었다. 그 섬에는 거울도 없고 거울 비슷한 물건도 없었기 때문에 자신의 눈이 무슨 색인지 아는 사람은 아무도 없었다. 그래서 그들은 자신의 눈 색깔을 알 길이 없었기에 행복하게 살아갈 수 있었으며, 자살 따위를 하는 사람은 아무도 없었다.
 그러던 어느 날 그 섬에 관광객이 찾아왔다. 그는 승려들 사이에 존재하는 규칙을 알지 못했기 때문에 절대로 하지 말아야할 말을 내뱉고 말았다.
 "당신들 중에서 적어도 한 명은 눈이 빨간색이로군요."
무심한 관광객은 그 날로 되돌아갔지만, 남아있는 승려들은 생전 처음으로 눈 색깔에 대한 말이 나왔기 때문에 크게 동요하지 않을 수 없었다. 그리고 그날 밤부터 그 섬에는 무서운 일이 일어나기 시작했다. 빨간 눈을 가진 사람은 모두 3명이 있었다. 과연 어떤 일이 일어났겠는가?

임백준저 - 누워서 읽는 알고리즘 중에서 발췌


http://www.sellsbrothers.com/fun/msiview/default.aspx?content=question.htm


위 주소는 마이크로소프트사의 면접 문제를 모아놓은 곳입니다.
 
 
---------------------------
 
var dayCount = 0;
whatHappened = function (redEye:Number):Number { dayCount++; if (redEye == 1) {
                trace(dayCount+"");
        } else {
                trace(whatHappened(redEye-1)+"번 승려 죽음");
        }
        return redEye;
};
trace(whatHappened(3)+"번 승려 죽음");

----------------------------
 
flash에서는 메모리상의 스택 Depth가 255를 넘어가게 되면 오버플로우(overflow)가 발생한다. 다시 말해서 위 redeye 승려가 255명을 초과하게 되면 플래시는 힘들다고 계산 안한다.  그런데 구현이 맞는지 모르겠습니다.;;

    

설정

트랙백

댓글

오버라이딩 인스턴스 메소드의 멤버 접근

Programming/ActionScript 2.0 2007. 2. 21. 10:55
[오버라이딩 인스턴스 메소드의 멤버 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드

예제 :
class A{
        public function over():Void{
        }
}

class B extends A{
        public function methOfB():Void{
        }
        public function over():Void{
                methOfB(); //B.methOfB()를 실행한다.
        }
}

설명 :
서브클래스에 정의된 메소드는 어느 하나가 오버라이딩 메소드라도 서로 접근할 수 있다. 따라서 오버라이딩 메소드

B.over()는 B.methOfB()를 정상적으로 실행한다. [표]상속받은 메소드에서 서브클래스의 인스턴스 메소드를 실행할

때 오류가 발생한 것과 비교해본다.
====================
멤버 접근:
상속받은 인스턴스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public function over():Void{
        }
        public function otherMethOfA():Void{
        }
}

class B extends A{
        public function over():Void{
                //otherMethOfA()를 실행함
                otherMethOfA();
        }
}

설명 :
[표]에서, 서브클래스(B)의 모든 메소드는, 심지어 오버라이딩 메소드라 하더라도, 슈퍼클래스(A)의 메소드에 접근할

수 있다.
====================
멤버 접근:
오버라이드된 인스턴스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public function over():Void{
        }
        public function over2():Void{
        }
}

class B extends A{
        public function over():Void{
                //B.over()를 실행. A.over2()가 아니다.
                over2();
        }
        public function over2():Void{
        }
}

설명 :
모든 상황에 있어서, 컴파일러는 불분명한 참조에 대해, 슈퍼클래스를 찾지 않고 서브클래스 안에서 참조를 모두 결

정한다. 예제에서 오버라이딩한 over() 메소드는 over2()를 실행하는데, 이 메소드가 서브클래스에 동일하게 존재하

기 때문에 B.over2()를 실행한다.
====================
멤버 접근:
서브클래스의 인스턴스 속성

예제 :
class A{
        public function over():Void{
        }

        class B extends A{
                public var propOfB:Number = 1;
                public function over():Void{
                        trace(propOfB); // 출력 : 1
                }
        }

        설명 :
        서브클래스에 정의된 메소드는 동일한 서브클래스의 속성에 접근 할 수 있다. 따라서 오버라이딩 메소드 B.over()는

        propOfB에 접근하는 것이 가능하다. [표]과 비교해 보면 상속받은 메소드에서 서브클래스의 인스턴스 속성에 접근하

        는 것은 오류가 발생한다.
        ====================
        멤버 접근:
        상속받은 인스턴스 속성(슈퍼클래스에 정의됨)

        예제 :
        class A{
                public var propOfA:Number = 2;
                public function over():Void{
                }
        }

        class B extends A{
                public function over():Void{
                        trace(propOfA); // 출력 : 2
                }
        }

        설명 :
        서브클래스에 정의된 메소드는, 오버라이딩한 메소드라 하더라도 슈퍼클래스의 속성에 접근할 수 있다. 따라서 오버

        라이딩 메소드 B.over()는 propOfA에 접근하는 것이 가능하다.
        ====================
        멤버 접근:
        오버라이딩된 인스턴스 속성(슈퍼클래스와 서브클래스 모두 정의됨)

        예제 :
        class A{
                public var overriddenProp:Number = 3;
                public function over():Void{
                }
        }

        class B extends A{
                public var overriddenProp:Number = 4;
                public function over():Void{
                        trace(overriddenProp); // 출력 : 4
                }
        }

        설명 :
        서브클래스의 메소드는 서브클래스의 오버라이드된 속성의 값을 출력한다(3이 아닌 4). 왜냐하면 bInstance는

        overriddenProp에 단 하나의 값만을 저장하며, 오버라이딩 메소드는 슈퍼클래스의 오버라이드된 값을 참조하지 않는

        다.
        ====================
        멤버 접근:
        서브클래스의 클래스 메소드 불분명한 참조

        예제 :
        class A{
                public function over():Void{
                }
        }

        class B extends A{
                public static function classMethOfB():Void{
                }
                ublic function over():Void{
                        classMethOfB(); // B.classMethOfB()를 실행함
                }
        }

        설명 :
        컴파일 과정에서 클래스 케소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다(classMethOfB()는 해당 메소드

        가 존재하는 곳이 B이므로, B.classMethOfB()로 결정된다) [표]과 비교하면 상속받은 메소드(슈퍼클래스에 정의된)에

        서 static메소드에 대한 불분명한 참조는 오류가 발생했다.
        ====================
        멤버 접근:
        서브클래스의 클래스 메소드 불분명한 참조

        예제 :
        class A{
                public function over():Void{
                }
        }

        class B extends A{
                public static function classMethOfB():Void{
                }
                public function over():Void{
                        B.classMethOfB(); /// 정상적으로 실행됨.
                }
        }

        설명 :
        B.classMethOfB()는 분명한 참조이므로, 컴파일러는 클래스 B에서 해당 클래스 메소드를 찾게 된다.(이것은 오버라이

        딩 메소드라 하더라도 모든 상황에서 통용되는 사실이다.)
        ====================
        멤버 접근:
        상속받은 클래스 메소드(슈퍼클래스에 정의됨)

        예제 :
        class A{
                public static function classMethOfA():Void{
                }
                public function over():Void{
                }
        }

        class B extends A{
                public function over():Void{
                        classMethOfA(); // A.classMethOfA()를 실행함
                }
        }

        설명 :
        컴파일 과정에서 클래스 메소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다. 따라서 classMethOfA()는

        B.classMethOfA()로 결정된다. 비록 서브클래스 B에 classMethOfA()를 정의하지 않았지만 서브클래스에서 상속받은

        클래스 메소드를 사용할 수 있기 때문에 참조하는 것이 가능하다. 따라서 이 예에서는 B.classMethOfA()와

        A.classMethOfA()가 동일한 작업을 수행한다.
        ====================
        멤버 접근:
        오버라이드된 클래스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

        예제 :
        class A{
                public static function overriddenClassMeth():Void{
                }
                public function over():Void{
                        //A.overriddenClassMeth()를 실행함
                        overriddenClassMeth();
                }
        }

        class B extends A{
                public static function overriddenClassMeth():Void{
                }
                public function over():Void{
                        //B.overriddenClassMeth()를 실행함
                        overriddenClassMeth();
                }
        }

        // 사용법
        var aInstance:A = new A();
        var bInstance:B = new B();
        // A의 overriddenClassMeth()를 실행함
        aInstance.over();
        // B의 overriddenClassMeth()를 실행함
        bInstance.over();

        설명 :
        컴파일 과정에서 클래스 메소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다. 따라서 B의 over()에서

        overriddenClassMeth()는 B.overriddenClassMeth()로 결정된다. A의 메소드를 실행하려면 명확히

        A.overriddenClassMeth()를 사용하면 된다. 불분명한 참조를 사용하면, 메소드를 호출하고 있는 클래스에 존재하는

        것을 사용한다고 생각하면 된다.
        ====================
        A 클래스 메소드와 마찬가지로 클래스 속성에 대해서도 동일한 접근 규칙을 사용한다.



        출처 : 콜린 무크의 Flash ActionScript 2.0에서 발췌

    

설정

트랙백

댓글

상속받은 인스턴스 메소드에서 멤버의 접근

Programming/ActionScript 2.0 2007. 2. 21. 10:55

[상속받은 인스턴스 메소드에서 멤버의 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드

예제 :
class A{
        public function methOfA():Void{
                methOfB(); //Error!
        }
}

class B extends A{
        public function methOfB():Void{
        }
}

설명 :
컴파일타임 오류 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 메소드를 참조할 수 없다. 그리고 클래스 A는 methOfB()를 정의하지 않았기 때문에 참조하지 못한다.
====================
멤버 접근 :
상속받은 인스턴스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public function methOfA():Void{
                //Executes otherMethOfA()
                otherMethOfA();
        }
        public function otherMethOfA():Void{
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//정상적으로 실행된다.

설명 :
어떤 클래스의 메소드가 동일한 클래스의 다른 메소드를 호출하는 것은 가능하다. 서브클래스의 인스턴스를 통해 사용하더라도 호출할 수 있다.

====================
멤버 접근 :
오버라이드된 인스턴스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public function methOfA():Void{
                // 클래스 B의 인스턴스에서 실행하면 B의 overriddenMeth()가 호출된다. 클래스 A의 인스턴스에서 실행하면 A의 overriddenMeth()가 호출된다.
                overriddenMeth();
        }
        public function overriddenMeth():Void{
        }
}

class B extends A{
        public function overriddenMeth():Void{
        }
}
//사용법
var aInstance:A = new A();
var bInstance:B = new B();
// A의 overriddenMeth()가 싱행된다.
aInstance.methOfA();
// B의 overriddenMeth()가 실행된다.
bInstance.methOfA();

설명 :
오버라이드된 메소드는 클래스의 인스턴스에 따라서 사용하는 대상이 달라진다.

====================
멤버 접근 :
서브클래스의 인스턴스 속성

예제 :
class A{
        public function methOfA():Void{
                trace(propOfB); // 오류발생!
        }
}

class B extends A{
        public var propOfB:Number = 1;
}

설명 :
컴파일타임 에러 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 속성을 참조할 수 없다. 클래스 A에는 propOfB가 없으므로 사용할 수 없다.
====================
멤버 접근 :
상속받은 인스턴스 속성(슈퍼클래스에 정의됨)

예제 :
class A{
        public var propOfA:Number = 2;
        public function methOfA():Void{
                trace(propOfA); //출력: 2
        }
}

class B extends A{
}

설명 :
methOfA()와 같은 슈퍼클래스의 메소드는 슈퍼클래스의 속성(propOfA와 같은)에 접근할 수 있다.
====================
멤버 접근 :
오버라이드된 인스턴스 속성(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public var overriddenProp:Number = 3;
        public function methOfA():Void{
                trace(overriddenProp);
        }
}

class B extends A{
        public var overriddenProp:Number = 4;
}

// 사용법
var aInstance:A = new A();
var bInstance:B = new B();
aInstance.methOfA(); // 출력 : 3
bInstance.methOfA(); // 출력 : 4

설명 :
비록 클래스 A에서 속성을 접근하지만 B인스턴스에서 methOfA()를 실행하면, 서브클래스에서 오버라이드된 속성의 값(3이 아닌 4)을 사용한다. 왜냐하면 bInstance는 overriddenProp에 단 한 개의 값만을 저장할 수 있기 때문이다.(자바에서는 methOfA()를 실행하면 항상 3을 출력한다.)

====================
멤버 접근 :
서브클래스의 클래스메소드, 불분명한 참조

예제 :
class A{
        public function methOfA():Void{
                classMethOfB(); // 오류발생!
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
컴파일타임 에러 발생. classMethOfB()는 클래스 A에 정의하지 않았고, 슈퍼클래스는 불분명한 참조를 통해 서브클래스에 존재하는 클래스 메소드를 참조할 수 없다
====================
멤버 접근 :
서브클래스의 클래스메소드 분명한 참조

예제 :
class A{
        public function methOfA():Void{
                B.classMethOfB(); // 정상적으로 실행된다.
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
B.classMethOfB()는 분명한 참조로서, 컴파일러는 클래스 B에 해당 클래스 메소드가 존재하는 것을 파악할 수 있다(A의 서브클래스 B가 아니라 할지라도, 모든 클래스에서 이와 같이 사용할 수 있다).

====================
멤버 접근 :
상속받은 클래스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public static function classMethOfA():Void{
        }
        public function methOfA():Void{
                //A.classMethOfA()를 실행
                classMethOfA();
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//A.classMethOfA()를 실행

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 따라서 classMethOfA()는 A.classMethOfA()를 참조한다. 서브클래스 B의 인스턴스에서 A.classMethOfA()를 실행하면 정상적으로 동작한다.
====================
멤버 접근 :
오버라이드된 클래스 메소드(슈퍼클래스와 서브클래스에서 모두 정의됨)

예제 :
class A{
        public static function overriddenClassMeth():Void{
        }
        public function methOfA():Void{
                //A.overriddenClassMeth()를 실행
                overriddenClassMeth();
        }
}

class B extends A{
}

//사용법
var bInstance:B = new B();
//A.overriddenClassMeth()를 실행
bInstaince.methOfA();

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 클래스 A에서 overriddenClassMeth()는 A.overriddenClassMeth()로 변경된다. 클래스 A는클래스 B에 존재하는 B.overriddenClassMeth()를 실행할 수 있다.
====================
* 클래스 메소드와 마찬가지로 클래스 속성에 대해서도 동일한 접근 규칙을 사용함.


출처 : 콜린무크의 Flash ActionScript 2.0에서 발췌

    

설정

트랙백

댓글

구글의 구인광고

Programming/Etc 2007. 2. 21. 10:55

이 수학문제를 풀어야 입사지원 된다?

실리콘밸리 중심가 101번 고속도로가 통과하는 곳에 최근 광고판 하나가 달렸다. 광고판에는 아무런 설명없이 수학문제 하나만 덩그러니 담겨있다.


검색업계의 강자 구글이 아무런 표시도, 설명도 없는 광고판을 세운 이유는 이 문제를 풀 수 있는 수학적 두뇌를 가진 사람을 골라 입사 기회를 주기 위해서라고 한다. 수학자 폴 아도스의 유명한 “수학자란 커피를 정리로 변환시키는 장치”라는 말을 연상시키는 채용방법이다.


광고판에는 ‘{첫 10자릿수 솟수 e}.com’이라고 적혀있다. 답은 7427466391이다. 이 문제를 풀어 7427466391.com으로 접속해보면 2번째 관문인 다른 문제가 나오는데, 여기에도 구글이라는 이름은 없다.


2단계 문제까지 풀면 비로소 구글 연구개발부서인 구글랩 페이지로 연결되며, “구글을 키워나가면서 우리가 배운 점 한가지는 우리가 찾고자 하는 상대방 역시 우리를 찾고 있을 때, 그 사람을 더 쉽게 찾게 된다는 것이다. 우리는 세계 최고의 엔지니어를 찾고 있고, 당신은 여기에 와있다”라는 환영메시지를 볼 수 있다.


메시지는 “짐작하겠지만 우리는 엄청난 량의 이력서를 매일같이 받고 있기 때문에 이러한 절차를 이용해 ‘신호대 잡음비’를 개선하려 하는 것”이라는 말로 이어진다.


올해 말 27억달러 규모의 IPO를 준비중인 구글은 깐깐한 채용 과정으로 유명하다. 회사 설립 첫날부터 3월 31일 현재 직원수 1907명에 이르기까지 구글은 자사만의 채용 기준을 엄격히 준수해왔다.


팔로알토 차고에서 운영되던 초창기에 입사한 한 직원은 “면접 볼 때 세르게이 브린과 래리 페이지(이상 구글 공동설립인)의 책상 위에는 8권의 채용관련 서적이 쌓여 있었다”고 말했다.

구글 직원들은 많은 면접 단계를 거쳤으며, 종종 수학이나 사업전략에 대한 테스트도 요구받았다고 한다. 채용조건은 이와같은 단계가 끝난 후에나 알 수 있었다. 최근 2년 동안에는 우수 인력을 영입하기 위해 프로그래밍 대회를 개최하기도 했다.


구글이 시행한 또한가지 독특한 채용방법은 검색결과 페이지의 광고 링크를 이용한 것이다. 예를 들면 아마존의 검색기술 연구팀인 A9의 팀장 우디 맨버(Udi Manber)를 구글에서 검색하면 검색결과 오른쪽 스폰서 링크에 ‘구글에서 일하세요’라는 문구가 뜨고, 구글 구인 페이지로 연결하는 링크가 나타난다.


한편 현재 구글에서 근무하는 컴퓨터 엔지니어들은 대부분 스탠포드 대학 컴퓨터과학도 출신인 것으로 알려졌다. 이번 수학문제 광고판은 산타클라라 방향에서 롤스톤으로 빠지는 길 근처에 세워졌다. 이 회사 관계자는 상황에 따라 광고판을 더 늘릴 수도 있다고 밝혔다.


출처: ZDnet

    

설정

트랙백

댓글

Iterator Design Pattern

Programming/Design Patterns 2007. 2. 21. 10:54
// Iterator interface //

interface Iterator{
public function hasNext():Boolean;
public function next():Object;
}

// Aggregate interface //

interface Aggregate{
public function iterator():Iterator;
}

// Book class //

class Book{
private var name:String = "";
public function Book(name:String){
this.name = name;
}
public function getName():String{
return name;
}
}


// BookShelfIterator class //

class BookShelfIterator implements Iterator{
private var bookShelf:BookShelf;
private var index:Number;
private var book:Book;
public function BookShelfIterator(bookShelf:BookShelf){
this.bookShelf = bookShelf;
this.index = 0;
}
public function hasNext():Boolean{
if(this.index < bookShelf.getLength()){
return true;
}else{
return false;
}
}
public function next():Object{
this.book = bookShelf.getBookAt(this.index);
this.index++;
return this.book;
}
}



// BookShelf class//



class BookShelf implements Aggregate{
private var books:Array;
private var last:Number = 0;
public function BookShelf(){
this.books = new Array();
}
public function getBookAt(index:Number):Book{
return books[index];
}
public function appendBook(book:Book):Void{
this.books[last] = book;
last++;
}
public function getLength():Number{
return last;
}
public function iterator():Iterator{
return new BookShelfIterator(this);
}
}



// Main class //

class Main{
private var bookShelf:BookShelf;
private var it:Iterator;
private var book:Book;
public function Main(){
init();
}
public function init(){
this.bookShelf = new BookShelf();
this.bookShelf.appendBook(new Book("Around the World in 80 Days"));
this.bookShelf.appendBook(new Book("Bible"));
this.bookShelf.appendBook(new Book("Cinderella"));
this.bookShelf.appendBook(new Book("Daddy-Long-Legs"));
this.it = bookShelf.iterator();
while(it.hasNext()){
this.book = Book(it.next());
trace(""+this.book.getName());
}
}
}
    

설정

트랙백

댓글

동적으로 로드한 이미지 Allow smoothing 컨트롤 하기...

Programming/ActionScript 2.0 2007. 2. 21. 10:54

Dcaland.com을 만들면서 사용한 메소드를 하나 올릴까 합니다. 플래시 8 버전에서는 이미지를 외부로 부터 로드를 할 경우에 default로 Allow smoothing(매끄럽게)이 false 값을 가지게 되는데 Allow smoothing이 false일 경우에는 에니메이션(좌표,로테이션등) 할때 이미지가 지글거리는 문제가 있죠. 라이브러리에 등록된 이미지는 속성에서 수동으로 채킹을 해서 사용하면 된다지만 외부에서 동적으로 불러온 이미지를 움직일 때는 문제가 있죠. 아래 메소드는 그 문제를 해결해 주는 메소드입니다. http://www.kaourantin.net/ 에 기술된 내용을 간단하게 수정해서 사용하고 있습니다.







import flash.display.*;

private function loadImg (target : MovieClip, url : String) : Void
{
        var bmc : MovieClip = target.createEmptyMovieClip ("bmc", target.getNextHighestDepth ());
        var listener : Object = new Object ();
        listener.tmc = target;
        listener.onLoadInit = function (mc : MovieClip)
        {
                mc._visible = false;
                var bitmap : BitmapData = new BitmapData (mc._width, mc._height, true);
                this.tmc.attachBitmap (bitmap, this.tmc.getNextHighestDepth () , "auto", true);
                bitmap.draw (mc);
        };
        var loader : MovieClipLoader = new MovieClipLoader ();
        loader.addListener (listener);
        loader.loadClip (url, bmc);
}


BitmapData 를 사용하기 위해서 import flash.display.*; 임포트 시켜서 사용하세요
입맛에 맞게 수정해서 사용하세요 어떻게 보면 약간의 꼼수가 있는거 같지만 8.5 나오기 전까지는 작지만 유용한 메소드가 될듯 싶습니다.

    

설정

트랙백

댓글