Project/Win32API로 던그리드 모작

    코드 리팩토링

    들여쓰기, 간격 한 줄짜리 if문과 for문에도 중괄호 들여쓰기를 적용한다. 괄호 내부에 공백을 삽입한다. 함수의 매개변수 목록, 함수 호출 시 인자 목록 내부에 공백을 삽입한다. 조건문의 조건식에 공백을 삽입한다. 괄호로 묶인 식의 내부에 공백을 삽입한다. 대괄호 내부에 공백을 삽입한다. 이항 연산자의 앞뒤에 공백을 삽입한다. 람다의 대괄호 내부에 공백을 삽입한다. 키워드 추가 // keyword.h #ifndef _keyword #define _keyword #define PURE // 대입 연산을 하지 않으며, 결과값이 외부 상태와 무관한 순수 함수 #define NOASSIGNMENT // 대입 연산을 하지 않는 함수 #define HELPER // 사용자 코드에서의 직접 호출되지 않고 다른 클래..

    csv 문서 파싱

    csv 파일 csv(comma-separated values) 파일은 쉼표로 구분되는 문자열을 나열한 파일 형식이다. 엑셀과 메모장에서 csv파일을 쉽게 보고 편집할 수 있다. 데이터베이스를 csv 파일로 구축하면 각 필드를 쉼표로 구분하여 튜플들을 저장할 수 있다. 작성 규칙 각 필드는 띄어쓰기 없이 , 로 구분한다. 각 튜플은 개행문자 \n, \r 로 구분한다. 문자열 필드일 경우 " " 로 감싼다. 문자열 내에서 " 를 사용할 때에는 "" 와 같이 두 번씩 쓴다. 문자열 내에서의 ,(쉼표), \n, \r 는 구분자가 아닌 문자열 내의 문자로 취급한다. 집합 필드일 경우 { } 로 감싸고, , 대신 공백(띄어쓰기, 탭, 개행문자)으로 구분한다. 예시 "월요일","화요일","수요일","목요일" 200,..

    게임 프레임 관리

    게임의 동작 게임은 일정 시간 간격마다 사용자 입력을 처리하고 객체들을 업데이트한 뒤 객체들을 렌더링한다. 따라서 게임에서 타이머의 역할은 매우 중요하다. 게임의 거의 모든 기반이 타이머를 통해 돌아간다. 초당 프레임 수(FPS) 프레임은 이미지이다. 서로 다른 이미지들을 연속해서 보여주는 것을 애니메이션이라 한다. 애니메이션에 쓰이는 이미지 한 장 한 장을 프레임이라 부른다. 플레이어는 애니메이션을 보고 움직임을 인지할 수 있다. 인간이 감각적으로 '생생한 움직임'을 느끼기 위해선 프레임 전환 속도가 빨라야 한다. 따라서 1초 동안 처리되는 프레임 수 FPS는 적절히 높아야 한다. "적절히 높아야" 한다는 게 포인트다. 게임은 이와 같은 방법으로 프레임을 처리한다. 프레임을 교체( 업데이트 ) 후 출력..

    빌더 패턴 - 직사각형 만들기

    배경 의 RECT는 단순히 초기화 리스트에 left, top, right, bottom 순으로 LONG 인수를 주면 초기화가 가능하다. 하지만 게임에서 직사각형을 생성할 때 대부분 리터럴로 생성하기보단 여러 변수가 조합된 상대적 위치로 생성하는 경우가 많다. 이럴 때 사각형의 잘못된 생성으로 오류가 나면, 코드의 가독성이 떨어져 어디가 잘못되었는지 알아보기 힘들다. RECT inventory_rect = { client.right - INVEN_RIGHT_SPACE - inventory_width, client.right - INVEN_RIGHT_SPACE, client.top + INVEN_TOP_SPACE, client.top + INVEN_TOP_SPACE + inventory_height }; 위..

    * passkey 패턴 : public 멤버 함수의 접근 권한 관리로 public 함수를 non-public 하게

    배경 싱글톤 패턴을 구현할 때 부모 클래스의 protected 멤버로 정의된 클래스를 자식 클래스의 특정한 멤버 함수가 매개변수로 받으면, 그 멤버 함수는 public이긴 하지만 그 부모 클래스에서만 이용 가능한, reverse-protected인 양 동작하는 멤버 함수가 된다는 사실을 이용했다 이를 조금 더 일반화하여, public인 멤버 함수를 특정 지역에서만 사용 가능하도록 하는 디자인 패턴이 혹시 이미 존재하지 않을까 했다 그 결과 다음 두 글을 발견할 수 있었다 https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Friendship_and_the_Attorney-Client More C++ Idioms/Friendship and the Attorney-Cli..

    c++식 랜덤값 얻기의 개선안

    std::default_random_engine을 선언해놓고 std::uniform_int_distribution 객체를 생성해 operator()의 인자로 주는 기존 c++스타일 랜덤은 몇 가지 한계가 있다 가장 중요한 이유로, std::default_random_engine은 용량이 커 전역 객체인 편이 나은데, 이 전역 객체는 코드를 유지보수하기 어렵게 만든다. 전역 객체는 어디에서나 접근 가능하기 때문에 오류나 수정 사항이 발생하면 모든 코드를 검토해야 하기 때문이다 심지어는, 여러 개의 헤더 파일로 이루어진 코드에서 extern 키워드를 통해 전역 객체에 접근하는 경우, 링크 순서가 꼬이면 도무지 이해 할 수 없는 디버그 메시지를 내뱉는 링크 에러의 지옥에 빠지게 된다 사용자가 객체의 이름을 마..