2019년 9월 29일 일요일

GMS2 GameMaker Studio 2 로 슈팅 게임 만들기 (4) (Let's Make shooting game)


0. 목차


슈팅 게임의 기초 - 배경 스크롤
다중 배경 스크롤
주인공 object
ON Screen Jog
적 object
적 탄환
boss object
boss 탄환
Timelines 사용
Paths 사용
Player 입장 구현
Player 퇴장 구현
우주 배경 배경 스크롤

1. 적 object

적 이미지를 준비합니다. 이름은 Fly로 지었고 이미지의 출처는 Free이미지였는데 정확한 URL은 잘모르겠지만, 직접 그린 이미지는 아닙니다. 날파리 처럼 날개가 파닥 거리게 하였습니다.

object 이름은 oEnemyFlySky로 이름 지었습니다. 해당 object는 정해놓은 길을 따라서 파닥거리며 날라오게 할것입니다. 정해놓은길을 사용하기 때문에 해당 object의 x,y좌표는 제어할 필요가 없습니다. 그래서 step에서 좌표 제어하는 부분들을 모두 필요없습니다.

2. Timelines

Timelines이라는것은 일정시간 후에 어떤 동작이 일어나도록 미리 동작을 정해 놓는것을 의미합니다.

2.1 TimeLine의 호출

Room의 Tileline시작은 oSkyTimelineMaker라는 object를 만들어 두었습니다. object는 내용은 비어있고 , room 에서 더블클릭하여 instance Creation code에서 timeline을 설정 하도록 만들었습니다.

2.2 TimeLine 호출 내용

timeline_index = tlSkyLvl1;   timeline 이름을 설정 합니다.
timeline_position = 0;         timeline 의 시작 위치를 알립니다.
timeline_running = true;      timeline 이 시작됨을 알립니다.

tlSkyLvl1의 내용을 살펴보면 아래와 같습니다.

대부분 같은 내용입니다. Moment는 시간을 의미합니다. 각각 60,200,400... step이 되었을때 어떤 동작을 설정 할 수 있습니다. 물론 해당 시간도 조정이 가능합니다.
내용을 살펴보면 해당 Moment에 path를 random으로 선택합니다. path는 다음에 설명 하도록 하겠습니다.
그리고 instance를 Instances_Enemies레이어에 생성 하게 됩니다. 이때 path를 설정하고 alarm[0]에 일정 시간 후에 path를 동작하도록 코드를 만들어 두었습니다. 
var i;
var pathinfo_l = choose(pSky_P1,pSky_P1F,pSky_P2,pSky_P2F);
for(i=0;i<3;i++){
var inst = instance_create_layer(0,0,"Instances_Enemies",oEnemyFlySky);
with(inst){
alarm[0]=i*60; pathinfo = pathinfo_l;
}
}

oEnemyFlySky Alarm 0 event에 아래 코드를 추가 하였습니다. Create 코드에는 visible = false로 되어있으며 아래와 같이 시작하는 시점에  visible이 true가 되도록 설정 하였습니다.
path_start(pathinfo, 1.5, path_action_stop, true);
visible = true;

이렇게 하는 이유는 특정 이벤트 후에 여러개의 object를 생성할때 붙어서 적들이 생성되면 모양새가 좋지 않습니다.

3. Paths

pSky_P1,pSky_P1F,pSky_P2,pSky_P2F 정의 된것은 path입니다.
path는 점들을 찍어서 길을 설정할때 만들고 object를 길을 따라 움직이게 만드는것이 가능합니다. 그것이  위에서 설명한 path_start 함수 입니다.
그리고 path를 만드는것은 paths에서 처리합니다.

4. 적 탄환

Fly 적이 그냥 날아가면 재미가 없습니다. 날라가면서 총알도 발사해야 합니다. 이것은 enemy step 이벤트에서 일정시간에 fire를 구현하면 됩니다. 대략 아래와 같은 코드로 구현가능합니다.

  var obj = instance_create_layer(x,y,"Instances_Ammo",oEBullet);
  var dir = 0;
  if( instance_exists(oPlayerSky)){
   dir = point_direction(x, y, oPlayerSky.x, oPlayerSky.y);
   var gp = gun_power;
   with(obj){
    gun_power = gp;
    speed     = 3;
    direction = dir;
   }
  }
  state_count = 0;
  vx = 0;
  state=SM_FIREWAIT;

위 코드는 주인공 위치로 총알을 발사하게 하는 코드입니다.

5. 완성된 모습


6. 전체 소스

https://drive.google.com/open?id=1-QVdcSBTHKJETbTkv5GyZ3w49-9yZBa3









댓글 없음:

댓글 쓰기