추억의 j-rpg 게임은 이렇게 케릭이 있으면
저 wait이라는 게이지가 가득 차면 턴이 오고,
자기 턴에 공격하기, 마법쓰기, 아이템 사용하기 등의 행동을 할 수 있다.
물론 자기턴에 행동을 하면 저 부분이 다시 초기화된다.
최근에 NDC2016 중 테라 서버 섹션 강의를 듣는 도중
c++의 std::future, std::promise, std::launch::async 등 잘 쓰지 않던 문법들이 나와 흥미로웠고
이를 어떻게 활용해볼까 하다가 저 위의 j-rpg 전투를 구현해보고자 했음.
유닛 클래스임.
유닛이 짤방의 전투하는 케릭터고, 생성자에서 값을 초기화할 수 있게 하고
메서드에 대해서는 이름으로 충분히 설명이 된다고 보고, 이해가 안가는 부분이 있으면 댓글로 남겨주셈.
promise 와 future를 하나로 합친 구조체. 여기서 초기화까지 다 해주게끔 함.
promise와 future에 대해선 나도 아직 알아가는 단계라 뭐라 명확하게 설명하긴 그런데
난 thread간 통신을 시원시원하게 해주는 용도로 활용했어
여긴 동작에 대한 함수들이야.
calc 함수는 매번 유닛들의 스피드 만큼 wait(delay) 게이지를 채우고, 만약 꽉 차면
"promise에 값을 넣어줌으로서 future에 그 데이터를 사용할 수 있게끔" 해줘
run 함수는 promise에서 값을 get한 future값을 내뱉는거지
음 tcp통신에서 값을 recvive하게끔 하면 여기서 wait하고
누가 send하면 wake해서 작동하는 식으로
future가 get()을 돌리면 promise가 set()하기 전까진 자고 있다고 보면 됨.
이게 메인 부분이야
유닛들 정보를 설정하고
아까 promise 와 future를 초기화하고
각 calc와 run 함수를 쓰레드를 돌려.
그럼 결과값이?
이렇게 A B C D 정보를 보여주는건 디버그? 잘 돌아가는지 확인으로 뿌리는거고
run이 매번 제대로 누구의 turn인지 확인해줌을 알 수 있지.
출력을 바로 cout으로 안하고 stringstream쓴 이유는
두 쓰레드가 각자 도는데 cout만 쓰면 서로 출력해서 우리 눈엔 꼬여보이고,
lock_guard 으로 io를 mutex로 막아봤는데, 그렇게 하니 calc를 다 출력하고 run을 출력하더라...ㅠㅠ
암튼 promise + future 이거 재밌으니까 아직 안써본 c++ 유저들은 활용해봐여!
난 이제 이걸 다듬어 게임 하나 만들어봐야겠음!
헐 개년글행
개념인;
좋은 글이나 조금 살짝 거슬려서 조언 드리면(무시하셔도 됩니다) 불필요한 주석 줄이시는게 좋으실거 같네요 유닛의 speed면 아는걸 주석 다시는건 만약 그런 부분이 헤깔릴수있어서 주석 다시는거라면 네이밍이나 설게를 잘못했다고 봐야겠죠
그런데 그런 수준이 아닌 습괁적 주석 같은데 의미없죠
존나 오래전글인데 댓글달렸다고 알람떠서 와봄ㅋㅋ 코드만 잔뜩 써놓으면 뭐라 할까봐 없던 주석 달아놓고 스샷찍은건뎅;