viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38477a16fb3dab004c86b6fd0548bb7fdb4d15f44496390cca9d3aeff64a4c1dbc1b18907d2c116bdaa5fadb795a2fa50881f36255c849d80


추억의 j-rpg 게임은 이렇게 케릭이 있으면

저 wait이라는 게이지가 가득 차면 턴이 오고, 

자기 턴에 공격하기, 마법쓰기, 아이템 사용하기 등의 행동을 할 수 있다.

물론 자기턴에 행동을 하면 저 부분이 다시 초기화된다.



최근에 NDC2016 중 테라 서버 섹션 강의를 듣는 도중

c++의 std::future, std::promise, std::launch::async 등 잘 쓰지 않던 문법들이 나와 흥미로웠고

이를 어떻게 활용해볼까 하다가 저 위의 j-rpg 전투를 구현해보고자 했음.




viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38477a16fb3dab004c86b6fd0548bb7fdb4d15f44496390cca9d3aeff64a4c1dbc1b18907d2c116bdaa5fadb797f9a5558a183d2b5c9e8380



유닛 클래스임.


유닛이 짤방의 전투하는 케릭터고, 생성자에서 값을 초기화할 수 있게 하고

메서드에 대해서는 이름으로 충분히 설명이 된다고 보고, 이해가 안가는 부분이 있으면 댓글로 남겨주셈.




viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38477a16fb3dab004c86b6fd0548bb7fdb4d15f44496390cca9d3aeff64a4c1dbc1b18907d2c116bdaa5fadb7c1a3fe518b1e677c5c9e8380



promise 와 future를 하나로 합친 구조체. 여기서 초기화까지 다 해주게끔 함.


promise와 future에 대해선 나도 아직 알아가는 단계라 뭐라 명확하게 설명하긴 그런데

난 thread간 통신을 시원시원하게 해주는 용도로 활용했어



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38477a16fb3dab004c86b6fd0548bb7fdb4d15f44496390cca9d3aeff64a4c1dbc1b18907d2c116bdaa5fadb7c7a4f905801a3c245c9e8380


여긴 동작에 대한 함수들이야.

calc 함수는 매번 유닛들의 스피드 만큼 wait(delay) 게이지를 채우고, 만약 꽉 차면 

"promise에 값을 넣어줌으로서 future에 그 데이터를 사용할 수 있게끔" 해줘


run 함수는 promise에서 값을 get한 future값을 내뱉는거지


음 tcp통신에서 값을 recvive하게끔 하면 여기서 wait하고

누가 send하면 wake해서 작동하는 식으로

future가 get()을 돌리면 promise가 set()하기 전까진 자고 있다고 보면 됨.



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38477a16fb3dab004c86b6fd0548bb7fdb4d15f44496390cca9d3aeff64a4c1dbc1b18907d2c116bdaa5fadb79af3ff0d89193d7e5c9e8380


이게 메인 부분이야


유닛들 정보를 설정하고

아까 promise 와 future를 초기화하고


각 calc와 run 함수를 쓰레드를 돌려.





그럼 결과값이?



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38477a16fb3dab004c86b6fd0548bb7fdb4d15f44496390cca9d3aeff64a4c1dbc1b18907d2c116bdaa5fadb795f5af55dc4d342f5c9e8380


이렇게 A B C D 정보를 보여주는건 디버그? 잘 돌아가는지 확인으로 뿌리는거고

run이 매번 제대로 누구의 turn인지 확인해줌을 알 수 있지.



출력을 바로 cout으로 안하고 stringstream쓴 이유는

두 쓰레드가 각자 도는데 cout만 쓰면 서로 출력해서 우리 눈엔 꼬여보이고,

lock_guard 으로 io를 mutex로 막아봤는데, 그렇게 하니 calc를 다 출력하고 run을 출력하더라...ㅠㅠ




암튼 promise + future 이거 재밌으니까 아직 안써본 c++ 유저들은 활용해봐여!

난 이제 이걸 다듬어 게임 하나 만들어봐야겠음!