adsense



Slick2D - java용 2D 게임엔진 (추가) PC/Mobile/Developer

※github에 스터디용 프로젝트를 오픈했습니다 : https://github.com/ChangseOh/Slick2DStudy

최근 받은 질문메일 덕분에 java용으로 opengl을 사용한 2d 게임엔진이 있다는 것을 알게 됐습니다. (이 자리를 빌어 감사드립니다)

이전에 libgdx도 있긴 했는데, 이건 세팅하기 까다롭고 유료 라이센스인지라..

받아서 적용해 봤는데, 안드엔진이나 cocos2d-x와 달리 이미지 렌더링 부분을 곧바로 코딩하게 되어 있어서 java awt로 만드는 비트맵 게임과 아주 흡사하게 다룰 수 있었습니다.

Slick2D 엔진 다운로드 : http://slick.ninjacave.com/


Slick2D를 적용한 자작게임은 차후에 소개해보기로 하고, (스샷은 awt로 만든걸 slick2D로 포팅한건데, 5분정도..?)

이클립스에서 이 엔진을 사용하려면 어떻게 해야 하나, 그것만 간단히 정리해봤습니다.

1. 이클립스의 window -> preferences -> Java -> Build Path -> User Libraires로 이동합니다.
2. New -> User library name은 원하는 것으로 적고 OK. 여기서는 Slick2D로 정했습니다.


3. Slick2D에 포커스 놓고 Add External JARs 클릭
4. slick.zip을 압축해제한 폴더의 lib 폴더로 이동해서 jinput.jar, lwjgl.jar, lwjgl_util.jar, slick.jar를 선택하고 ok.
※ 사운드를 사용하려면 jogg-0.0.7.jar와 jorbis-0.0.15.jar도 선택합니다. .xm, .mod, .aif, .wav and .ogg가 지원됩니다. mp3 불가.
5. OK 를 눌러 User Libraires 설정을 마칩니다.


6. 빈 자바 어플리케이션 프로젝트를 생성합니다.
7. 프로젝트 우클릭 -> Build Path -> Configure Build Path -> Libraries 탭 선택
8. Add Library -> User Library -> Slick2D 선택하고 OK


9. src에 BasicGame을 상속하는 자바 클래스를 생성합니다. (ex. SimpleSlickGame)
10. 9.에서 생성한 클래스 안쪽에 생성자와 main 함수를 그림과 같이 코딩합니다.



11. 프로젝트 우클릭 -> Run As -> Run Configurations -> Java Application에서 현재 프로젝트를 선택 (보이지 않는다면 AlphaMapTest라고 된 항목을 선택)합니다.
12. Main 탭에서 프로젝트 명을 확인하고, MainClass는 9.에서 생성한 클래스 (main이 존재하는 클래스)를 기입하고 Apply 누릅니다.
13. 나가지 않고 바로 Arguments 탭으로 이동해서 VM arguments 항목에 아래와 같이 입력합니다.

-Djava.library.path=D:\download_backup\slick2d\
※여기서 D:\download_backup\slick2d\는 현재 slick.zip 압축을 풀어놓은 폴더로 적어줍니다. (폴더명에 스페이스, 한글 금지)


14. Apply를 눌러 완료하고 닫습니다.

이제 사용 준비가 되었습니다.
http://slick.ninjacave.com/wiki/index.php?title=Hello_World

테스트 삼아 위 페이지를 참조해서 메시지를 출력하도록 render 함수 내용을 수정해주고 Java Application을 실행하면 됩니다.

엔진을 적용하고 나면 기존에 run-process 스레드에서 처리하던 내용은 update 함수 안에서, paint 에서 처리하던 내용은 render에 각각 코딩해주면 됩니다.

핑백

  • Model ISLAND - 어떤 의미에선 3차원 : [java] Slick2D로 게임 만들기 -시작- 2015-11-27 04:41:41 #

    ... 겠습니다. 여기서 소개하는 내용은 https://github.com/ChangseOh/LetsStudySlick2D 이곳에서 프로젝트를 다운받으실 수 있습니다. 우선 앞선 포스팅을 참조해, 이클립스에서 신규 자바 프로젝트를 생성하고 유저 라이브러리로 Slick2D를 추가해줍니다. 프로젝트를 생성했으면 src 아래 패키지를 새로 만들어줍 ... more

덧글

  • 밤콩 2015/11/18 13:12 # 삭제 답글

    메일도움주셔서 감사합니다 ^^
  • 펭귄대왕 2015/11/18 18:30 #

    감사합니다. 플젝 잘 되시기 바라고, 혹시 도움드릴만한 일이 있으면 얘기해 주세요.
  • 밤콩 2015/11/24 11:49 # 삭제 답글

    죄송한데. 질문이있습니다 펭귄님
    처음실행하면 이미지를 불러오는건지 뭐하는건지 모르겠지만 하얀화면으로
    조금 있다가 이미지가 나타나는데
    이것을 해결할수있는방법이 있을까요?
  • 펭귄대왕 2015/11/24 12:45 #

    Slick2D쪽 말씀인가요?
    이건 라이브러리가 jar로 묶여있어서 내부에서 뭘 하는지 추적하기가 좀 어렵네요..
    Slick2D라면 처음 시작할 때 init에서 불러들이는 이미지나 사운드 용량에 따라 스타팅이 느려지는 모양이니까, init에서는 간단한 now loading 이미지를 하나만 읽어주고, 이걸 화면에 표시한 상태에서 update에서 추가 이미지를 불러들이도록 한 다음 게임을 시작하도록 하면 될 것 같습니다.
  • 밤콩 2015/11/24 13:41 # 삭제

    아아.. 죄송합니다 실릭이아니고
    JFrame자체로 만든게임으로 바꿧는데
    조금기다리면 이미지가 정상출력이되지만
    처음켤때 이미지불러오는게 늦은감이있어그런진모르겠지만
    하얀창으로 조금 지속되다가 동작되더라고요.
    혹시 그 로딩시간도 없앨수있는방법이 없나해서..
    그 버퍼드 이미지 안썻는데 그것이랑도 관련있나해서요
  • 펭귄대왕 2015/11/24 16:05 #

    이미지가 불려지지 않은 상태로 게임이 조금 진행되다가 이미지가 나타난다.. 이런 식이면 미디어트랙커를 쓰지 않은 경우에 그런 식으로 됩니다.

    이미지 주소는 확보됐는데 이미지 불러오기가 끝나지 않은 상태에서 스레드가 시작되면서 생기는 문제인지라.

    public Image makeImage(String furl){

    //rsc 폴더 내의 이미지를 불러들여 Image 객체로 받는다

    System.out.println(furl);

    Image img;

    Toolkit tk = Toolkit.getDefaultToolkit();
    img = tk.getImage(furl);
    try {
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(img, 0);
    mt.waitForID(0);
    } catch (Exception ee) {
    ee.printStackTrace();
    return null;
    }

    return img;
    }
    이런 식으로 파일에서 Image 객체를 만들 때, 미디어 트랙커를 붙여서 이미지 로딩이 완료되고 나서 다음 처리로 넘어가도록 하는데, 평범한 수준의 이미지 양이면 로딩은 거의 느낄 수 없습니다. (이미지보다는 사운드쪽에서 느껴질 정도로 렉이 걸리는 편이 보통이라..)
  • 펭귄대왕 2015/11/24 22:03 #

    제 경우는 awt-swing으로 만든 경우 이미지 불러오느라 초기지연이 생기는 일은 없었기 때문에, 아마 다른 문제가 아닐까 싶습니다..
    언제부터 repaint가 되는지, repaint가 시작되기 전에 어떤 처리를 하는지 되짚어 가는 식으로 지연이 생기는 지점을 찾아봐야 할 것 같네요.
  • 밤콩 2015/11/25 01:29 # 삭제

    아.. 그렇군요 감사합니다
    항상 질문에 친절히 답변해주시고 신경써주셔서 감사합니다.
    한번 적용하고 참고해보겠습니다.
  • 칼륨 2015/12/06 22:34 # 삭제 답글

    안녕하십니까
    블로그 보고 이거다 싶어 염치불구 하고 문의 드립니다
    Awt 프로젝트 포팅에 5분정도 소요되었다 하셨는데 slick2d 에서 awt 를 그대로 사용 가능한것인지요?
  • 펭귄대왕 2016/03/26 09:35 #

    awt 프로그래밍이라고 해도 어떻게 작성했는지에 따라 여러가지가 있겠는데요,
    이 경우는 게임 처리에 canvas를 사용하고,
    스레드로 일정시간마다 repaint를 해 주는 그런 형태의 프로그래밍(요시카 스크램블이나 위치즈 플라이트, 아스테로이드 벨트가 여기에 해당합니다)이 slick2d로 옮기기에 딱 좋습니다.

    기존에 제가 awt로 만든 게임들에서는 스레드에서 1/60초마다 repaint와 추가 처리(보통 제 프로그램에서는 process라는 함수로 정의합니다)를 해 주는데,
    slick2d에서는 기본적으로 각 게임 클래스마다 render와 update라는 함수를 필수 오버라이드 함수로 제시하고 있어
    awt게임의 repaint 부분을 render에서, process 부분을 update에서 처리하도록 이식해주면 상당히 쉽게 옮길 수 있었습니다.

    완전히 동일하지는 않기 때문에 image 객체를 불러오는 부분이라던가 클리핑 처리, drawImage 함수 사용의 인수 등에서는 다소 수정해줘야 합니다.
  • 학생2 2016/03/26 09:25 # 삭제 답글

    저기. 질문이있는데요

    4. slick.zip을 압축해제한 폴더의 lib 폴더로 이동해서 jinput.jar, lwjgl.jar, lwjgl_util.jar, slick.jar를 선택하고 ok.

    따라하는 도중에 slick.zip 파일은 어디서 다운을 받나요? 위에 링크걸어주신 것에는 없는거 같은데요 ㅠㅠ
  • 펭귄대왕 2016/03/26 09:33 #

    http://slick.ninjacave.com/ 이쪽에서 받으시면 됩니다. 본문에도 추가해놓겠습니다.
  • 학생2 2016/03/27 13:18 # 삭제

    감사합니다!! 유익한 자료 많이 배우고 갑니다!
  • 학생2 2016/04/02 00:04 # 삭제 답글

    저기 9. src에 BasicGame을 상속하는 자바 클래스를 생성합니다. (ex. SimpleSlickGame) 게 무슨말인가요?
    Basicgame을 상속한다라는게 무슨 말인지 이해가 안가네요 ㅠ
  • 학생2 2016/04/02 00:21 # 삭제 답글

    그리구 하란대로 다하고 돌렷는데 마지막에 기본클래스 SimpleSlickgame을 찾거나 로드할수 없습니다. 라는 오류가 뜹니다 ㅠㅠ 뭐가 잘못된건가요.
  • 펭귄대왕 2016/04/03 17:16 #

    일단 9. 부터..
    class SimpleSlickGame extends BasicGame 과 같은 식으로 시작되는 SimpleSlickGame.java 파일을 src 폴더 아래에 만들어주면 됩니다.
    이때 이클립스를 사용한다면 패키지 익스플로러에서 src에 우클릭->New->Class를 선택하고, 그 다음에 나오는 창에서 클래스 이름은 SimpleSlickGame, 상속할 클래스를 BasicGame으로 지정해서 생성하는게 편리합니다.

    이렇게 생성한 SimpleSlickGame이 있으면 두 번째 질문도 해결됩니다.

    ※SimpleSLickGame은 편의상 붙인 이름이므로 BasicGame을 상속(extends)하기만 하면 클래스 이름은 원하는 걸로 만들어도 됩니다.
  • 프레스코 2017/10/22 17:44 # 삭제 답글

    안녕하세요!! 여기서 하라는데로 하는데 9번에서 자꾸 막히네요...그림에나오는대로 소스를 치면 gamename과 super(gamename)여기부분이 밑에 지렁이가 생기는데 도대체 뭐가 문제일까요...
    그밑에 소스도 에러도 많이뜨구요..
  • 프레스코 2017/10/22 17:45 # 삭제

    사진을남기고싶은데 사진은 안올라가네요..
  • 프레스코 2017/10/22 17:54 # 삭제

    빈 자바 어플리케이션 프로젝트를 생성합니다. 이 부분이


    file>>new >> java project 해서 프로젝트명은 제 임의로 만들고 7. 프로젝트 우클릭 -> Build Path -> Configure Build Path -> Libraries 탭 선택
    8. Add Library -> User Library -> Slick2D 선택하고 OK 여기까지아닌가요?

    그다음

    src에 BasicGame을 상속하는 자바 클래스를 생성합니다. (ex. SimpleSlickGame) 이부분인데 임의로만든 프로젝트아래에 src파일이 생성되자나요? 거기서 오른쪽마우스클릭후 new >> class해서 SimpleSlickGame 이걸로 지정한다음 그림에 나와있는 소스를 입력하는것아닌가요??

    제가 실수한부분이있다면 정말 죄송하지만 조금만 쉽게 자세하게 순서를 설명해주실수있을까요..?
  • 프레스코 2017/10/22 17:56 # 삭제

    이클립스를 사용하고있습니다..
  • 프레스코 2017/10/22 17:57 # 삭제

    바쁘신데 질문 자꾸 이렇게 남겨서 죄송합니다. 이해 안가는 부분이 >>상속할 클래스를 BasicGame으로 지정 이 부분이 제일 이해가 안갑니다..
  • 펭귄대왕 2017/10/22 18:15 #

    src폴더에 오른클릭->new->class
    이때 나오는 New Java Class 창에서 Superclass라는 항목이 있습니다. 여기에 BasicGame을 지정해 줍니다.
    혹은 그냥 생성하고 extends BasicGame 을 추가해도 됩니다.

    그렇게해서 생성한 클래스는
    public class SimpleSlickGame extends BasicGame {

    }
    최초에 이런 모양으로 존재하게 됩니다.
    여기에 생성자와 main 부분을 작성하면 됩니다.
  • 프레스코 2017/10/22 18:21 # 삭제 답글

    아... 왜안되죠..? BasicGame에 자꾸 지렁이가 뜨는데 BasicGame이 여기서 의미하는게 뭐죠??
  • 펭귄대왕 2017/10/22 18:25 #

    BasicGame은 Slick2D에서 기본적으로 제공되는 클래스입니다.
    이걸 찾을 수 없다면 Slick2D 라이브러리가 제대로 연결되지 않은 것 같네요.

    https://github.com/ChangseOh/Slick2DStudy
    여기서 Clone or Download -> Download ZIP 으로 완성된 프로젝트를 받아서 한 번 비교해 보면 도움이 될까 싶습니다.
  • 프레스코 2017/10/22 18:31 # 삭제 답글

    여기에 나와있는대로 Slick2D 파일다운받아서 추가하고 했는데 연결안되는경우도있나요.?
  • 펭귄대왕 2017/10/22 18:37 #

    BasicGame 클래스를 상속할 수 없다면 지금 생각할 수 있는 건 빌드패스에 연결이 안되어있는 경우거나, 이 게시물 작성 이후 Slick2D가 업데이트되거나 해서 바뀐 점이 있거나.. 등일 것 같은데요,
    이것만으로는 저도 바로 짐작할 수 있는게 달리 없네요.
  • 프레스코 2017/10/22 18:36 # 삭제 답글

    Superclass여기부분에 java.lang.Object 지금 이렇게 들어가있는데 이걸 지우고 BasicGame 을 바꾸라는얘기아닌가요?
  • 펭귄대왕 2017/10/22 18:39 #

    제가 드린 설명은 그 내용이 맞습니다.
    그런데도 안된다면 칸을 지우고 옆의 Browse 버튼을 눌러보세요.
    그러면 현재 선택 가능한 부모클래스가 뜰텐데 Slick2D가 제대로 링크되었다면 관련 클래스(BasicGame이라던가)가 나타날겁니다. 없다면 초반 연결 과정이 어디선가 잘못되었을 것 같네요.
  • 프레스코 2017/10/22 18:38 # 삭제 답글

    BasicGame
    BasicGameState 이렇게 두개가 뜨는데 아무거나 상관없나요?
  • 펭귄대왕 2017/10/22 18:40 #

    BasicGame으로 지정하시면 됩니다
  • 프레스코 2017/10/22 18:40 # 삭제 답글

    그 밑에 세개의 체크 부분이 있는데

    constructors from superclass 이건 체크해야되는건가요? 셋중에 어떤걸 체크하고 넘어가야되죠??
  • 펭귄대왕 2017/10/22 18:42 #

    main하고 construction을 체크하고 마지막건 해제합니다
  • 펭귄대왕 2017/10/22 18:43 #

    지금 이클립스를 볼 수 없는 환경이라서 기억만으로 답변드리고 있으니 세세한 부분은 답변 못드릴 수도 있습니다
  • 프레스코 2017/10/22 18:46 # 삭제 답글

    이렇게 자세하게 설명해주시는데 왜 안될까요.. BasicGame의 지렁이는 이제 사라졌는데 SimpleSlickGame 여기에 지렁이가 뜨네요

    클래스명을 SimpleSlickGame 이거로 하는게 아닌가요.?
  • 펭귄대왕 2017/10/22 18:50 #

    클래스명은 자유롭게 지정하시면 됩니다.
    앞의 답변처럼 constructor에 체크하고 클래스를 만들었으면 클래스명과 같은 생성자도 함께 생성됐을테니 그걸 찾아서 확인해 보면 되고요

    생성자에 리턴타입을 지정했거나(void라던가), 클래스와 생성자로 만든 함수의 이름(혹은 대소문자)이 틀리게 지정되었거나 그런게 아닐까 싶네요.
  • 프레스코 2017/10/22 18:49 # 삭제 답글

    public abstract class SimpleSlickGame extends BasicGame 이렇게 추가하니까 지렁이는 사라졌습니다..
  • 프레스코 2017/10/22 19:02 # 삭제 답글

    도저히 안되네요...시작도하기전에 이러니까 힘빠지고 ,, 이걸 해야만 다음 진행할수있나요.?
  • 펭귄대왕 2017/10/22 19:24 #

    이 다음 포스팅 내용은 이걸 못해도 Slick2D만 연결할 수 있으면 되긴 합니다.. 이것만으로는 저도 뭐가 문제인지 알 수가 없네요.
  • 프레스코 2017/10/31 19:20 # 삭제 답글

    안녕하세요 지금 스윙으로 작업중인데 비행기 기체가 프레임 밖으로 나가지는데 이거를 못나가게 잡아주는건 어떻게 해야하는거죠..?
  • 펭귄대왕 2017/11/01 01:01 #

    캐릭터 좌표를 이동시키고 나서
    if(x<0)
    x=0;
    if(x>화면너비)
    x=화면너비;
    이런식으로 X, Y 좌표에 대해서 수정해줍니다.

    캐릭터 크기에 따라서
    if(x>화면너비-캐릭터너비)
    x=화면너비-캐릭터너비;
    이런 식으로 하면 화면 안쪽에만 있을 수 있습니다.
  • 프레스코 2017/11/02 23:13 # 삭제 답글

    감사합니다.
  • 펭귄대왕 2017/11/20 14:54 #

    exe 파일로 만드는 건 저도 잘 몰라서 찾아보고 도와드리려고 했습니다만.. 도움드리지 못해 죄송합니다.
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.