'전뇌 라이프/데스크탑 and..'에 해당되는 글 23건

  1. 2011/12/02 펭귄대왕 요시카 스크램블~위치 네우로이 등장?!
  2. 2011/11/29 펭귄대왕 java 게임(요시카 스크램블)에 아이템 추가하기 (5)
  3. 2011/10/13 펭귄대왕 UNIX/C의 개발/창시자, 데니스 리치 별세 (2)
  4. 2011/08/08 펭귄대왕 WINDOWS 7로 전향(?)했습니다.. (9)
  5. 2010/12/14 펭귄대왕 게임 프로그래밍의 중핵이 되는 프레임워크
  6. 2010/12/13 펭귄대왕 JAVA로 슈팅게임!? 요시카 스크램블 - 보스전 추가 (8)
  7. 2010/10/03 펭귄대왕 JAVA로 게임을 만들어보자? 게임제작강좌..일지도? (23)
  8. 2010/09/25 펭귄대왕 IEditor v0.1 - 2D게임 개발지원툴
  9. 2010/09/05 펭귄대왕 중고모니터 구입.. (2)
  10. 2010/08/20 펭귄대왕 트랜스폼 (4)
  11. 2010/06/26 펭귄대왕 Claire AR210 모니터 벽걸이 암 (8)
  12. 2009/12/26 펭귄대왕 너님들 EMI필터 어쩌셨쎄요? (6)

사용자 삽입 이미지

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



프로젝트 파일 다운로드하기 (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;
      }*/
정상적인 게임 작동을 위해서는, 위 부분을 찾아 주석을 해제해주면 됩니다.

2011/12/02 13:36 2011/12/02 13:36
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.modelisland.pe.kr/blog/rss/response/333

트랙백 주소 :: http://www.modelisland.pe.kr/blog/trackback/333

트랙백 RSS :: http://www.modelisland.pe.kr/blog/rss/trackback/333

댓글을 달아 주세요

댓글 RSS 주소 : http://www.modelisland.pe.kr/blog/rss/comment/333
[로그인][오픈아이디란?]

아이템을 추가하기 위해서 수정해야 하는 함수는

public void Init_GAME() <- 아이템으로 쓸 그림을 추가
public void Draw_ITEM() <- 추가 아이템 그림 그리는 부분을 추가
public void process_BULLET() <- 아이템을 생성할 때 추가 아이템을 포함할 수 있도록 수정
public void process_ITEM() <- 아이템을 먹었을 때 발생하는 효과를 처리

이렇게 4개의 함수 내용을 수정하게 됩니다.


1. 아이템으로 쓸 그림 & 추가아이템을 그려주는 부분을 추가하기

우선
class GameScreen extends Canvas
의 변수 선언 부분에서
Image item[]=new Image[3];//아이템
부분을 찾아, 아이템을 추가할 만큼 수정합니다.

예)아이템을 5종류 등장시킨다면
Image item[]=new Image[5];//아이템
와 같이 수정.

만일 하나만 추가할 거라면 수정하지 않아도 됩니다.


기존의 아이템으로 사용되던 그림은 item0.png와 item1.png입니다.


위 두 그림의 공통점은

- 해상도가 252*36

- 연속되는 애니메이션 컷 7컷을 가로로 나열

이 두 가지입니다.
만약 추가할 아이템 그림이 위와 같은 규격으로 만들어진다면, Draw_ITEM()의 내용은 수정할 필요가 없습니다.

아이템으로 쓸 그림의 이름은 item2.png로 가정하고, rsc/game 폴더에 넣습니다.

우선 Init_GAME()에

gamescreen.item[2]=makeImage("./rsc/game/item2.png");

를 추가합니다.


