묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
RegisterAccept를 여러번 호출해줘야 하는 흐름이 잘 이해가 안됩니다.
강의 39분쯤 그림판을 켜서 설명해주시는 부분에서accept 또한 iocp 흐름을 따라 낚싯대를 다시 던져줘야 한다고 설명해 주셨는데요,Listener의 accept가 왜 다시 호출되어야 하는지가 잘 이해가 안됩니다. 한번 연결된 후에 작업이 완료되고 기존의 클라이언트가 여전히 연결되었는지 재확인 하는 과정인가요?
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
기존 C++ 시리즈와 현재시리즈중 우선순위
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] 와 비교해서 현재 시리즈를 먼저 진행하고 하는것이 알맞은 순서일까요? 이전 C++ 언리얼 MMO 과정에는 어셈블리도 다루고 좀더 딥하게 다루던걸로 기억해서 여쭈어봅니다
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
2d 이동 로직 관련 질문 드립니다.
안녕하세요 강의를 들으면서 메이플스토리 모작 2d 포폴을 만들고 있습니다.상태 변화에 따른 처리 로직을 만들던 중 한 가지 질문드립니다.void Player::OnComponentBeginOverlap 땅과 충돌 했을때SetState(PlayerState::MoveGround) 로 바꿔주어서 중력 작용을 받지 않게하고 void Player::OnComponentEndOverlap 땅과 충돌이 끝났으면SetState(PlayerState::GroundFall) 로 바꿔주면서 중력 작용을 받게 하는충돌 처리 로직이 - 충돌 했을때 밀어주는 방법을 사용하여 플레이어 상태가 GroundFall <-> MoveGround 상태를 계속 왔다 갔다 하면서 동작을 하게 됩니다. 땅과 떨어졌을때 계속 중력을 받아야 하는건 맞는 상태인 것 같은데 플레이어의 상태가 계속 변화하는 문제가 생기게 됩니다.-> 땅과 떨어 졌을때는 GroundFall 상태로만 되고 땅과 붙었을때는 MoveGround 상태로만 동작이 되었으면 합니다.State 패턴 강의에서 슈퍼마리오 예제를 하시다.아름다운 방법을 찾으셨다고 말씀 하셨는데 어떠한 방법으로 해결 하셨는지 알 수 있을까요?
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
충돌 체크 방식 질문
안녕하세요 강의를 들으며 공부하면서 메이플스토리를 모작으로 포토폴리오 만들고 있습니다.강의에서는 타일맵 형식으로 충돌을 체크 하였는데 미세한 움직임을 구현하기 위해서는 타일맵 형식 보다는 충돌 레이어 (boxcollider)와 같은 충돌 방식이 더 좋은 방법이 될려나요?타일맵 형식은 셀 단위로 이동을 하다 보니 미세한 움직임은 불가능해 보여서 질문드립니다.서버와 클라이언트를 연동하는 것을 고려 했을때 타일맵과 충돌 레이어 두 가지 방식 중 어느 것이 더 좋은 방법이 될까요?
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
Player 생성자/Player Init(BeginPlay)
안녕하세요 루키스님,강의를 듣다가 궁금한 것이 생겨서 질문드립니다.강의에서는 이렇게 생성자에서 flipbook이랑 camera를 추가하는데 Init(BeginPlay)에 옮겨서 실행하면 안될지 여쭤봅니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
윈도우 API 프레임워크제작) LINK1168 오류 관련 문의 드립니다. (xxx.exe을(를) 쓰기용으로 열 수 없습니다.)
윈도우API 강의 따라해 보고 있는데 어느 순간부터 빌드할 때마다 LINK1168 오류가 납니다. 이에 여기 저기 찾아봤는데 VS에서 이전 실행 창을 제대로 종료하게 되지 않으면 exe 파일이 남아 있게 되어 다시 빌드 시 아래와 같은 오류가 나온다고 하더라구요. 그래서 cmd에서 taskkill 을 통해 남아 있던 exe 파일을 종료하고 다시 빌드 실행하면 잘 되는데, 이때 다시 주석만 달고 빌드를 하게 되면 다시 또 LINK1168 오류가 나네요.. 이거 왜 이런지 계속해서 찾아보고 강의 다시 보면서 코드 다시 쳐보면서 알게 되었는데 아래와 같이 while(true){pfPeakmessage~)이 부분이 기존에 있던 코드에서 수정 및 추가되면서부터 빌드 이후에 종료하여도 exe 파일이 잔재하여 위와 같은 오류가 발생하는 것으로 확인이 됩니다. 위 부분은 게임 관련 작업 시에 어떤 메시지 인풋이 없어도 계속해서 화면 렌더링 하는 부분이라 필수적인 것 같은데,, 위 부분을 냅두자니 계속해서 오류가 발생하고 어떻게 하면 좋을지 모르겠네요ㅠ관련하여 도움 주시면 감사 드리겠습니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
빌드 오류 질문
안녕하세요 루키스님 소켓프로그래밍 입분 20분 초반대에 빌드하셔서 실행하시면 서버와 클라이언트가 잘 실행되서 연결되지만 제 환경에서는 Debug\ServerCore.lib 파일을 열수 없다 오류가 나옵니다.ServerCore를 먼저 빌드 후 해봐도 그렇고 루키스님께서 올려주신 파일을 다운받아 순차적으로 빌드해도 동일한 증상이 나타나는데 무슨 문제인지 알 수 있을까요?
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
안녕하세요 서버 강의 질문드립니다.
안녕하세요 루키스님 항상 양질의 강의 감사합니다. 제가 현재 이 강의에서 서버 제외한 부분만 전부 수강을 했고 이제 서버부분을 들으려고 하는데[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버이 강의도 소지하고 있어서 위 강의를 먼저 수강 후 현재 강의를 듣는게 나을지 아니면 이 강의를 완독 후 Part4 강의를 듣는게 나을지 질문드립니다. PS: part5도 구매예정입니다
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
함수 포인터, 함수 객체에 대한 질문입니다!
공부하다가 생긴 궁금증입니다. 함수 객체가 함수 포인터의 모든 기능을 대체할 수 있나요?함수 포인터를 매개변수로 받아주는 라이브러리를 사용하는 것을 제외하고c++에서 함수 객체 말고 함수 포인터를 사용해야만 하는 경우가 있나요?함수 객체의 기능이 매우 뛰어난데, std::functional을 이용해서 callable 을 따로 관리하는 기능이 있는 이유는 무엇이고 이점은 무엇인가요? 가장 궁금한 것은 std::functional 을 사용하는 이유입니다!
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
SetConsoleTextAttribute 함수 특수문자 겹침 현상..
위와 같은 현상이 왜일어나는지 아시나요?같은 색으로 하면 괜찮습니다..색은 변경할때 반칸씩 밀려 겹쳐 보이네요..간단한 코딩 아래첨부합니다..#include <iostream>int main(){ int temp = 0; for (int y = 0; y < 25; y++) { for (int x = 0; x < 25; x++) { temp++; //단일색 안밀림.. //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 1); //색변경시 밀림.. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), temp % 3 == 0 ? 1 : 2); cout << "■"; } cout << endl; }} 환경은 윈도우 11입니다.
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
섹션 3. 포인터와 배열 (3주차) 배열 실습까지 진행했는데요
저는 코드를 똑같이 따라 했다고 생각했는데 오류가 납니다.파일 올려주신다고 했는데 어디서 다운 받을 수 있나요? https://youtu.be/7Tk8ocwMO7Q
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
반년넘게 C#해도 이해라는게 도저히 안갔는데
C++하니까스택이고 힙이고 참조고 이해가 됩니다진짜 왜 C#을 먼저했을까요? 감사합니다
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
Stack Frame 구조 질문 (section2 스택메모리와 스택프레임 10분~12분경)
강의에서 설명된 내용 기준으로 argument 10 및 return address가 main함수의 스택 프레임에 있는 것으로 설명되었는데, 실제 코드에서 main함수에서 Test함수를 argument 10을 주면서 호출할 시에 매개변수 10에 대한 값과 추후에 다시 main 함수로 돌아오게 될 위치에 대한 리턴 어드레스 값은 메인 스택 프레임이 아닌 그 아래에 위치할 Test함수의 스택 프레임에 있는 것이 더 정확하지 않나에 대한 질문드립니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
온라인 환경에서 Arrow, 제거와 발사 시 동기화 문제
안녕하세요 Rookis님.강의를 모두 완강하고 포트폴리오를 개선하고 있는 중입니다.강의 중에 화살을 온라인에 추가할 것이라면 Creature와 GameObject 내용을 수정해야 한다고 하셔서 코드 이사는 완료한 상태입니다.지금 Arrow는 MyPlayer에서 입력을 받고 State와 WeaponType을 체크하면 Player에서 Scene에 Arrow를 스폰해주는 방식으로 알고 있습니다.이걸 서버에서는 몬스터나 플레이어를 만드는 GameObject::Create 함수를 파줘서 Arrow를 make_shared로 만들어서 발사 처리를 하게 만들었는데요서버에서 몬스터가 제거되면 클라이언트에서도 정상적으로 몬스터가 제거되는걸 확인은 했습니다.그러나 문제가 몇 가지 있습니다.Arrow 스마트 포인터가 해제되지 않는 현상Arrow 동기화가 종종 씹히는 현상입니다. 먼저 1번입니다.make_shared로 생성된 Arrow가 해제되지 않음void Player::UpdateSkill() { if (room == nullptr) return; if (info.weapontype() == Protocol::WEAPON_TYPE_SWORD) { // 내 앞에 있는 좌표 CreatureRef creature = room->GetCreatureAt(GetFrontCellPos()); if (creature) { if (creature->GetType() == Protocol::OBJECT_TYPE_PLAYER) { SetState(IDLE); return; } // 몬스터가 플레이어에게 피격 creature->OnDamaged(shared_from_this()); } } else if (info.weapontype() == Protocol::WEAPON_TYPE_BOW) { ArrowRef arrow = CreateArrow(); arrow->SetDir(GetLookAtDir(GetFrontCellPos())); arrow->SetOwner(shared_from_this()); arrow->room = room; arrow->info.set_posx(info.posx()); arrow->info.set_posy(info.posy()); arrow->SetState(IDLE, true); room->AddObject(arrow); } SetState(IDLE); }서버쪽의 UpdateSkill 함수인데 여기에서 arrow를 CreateArrow로 만들어서 room에 AddObject로 _arrows map을 만들어 관리를 하고 있습니다. (사실 룸에서 발사체를 관리하는 것이 옳은지도 의문이긴 합니다)void GameRoom::Update() { for (auto& item : _players) { item.second->Update(); } for (auto& item : _monsters) { item.second->Update(); } for (auto& item : _arrows) { item.second->Tick(); } }그리고 Update 함수, AddObject, RemoveObject도 _arrows map을 처리하게 만들었습니다.이렇게 처리하다 보니 화살을 제거할 때 몬스터가 피격받는 순간에 해당 화살을 RemoveObject를 실행하니 삭제 이후에 for문을 돌 때 오류가 발생하며 크래시가 발생했습니다.Arrow가 _arrows 맵에서 관리되어서 스마트 포인터가 해제가 안되는 것 같은데, 화살을 어떤 때에서 제거해야 될지 모르겠습니다.지금은 임시적으로 vector에 참조로 받아와서 Update 하단에서 erase하는 방법을 사용하고 있습니다. 화살 동기화 문제 클라이언트에서는 Projectile 클래스에서 _owner에 대한 정보를 들고 있고 Arrow를 Scene에서 소환할 때 GetOwner 함수로 화살의 주인에 대한 포인터를 들고 있도록 했습니다.기존에 발사할 때도 S_Move 패킷을 그대로 이용해서 Arrow의 _owner 포인터를 이용해서 위치를 초기화해주고 있습니다.그런데 두 클라이언트를 접속시켜서 2를 눌러 WeaponType을 Bow로 바꿔서 공격 키로 테스트해보면 종종 반대쪽 플레이어의 화살이 안보이는 경우가 있습니다.여기에 몇 개의 질문이 있는데요1) 화살을 생성하고 클라이언트에서 패킷을 전송하는 것이 맞는지2) 맞다면 어떤 정보를 패킷에 담아야 하는지3) 서버에서는 어떤 처리를 해주어야 하는지잘 모르겠습니다.일단은 Make, Handle 함수를 파서 ObjectInfo를 넣어놓긴 했습니다.하루 종일 코드를 조작해봐도 해결을 못하고 있습니다.. 도와주세요..
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
disassembly 창
dissasembly 창을 띄우고 싶은데, 이처럼 설정을 해줘도 창이 띄워지지 않습니다. 이런 경우, 어떻게 해야 하는지 문의드립니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
RemoveItem 함수에서 아이템 포인터를 nullptr로 바꾸기 전에 delete를 하지 않는 이유가 있나요?
강의에 나온 예제 에서는 Clear 함수로 모든 아이템을 delete하는데 이때 RemoveItem 함수에서 이미 nullptr로 지정된 아이템은 따로 delete 연산을 하지 않아서 Clear 이후에 배열의 포인터는 nullptr인데 힙 메모리에는 데이터가 남는 게 아닌가 싶어서 질문 드립니다.실제로 RemoveItem을 실행하는 아니템들을 따로 배열에 모아 Clear 함수 이후에 데이터를 확인해 보니 아이템들이 존제하는 것을 확인 했습니다.bool Inventory::RemoveItem(Item* _item){ if (_item == nullptr) return false; int slot = FindItemSlot(_item); if (slot < 0) return false; //delete mItem[slot]; // 제거되는 아이템 모음 mRemove[mRemoveIndex] = mItem[slot]; mRemoveIndex++; mItem[slot] = nullptr; mItemCount--; return true;}위에 mRemove에 아이템을 모아 Clear 이후에 중단점을 걸어 데이터를 확인해 보니 아이템의 데이터가 남아있는 것을 확인했습니다.혹시 의도적의로 delete연산을 하지 않은 것 인지 궁금하여 질문 드립니다.
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
프레임 제한 코드의 원리가 궁금합니다.
윈도우api 메인 루프 부분에서 프레임 제한을 위해 적은 코드의 원리를 모르겠습니다. uint64 prevTick = 0; uint64 now = ::GetTickCount64();if(now - prevTick >= 10) // 요부분!{ // TODO prevTick = now;} sumTick 을 만들어서 특정 시간이 되면 if 문으로 들어가는 것도 아니고 현재틱-이전틱 이 일정값 이상으로 조건을 걸어주는게 어떻게 프레임을 제한하는지 궁금합니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
해당 강의 수강 후 질문
안녕하세요 루키스님!해당 강의를 완강한 후에 대해, 궁금한 게 있어 질문드립니다.올인원 C++의 내용으로도 MMO Part3 자료구조 알고리즘과 다이렉트x11 강의를 수강하여도 문제가 없을까요?
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
포인터 이동 질문
포인터에 대한 강의를 듣고 포인터에 대한 공부를 하던 도중 이해가 되지 않는 부분이 있어 질문드립니다.Shape** shapes;shpaes = new Shape* [100];shapes[0] = new Circle(); //shapes[1] = new Triangle();shapes[2] = new Triangle();...// shapes[1]을 지우고 포인터 shapes[2]번을 shapes[1]번으로 옮길때저는 현재 힙 영역의 메모리 구조를 이렇게 생각하였고포인터는 어쩌피 주소를 닮는 공간이니delete shapes[1];로 도형을 지우고 shapes[1] = shapes[2]로 하고 shapes[2] = nullptr로 하여이런식으로 진행하면 문제가 없다고 생각했습니다.그런데 프로그램을 종료할때 delete[] shapes를 진행하는 부분에서 Heap Corruption Detected( 메모리에 대한 잘못된 접근이나 이미 해제한 메모리에 대한 접근 ) 오류가 나오게 됩니다.그래서 생각되는 문제가 shapes[1] = shapes[2]로 바로 옮기면 되는 것이 아니라 옮기기 전에 shapes[1]에도 shapes[2] 만큼의 크기를 만들어 주고 shapes[1] = shapes[2]로 옮겨야 되는 것인가 라고 생각하여 코드를shapes[1] = new Circle(); // shapes[2]에 저장된 도형을 만들고*shapes[1] = *shapes[2] // 값을 복사하고delete shapes[2]; // shapes[2]를 지우고shapes[2] = nullptr; // nullptr로 가리키고 있는 곳을 풀어준다.이렇게 코드를 수정하니 delete[] shapes; Heap Corruption Detected에 대한 메모리 오류가 사라졌습니다.여기서 드는 궁금한 점이 포인터는 주소를 담는 바구니(8바이트)인데 왜 shapes[1] = shapes[2]로 가르키는 곳만 바꾸는 것으로 Heap Corruption Detected의 오류가 나며 동작이 안되는지 궁금합니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
Vector::operator+= 값을 반환해야 합니다 라는 오류가 뜨네요
43:40초에 컴파일 하는 곳에서 Vector::operator+=값을 반환해야 합니다 라는 오류가 발생하네요 Types.h에 다시 봐도정상적으로 기입해놨는데 왜 이러는지 모르겠네요..