adsense



요시카 스크램블 소스(이클립스 프로젝트)

YScramble_20111203.zip

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

자바(awt)로 만들어진 2D 슈팅게임입니다. (jdk 1.4 이상)
- default package의 W_Shooting.java가 게임 메인 소스입니다.
- 해당 프로젝트의 rsc폴더에 게임에 사용되는 그림이 있습니다. (쓰이지 않는 그림도 있습니다)

이 소스로 그동안 전달했던 내용들 (링크는 임시 링크)

1장. 게임의 기본적인 기능 구현
2장. 보스전 추가
3장. 아이템 추가
4장. 적 캐릭터 추가

현재 소스는 4장까지 모두 구현된 버전입니다.


※ 본문 해설 삼아 덧붙이는 부분입니다. (2014. 7. 21)


public void drawImageAnc(Image img, int x, int y, int anc) 에서 anc 값의 의미.

anc값에 해당하는 위치가 화면의 x, y 좌표가 됩니다.
즉, 같은 좌표라고 해도 anc=0 이면 왼쪽 위 꼭지점이 x, y에 오고, anc=4이면 그림의 중심이 x,y 위치에 옵니다.



public void drawImageAnc(Image img, int x, int y, int sx,int sy, int wd,int ht, int anc)에서 각 값의 의미

이것의 의미는 '화면 상의 x, y 좌표에 img 이미지 객체의 sx, sy부터 가로 wd, 세로 ht 만큼 그려라' 라는 뜻입니다.
즉, 이미지의 일부분만 화면에 그리라는 것인데요,

자바awt에서의 클리핑은, 이미지를 자르는 것이 아니고, Graphics 객체의 일부분만을 남기는 것입니다.
어떤 의미에서는 Graphics 객체에 구멍을 뚫고 그 구멍을 통해서 이미지를 본다고 하면 맞을지도요.
그때문에 약간 복잡한 계산이 추가됩니다.

Graphics 객체의 x,y위치에 가로 wd, 세로 ht만한 구멍을 뚫는게 gc.setClip(x, y, wd, ht); 에 해당합니다.
이 구멍을 통해서 이미지를 보여주는데, 이미지의 sx, sy 부분부터 보여주려고 합니다.

①에 해당하는 것이 화면 상의 x, y 좌표입니다. 이 부분이 '구멍'이 되는 것이고요,

그때문에 이미지는 실제 보여주기 시작할 위치인 sx, sy만큼 뒤로 빼서 보여줘야 합니다.
그것을 하는 것이 gc.drawImage(img, x-sx, y-sy, this); 라인으로
②에 해당하는 것이 x-sx, y-sy 좌표입니다.

Graphics 객체에 구멍을 뚫어 일부만 그려지게 했으니, 이게 끝난 후에는 다시 화면 전체에 그릴 수 있도록 해야겠죠.
gc.setClip(0,0, main.gScreenWidth+10,main.gScreenHeight+30); 이것이 그 역할을 합니다.




