본문 바로가기

FLASH/AS3.0팁

게임프레임웍기본형(절차적방식, 클래스방식)

초기화면 나오고 시작버튼 클릭하면

게임모드로 플레이 하고 그냥 빈화면 10번 클릭으로 했습니다.

엔딩화면 나오고 리스타트 클릭하면 다시 게임모드로 되는 것을 구현한 코드입니다.

 

우선 게임을 볼까요?

시작버튼 클릭후 빈화면을 10번 클릭하면 게임이 종료됩니다.



basic.fla




 

절차적방식의 예입니다.

소스를 보면 아시겠지만 플래시파일 첫번째 타임라인에 적어주면 됩니다.

 

 

const STATE_INIT:int = 10;

const STATE_PLAY:int = 20;

const STATE_GAME_OVER:int = 30;

var gameState:int = 0;

var clicks:int = 0;

var bgStart:BG_start = new BG_start();

var btnStart:BTN_start = new BTN_start(); 

 


var bgEnd:BG_end = new BG_end();

var btnEnd:BTN_end = new BTN_end(); 

 

 

 

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

addEventListener(Event.ENTER_FRAME, gameloop);

gameState = STATE_INIT;

// 게임루프

function gameloop(e:Event):void{

 switch(gameState){

  case STATE_INIT:

   initGame();

   break;

  case STATE_PLAY:

   playGame();

   break;

  case STATE_GAME_OVER:

   gameOver();

   break;

 }

}

///////// 초기화와 시작화면 관련

function initGame(){

 //게임루프정지

 removeEventListener(Event.ENTER_FRAME, gameloop); 

 initData(); 

 viewStart();    

}

function initData(){

 clicks = 0;

}

function viewStart(){

 addChild(bgStart);

 addChild(btnStart);  

 btnStart.x = (stage.stageWidth - btnStart.width)/2;

 btnStart.y = stage.stageHeight - 2*(btnStart.height);

 btnStart.buttonMode = true;

 btnStart.addEventListener(MouseEvent.CLICK, onStart);

}


function onStart(e:MouseEvent){

 var mc:MovieClip = e.currentTarget as MovieClip;

 removeChild(mc); 

 removeChild(bgStart); 

 mc.removeEventListener(MouseEvent.CLICK, onStart);

 

 trace("게임시작");

 //게임루프시작

 addEventListener(Event.ENTER_FRAME, gameloop); 

 gameState = STATE_PLAY;

}

///////// 게임모드

function playGame(){

 stage.addEventListener(MouseEvent.CLICK, onMouseClickEvent);

 if(clicks >= 10){

  gameState = STATE_GAME_OVER;

 }

}

function onMouseClickEvent(e:MouseEvent){

 clicks++;

 trace(clicks+ "번 마우스 클릭질 했습니다.");

}

///////// 게임오버화면

function gameOver(){

 //게임루프 멈춤

 removeEventListener(Event.ENTER_FRAME, gameloop); 

 //클릭게임의 모든 이벤트 멈춤

 stage.removeEventListener(MouseEvent.CLICK, onMouseClickEvent);

 trace("게임오버"); 

 initData();

 viewEnd()

}

function viewEnd(){

 addChild(bgEnd);

 addChild(btnEnd);

 btnEnd.x = (stage.stageWidth - btnEnd.width)/2;

 btnEnd.y = stage.stageHeight - 2*(btnEnd.height);

 btnEnd.buttonMode = true; 

 btnEnd.addEventListener(MouseEvent.CLICK, onEnd); 

}

function onEnd(e:MouseEvent){

 var mc:MovieClip = e.currentTarget as MovieClip;

 mc.removeEventListener(MouseEvent.CLICK, onEnd);

 removeChild(mc); 

 removeChild(bgEnd); 

 trace("게임오버");  

 //게임루프시작

 addEventListener(Event.ENTER_FRAME, gameloop);  

 gameState = STATE_PLAY;

}

 

 

=====================================================


1_기본파일.zip




똑같은 로직의 클래스방식입니다.

별도의 AS파일에 적으면 됩니다.

 

