몰?.루();

[마인크래프트 모드 개발] GUI 버튼 추가 본문

마인크래프트/마인크래프트 모딩

[마인크래프트 모드 개발] GUI 버튼 추가

toonraon 2016. 12. 17. 15:32

모바일에서 신택스하이라이터가 제 역할을 하지 못한다... 모바일에서는 js 파일을 불러오지 못해서 생기는 문제 같은데 난감하다.



저번에 사진만 띄워봤으니 이번엔 버튼을 추가해보자.



저번 코드에서 fontRendererObj.drawString("Test", GUIX+ 100, GUIY + 100, 0xAAAAAA);를 통해 글자를 추가하는 것까지 해보았다. 각 파라미터는 (텍스트, x, y, 0xRRGGBB)이다.


이번에 알게 된 건데 super.xxx();들을 함수의 끝부분에 놓지 않으면 문제가 생길 수 있다. 아마 저번 게시글에선 첫 부분에 놓아도 문제가 없었는데 코딩하다보니 버튼이 GUI에 가려지는 문제가 발생했었다. 클릭은 되는데 버튼이 안 보였다. (가려진건지 아예 안 보인 건지 모르겠다.)


글자를 써보는 건 별 것 아니고 본격적으로 버튼을 추가해보았다. 위의 코드에도 적혀있듯 initGui() 함수에서 버튼을 추가한다. 추가한 버튼은 actionPerformed()함수에서 이벤트를 관리할 수 있다.


keyTyped() 함수로 키보드 이벤트도 관리할 수 있다. 여기선 E키를 누르면 GUI가 닫히도록 했다.



참고로 initGui()는 GUI를 열 때마다 한 번씩만 실행된다.

특이한 것은 drawScreen() 함수는 GUI를 연 동안 계속해서 불러온다는 것이다. 미친듯이 계속 부른다.


그래서 만약 특정 boolean 변수가 바뀌었을 때 GUI가 바뀌게 한다던지 하도록 코딩을 하려고하면 굳이 쓰레드를 사용할 필요가 없다. 그냥 if(변수 == true) { ... }를 drawScreen()에 써놓으면 그 즉시 바뀐다. 그러나 initGui()는 GUI를 열 때 한 번씩만 실행되기 때문에 실시간으로 GUI를 변경할 순 없다.




그런데 구현하고나니 버튼이 좀 이상했다.



안드로이드에서 Button을 추가할 때처럼 알아서 마인크래프트 버튼 모양이 추가될 줄 알았는데 그렇지 않았다. 뭔가 쓸데 없는 그림들도 같이 보였다. 마우스가 올라가니 딱 원래 버튼 위치가 파란 버튼으로 바뀌게 이미지가 올라가(?)는 것으로 보아 마우스가 버튼 위에 올라갔을 때 그냥 그림을 밀어올려서 마치 버튼 모양이 바뀐 것처럼 보이게 하는 것 같다.


그건 그렇다쳐도 분명 가로 길이는 꼭 맞는데 세로 길이가 안 맞았다. 몇 번 실험해서 얻은 결론은 GuiButton은 무조건 높이가 20일 때 제대로 표현된다. 단, 가로 길이는 알아서 조정되는 듯하다. (그럴 꺼면 세로 길이도 좀 알아서 변형시켜주지...)


버튼 크기를 50x20으로 해서 다시 실행해보았다.



딱 크기가 맞다. 실제로 마인크래프트에서도 모든 버튼 크기가 가로 길이는 달라도 세로 길이는 같은 것으로 보아 이게 한계인 것 같다.

(GuiButton 클래스 코드를 보니 가로 길이도 200px까지가 한계인 듯하다. 원본 gui png파일이 200x20 크기인데 가로길이가 200보다 작은 버튼은 코드로 가운데 부분을 자르고 양 끝만 보여주는 방식을 통해 가로 길이를 가변적으로 조절하고 있었다.)



영상을 보니 커스텀 버튼을 만들려면 마우스 이벤트를 통해 어딜 클릭했는지 감지하면 된다.



mouseButton은 좌클릭, 우클릭, 게이밍 마우스의 3번키, 4번키 같은 거에따라 달라지는 것 같다.


그런데 솔직히 안드로이드할 때는 이런 구식의 방법은 사용하지 않는다.

투명한 버튼을 놔두지 터치 좌표를 가지고 구현하진 않는다. 그래서 버튼을 투명화할 방법을 찾아보려했으나 찾지 못하였고 버튼을 그리는 drawButton()함수를 오버라이딩한 새로운 MyButton 클래스 (extends GuiButton)를 만들어 보았지만 사진 파일을 투명한 파일로 바꿔도 그대로 똑같은 버튼모양이 나타났다.




Comments