덧글

  • 오리마왕 2013/06/21 09:59 # 삭제 답글

    자바관련해서 질문이 있어 이렇게 덧글 남깁니다~
    현재 학원에서 자바 게임 프로젝트를 진행중인데요
    두더지 게임을 만들려고 하고 있습니다.

    근데 마우스에 망치를 올려야 하는데 이미지 크기가 마우스 포인터 크기로 고정이 되더라구요
    아무리 검색하고 찾아봐도 없어서 그러는데 혹 마우스 커서 이미지 삽입해서 크게 확대하는 방법을 알고 계시는지요.. 컹
    도움좀 부탁드립니다~~

  • 펭귄대왕 2013/06/21 10:45 #

    마우스포인터를 직접 변경하는 방법보다는 마우스 커서의 위치를 프로그램에서 읽어들여, 해당 위치에 망치 이미지를 출력하는 방법이 좋을 것 같습니다.

    게임 클래스에 MouseMotionListener를 implements한 다음,
    초기화 해 주는 부분에서 addMouseMotionListener(this); 로 마우스 움직임 이벤트를 읽어들일 수 있도록 합니다.

    MouseMotionListener 인터페이스의 필수 오버라이드 함수는
    public void mouseDragged(MouseEvent e) 와
    public void mouseMoved(MouseEvent e)
    두 가지가 있는데,
    이 중에서 마우스 커서의 위치는 mouseMoved에서 감지합니다.

    예를 들면

    int hammerX, hammerY;
    .
    .

    @Override
    public void mouseMoved(MouseEvent e) {
    // TODO Auto-generated method stub
    hammerX = e.getX();
    hammerY = e.getY();
    }
    이렇게 해 주고

    화면을 그리는 부분에서, hammerX, hammerY 위치에 망치 이미지를 그리도록 하면 될 것입니다.
  • 오리마왕 2013/06/21 12:01 # 삭제 답글

    오옷 정말정말 감사합니다~
    조원들 모두 정말 감사해 하고 있습니다..^^;;

    이것저것 질문할게 많았는데 구글링 하면서 운좋게 해결이 되었네요^^

    음 근데 마우스를 클릭하면 약간 버벅이는 부분이 있는데 이부분은 저희 로직 문제일까요?^^;;
  • 펭귄대왕 2013/06/21 13:11 #

    잘 되셨다니 다행입니다.

    프로그램 구조를 모르니 클릭할 때 버벅이는 이유를 알 수는 없겠는데,
    그래픽이나 사운드같은 리소스를 미리 메모리에 올려놓지 않고 클릭할 때마다 읽어오게 하는 식으로 만들었다면 그럴 수도 있습니다.
  • 오리마왕 2013/06/21 15:38 # 삭제 답글

    음 그냥 알려주신데로 바로 올려서 버벅되는거 같습니다..^^;;
    메모리에 올리고 하는 그런 법을 아직 잘 모르겠네요...^^;;

    음 그리고 개인적으로 궁금한게 또 있는데요
    혹 맥에서 작업하시나요?
    맥으로 개발을 하고 싶은데... 이클립스나 개발환경 맞추는 부분이 자세히 나와있는 부분이 없네요...컹;;

    궁금합니다+_+
  • 오리마왕 2013/06/21 15:49 # 삭제

    아 버벅이는건 클릭하고 드래그 할때 이미지가 안그려져서 버벅이는걸로 보였네용

    드래그 부분에대가 그리기 넣어주니깐 잘 됩니다 ㅎㅎ;;;
  • 펭귄대왕 2013/06/21 16:01 #

    그냥 PC에서 작업합니다. 맥은 좀 써보다 말았네요..
  • 토끼 2013/10/21 13:38 # 삭제 답글

    안녕하세요
    학교에서 자바게임 프로젝트를 준비하고있는데
    게임내에 BGM(배경음악)을 깔려고하는데 잘안되서
    이렇게 글남깁니다.
    도와주십쇼 T^T
  • 펭귄대왕 2013/10/21 15:33 #

    http://icegeo.egloos.com/274353

    위 포스팅을 참조하시면 midi 형식 파일로 배경음악을 연주할 수 있습니다.
    순수 자바어플리케이션 환경에서는 미디어 기능 구현이 어려워서 간단하게 소개할 수 있는 건 이정도까지네요. mp3나 wav 등은 어렵습니다. midi 파일도 음량 조절 등의 기능이 제공되지 않습니다.
  • cattic 2013/10/24 21:04 # 삭제 답글

    안녕하세요 펭귄 대왕님의 소스를 보면서 슈팅 게임 연습을 하고 있습니다.

    소스를 분석하면서 이것저것 손대보는 중인데요 현재 창 사이즈 640-480을 세로로 좀 늘렸습니다.
    그런데 기존의 창 사이즈 이상 늘려진 창으로캐릭터 및 적/총알이 이동하면 그림이 그대로 남아버리는 문제가 발생합니다.
    다시 원래 프레임으로 돌아오면 더이상 잔상은 안 생기지만, 화면 밖(새로 늘린 영역)에는 계속 이미지가 남아 있는 문제가 생깁니다.
    어디를 손봐야 하는 걸까요?
  • 펭귄대왕 2013/10/25 03:34 #

    비트맵 방식 화면 갱신에서는 기존에 그려진 화면 위에 새 그림(배경)을 덮어씌우는 방식으로 기존에 그려졌던 그림의 잔상을 제거하고 있습니다.

    지금 사용되는 배경 그림이 늘어난 창 사이즈보다 크기가 작아 이 배경그림으로 덮지 못하기 때문에 그 영역에 그려진 그림의 잔상이 남는 것이니 배경 그림을 수정한 창 크기만큼, 혹은 그 이상으로 늘려주면 해결될 것으로 생각합니다.
  • cattic 2013/10/25 12:01 # 삭제

    말씀대로 하니 해결되었습니다. ^^

    감사합니다.~
  • cattic 2013/10/25 15:45 # 삭제

    안녕하세요 펭귄대왕님 ^^

    이번에는 BG2의 흐르는 구름을 이용해 뒷 배경을 반복 출력하려고 합니다.

    1. 배경 화면이 3번인가? 정도 흐른 뒤에 더이상 출력되질 않습니다. 어느 부분을 손을 봐야 할까요?
    2. 배경이 아예 끊겨버리는데 양쪽 면을 이어서 반복 스크롤 될 수 있도록 하는 방법은 없을까요?
  • 펭귄대왕 2013/10/25 17:34 #

    http://icegeo.egloos.com/274668

    혹시 원하시는게 이런 내용이 맞을까요? 글로 설명하기보단 그림으로 보는게 이해가 빠를거 같아 별도 포스팅으로 작성했습니다.
  • cattic 2013/10/25 22:29 # 삭제

    몇번의 시행착오 끝에 2개의 이미지를 반복 출력하는 느낌으로 해결이 된것 같습니다.

    근데 스크롤 속도가 매우 빠른데...

    step=(cnt%(bg_f.getHeight(this)/main.scrspeed))* main.scrspeed;

    이 부분이 잘 이해가 되질 않습니다.

    지금 보면 매우 빠르게 스크롤 되는데 천천히 스크롤 될 수 있도록 하려면 어떻게 해야 할까요?
  • 펭귄대왕 2013/10/26 03:27 #

    step=(cnt%(bg_f.getWidth(this)/main.scrspeed))*main.scrspeed;

    위 식에서 각 값에 대해 알아보겠습니다.

    step : 배경 그림을 그려줄 위치입니다.

    cnt : 스레드(프레임)에서 루프를 돌 때마다 1씩 증가하는 값입니다. 이 값을 사용해서 몇 프레임마다 반복적으로 처리할 일이 있을 때 아래 예와 같이 사용합니다.

    예)
    if (cnt%2==0) {...} // 2프레임마다 {}을 처리합니다.
    if (cnt%16==0) {...} // 16프레임마다 {}을 처리합니다.

    bg_f : 배경 그림(원래는, 앞쪽에 빠르게 흘러가는 제트기류) 비트맵 이미지입니다.
    그러므로 bg_f.getWidth(this) 는 이 이미지의 가로 픽셀 크기(너비)임을 알 수 있습니다.

    지금은, 다른 종류의 배경(아마도 가로가 640) 그림을 처리할 것이므로 bg_f.getWidth(this)는 640으로 바꿔 생각하기로 합니다.

    main.scrspeed : 메인 클래스에서 선언된 스크롤 속도입니다. 16으로 설정되어 있습니다.

    % 연산자는 나눗셈 후 몫을 취하는 연산자이니..

    그럼 샘플 값을 대입해서 계산해보면

    cnt = 0
    bg_f.getWidth(this) = 640
    main.scrspeed = 16
    일 때

    step=(0%(640/16))*16;
    step은 0

    cnt=1이면
    step=(1%(640/16))*16;
    step은 16

    cnt=2이면
    step=(2%(640/16))*16;
    step은 32

    ...즉, cnt가 1 증가할 때마다 (1 프레임마다) step은 16 씩 증가합니다. 이것이 스크롤 속도(main.scrspeed)의 의미입니다.

    cnt=40이 되면?

    step=(40%(640/16))*16;
    step은 0이 됩니다. 즉, 40프레임마다 step이 원위치로 돌아오게 됩니다.

    그러면 왜 이렇게 복잡해 보이는 계산을 했을까?

    이것은 배경으로 쓰일 이미지의 가로 크기가 가변적일 경우를 대비했기 때문입니다.

    그렇지 않고 이미 이미지의 크기를 알고 있다면 그냥 식에 상수로 넣어줘도 무방합니다.

    그리고 스크롤 속도를 늦게 하고 싶다면 위 식에서 main.scrspeed를 그보다 훨씬 작은 상수값으로 바꿔주면 됩니다.

    예를 들어 이미지의 가로 길이가 640이라면

    step=(cnt%(640/2)*2; //이렇게 하면 1프레임에 2도트 씩 스크롤되며
    step=cnt%640; //이렇게 하면 1프레임에 1도트 씩 스크롤됩니다.

    이보다 더 느리게도 가능합니다.
    step=cnt%(640/0.5)*0.5; //2프레임에 1도트 씩 스크롤 됩니다.


    그럼 이제 나머지는 그려주는 방법. 배경 원경이고 배경의 세로 위치는 변하지 않으니 0으로 고정합니다.

    gc.drawImage(bg,0-step,0,this);

    이렇게 배경이 왼쪽으로 이동하듯 보이게 할 수 있습니다.
  • cattic 2013/10/28 10:20 # 삭제

    친절하고자세한 설명 감사합니다.~
    덕분에 깔끔하게 이해가 됐습니다 ^^
  • cattic 2013/10/29 16:26 # 삭제 답글

    안녕하세요~ 펭귄대왕님~

    이번엔 다른 질문이 있습니다.

    게임 중 나오는 점수를 그림 파일로 대체해서 출력하려고 합니다.
    이미지는 0123456789가 있고, 이미지 사이즈는 330x34 입니다.

    이걸 num[i]에 넣어서 숫자 대신 이미지 파일을 출력해보고 싶습니다.

    어떻게 하면 좋을지 조언좀 부탁드립니다.
  • 펭귄대왕 2013/10/29 20:33 #

    0~9까지의 숫자를 한 장의 이미지로 갖고 있다고 하면 각 자릿수마다의 값을 읽어서 순서대로 이미지 일부를 화면에 잘라 보여주면 됩니다..만,
    스탠다드 java에는 한 장의 이미지에서 일부 rectangle만 보여주는 api가 없습니다.

    때문에 제가 해당 소스에 만들어놓은 drawImageAnc라는 함수를 써서 출력할 수 있습니다.

    구현 순서는 다음과 같습니다.
    1. 우선 점수를, 문자열로 바꿔 자릿수 순서대로 하나씩 떼어낼 수 있도록 합니다.
    2. for 문으로 순환을 돌려서 순서대로 자리값을 읽어와
    3. drawImageAnc 함수로 원하는 좌표에 출력해 줍니다.

    간단히 구현해보면 아래 내용을 public void Draw_UI()에 넣어주면 됩니다.

    String scoreStr = String.valueOf(main.score);//숫자를 문자열로 바꾼 다음에
    for(int i=0;i<scoreStr.length();i++)//자릿수만큼 루프를 돌려서
    drawImageAnc(num, iWantX+i*33, iWantY, (scoreStr.charAt(i)-'0')*33, 0, 33,34, 0);//자릿수에 해당하는 값 만큼 이미지를 화면에 잘라서(일부만) 보여줍니다.

    Image num[] = new Image[9];를 선언해서 처음 읽어온 큰 이미지를 부분 부분 잘라서 각각에 할당하는 방법도 있는데, 여기서는 좀 간단하게 Image num; 하나에 합쳐진 이미지 한 장을 할당해서 썼습니다.

    33과 34는, 10개 숫자가 들어있는 이미지 가로 크기가 330이니 숫자 하나는 33*34이겠죠.

    scoreStr.charAt(i)으로 자릿수를 읽는데, 이게 char형이므로 -'0'을 해주면 문자 '0'은 0값을, 문자 '9'는 9값으로 바뀌게 됩니다.

    iWantX와 iWantY는 원하는 위치로 적절한 값을 넣어주면 됩니다.
  • cattic 2013/10/30 21:09 # 삭제

    언제나 정확한 답변 감사드립니다.

    덕분에 어려운 부분을 쉽게 해결할 수 있어서 많은 도움이 되고 있습니다.
    게다가 소스도 이해하기가 쉬워서 공부가 많이 되네요
  • 님프 2014/07/21 11:53 # 삭제 답글

    펭귄대왕님! 질문할게 많아서 읽으실지 모르겠지만 적어보겠습니다 ..ㅠ
    처음 시작 프로젝트에서 질문입니당!

    1. MFC의 경우 이미지 여백 색깔을 추출해서 transparent 함수를 해줘야 여백을 bg에 맞춰서 투명하게 없앨 수 있는데 여기서는 딱히 그런 코드가 보이지 않더라구요. 어떻게 된건가요 ㅇㅅㅇ ??

    2. 게임스크린 자바 파일에서 v[], v2[] 로 지정해준 배열이 무엇을 의미하는지 모르겠습니다..
    이것이 적용되는 곳을 봤는데 이거는 bg_f에 대해서 높이를 약간씩 주기 위해서인가요..?
    그러면 왜 -2부터 2까지 왔다갔다 하는지랑 -8부터 8까지 범위를 준 것에도 어떤 의미가 있는지 ..

    3. drawImageAnc 함수 이해가 잘 가지 않습니다..
    인자가 적은 함수에서 연산이 왜 이렇게 되는지 모르겠구요..
    인자가 많은 함수를 보면 더더욱 멘붕 ㅇㅅㅇ ;;
    파라미터가 많은 함수를 보면
    if(x<0), if(y<0)이 무엇을 말하는 것인지 모르겠어요. 그리구 x, y 연산이랑
    클리핑 할 때 왜 두번 클리핑을 했고 drawImage에서 -sx, -sy를 해주었는지도 모르겠습니다..
    솔직히 이 함수 자체를 이해 못했어요 .ㅠㅠ... 펭귄님 부탁드립니다>!!!..<
  • 펭귄대왕 2014/07/21 13:12 #

    1. png포맷은 자체적으로 투명 정보를 갖고 있기 때문에 별도로 투명값을 지정할 필요는 없습니다. (드물게 png에 있는 투명 정보를 무시하는 플랫폼이 있지만 java awt가 돌아간다면 거의 없습니다)

    2. v2[]는 사용하지 않게 된 잉여 변수입니다.
    v[]는 일정 간격마다 빠르게 흘러가는 기류 그래픽의 높낮이를 약간씩 변경시켜서 화면에 변화를 주려고 넣은 것인데, 변화량이 적어서 큰 의미가 없어졌습니다. (즉, 없어도 무방합니다..)

    3. drawImageAnc에 관해서는 본문에 해설을 추가했습니다.
  • 님프 2014/07/21 17:33 # 삭제 답글

    펭귄대왕님 ~!

    마지막에 gc.setClip(0,0, main.gScreenWidth+10,main.gScreenHeight+30);
    이 부분이 다시 전체를 그릴 수 있도록 전체를 구멍낸다는 뜻인가요??

    +10, +30의 의미는 무엇인지 궁금합니다~
    이게 화면 밖으로 나갈 때를 막기 위한 것이라면 frame에서 bullet을 범위를 설정할 때 y축으로 화면+10 을 지정해줬었고
    enemy의 경우 화면(640)을 넘어가면 false를 리턴하게 되있는데 +30이 의미하는게
    제가 생각하는 이게 아닌거 같네요 ㅇㅅㅇ ;

    아, 그리구, 파라미터 많은 쪽의 함수에서 if문 2개 있잖아여. if(x<0), if(y<0). 그거는 밑에 클립이랑 드로우에서
    좌측과 상단 화면 밖으로 나갈 경우 그리지 않기 위해서가 맞나용?

    펭귄대왕님 답변 정말 감사합니다~!!!
  • 펭귄대왕 2014/07/21 17:45 #

    다시 전체를 그릴 수 있도록 하는게 맞습니다. 즉, 구멍을 화면 전체로 한다는 것인데요,

    단, 저 범위가 윈도우상에서는 윈도우 프레임까지를 포함하게 됩니다. 딱 맞게 640, 480으로 잘라주면 화면 구석에 잔상이 남거나 갱신이 안되는 경우가 있을 수 있습니다.
    정확한 수치는 아니고 환경에 따라서 윈도우의 두께가 달라질 수 있기 때문에 값을 이것 저것 넣어보고 적당히 넉넉하게 준겁니다.

    if(x<0)과 if(y<0)은, 그려주는 좌표가 화면 밖일 경우, 화면 밖은 계산하지 않고 화면 안쪽으로만 위치를 재배치해주는 부분입니다.

    위에 숫자 그림의 예에서, 그려주는 x,y가 마이너스일 경우를 가정한 숫자를 대입해서 수작업으로 계산해보면 대충 역할을 이해할 수 있을겁니다.

    예를 들어 drawImageAnc(num, -10, -10, 99, 0, 33,34, 0); 같은 식으로요
  • 님프 2014/07/21 18:00 # 삭제 답글

    감사합니다 ~ 펭귄대왕님!!
  • 펭귄대왕 2014/07/22 17:35 #

    혹시 또 궁금하신 점 있으면 언제든지 환영합니다
  • 필풍 2014/11/26 16:15 # 삭제 답글

    혹시 이게임을 Rank를 만들어서 순위를 파일로 출력하는 프로그램을 만들수있나요??
    만들어보니 점수가 자꾸 초기화 되어서 그러는데 어떻게 해야되나요?
  • 펭귄대왕 2014/11/26 16:54 #

    이 게임에는 게임 정보를 저장하는 부분이 없습니다.

    http://icegeo.egloos.com/278063
    여기 보시면 최고점수와 획득한 골드를 파일로 저장하고 불러오는 내용이 있습니다. 이걸 응용하면 간단히 만들 수 있습니다.
  • 필풍 2014/11/28 16:54 # 삭제 답글

    보내주신 사이트 이용해서 하려구 했는데 이해가 잘 안되서 이 코드에 파일 입출력으로 점수 출력하는 방법 좀 자세히 가르쳐 주시면 안되요??
  • 펭귄대왕 2014/11/28 19:57 #

    최고기록 다섯 개 정도 보여준다면 int[] highscore = new int[5]; 이렇게 선언해서 초기치 0으로 주고,

    게임오버 판단은
    if(--mylife<=0) {
    status=3;
    여기서 하고 있으니

    이때마다 이번 점수를 highscore[0]~[4]까지 순서대로 비교하면서 highscore보다 크면 거기에 지금 점수를 넣고, 앞 리플 링크에 있는 것 처럼 내용을 파일로 내보내서 저장하면 되겠네요.
    프로그램 시작되는 초반에 해당 파일을 읽어오는 부분을 넣어주고요.

    이걸 출력한다면, 적당히 타이틀 화면 (Draw_TITLE) 그려주는 부분에서 drawString이나 drawImageNum으로 highscore 보여주는 걸 추가하면 되겠습니다.

    만일 그동안 한 게임의 기록을 모두 남긴다면, 조금 더 복잡해지겠네요.
  • 엔루니스 2015/03/02 16:20 # 삭제 답글

    게임 플레이 해봤는데 이거 플레이어 캐릭터가 구현화면상의 맨 우측에 가서 서있으면 타겟들이 알아서 리턴되어버립니다.

    이에따라 몹(블럭)의 최대 동선을 캐릭터-100~-200정도는 줘야하지 않나 건의해봅니다.
    피드백 : enruniss@rlk.co.kr
  • 펭귄대왕 2015/03/02 20:08 #

    말씀 감사합니다.
    지적해주신 부분을 참고해서 적절한 수정안을 업데이트하도록 하겠습니다.
  • 기무치데스 2015/05/14 14:39 # 삭제 답글

    안녕하세요. 요시카스크램블 게임 수정 중에 질문이 있습니다. bgm을 설치하려는데 wav파일로 혹시 bgm설치가 안되나요?
  • 펭귄대왕 2015/05/14 16:33 #

    http://icegeo.egloos.com/300509
    위 포스팅에 있는 내용을 참조하시면 midi, wav, aiff, au 등의 포맷으로 사운드를 낼 수 있습니다.

    파일 불러올 때의 렉 등이 있어서 상용게임처럼 자연스러운 처리는 안됩니다.
  • 멘붕 2015/05/17 17:43 # 삭제 답글

    자바 게임을 만들고있는중입니다 아직 학생이라 모르는게 너무 많은데....
    캐릭터가 걸어가는 장면이나 스킬을 쓰는것을 ArrayLsit에 넣고 timer 로 놀리니까 렉이 너무 심해서 ....
    이중버퍼를 사용해야되나요??? 아니면 다른방법이 있을까요?
    RPG처럼 대전게임인데... 좌우 전부다 하니... ㅠㅠ 멘붕입니다...
  • 펭귄대왕 2015/05/18 08:26 #

    타이머를 사용하지 말고 스레드 내에서 처리해주도록 하면 됩니다.

    설명이 길어져서 포스팅을 새로 작성했으니
    http://icegeo.egloos.com/306378
    이 포스팅을 참조해주세요.
  • 도돌이표 2015/06/03 00:02 # 삭제 답글

    자바로 게임을 만들고 있는데요
    아이템을 먹으면 플레이어의 무기가 업그레이드 되도록 하고싶은데 코드를 어떻게 해야 하나요?ㅠㅠ
    며칠 째 붙잡고 있는데 제자리걸음입니다 도와주세요ㅠㅠ
  • 펭귄대왕 2015/06/03 04:18 #

    어떤 게임이고, 어떤 식으로 표현할 것인가에 따라서 다르겠네요.
    여기에 질문해주셨으니 십중팔구 슈팅게임이라고 가정하면..

    파워 업도 여러 가지가 있겠는데요. 총알 한 발 한 발의 파괴력이 높아지는 경우, 발사속도가 빨라지거나, 발사 범위가 넓어지거나.
    그리고, 게임 중에 파워 업 했다가 되돌아 가거나, 드래곤플라이트처럼 상점에서 무기 파워업을 구매해 계속 그 상태를 유지하거나.

    http://icegeo.egloos.com/278037
    예를 들어 위 포스팅에서는 각종 아이템의 취득을 하고, 트윈샷 아이템을 먹으면 한 줄로 나가던 탄을 두 줄로 나가게 해서 범위를 넓히고 있습니다. (범위가 넓어지는 방식)
    동시에 시간이 지나면 원래대로 돌아오는 파워업이고요..

    http://icegeo.egloos.com/277925
    여기서는 총알에도 HP(파괴력)를 부여, 총알과 적이 충돌했을 때 총알과 적의 HP를 각각 감소, 총알의 HP가 높으면 HP가 높은 적도 빠르게 격파할 수 있고, 격파하고도 총알에 HP가 남아 있으면 총알은 남아있어 관통 효과까지도 볼 수 있습니다.
    총알의 그림을 두 개 이상 준비해서 총알의 파괴력이 높을때는 강력해 보이는 총알 그림을 사용하면 시각적으로도 확실합니다.

    그리고 이 게임의 public void process_MY() 함수에 보면
    if(cnt%4==0||myshoot){
    여기서 cnt%4==0, 그러니까 4회 루프마다 한 번씩 총알을 발사하게 되어 있는데, 이 숫자를 늘리고 줄여서 총알 발사 간격(연사)을 조절할 수 있습니다.
    그리고 Bullet클래스의 생성자 인수 중에 발사 각도나 speed를 지정해주는게 있어 총알이 퍼지는 범위나 총알의 비행 속도를 조절할 수 있습니다.

    이상을 원하는 형태로 적절하게 조합해주시면 되겠습니다.
댓글 입력 영역


Books

Geek라이프

게임 매니악스 슈팅 게임 알고리즘
마츠우라 켄이치로,츠카사 유키 공저/손정도 역/박민근,Pope Kim 감수

게임 매니악스 퍼즐 게임 알고리즘
마츠우라 켄이치로,츠카사 유키 공저/김병국 역

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

될 수 있어! SE 13
나츠미 코지 저/Ixy 그림/김경훈 역
예스24 | 애드온2