만일 다른 아이템 그림과 크기나 애니메이션 컷 수가 다르다면 Draw_ITEM()의 내용을 다음과 같이 수정합니다.

 public void Draw_ITEM(){
  int i;
  Item buff;
  for(i=0;i<main.items.size();i++){
   buff=(Item)(main.items.elementAt(i));
   switch(buff.kind){
   case 0:
   case 1:
    drawImageAnc(item[buff.kind], buff.dis.x, buff.dis.y, ((main.cnt/4)%7)*36,0, 36,36, 4);
    break;
   case 2:
    drawImageAnc(item[2], buff.dis.x, buff.dis.y, ((main.cnt/4)%cut)*width,0, width,height, 4);
    break;
  }
 }

위 내용을 그대로 입력하면 안되고
 drawImageAnc(item[2], buff.dis.x, buff.dis.y, ((main.cnt/4)%cut)*width,0, width,height, 4);
이 라인에서

cut은 가로 방향으로 애니메이션의 컷 수입니다. 만일 4컷이라면 4를 넣어줍니다.
width는 그림의 1컷의 가로 크기입니다.
height는 그림의 세로 크기입니다.

추가한 그림의 가로 세로 크기에 맞춰 수정해 넣어주면 됩니다.
예를 들어 48*48 그림이 가로로 두 장 들어가 있다면
 drawImageAnc(item[2], buff.dis.x, buff.dis.y, ((main.cnt/4)%2)*48,0, 48,48, 4);
이렇게 입력합니다.


2. 적을 파괴했을 때, 새로 추가된 아이템이 등장할 수 있도록 처리

아이템을 생성하는 부분은
 Item tem=new Item(ebuff.pos.x, buff.pos.y, RAND(1,(level+1)*20)/((level+1)*20));//난수 결과가 최대값일 때만 생성되는 아이템이 1이 된다
라인입니다.
RAND가 있는 부분에 0~2 사이의 값을 대입해주면 되며, 0은 점수 아이템(502대 마크), 1은 실드 아이템, 2가 새로 추가하는아이템이 됩니다.

원래의 라인은 0 또는 1만 생성되므로, 저 라인은 주석 처리하고

 int itemKind=RAND(1,100);
 if(itemKind<70)
  Item tem=new Item(ebuff.pos.x, buff.pos.y, 0);
 else if(itemKind<97)
  Item tem=new Item(ebuff.pos.x, buff.pos.y, 2);
 else
  Item tem=new Item(ebuff.pos.x, buff.pos.y, 1);
 위와 같이 해 주면, 70% 확률로 0번 아이템
 97-70=27% 확률로 2번 아이템 <- 여기서 새로 추가한 아이템이 생성됩니다.
 3% 확률로 실드 아이템이 생성됩니다.

현재 난이도(레벨)에 따라서 아이템이 생성될 확률을 바꿔주려면 level 값을 참고해서 난수나 비교값의 폭을 조절하면 됩니다.


3. 아이템을 먹었을 때 발생하는 효과를 처리

process_ITEM()에서
 switch(buff.kind){
 case 0://일반 득점
  score+=100;
  break;
 case 1://실드
  myshield=5;
  break;
 }
이 부분이 아이템 획득 시의 처리입니다.
그러므로
 case 2://새로운 아이템
항목을 추가하면 쉽게 새로운 아이템의 습득 효과를 줄 수 있습니다.

예1)새로운 아이템을 먹으면 1천점 득점

 switch(buff.kind){
 case 0://일반 득점
  score+=100;
  break;
 case 1://실드
  myshield=5;
  break;
 case 2://새로운 아이템
  score+=1000;
  break;
 }

예2)새로운 아이템을 먹으면 화면상의 적 전멸

 switch(buff.kind){
 case 0://일반 득점
  score+=100;
  break;
 case 1://실드
  myshield=5;
  break;
 case 2://새로운 아이템
  for(int j=0;j<enemies.size();j++){
   enemies.remove(j);//적 캐릭터 소거
   expl=new Effect(0, ebuff.pos.x, buff.pos.y, 0);
   effects.add(expl);//폭발 이펙트 추가
  }
  break;
 }

2011/11/29 10:37 2011/11/29 10:37
받은 트랙백이 없고, 댓글 5개가 달렸습니다.

댓글+트랙백 RSS :: http://www.modelisland.pe.kr/blog/rss/response/331

트랙백 주소 :: http://www.modelisland.pe.kr/blog/trackback/331

트랙백 RSS :: http://www.modelisland.pe.kr/blog/rss/trackback/331

댓글을 달아 주세요

댓글 RSS 주소 : http://www.modelisland.pe.kr/blog/rss/comment/331
  1. 학생2 2011/11/30 21:50  댓글주소  수정/삭제  댓글쓰기

    우선 답변에 친절하게 답해주셔서 감사합니다

    화면상의 적 전멸하는 소스부분에서

    expl=new Effect(0, ebuff.pos.x, buff.pos.y, 0);
    effects.add(expl);

    이부분에서 오류가 떠서 수정해볼려고 노력해봤는데 잘 안되네요 ㅜ.ㅜ;;;

    그리고 1~2개의 적을 추가하려고 하는데 간단한 팁정도 알려주시면 감사하겠습니다^^;;

    덕분에 학교 프로젝트를 열심히 준비하고 있습니다 ㅎㅎ~~

  2. 학생2 2011/12/04 18:49  댓글주소  수정/삭제  댓글쓰기

    감사합니다 ㅜ.ㅜ!!!!!

    주말에 다른일에 차여 하지못하고 있어서 지금 올려여~~

    • 펭귄대왕 2011/12/05 10:17  댓글주소  수정/삭제

      오지랖입니다만, 기왕이면 소스를 고쳐서 유용하는 정도에 그치지 말고 자신의 것으로 소화하시어 다른 형태로 응용하실 수 있게 되면 좋겠습니다.

[로그인][오픈아이디란?]