Flash with Adobe AIR

Starling-Hungry Hero-05

GrayrabbiT 2015. 2. 16. 13:53
반응형

05번 시간이 맞을거 같습니다. 정신이 없어서. 정신이 나간거 같아요.ㅡㅡ;

자 이제 시작하겠습니다 오늘은 InGame안에서 거의 놀듯 싶은데요. 일단 한번 보시죠. 게임화면에 들어가면 일단 게임을 시작하는 버튼을 만들어 주려고 합니다. 그러면 위에서 객체를 하나 선언하도록 하겠습니다. 버튼이구요. 그 다음에 시간을 좀 판단할 필요가 있겠죠? 얼마나 날아갔느냐 이런 것들은 시간으로 판단하면 될테니까요 그래서 일단 몇가지를 추가하는데요

 

import flash.utils.getTimer;

 

요 녀석을 추가해주고 선언은 이렇게.. 바꿉니다.

 

        private var startButton:Button;

        

        private var timePrevious:Number;

        private var timeCurrent:Number;

        private var elapsed:Number;

        

        private var gameState:String;

        

버튼 하나 추가하구요 그담에 전시간 지금시간 그담에 그 사이를 측정할 3개의 숫자 변수를 넣고. 그담 우리의 겜 상태를 판단하는 녀석을 집어 넣도록 하겠습니다.

그리고 drawGame() 메소드 안에서 starButton을 넣어주도록 하겠습니다. 이렇게요.

        private function drawGame():void

        {

            bg = new GameBackground();

            bg.speed= 10;

            this.addChild(bg);

            

            hero = new Hero();

            hero.x=stage.stageWidth>>1;

            hero.y=stage.stageHeight>>1;

            this.addChild(hero);

            

            startButton = new Button(Assets.getAtlas().getTexture("startButton"));

            startButton.x=stage.stageWidth-startButton.width>>1;

            startButton.y= stage.stageWidth-startButton.height>>1;

            this.addChild(startButton);

            

            

        }

    

이렇게 넣었습니다. 일단 텍스쳐 붙여서 버튼 만들고 화면 중간에 띄우도록 하죠. 다음으로는 동작하게 되었을 때 몇가지 효과를 넣어주도록 하겠습니다요.

        public function initialize():void

        {

            this.visible=true;

            this.addEventListener(Event.ENTER_FRAME, checkElapsed);

            

            hero.x=-stage.stageWidth;

            hero.y=stage.stageHeight>>1;

            

            gameState="idle";

            

            startButton.addEventListener(Event.TRIGGERED,onStartButtonClick);

            

            

        }

 

일단 보시면 먼저 화면 보여주는 건 있었구요. EnterFrame 이벤트를 넣어주었습니다. 그리고 히어로가 스테이지 밖에서 발사! 하면 화면안으로 슉~ 들어왔다가 제자리로 가는걸 만들어 보기 위해서 화면 밖으로 쫓겨났구요. 그담에는 스타트 버튼에 트리거를 걸어 주었습니다. 스타트 버튼 먼저 구성할께요. onStartButtonClick 입니다.

 

        private function onStartButtonClick(e:Event):void

        {

            startButton.visible=false;

            startButton.removeEventListener(Event.TRIGGERED,onStartButtonClick);

            launchHero();

        }.

이렇게 해 주면 일단 버튼을 없애고 이벤트를 삭제해 주었어요. 그리고 히어로를 발사! 시킬겁니다.ㅡㅡ; 그런데 아직 없잖아요? 그럼 만들어야죠 뭐….만들겠습니다. 이렇게 일단 잡죠.

        private function launchHero():void

        {

            this.addEventListener(Event.ENTER_FRAME, onGameTick);

        }

 

네 일단 런치가 되면 엔터프레임에서 시작됩니다. onGameTick 이라는 녀석인데요 이녀석은 아마도 계속 접하시게 될거에요. 이 안에서 거의 대부분이 시작되니까요.

 

그리고 아까 또하나의 엔터프레임이 있었는데요. 이렇게 잡아줄 것입니다.

        private function checkElapsed(e:Event):void

        {

            timePrevious = timeCurrent;

            timeCurrent = getTimer();

            elapsed = (timeCurrent - timePrevious)*0.001;

        }

 

이렇게요 일단 전 타임과 지금 타이밍의 차이에서 0,001을 곱한 녀석입니다.휴.. 이제 되었죠?

그런데 변수 몇가지 더 선언할께요.

 

        private var playerSpeed:Number;

        private var hitObstacle:Number=0;

        private const MIN_SPEED:Number=650;

 

이렇게 선언하겠습니다. 플레이어의 스피드와 몇번 장애물에 몇번 부딪쳤는지 체크하는 녀석과 그다음 최소 스피드 입니다. 이녀석들을 가지고 onGameTick을 꾸며 볼꺼에요 잘 따라오세요.

        private function onGameTick(e:Event):void

        {

            switch(gameState)

            {

                case "idle":

                    

                    if(hero.x<stage.stageWidth*0.5*0.5){

                        hero.x+=((stage.stageWidth*0.5*0.5+10)-hero.x)*0.05;

                        hero.y=stage.stageHeight>>1;

                        

                        playerSpeed+=(MIN_SPEED-playerSpeed)*0.05;

                        bg.speed =playerSpeed*elapsed;

                    }

                    else

                    {

                        gameState="flying";

                                    

                    }

                    break;

                case "flying":

                    playerSpeed-=(playerSpeed-MIN_SPEED)*0.01;

                    bg.speed = playerSpeed*elapsed;

                    break;

                case "over":

                    break;

            }

        }

 

