
작년에 왔던 각설이 죽지도 않고 또왔네
프로젝트 파일 다운로드하기 (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;
}*/
정상적인 게임 작동을 위해서는, 위 부분을 찾아 주석을 해제해주면 됩니다.


댓글을 달아 주세요
댓글 RSS 주소 : http://www.modelisland.pe.kr/blog/rss/comment/333