이번엔 GUI에 관해서 작성함.


가장 먼저 API사이트에 가서 LuaGui 클래스를 열어본다.


https://lua-api.factorio.com/latest/LuaGui.html





그럼 일단 다른거 제껴두고 top, left, center라는 방향 표시가 보일거고, screen도 있어.

player라는게 보이는거 보면 각 플레이어마다 따로따로 gui를 표시해줘야한다는 것도 예상할 수 있겠지.

모든 플레이어에게 어떤 동일한 gui 처리를 해주려면

for _, player in pairs( game.connected_players ) do

local gui = player.gui

... 블라블라 ...

end

같은 식으로 접속한 플레이어들 한명한명 뭐 하나 갱신할 때마다 매번 다 돌려줘야함.

플레이어마다 다른 gui를 보여줄 수도 있고.




각각의 위치가 지정하는 구역은 이렇게 생김.

screen은 화면 내에 아무데나를 지정하는 거임. 드래그해서 움직일 수 있는 창은 screen안에다 만들어야해.

각 구역에는 새로운 LuaGuiElement를 배치할 수 있다.

좌표는 오른쪽이 +x방향, 아래쪽이 +y방향인데, screen안에서 작업할게 아니라면 좌표를 신경쓸 필요는 크게 없다.

그리고 LuaGuiElement는 배치될 때, screen 구역에 만든게 아닌이상, 자동으로 서로서로 겹치지않게 옆에 생기거나 밑에 생기거나 한다.



◆연습


연습삼아 몇개만 만들어보자.

우선 만들면서 간간히 https://lua-api.factorio.com/latest/LuaGuiElement.html 이걸 참고해야함.

만든어지는 모든 GUI요소들은 이 LuaGuiElement니까.


top, left, center, screen같은 구역도 투명한 LuaGuiElement임. 종류는 flow.

종류가 뭐 되게 많은데, 기본적으로 구역안에 구역을 지정하기 위해선 왠만하면 "flow"라는 gui를 먼저 만들기를 권장하고 있어.

하지만 flow는 눈에 안보이니까 "frame"으로 먼저 연습을 해보자.


먼저 채팅창에

/c gui = game.player.gui

이렇게 입력하면 쓰다버리는 임시 전역변수 gui를 만들고,

거기에 game.player (lua 커맨드를 사용한 플레이어 자신의 LuaPlayer개체) 의 gui 키(LuaGui)를 대입한다.

LuaPlayer는 gui라는 키값을 가지고 있어. 그 플레이어의 최상단 LuaGui를 return 함.

https://lua-api.factorio.com/latest/LuaPlayer.html#LuaPlayer.gui


그러면 커맨드에

game.player.gui.어쩌고.쩜.어쩌고.쩜.쩜.쩜.뭐.쩜.뭐뭐.쩜.뭐어쩌고 입력하는 것 대신에

무표기 전역변수 gui를 쓰면

gui.어쩌고.쩜.어쩌고.쩜.쩜.쩜.뭐.쩜.뭐뭐.쩜.뭐어쩌고

식으로 좀 더 길이를 줄일 수 있겠지!

스크립트 안에나, 멀티플레이어에서는 무표기 전역변수를 만들면 안된다!! 절대로! 혼자하는 연습이니까 이렇게 하는거임.


그리고

/c gui.top.add{ type = "frame", name = "frame1" }

을 입력해보면 화면 좌측상단에 검은 막대기가 생긴걸 볼 수 있다.

add 사용법은

https://lua-api.factorio.com/latest/LuaGuiElement.html#LuaGuiElement.add


name을 지정해주면, gui.top["frame1"] 또는 gui.top.frame1 같은 식으로 해당 child gui에 액세스할 수 있음.

/c gui.top["frame1"].add{ type = "label", caption = "헬로월드" }

그 안에 글자를 써넣자.


이렇게 됐을거야. 스샷찍으려고 게임창 세로길이를 극단적으로 줄여서 채팅칸하고 윗줄하고 거의 만나게 해봤어.


그럼 gui를 안에다 안넣고 옆에다 추가로 더 넣으면 어캐될까.

/c gui.top.add{ type = "frame" }

/c gui.top.add{ type = "frame" }

/c gui.top.add{ type = "frame" }

이걸 여러번 입력해보자.


그럼 검은 막대기가 오른쪽으로 주르륵 생겨나는걸 볼 수 있다.

gui.top.direction 값이 기본적으로 "horizontal"이기 때문이다.


세로로는 추가 못해?

할 수 있지. 내부에 gui들이 쌓이는 방향을 지정해주는건 add 함수를 쓸 때, direction = "horizontal" 또는 direction = "vertical"을 지정해주면 된다.


일단 지저분한 검은 막대를 다 지워보자.


/c gui.top.clear()

이건 자신이 데리고 있는 하위 child gui를 모조리 없애버리는 거야.

https://lua-api.factorio.com/latest/LuaGuiElement.html#LuaGuiElement.clear


frame이 어떻게 생기는지 이해했으니까, 이제 투명한 flow를 설치해보자. frame과의 차이점은 투명하다는 것 뿐일거야 아마.

/c vflow = gui.top.add{ type = "flow", name = "verticalflow", direction = "vertical" }

vflow라고 변수를 하나 만들었고 거기에 flow개체를 대입한다. 왜냐하면 다 적으려면 너무기니까.

이름을 verticalflow라고 지어줬으니까 아래처럼 해도 해당 gui를 찾을 수 있는데,

game.player.gui.top.verticalflow

존나 길잔아.

vflow로 하자. 실제 스크립트 안에서는 local vflow = ...라던가 하는 식으로 지역변수로 쓰거나 global 테이블 안에 넣어야한다.

이건 혼자하는 테스트니까 무표기 전역변수 선언을 남발하는 거임.


/c vflow.add{ type = "frame" }

/c vflow.add{ type = "frame" }

/c vflow.add{ type = "frame" }

그 다음 이걸 존나 도배해보자.




세로로 생기지?



gui.top에다가 button도 추가해보자.


/c gui.top.add{ type = "button" }

/c gui.top.add{ type = "button" }


그럼 이 button은 vflow랑 같은 top(direction=수평)의 바로 아래에 있기 때문에 옆으로 들어갈 것.


/c vflow2 = gui.top.add{ type = "flow", direction = "vertical" }

/c vflow2.add{ type = "frame" }

/c vflow2.add{ type = "frame" }

또 수직배치flow를 또 만들어보자


/c lastframe = vflow2.add{ type = "frame" } lastframe.add{ type = "label", caption = "끝!" }



여기까지 하면 기괴한 것이 완성 되었다.


/c vflow.clear()

하면 vflow내부의 것만 청소되고, (vflow자체는 남는다.)

/c gui.top.clear()

까지하면 다 청소된다.


/c gui = nil

마지막으로 가지고 놀았던 전역변수 gui를 없애주면 연습 종료.



다음엔 다른 모드와 조화롭게 gui공간을 나눠쓰는 것과, 스크립트 안에 gui를 만들도록하는 스크립트를 작성하는걸 해보도록 하지.