아까 보셨겠지만… 음 gameState을 "idle"로 해주었습니다. 이상테는 초기상태가 되겠죠? 런치히로가 실행되면 onGameTick이 프레임마다 돌아가는게요 일단 아이들 상태가 되면 좌표를 좀 바꿔줄꺼에요. 아까도 말씀드렸지만 화면 밖에서 히어로가 슝 날아올껍니다. 어디까지? 화면의 1/4 지점까지!

화면 1/4 지점까지 날아가면서 변화되는 값을 일단 보시죠. 일단 플레이어 스피드는 0이에요 그런데 우리는 최소 스피드에까지 도달해야 합니다. 그래서 저러한 수식이 나와요. 보통 이런식입니다.

현재변수 += (목표값-현재변수)*비율

이렇게 꾸며주게 된답니다. 그리고 게임 스피드와 배경의 속도가 비율을 이루어야 하기때문에 게임 스피드를 배경스피드와 맞춰주게 되는데 이때도 비율인 전 시간과 지금 시간을 계속 곱해줍니다. 왜이런지는 나중에…

그리고 목표 좌표에 도달하게 되면. 더이상 히어로를 움직이지 않고 상태를 플라잉으로 바꾸어 줍니다.

플라잉에서는 수식이 왜 저모냥이냐 라고 물으시면.. 일단 혼자 이해해 보시죠^^가 아니구요 그냥 MinSpeed에 맞추는 거에요. 위에처럼 쓰셔도 똑같을거고 배경화면 속도도 똑같구요.

그리고 이제 초기값을 정리해주죠. 일단 드로우에서 게임 스피드를 정할 필요가 없습니다. 삭제~

그리고 initialize 에서 초기값을 잡아줍니다. 전체코드를 드릴께요.

InGame 전체 소스입니다.

package screens

{

    import com.greensock.easing.Back;

    

    import flash.utils.getTimer;

    

    import objects.GameBackground;

    import objects.Hero;

    

    import starling.display.Button;

    import starling.display.Sprite;

    import starling.events.Event;

    

    public class InGame extends Sprite

    {

        private var startButton:Button;

        private var hero:Hero;

        private var bg:GameBackground;

        

        private var timePrevious:Number;

        private var timeCurrent:Number;

        private var elapsed:Number;

        

        private var gameState:String;

        private var playerSpeed:Number;

        private var hitObstacle:Number=0;

        private const MIN_SPEED:Number=650;

          

        

        public function InGame()

        {

            super();

            this.addEventListener(Event.ADDED_TO_STAGE, onAdded);

        }

        

        private function onAdded():void

        {

            this.removeEventListener(Event.ADDED_TO_STAGE, onAdded);

            drawGame();

        }

        

        private function drawGame():void

        {

            bg = new GameBackground();

            this.addChild(bg);

            

            hero = new Hero();

            hero.x=stage.stageWidth>>1;

            hero.y=stage.stageHeight>>1;

            this.addChild(hero);

            

            startButton = new Button(Assets.getAtlas().getTexture("startButton"));

            startButton.x=(stage.stageWidth-startButton.width)>>1;

            startButton.y= (stage.stageHeight-startButton.height)>>1;

            this.addChild(startButton);

            

            

        }

        

        public function disposeTemporarily():void

        {

            this.visible=false;

        }

        

        private function onStartButtonClick(e:Event):void

        {

            startButton.visible=false;

            startButton.removeEventListener(Event.TRIGGERED,onStartButtonClick);

            launchHero();

        }

        

        private function launchHero():void

        {

            this.addEventListener(Event.ENTER_FRAME, onGameTick);

        }

        

        private function onGameTick(e:Event):void

        {

            switch(gameState)

            {

                case "idle":

                    

                    if(hero.x<stage.stageWidth*0.5*0.5){

                        hero.x+=((stage.stageWidth*0.5*0.5+10)-hero.x)*0.05;

                        //hero.y=stage.stageHeight>>1;

                        

                        playerSpeed+=(MIN_SPEED-playerSpeed)*0.05;

                        bg.speed =playerSpeed*elapsed;

                    }

                    else

                    {

                        gameState="flying";

                                    

                    }

                    break;

                case "flying":

                    playerSpeed-=(playerSpeed-MIN_SPEED)*0.01;

                    bg.speed = playerSpeed*elapsed;

                    break;

                case "over":

                    break;

            }

        }

        

        private function checkElapsed(e:Event):void

        {

            timePrevious = timeCurrent;

            timeCurrent = getTimer();

            elapsed = (timeCurrent - timePrevious)*0.001;

        }

        

        public function initialize():void

        {

            this.visible=true;

            this.addEventListener(Event.ENTER_FRAME, checkElapsed);

            

            hero.x=-stage.stageWidth;

            hero.y=stage.stageHeight>>1;

            

            gameState="idle";

            playerSpeed = 0;

            hitObstacle = 0;

            

            bg.speed=0;

            startButton.addEventListener(Event.TRIGGERED,onStartButtonClick);

            

            

        }

    }

}

 

네 이렇게 하면 될거에요. 아마도..ㅡㅡ;

반응형

'Flash with Adobe AIR' 카테고리의 다른 글

Starling-03 TouchEvent  (0) 2015.02.16
  (0) 2015.02.16
Starling-Hungry Hero-04  (0) 2015.02.16
Starling-Hungry Hero-03  (0) 2015.02.16
Starling-HungryHero-02  (0) 2015.02.16