All250 [Gomoku] Ready 패킷을 상대 호스트에 어떤 형태로 보낼 것인가? P1과 P2가 모두 ready를 하면 P1(서버)이 game start 버튼을 통해 게임을 시작할 수 있다. 이를 위해 bReadyP1, bReadyP2 라는 타입의 변수를 두고 모두 true일 경우 게임을 시작할 수 있도록 했다. 두 값의 default는 false이고 Ready 버튼을 누를 때마다 NOT 연산을 통해 현재 값을 반전시킨다. 이를 상대 플레이어에게도 알리려면 Ready 버튼을 누를 때마다 상대 호스트에게도 내 ready 값을 바꾸라는 패킷을 보내야 한다. 우선 대략적인 틀은 다음과 같다. WndProc(...) { ... // 버튼 클릭 시 { // 자신의 레디 상태 변경 bReadyP1 = !bReadyP1; // 자신의 레디 상태를 변경하라는 신호 전송 SendChangeReadyP.. 2020. 11. 1. [C++] void*에서 enum 타입으로 캐스팅 하는 법 | cast void* to enum 윈도우즈 프로그래밍 도중 void*을 인자로 받는 함수에 enum 타입을 캐스팅하여 전달하였는데, 그 함수 내에서 다시 enum 타입으로 변환하여 switch문에 활용하려 했다. if문을 사용하면 되지만 그냥 switch case를 사용하고 싶었음. 그래서 캐스팅 방법을 알아보던 도중 void*을 uintptr_t 타입으로 변환할 수 있는 것을 알게 됨. uintptr_t는 unsigned int 타입을 재정의한 것으로 이름과 달리 포인터 타입이 아님. 이 타입은 WinAPI의 UINT_PTR 타입과 동일한데, 어디서 본 것 같은 타입. WPARAM이 바로 UINT_PTR 타입. 어쨌든 다음과 같이 void*를 두 단계에 거쳐 enum 타입으로 변환할 수 있다. enum class 타입도 동일하게 가능... 2020. 10. 31. [Gomoku] 멀티 플레이어 오목 게임 개발 중... 한달 전 정도부터 Win32 API로 멀티 플레이어 오목 게임을 개발 중이다.. 우리가 보통 생각하는 장르의 2D 또는 3D 게임을 만들어 보기 전에 간단하게 오목 한 번 만들어 보려 했는데 생각보다 어렵고 오래 걸린다. C/C++, 간단한 소켓 프로그래밍 정도만 할 줄 아는 상태였는데 오목 게임 하나에 필요한 지식들이 꽤나 많다. 우선 윈도우즈 프로그램이기에 WinAPI를 어느정도 공부해야 된다. MFC는 예전에 조금 배웠었는데 그냥 raw api로 한번 익혀보는 게 학습용에선 더 나을 것 같아 WinAPI를 선택. 처음엔 간단한거 하나 구현하는 것도 어려웠는데 지금은 꽤나 익숙해졌다. OOP 형태로 구현하면 현재 학습 목적에 집중하지 못할 것 같아서 웬만한 건 API 그대로 사용했다. 그리고 Wins.. 2020. 10. 30. [GDI+] Image::FromFile 결과가 NULL이 나올 때 원래는 잘 출력 됐었는데 코드를 좀 수정하고 이미지를 출력하니까 이미지가 안나왔다. 다른 이미지는 잘 나오는데 이 이미지에 대한 FromFile 결과(Image*)가 계속 NULL이 나오는 것이다. 한 사십분 삽질하다 찾아보니 Gdiplus 관련 변수가 초기화되어 있지 않을 때 FromFile이 NULL을 반환한다고 한다. 엥? 초기화되어 있을텐데 하고 다시 보니 이 이미지 파일만 Gdiplus 관련 변수보다 일찍 초기화가 됐었다.. 결론: GdiplusStartup()로 초기화하기 전에 FromFile로 이미지 파일을 만들지 않았는지 확인해 본다. 2020. 10. 29. 논블로킹(Non-blocking) 소켓 만들기 | ioctlsocket, select Winsock을 기준으로 설명합니다. 혹시나 틀린 부분이 있을 수 있으니 맹신은 마시고 있다면 알려주세요~ 소켓 관련 함수에 타임 아웃을 지정하고 싶다면 비동기 소켓 + select 함수가 필요합니다. 해당 글을 전부 읽으시면 됩니다. 기본적으로 Winsock의 accept, connect, recv, send와 같은 대부분의 소켓 관련 함수들은 호출 스레드를 블로킹(blocking) 상태로 만듭니다. 블로킹 상태란 현재 스레드가 더 이상 코드를 진행하지 않고 block 상태로 멈춰 있는 상태를 말합니다. 블로킹 상태는 각 조건을 만족하거나 타임 아웃이 될 때까지 유지됩니다. 이해하기 어려우면 그냥 조건을 만족할 때까지 함수를 벗어나지 않고 기다린다고 생각하면 편합니다. accept 함수는 클라이언트의 .. 2020. 10. 22. 스레드가 종료되기 전에 CloseHandle()를 호출해도 된다. _beginthreadex() 함수를 이용해 스레드를 성공적으로 생성하면 핸들을 반환한다. 그리고 생성한 스레드가 종료되면 CloseHandle 함수를 통해 핸들을 닫아야 한다는 걸 알고 있었다. 아래는 MSDN의 CloseHandle 글인데 해석해 보면 스레드 핸들을 닫는 행동이 관련된 스레드를 종료하거나 스레드 객체를 종료하진 않는다고 한다. 그리고 스레드 객체를 지우려면 스레드를 종료시키고 핸들을 닫으라고 한다. Closing a thread handle does not terminate the associated thread or remove the thread object. Closing a process handle does not terminate the associated process o.. 2020. 10. 18. 이전 1 ··· 14 15 16 17 18 19 20 ··· 42 다음