adsense



[2011.12.2]요시카 스크램블~위치 네우로이 등장?!

※도메인 이전 관계로 일부 글을 과거 블로그에서 이전해 왔습니다.

사용자 삽입 이미지

작년에 왔던 각설이 죽지도 않고 또왔네



프로젝트 파일 다운로드하기 (ver.20111203)

※이클립스에서 프로젝트 파일을 불러오는 법
-적절한 위치에 위 압축을 풉니다. 그러면 YScramble 이란 폴더가 나옵니다.
-이클립스에서 File->New->Java Project
-Use default location의 체크를 끄고 Browse 버튼을 눌러, YScramble 폴더를 찾아 선택합니다.
-Finish를 누르면 완료.


그럼 적 캐릭터를 추가해 보겠습니다.

가장 기본적인 자코 캐릭터와 보스 캐릭터가 구현되어 있으니, 이번에는 자코보다는 조금 강한 캐릭터를 넣어보겠습니다.

1, 2기 통틀어 원작 최강의 떡밥인 위치 네우로이입니다.

사용자 삽입 이미지

(네우로이가 인간들과 교감을 시도하기 위해 보내는 단말로 추정, 실제 작중 취급은 걍 맥거핀..)


원작에선 이렇게 생겼습니다만,

요시카 스크램블에 등장할 위치 네우로이는 이런 그림입니다.

사용자 삽입 이미지

enemy2.png



....네, 요시카를 좌우 반전해서 색을 바꾸고 살짝 고친 겁니다...


큐브형 네우로이보다는 더 단단하고,
좀 더 복잡한-다소는 판단에 의해 결정하는- 움직임을 보이며,
기존 자코와 섞어 쓸 때 유효한 공격을 보여주는 것이 목적입니다.

위치 네우로이의 시나리오는 다음과 같습니다.

1. 레벨 2 이상부터 나온다. 레벨이 높을 수록 자주 나온다.
2. 보스의 수행 캐릭터로는 레벨 3 이상부터 나온다.
3. 수평으로 등장, 화면 오른쪽 중간 지점 정도에 멈춘다. 그 이후 플레이어를 쫓아 상 하로 이동하다 정지, 일직선으로 총알을 연사한 후 되돌아간다.

대충 이렇게 설정해 두고, 이제 실제로 구현해 보겠습니다.


새로운 캐릭터를 추가하기 위해서는
 1. 초기 설정
 2. 캐릭터를 그려 줄 부분
 3. 움직임을 처리할 부분
 4. 공격을 처리할 부분
 이 각각 필요합니다.


1. 초기 설정

Enemy 클래스의 생성자 부분을 봅니다.
여기서 기존의 보스 전용 세팅 부분을 고쳐서, 생성 시 kind 값에 따라 초기 세팅을 바꿔줄 수 있게 했습니다.
거기서 위치 네우로이 세팅을 봅시다. case 2: 부분입니다.

case 2://위치 네우로이 전용 셋팅
 life=20+main.RAND(0,10)*main.level;
 hitrange=2000;
 cnt=-(main.RAND(30,50));
 break;

라이프는 자코보다는 많이 높습니다.
크기도 약간 크기 때문에 hitrange도 좀 더 넓게 줍니다.
cnt로 움직임을 순차적으로 제어할 생각입니다. 왜 이런 값이 됐는지는 이후에.


2. 공격과 움직임을 처리

위치 네우로이의 움직임을 스텝 별로 정리한 시나리오는 대충 아래와 같습니다.
 - 오른쪽에서 등장하여 왼쪽으로 이동하다 화면 70~80% 정도 위치에 정지한다.
 - 플레이어의 y좌표를 참조하여 상하로 일정 간격 이동하다
 - 정지하여
 - 손을 앞으로 내밀고 공격
 - 2~4를 몇 번 수행한 후
 - 뒤로 돌아 물러간다

여기서 각 행동 스텝은 mode 변수로 구분됩니다. mode의 사용 방법은 보스 캐릭터 처리와 유사합니다.

mode=0 : 왼쪽으로 이동 중
mode=1 : 잠시 정지
mode=2 : 아래로 이동
mode=3 : 위로 이동
mode=4 : 정지해서 손을 앞으로 내밀고 공격
mode=5 : 뒤로 돌아 퇴각


공격과 움직임은 모두 Enemy 클래스의 move() 함수에서 처리합니다. 이 함수는 루프를 돌 때마다 계속 호출됩니다.

move함수에서는 switch(kind)가 두 번 나오는데, 첫 번째가 공격, 두 번째가 이동 처리입니다.

위 mode값의 설정에서 보듯, 공격은 mode==4 일 경우에만 하므로, 공격에서는 mode값이 4가 아닐 경우는 그냥 나오게 합니다.

구현된 공격 코드는, 짧고 빠르게 여러 발의 총알을 일직선으로 날리는 것입니다.
cnt가 0~29 사이 값일 때, 0, 5, 10, 15, 20, 25일 때 총알을 발사하므로 총 6발을 발사합니다.

if(cnt<30&&cnt%5==0){
 bul=new Bullet(pos.x, pos.y, 2, 1, 90, 5);
 main.bullets.add(bul);
}


그리고 잠시 정지한 후, 랜덤값에 따라 돌아가거나 다시 상하로 이동합니다.

