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 |