자바스크립트로 만드는 객체지향 게임 - 폭탄 클래스

이제 가장 중요한 부분인 폭탄 클래스입니다.

폭탄은 폭발할 경우 인접 폭탄으로 폭발 메시지를 비동기 방식으로 전달하며, 메시지를 받은 폭탄은 심지가 폭발 방향을 향하고 있는지 판단하여 폭발합니다. 그리고, 다시 인접 폭탄으로 폭발 메시지를 전달하는 것을 반복합니다.

또한, 폭탄은 사용자가 액션을 취하는 유일한 클래스입니다. 클릭 이벤트를 받아 심지의 방향을 바꿉니다.

폭탄 클래스는 아래와 같습니다.

        /* 개별폭탄클래스*/

        $class({

               CBomb : {

                       sprite : null,   // CSprite

                       direction : 0,   // 0 : right, 1 : bottom, 2 : left, 3 : top

                       fireLevel : 4,   // 폭발단계

                       /* 폭탄위치*/

                       x : 0,          

                       y : 0,

                       bombTable : null,

                       dropY : 0,

                      

                       /* 이벤트매핑*/

                       EVENT_MAP : {

                              click : 'onClick',  // 폭탄클릭

                              fire : 'onFire',    // 폭탄폭발

                              drop : 'onDrop'     // 폭탄떨어짐

                       },

                      

                       /* 폭탄스프라이트를생성*/

                       init : function (bombTable,clickEnable) {

                           this.bombTable=bombTable;

                              this.sprite = $factory.get(CSpriteBase).get(0,bombTable.element);

                              this.direction = this.sprite.getShape();

                              if (clickEnable==true) $event(this.sprite.getElement(),this);   // 맨밑줄의폭탄은클릭할수없다.

                              this.sprite.show();

                       },

                       /* 폭탄을클릭가능하게함*/

                       enable : function() {

                           $event(this.sprite.getElement(),this);

                       },

                       /* 폭탄의위치지정*/

                       setPos : function (x,y) {

                           this.x=x;

                           this.y=y;

                              this.sprite.setPos(x*29,y*29,this.bombTable.element);

                       },

                       /* 폭탄의심지방향지정*/

                       setDirection : function(dir) {

                           this.direction=dir;

                           this.sprite.shape(dir);

                       },

                       /* 현재폭탄의심지방향반환*/

                       getDirection : function() {

                           return this.direction;

                       },

                       /* 폭탄의폭발애니메이션을보여준다*/

                       showExplosion : function () {

                              if (this.fireLevel<6) {

                                      this.sprite.shape(this.fireLevel);

                                      this.fireLevel++;

                                      window.setTimeout(this.showExplosion.bind(this),100);

                              } else {

                                      this.fireLevel=4;

                                      this.sprite.hide();

                                      $event.fire(this.bombTable,'explosion',this.x,this.y);

                              }

                       },

                       /* 폭탄클릭이벤트핸들러- 폭탄심지의방향을바꾼다*/

                       onClick : function (evt,src,type) {

                              this.direction++;

                              if (this.direction>3) this.direction=0;

                              this.sprite.shape(this.direction);

                       },

                       /* 인접폭탄이폭발했다- 심지가폭발방향을향하고있으면, 자신도폭발한다*/

                       onFire : function(evt,src,type,x,y) {

                           if ((this.direction==0 && y==this.y && x==this.x+1)||

                               (this.direction==1 && y==this.y+1 && x==this.x)||

                               (this.direction==2 && y==this.y && x==this.x-1)||

                               (this.direction==3 && y==this.y-1 && x==this.x)) {

                                   $event.fire(this.bombTable,'fireBomb',this.x,this.y);

                                   this.doFire();

                               }

                       },

                       /* 인접폭탄들에폭발메시지를보낸다*/

                       doFire : function() {

                           var arrSiblings=this.bombTable.getSiblingBomb(this.x,this.y);

                           for(var i=0;i<4;i++) {

                                if (arrSiblings[i] && this.direction!=i)

                                    $factory.get(CMessageQueue).put(arrSiblings[i],'fire',this.x,this.y);   // 비동기로메시지를전송한다.

                           }

                           this.showExplosion();

                       },

                       /* 폭탄이아래로떨어진다*/

                       onDrop : function() {

                           this.dropY=0;

                           window.setTimeout(this.doDrop.bind(this),100);

                       },

                       /* 실제폭탄이떨어지는애니메이션구현*/

                       doDrop : function() {

                           var finish=false;

                           this.dropY+=15;

                           if (this.dropY>29) {

                                this.dropY=29;

                                if (this.direction==1) this.setDirection(3);

                                else if (this.direction==3) this.setDirection(1);

                                finish=true;

                           }

                           this.sprite.setPos(this.x*29,this.y*29+this.dropY,this.bombTable.element);

                           if (finish) {

                                /* 폭탄이모두떨어지면폭탄테이블에알린다*/

                                this.y++;

                                $event.fire(this.bombTable,'dropComplete',this,this.x,this.y-1);

                           } else {

                                window.setTimeout(this.doDrop.bind(this),100);

                           }

                       }

               }

        });

 


소스는 그냥 보면서 쭉 읽으면 알 수 있을 정도로 간단합니다. 다른 방식으로 구현 할 수도 있지만, Swaf에서 클래스의 사용 및 메시징을 알리기 위해 이렇게 구현하였습니다.

아쉽게도, 부족한 시간으로 상속 등을 사용하지는 못했습니다. ㅠㅠ

by 레이쥬 | 2007/12/21 16:54 | SWAF - 응용 | 트랙백 | 덧글(0)

트랙백 주소 : http://reizes.egloos.com/tb/1686161
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