if(cnt>50){
 if(main.RAND(1,100)<50){
  mode=1;//새로 이동할 방향을 결정
  cnt=30;
 }else{
  mode=5;//퇴장
  cnt=0;
 }
}


다음은 이동 코드입니다.
각 mode값에 따라 다른 동작을 취하게 되므로, switch 문을 사용해 분기하고 있습니다.
이쪽은 어려운 부분 없이, 좌표의 변경, 그리고 cnt값이나 좌표에 따라 mode 값을 변경하도록 하고 있으므로 소스를 참조하시기 바랍니다.


3. 캐릭터 그리기

Draw_ENEMY() 함수를 봅니다.
switch 문에 case 2:를 추가했습니다.

위에서 예시를 든 enemy2.png 그림에서도 보듯, 위치 네우로이는 모두 세 개의 그림 패턴을 갖고 있습니다.
큐브 네우로이의 경우 회전 애니메이션이라 계속해서 반복하면 됐지만, 위치는 행동에 따라 각각 다른 그림을 보여줍니다.
단순 이동이나 대기인 mode 0,1,2,3에서는 0번 컷을,
공격 시에는 1번 컷
퇴각 시에는 2번 컷을 사용합니다.

case 2: 아래의 switch(buff.mode)는 그러한 경우에 해당하는 컷을 그려주기 위한 부분입니다.

그리고, 여기 그리기 전에 미리 Init_GAME()함수에 아래 라인이,

gamescreen.enemy[2]=makeImage("./rsc/game/enemy2.png");//위치 네우로이

그리고 enemy2.png가 rsc/game 폴더에 추가되어 있어야 합니다. (압축 파일 안에 있는 프로젝트에는 모두 들어 있습니다)


4. 캐릭터 발생시키기

이제 위치 네우로이를 처리하기 위한 모든 준비가 끝났습니다.
그래서 실행을 시키면..? 등장하지 않는다?

위치 네우로이를 생성하는 부분이 빠졌습니다.

위에서 위치 네우로이의 생성 조건은 레벨 2 이상부터, 그리고 레벨이 높을 수록 자주, 보스의 수행역으로는 레벨 3부터라는 조건이 있었습니다.

적 캐릭터를 생성하는 부분은 process_GAMEFLOW() 함수입니다.

보스가 등장중일 때 지원 캐릭터가 등장하는 부분, 그리고 보스전 도중이 아닐 때 적이 등장하는 부분을 손봐주면 됩니다.

// 보스전이 후반부에 들어서면서 소형 지원기들의 공격이 거세진다
부분에서 다음과 같은 부분이 우선 보스의 지원기 역할을 하는 부분입니다.

if(level>1&&RAND(1,100)<level*10)
 en=new Enemy(this, 0, gScreenWidth*100, newy, 2,0);
else
 en=new Enemy(this, 0, gScreenWidth*100, newy, 0,mode);

레벨 1에 해당하는 level값은 0이므로 level==2 부터가 3레벨에 해당합니다.
그러므로 level>1이고, 1~100 사이의 난수를 발생시켜 level*10보다 작으면 2번 적(=위치 네우로이)을 생성하도록 했습니다.
level*10은 처음에는 20이고, 이후 30, 40, 50,.. 순으로 계속 커져가므로 위치 네우로이가 발생할 확률이 점점 높아지도록 한 것입니다.

평상시의 등장에서는 switch(control) 부분을 봅니다.

모든 적 생성 부분을 공통적으로

if(RAND(1,3)!=3&&level>0)
 en=new Enemy(this, 2, gScreenWidth*100, newy, 2,mode);
else
 en=new Enemy(this, 0, gScreenWidth*100, newy, 0,mode);

이렇게 수정해 줬습니다.
조건은 조금 다르지만 의미는 보스 지원기의 생성과 같습니다.


이제 적 캐릭터 추가를 완료했습니다.
앞으로는 게임에서 위치 네우로이를 만날 수 있습니다. 하지만 애니에서처럼 공중 술래잡기는 할 수 없고 나타나면 닥치고 때려부수도록 합시다. -_-;


※레벨 2까지 기다릴 수 없다, 당장 위치 네우로이를 보고 싶어! 라고 생각했다면, &&level>0 부분을 빼면 얼마 되지 않아 바로 위치 네우로이를 확인할 수 있습니다.

※현재 테스트를 위해 라이프가 감소하지 않도록 했습니다.
      /*if(--mylife<=0) {
       status=3;
       gamecnt=0;
      }*/
정상적인 게임 작동을 위해서는, 위 부분을 찾아 주석을 해제해주면 됩니다.




덧글

  • ㅇㅇ 2014/12/04 15:35 # 삭제 답글

    1. 초기설정에서요
    cnt=-(main.RAND(30,50)); 이 총쏘는 시간 감소를 의미하는 건가요??
  • 펭귄대왕 2014/12/04 19:33 #

    cnt값은 초기 설정 이후에 계속해서 프레임마다 1씩 증가합니다.

    증가하면서, move 메소드 내에서는 이 cnt 값을 참조해 움직이거나, 공격하거나, 움직임을 바꾸거나 하고 있습니다.

    움직임이나 공격에 개체별로 조금씩 시간 차이를 주고자 초기값에 난수로 약간의 변형을 주고 있는 것이고요.

    주된 사용은 public boolean move()에 나와 있습니다.
댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC