※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에 각각 코딩해주면 됩니다.
최근 받은 질문메일 덕분에 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에 각각 코딩해주면 됩니다.
at 2015/11/18 06:29
덧글
처음실행하면 이미지를 불러오는건지 뭐하는건지 모르겠지만 하얀화면으로
조금 있다가 이미지가 나타나는데
이것을 해결할수있는방법이 있을까요?
이건 라이브러리가 jar로 묶여있어서 내부에서 뭘 하는지 추적하기가 좀 어렵네요..
Slick2D라면 처음 시작할 때 init에서 불러들이는 이미지나 사운드 용량에 따라 스타팅이 느려지는 모양이니까, init에서는 간단한 now loading 이미지를 하나만 읽어주고, 이걸 화면에 표시한 상태에서 update에서 추가 이미지를 불러들이도록 한 다음 게임을 시작하도록 하면 될 것 같습니다.
JFrame자체로 만든게임으로 바꿧는데
조금기다리면 이미지가 정상출력이되지만
처음켤때 이미지불러오는게 늦은감이있어그런진모르겠지만
하얀창으로 조금 지속되다가 동작되더라고요.
혹시 그 로딩시간도 없앨수있는방법이 없나해서..
그 버퍼드 이미지 안썻는데 그것이랑도 관련있나해서요
이미지 주소는 확보됐는데 이미지 불러오기가 끝나지 않은 상태에서 스레드가 시작되면서 생기는 문제인지라.
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 객체를 만들 때, 미디어 트랙커를 붙여서 이미지 로딩이 완료되고 나서 다음 처리로 넘어가도록 하는데, 평범한 수준의 이미지 양이면 로딩은 거의 느낄 수 없습니다. (이미지보다는 사운드쪽에서 느껴질 정도로 렉이 걸리는 편이 보통이라..)
언제부터 repaint가 되는지, repaint가 시작되기 전에 어떤 처리를 하는지 되짚어 가는 식으로 지연이 생기는 지점을 찾아봐야 할 것 같네요.
항상 질문에 친절히 답변해주시고 신경써주셔서 감사합니다.
한번 적용하고 참고해보겠습니다.
블로그 보고 이거다 싶어 염치불구 하고 문의 드립니다
Awt 프로젝트 포팅에 5분정도 소요되었다 하셨는데 slick2d 에서 awt 를 그대로 사용 가능한것인지요?
이 경우는 게임 처리에 canvas를 사용하고,
스레드로 일정시간마다 repaint를 해 주는 그런 형태의 프로그래밍(요시카 스크램블이나 위치즈 플라이트, 아스테로이드 벨트가 여기에 해당합니다)이 slick2d로 옮기기에 딱 좋습니다.
기존에 제가 awt로 만든 게임들에서는 스레드에서 1/60초마다 repaint와 추가 처리(보통 제 프로그램에서는 process라는 함수로 정의합니다)를 해 주는데,
slick2d에서는 기본적으로 각 게임 클래스마다 render와 update라는 함수를 필수 오버라이드 함수로 제시하고 있어
awt게임의 repaint 부분을 render에서, process 부분을 update에서 처리하도록 이식해주면 상당히 쉽게 옮길 수 있었습니다.
완전히 동일하지는 않기 때문에 image 객체를 불러오는 부분이라던가 클리핑 처리, drawImage 함수 사용의 인수 등에서는 다소 수정해줘야 합니다.
4. slick.zip을 압축해제한 폴더의 lib 폴더로 이동해서 jinput.jar, lwjgl.jar, lwjgl_util.jar, slick.jar를 선택하고 ok.
따라하는 도중에 slick.zip 파일은 어디서 다운을 받나요? 위에 링크걸어주신 것에는 없는거 같은데요 ㅠㅠ
Basicgame을 상속한다라는게 무슨 말인지 이해가 안가네요 ㅠ
class SimpleSlickGame extends BasicGame 과 같은 식으로 시작되는 SimpleSlickGame.java 파일을 src 폴더 아래에 만들어주면 됩니다.
이때 이클립스를 사용한다면 패키지 익스플로러에서 src에 우클릭->New->Class를 선택하고, 그 다음에 나오는 창에서 클래스 이름은 SimpleSlickGame, 상속할 클래스를 BasicGame으로 지정해서 생성하는게 편리합니다.
이렇게 생성한 SimpleSlickGame이 있으면 두 번째 질문도 해결됩니다.
※SimpleSLickGame은 편의상 붙인 이름이므로 BasicGame을 상속(extends)하기만 하면 클래스 이름은 원하는 걸로 만들어도 됩니다.
그밑에 소스도 에러도 많이뜨구요..
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 이걸로 지정한다음 그림에 나와있는 소스를 입력하는것아닌가요??
제가 실수한부분이있다면 정말 죄송하지만 조금만 쉽게 자세하게 순서를 설명해주실수있을까요..?
이때 나오는 New Java Class 창에서 Superclass라는 항목이 있습니다. 여기에 BasicGame을 지정해 줍니다.
혹은 그냥 생성하고 extends BasicGame 을 추가해도 됩니다.
그렇게해서 생성한 클래스는
public class SimpleSlickGame extends BasicGame {
}
최초에 이런 모양으로 존재하게 됩니다.
여기에 생성자와 main 부분을 작성하면 됩니다.
이걸 찾을 수 없다면 Slick2D 라이브러리가 제대로 연결되지 않은 것 같네요.
https://github.com/ChangseOh/Slick2DStudy
여기서 Clone or Download -> Download ZIP 으로 완성된 프로젝트를 받아서 한 번 비교해 보면 도움이 될까 싶습니다.
이것만으로는 저도 바로 짐작할 수 있는게 달리 없네요.
그런데도 안된다면 칸을 지우고 옆의 Browse 버튼을 눌러보세요.
그러면 현재 선택 가능한 부모클래스가 뜰텐데 Slick2D가 제대로 링크되었다면 관련 클래스(BasicGame이라던가)가 나타날겁니다. 없다면 초반 연결 과정이 어디선가 잘못되었을 것 같네요.
BasicGameState 이렇게 두개가 뜨는데 아무거나 상관없나요?
constructors from superclass 이건 체크해야되는건가요? 셋중에 어떤걸 체크하고 넘어가야되죠??
클래스명을 SimpleSlickGame 이거로 하는게 아닌가요.?
앞의 답변처럼 constructor에 체크하고 클래스를 만들었으면 클래스명과 같은 생성자도 함께 생성됐을테니 그걸 찾아서 확인해 보면 되고요
생성자에 리턴타입을 지정했거나(void라던가), 클래스와 생성자로 만든 함수의 이름(혹은 대소문자)이 틀리게 지정되었거나 그런게 아닐까 싶네요.
if(x<0)
x=0;
if(x>화면너비)
x=화면너비;
이런식으로 X, Y 좌표에 대해서 수정해줍니다.
캐릭터 크기에 따라서
if(x>화면너비-캐릭터너비)
x=화면너비-캐릭터너비;
이런 식으로 하면 화면 안쪽에만 있을 수 있습니다.