전략게시판

전략게시판 [스튜디오]
[lua] 각플레이어에게 ui표시하기에 대한 고찰
2019.11.09 16:35 조회 : 4983
Lv. 395님들밥먹고히죠 빌런 작성자 게시물 더보기
먼저 읽기전에
무뇌충이거나 프로그래밍의 대한 기본적인 지식이 없다면 이해가 불가능할테니 뒤로가기 클릭이나 ㄱ






내가 만들려던 기능은 플레이어로 '각자'의 시간을 ui로 화면에 표시하기다
원래 ui로 화면에 그리는건 내용을 전부 공유한다,
그니까 방에 몇명이 있던간에 ui로 화면에 뭘 표시하면 모든 플레이어가 그걸 보게된다는뜻
근데 각자의 유저에게 서로다른 ui를 표시하려면 어떻게 해야할까?


속도계를 예로들자

이미 속도계 구현한 루아에서도 가장 중요한 부분중 하나였는데
플레이어는 여러명인데 내속도계에 다른사람의 속도가 표시되면 안되자나?
그래서 해결방법이 뭐냐,

가장 간단하고 확실한건
플레이어별로 각자 속도를 저장할 값을 하나씩 다 만들고
거기다 플레이어 번호순서에 맞게 집어넣으면 그만이긴 한다
근데 그방법은 코드가 너무 길어지고 비효율적이라 시도는 안해봄



▲이건 북미섭인지 인도섭인지 하여튼 한 유저가 만든 속도계인데 이미 한섭여러맵에서 많이 쓰이는거드라
대부분 lua 들어간 버니나 서프맵은 그냥 이거 갖다 처붙힌 맵임
이건 위 방법대로 변수여러개 생성안하고 각자 속도 표시하던데
나도 어디까지나 아마추어라 소스 읽어봐도 도저히 이해를 못하겠더라




위에껀 솔직히 봐도 모르겠고 기왕 만들꺼 직접만들자 생각함,
그래서 내가직접 각자의 ui를 표시하도록 만들어 보기로 했음 ㅇㅇ
여기서 내가 만들건 맵 플레이 타임을 각자 표시하도록 한거,







우선 진짜 간단하게 생각해서, 유저별로 플탐을 저장한 배열을 직접
싱크밸류로 전달하고 거기서 플레이어 인덱스로 찾아서 표시하면 안돼나?
그생각으로 시도 해봄


근데 결론은 안됨







싱크밸류로 배열을 전달할순 없더라




그래서 일단은 무시하고 배열안에 저장된 플레이어 시간 정보를 game.lua에서 하나씩 얻어
직접 ui로 보내봄

list(대충 플레이어 시간정보를 담고있는 배열)
sync.value=list[플레이어 인덱스번호]

이런식으로


근데 이것도 실패함
시간을 동기화하는 싱크밸류는 하나인데
사람이 여러명 들어오면 여러사람들 시간이 서로 계속해서 바뀌니까
시간이 겹쳐 보이더라
그럼 변수 더 추가 하면 안돼냐? 그게 맨 위에서 말한 유저별로 변수 각자만드는 방식임
결국 이것도 안됨





그럼 어떻게 해야하나?
싱크밸류 변수 하나로 맵에 있는 모든 플레이어의 시간정보를 담아서 한번에 보낼순 없나?
그거만 가능하면 ui에서 전달받은 값에서 플레이어 인덱스 번호순서대로 꺼내 쓰기만 하면 그만이다

딴사람들은 어떻게 했을까하면서 좀 알아보려고
유튜브 dowgen(알사람은 누군지 알듯) 
채널에서 신버전 속도계라며 올린글 한번 읽어봤는데





출처:dowgen



kia... 기가 막히더라
이사람 아이디어가 ㄹㅇ루다 대단함
위 소스 대충 설명하자면

싱크밸류로는 숫자,문자열,불리언 값 밖에 못보낸다,
그래서 저사람이 생각한 방식이 빨간밑줄 그은부분처럼
아예 배열안에 있는 모든 요소를 하나의 문자열로 만들어서 싱크밸류로 넘기는 방식이더라
그다음 ui에서 넘겨받은 문자열 중 플레이어의 인덱스 값으로 문자열에서 위치를 찾아서 
그 부분만 잘라내서 ui로 표시하는 방식이었음

ㄹㅇ ㅆㅅㅌㅊ 아이디어


그래서 저 방법대로 소스를 짜보자


혼자 별 g랄 다하다 만든 흔적


내가 만든 시간표시 코드중 일부분인데
나도 아마추어라 누가 보기엔 엉터리에 더워보일수도 있고
다른 누가보기엔 잘하는 사람처럼 보일수도 있고 ㅇㅇ



그럼 이제 ui에서 표시를 해보자
ui에선 그냥 하나의 길다란 문자열을 받았을것이다
이걸 이제 또 나눠줘야함
위 소스에선 안보이는데 각플레이어 시간 맨뒤에 공백 붙혀서 저장됨,

공백을 기준으로 문자열을 다시 배열로 나눠서 따로 배열에 저장하고
그다음 플레이어 인덱스 꺼내쓰면 끝



출처



근데 왠만한 다른언어에는 다있을 split이 루아는 없다고 하더라
그래서 인터넷 **서 찾은 커스텀 스플릿 복붙해서 씀

사용법은 (나눌 문자열,기준문자) 넘기면 기준 문자로 나눠서 배열로 리턴해줌



마지막으로 테스트도 해보자

내가 의도한건 맵 시작시 각자의 플레이 타임을 보여준다
기록 채킹용 타이머 ㅇㅇ






일단은 되긴 된다, 다른사람한텐 그사람의 시작시간이 따로 보임
근데 또 무슨 버그가 있을지 모름
테스트는 여러명에서 해야하는데 같이 할 사람이 없어서 테스트도 어려움...



일단 어째저째 각플레이어시간 나타내기를 완성하긴 했다
분명 이방법보다 좋고 간단한 방법이 있을꺼지만 
솔직히 난 일단 완성만 했으면 그만이다

클래스를 따로 작성한거라 다른맵에 클래스 넣기만 하면 바로 적용가능
내가 만든 버니맵들에 전부 적용하러 가봄
추천 : 2
댓글을 남기시려면 로그인 해주세요
댓글 : 3
  • 루아스크립트 자체가 절차지향적 프로그래밍이라 복잡한거는 어쩔수 없음.. 일단 설명은 잘하셨네요 추천 박습니다. Lv. 1238RebuiltAngel 2019.11.13
  • ㄴㄷㅆ Lv. 6모바일에서 등록첸폭523 2019.11.11
  • ㄴㄷㅆ이라 비추 ㅗ Lv. 361모바일에서 등록C418 2019.11.09