개발 지식 21

상태 패턴

사용자 입력에 따라 상태를 변환할 때 사용하는 패턴이다. FSM 이라는 유한상태기계를 구현하는 방법이다. 걷기, 점프, 달리기 등 여러 상태가 존재하는데 이를 분기문으로 처리하려면 bool변수도 그렇고 너무 복잡해진다.이를 상태에 따라 깔끔하게 구현가능하게 해주는 것이 상태패턴이다. 우선 열거형으로 상태를 정의할 수 있다. 그리고 이를 switch문으로 분기해서 코드를 모아둘 수 있다. 이정도로도 충분할 수 있지만 '게임 프로그램이 패턴' 책에서는 각 상태를 클래스로 만들었다. 상태 인터페이스를 만들고 각 상태는 이를 상속한다.interface heroState{ virtual void update() virtual void handleinput() static walkState; ..

싱글턴 패턴

싱글턴패턴은 가장 익숙한 패턴이 아닐까 싶다. 처음 게임구조를 익히면서 가장 먼저 접하게 되는 것 같다.특히 매니저라는 이름의 클래스를 만들 때 항상 봤던 것 같고, 나도 항상 사용해왔다. 싱글턴은 무엇인가?단 하나의 인스턴스만 있게하고 싶고, 동시에 전역적인 접근이 필요할 때 싱글턴 패턴을 사용한다. 이는 static instance 와 생성자를 private으로 둠으로써 해결한다. 이런 특징으로 manager로서 많이 사용이 된다. 하지만 '게임프로그래밍 패턴'의 저자인 로버트 나이스트롬은 자신은 싱글톤을 사용한 적이 없다며지양해야 한다고 말했다. 이유인 즉, 회사에서는 여러사람이 관리하며 최대한 커플링되지 않아야 한다. 그러나 전역적인 접근은아무것도 모르는 신입이 잘 짜여진 구조를 유지하려는 생..

관찰자 패턴

옵저버패턴이라고도 불리는 이 패턴은 아주 흔하게 사용된다.C#에서는 event 로 이미 사용하고 있던 패턴이다. 이는 상관없는 코드 덩어리들의 결합도를 낮추기 위함인데, event에 함수를 등록해 놓으면 특정상황 발생 시, 알아서 함수를 실행 시켜준다. event DeathEvent;void playerDeath(){ DeathEvent.Invoke();}class uimanager{ public uimanager() { DeathEvent += UpdateUI; } UpdateUI(){}}이렇게 += 로 등록할 수 있다. 그러면 플레이어가 죽어서 playerDeath 함수가 실행되면 DeathEvent에 함수를 등록한모든 클래스에서 해당 함수가 실행된다. 이 때, 등록한..

경량 패턴

경량패턴은 메모리 최적화를 위한 패턴이다. 많은 객체를 생성해야할 때, 에를 들어, 나무 오브젝트를 생성할 때, texture와 model은 동일하지만 위치와 색 등을 바꿔 숲을 만들 수 있다. 이 때, 100개의 나무라면 텍스처와 모델도 100개가 생성되는데, 동일한 이 백개를 공유데이터 1개로 대체하여 메모리를 최적화하는 것이다. 이 때, texture, model 같은 공유되는 데이터를 내부상태라 하고, 위치, 값 등 달라지는 변수를 외부상태라 한다. 내부 상태는 모든 나무 객체가 참조하게끔 하고 외부상태만 설정하게끔 하면 된다. 타일도 마찬가지로 고유한 타일의 값, 텍스처, 이 타일위에서의 캐릭터 이동속도 등은 변하지않는다. 그렇지만 위치는 매번 다르다. 따라서 각 타일마다 객체를 하나씩 ..

명령 패턴

작업의 요청자와 수행자를 분리시켜주는 디자인 패턴이다. 때문에 결합도를 낮추고 큐나 스택을 이용해 명령 취소, 되돌리기 등의 기능도 쉽게 구현할 수 있다. 상위 클래스인 Command라는 것을 만들고 멤버함수로 execute 라는 가상함수를 만든다. 그리고 그 하위클래스에서 이를 오버라이딩해서 다른 곳에서 execute를 실행한다. 따라서 요청자는 이 작업에 대해서 실행해줘라고만 하고, 수행자인 Command의 하위클래스는 로직을 실행하게 된다 . 이는 게임개발에서 사용자입력, ai 행동, undo, redo 등 사용된다. public interface ICommand{ void Execute();}public class MoveCommand : ICommand{ private Charac..

테스트에 관한 짧은 글

테스트와 관련해서 chatgpt 와 나눈 대화를 정리한 글이다.  먼저 단위테스트와 통합테스트가 있다. a기능을 개발해야하는 상황에서 a기능은 1번 데이터 정렬, 2번 정렬된 데이터로 하는 무언가 라고 정의하자. 이때, 1번을 구현해서 먼저 테스트해보는 것을 단위테스트라고 한다. 또 1,2번을 모두 구현하고 한번에 실행했을 때 하는 테스트를 통합테스트라고 한다.  // 1번 작업: 데이터 정렬std::vector sortData(const std::vector& data) { std::vector sortedData = data; std::sort(sortedData.begin(), sortedData.end()); return sortedData;}// 2번 작업: 정렬된 데이터를 가지..

개발 지식 2024.08.07

게임에서의 내적

알고리즘 문제 중 내적관련한 문제를 풀고 내적이 어떻게 게임개발에서 사용될까 궁금해져서 찾아보았다.  보통 각도를 구할 때 사용된다. 1. 두 벡터간의 방향 내적은 두 벡터가 서로 같은 방향을 향하는지, 반대 방향을 향하는지, 아니면 직교하는지를 확인하는 데 사용됩니다.두 벡터의 내적이 양수일 경우, 두 벡터는 대체로 같은 방향을 향합니다.두 벡터의 내적이 음수일 경우, 두 벡터는 반대 방향을 향합니다.두 벡터의 내적이 0일 경우, 두 벡터는 직교합니다.2. 두 벡터간의 각도 계산 내적은 두 벡터 사이의 각도를 계산하는 데 사용됩니다. 벡터 A와 벡터 B의 내적이 다음과 같이 정의됩니다:​3. 최적화 벡터의 길이를 비교할 때, 길이를 직접비교하는 것보다 내적하는 것이 더 빠르다. 4. 게임에서 시야 각도..

개발 지식 2024.07.29

정규표현식과 예제문제

정규표현식 정규 표현식(regular expression, regex)은 특정한 규칙을 가진 문자열의 패턴을 표현하는 방법입니다. 정규 표현식은 문자열 검색, 일치, 치환 등을 수행하는 데 사용됩니다. 프로그래밍 언어와 텍스트 편집기에서 자주 사용되며, 데이터 검증, 텍스트 파싱, 데이터 변환 등의 작업에 유용합니다.기본 개념리터럴 문자: 문자 그대로 일치하는 문자열을 찾습니다.예: abc는 "abc" 문자열과 일치합니다.메타 문자: 특별한 의미를 가진 문자들로, 패턴 매칭을 제어합니다..: 임의의 한 문자와 일치 (줄 바꿈 문자는 제외)^: 문자열의 시작과 일치$: 문자열의 끝과 일치*: 0회 이상 반복+: 1회 이상 반복?: 0회 또는 1회 일치|: OR 연산자 (선택)문자 클래스: 대괄호 [] 안에..

개발 지식 2024.07.23

Git 협업을 위한 Branch 정리

git 을 사용해 팀 프로젝트를 진행하는데 main 브랜치로 바로 작업 후 커밋 푸시를 하게 되면 내가 실수했을 때 모든 팀원에게 영향이 간다. 그래서 branch라는 것을 발견했고 알아보았다. 나뭇가지라는 의미로 워크트리에서 잔가지를 친다고 생각하면 된다. 현재 커밋지점에서 분기를 만들어서 내가 따로 기능을 수정하거나 추가, 삭제를 진행한다. 그리고 모두가 공유하고 있는 main 브랜치에 병합할 수 있다. 따라서 중간 중간 저장하고 싶을 때 마음대로 커밋을 해도 다른 팀원에게 영향가지 않는다. https://git-school.github.io/visualizing-git/ Visualizing Git git-school.github.io 이 사이트에서 연습해볼 수 있다. 사용법 git branch t..

개발 지식 2024.02.27

비트 연산

비트연산 : 비트단위의 조작이 필요할 때 사용된다. 대표적으로 BitFlag가 있다. 비트연산의 종류 ~ (bitwise not ) : 모든 종류의 비트를 뒤집음 & (bitwise and) : 모든 비트 쌍을 대상으로 and 연산을 실행 | (bitwise or) : 모든 비트 쌍을 대상으로 or 연산을 실행 ^ (bitwise xor) : 모든 비트 쌍을 대상으로 xor 연산을 실행 -> xor 연산은 두 번 실행하면 원래의 숫자로 돌아오게 되어 암호학에서 쓰인다. 비트 우측 이동 : N만큼 우측으로 이동, 오른쪽에 넘치는 건 버린다. 이 연산은 부호비트가 있으면 부호비트는 따르고 나머지 새로운 비트를 0으로 만들고 unsigned 같은 타입의 부호비트가 없는 숫자면 맨 처음 비트도 0으로 만든다. ..

개발 지식 2023.07.28