package  {

 

 import flash.display.MovieClip;

 import flash.events.Event;

 import flash.events.MouseEvent;

 import flash.display.*;

 import flash.events.*;

 import flash.net.*;

 

 public class Game extends MovieClip {

  

  public static const STATE_INIT:int = 10;

  public static const STATE_PLAY:int = 20;

  public static const STATE_GAME_OVER:int = 30;

  

  public var bgStart:BG_start = new BG_start();

  public var btnStart:BTN_start = new BTN_start();

  public var bgEnd:BG_end = new BG_end();

  public var btnRestart:BTN_restart = new BTN_restart();  

  

  public var gameState:int = 0;

  public var clicks:int = 0;    

  

  public function Game() {

   addEventListener(Event.ENTER_FRAME, gameloop); //루프작동

   gameState = STATE_INIT;

  }

  

  public function gameloop(e:Event):void{

   switch(gameState){

    case STATE_INIT:

     initGame();

     break;

    case STATE_PLAY:

     playGame();

     break;

    case STATE_GAME_OVER:

     gameOver();

     break;

   }

  }

  

/////////////// 게임 초기화 및 시작화면 관련

  public function initGame(){

   //게임루프멈춤

   removeEventListener(Event.ENTER_FRAME, gameloop); 

   // 데이터 초기화

   initData();

   // 시작화면 보여주는 함수 호출

   viewStart();

  }

  

  // 데이터 초기화 함수

  public function initData(){

   clicks = 0;

  }

  

  // 시작화면 그리기

  public function viewStart(){

   addChild(bgStart);

   addChild(btnStart);

   btnStart.x = (stage.stageWidth - btnStart.width)/2;

   btnStart.y = stage.stageHeight - 2*(btnStart.height);

   btnStart.buttonMode = true;

   //스타트버튼 이벤트 등록

   btnStart.addEventListener(MouseEvent.CLICK, onStart);   

  }

  // 스타트버튼 클릭하면 시작화면들 지워줍니다. 

  public function onStart(e:MouseEvent){

   var mc:BTN_start = e.target as BTN_start;

   removeChild(mc);

   removeChild(bgStart);

   //스타트버튼 이벤트 삭제

   

   trace("게임시작");

   

   mc.removeEventListener(MouseEvent.CLICK, onStart);

   //게임루프작동

   addEventListener(Event.ENTER_FRAME, gameloop); 

   gameState = STATE_PLAY;

  }

////////////////// 게임플레이 관련  

  public function playGame(){

   stage.addEventListener(MouseEvent.CLICK, onMouseClickEvent);    

   if(clicks >= 10){

    gameState = STATE_GAME_OVER;

   }

  }

  public function onMouseClickEvent(e:MouseEvent){

   clicks++;

   trace(clicks+ "번 마우스 클릭질 했습니다.");

  }  

////////////////////// 엔딩 관련

  public function gameOver(){

   //게임루프 멈춤

   removeEventListener(Event.ENTER_FRAME, gameloop); 

   //클릭게임의 모든 이벤트 멈춤

   stage.removeEventListener(MouseEvent.CLICK, onMouseClickEvent);

   //데이터 초기화

   initData();

   //엔딩화면 함수 호출   

   viewEnd();

   //gameState = STATE_INIT;

   trace("게임오버");

  

  }  

  

  // 엔딩화면 그리기

  public function viewEnd(){

   addChild(bgEnd);

   addChild(btnRestart);

   btnRestart.x = (stage.stageWidth - btnRestart.width)/2;

   btnRestart.y = stage.stageHeight - 2*(btnRestart.height);

   btnRestart.buttonMode = true;

   //리스타트 버튼 이벤트등록

   btnRestart.addEventListener(MouseEvent.CLICK, onEnd);  

  }

  

  public function onEnd(e:MouseEvent){

   var mc:BTN_restart = e.target as BTN_restart;

   removeChild(mc);

   removeChild(bgEnd);

   // 리스타트버튼 이벤트 삭제

   mc.removeEventListener(MouseEvent.CLICK, onEnd);

   

   trace("게임 다시시작");

   

   // 게임루프작동

   addEventListener(Event.ENTER_FRAME, gameloop); 

   gameState = STATE_PLAY;

  }

 }

}