요청을 처리하는 수신측과 송신측의 결합도를 줄여주는 패턴요정을 보내는 송신특은 자신이 알고있는 객체에게 요청을 보낸다. 수신측은 자신이 그 요청을 처리할 수 있으면 서비스를 제공하고, 아니라면 자신이 알고있는 다음 객체에게 요청을 전달한다.이런 연쇄를 구현하기 위해 수신 객체들은 하나의 부모 클래스를 두어 인터페이스를 통일시켜야 한다. * 구조를 그리고 싶다. 결과객체간의 행동 결합도를 줄인다.송신측과 수신측이 서로를 몰라도 메세지 전달이 가능하다.수신측은 자신과 연결된 하나의 객체만 알고 있으면 된다.객체에 책임을 할당하는데 유연성을 높인다. 런타임 중에 연결고리를 변경하거나 추가하여 확장시킬 수 있다.메세지의 처리가 보장되지 않는다.연결고리가 잘 정의되어 있지 않다면 메세지가 전달만 되다가 버려질 수..
3 match 게임에는 변수가 하나 있는데, 바로 다음에 나올 jewel의 종류가 불규칙적이고 새로 생성되는 jewel로 인해 어떤 연쇄작용이 일어날지 예상할 수 없다는 것이다.* 애니팡의 경우에는 적절한 계산을 통해 진행 불가능한 board가 나오지 않게 새로운 동물이 생성된다고 한다. 그래도 새로운 동물로 인한 연쇄작용은 예측하기 힘들다. 새로 생성되는 jewel이 일으키는 연쇄작용은 생성되는 jewel과 기존 jewel이 match를 이루는 경우이다.새로운 jewel이 바닥( 자신 index번호에 맞는 위치 )에 도달할 때 마다 그 jewel을 기준으로 match3검출을 수행하는 것은 별로 좋지 않은 방법인 것 같다. 4x2 범위에 있는 jewel이 모두 새로 생성되어 아래와 같은 board가 되었..
3 match 게임의 가장 핵심인 match알고리즘을 구현해보자. 이 글에서 구현하려고 하는 Match3 알고리즘은 Swap한 2개의 jewel을 대상으로 이루어지는 검사이며, 주의해야할 점은 다음과 같다.* match가 되어 jewel이 사라지더라도 실제로 화면에 사라지는 모션이 보여지기 전에는 죽는( 어휘력이 떨어져서 죽는다는 표현밖에 생각 못하겠다. )jewel 위에 있는 jewel이 아래로 떨어지지 않는다. ( 즉, 데이터의 변경이 모션이 끝난 후에 일어난다. )* 3개가 맞으면 재자리에서 죽는 모션이 보여지지만, Bejeweled를 기준으로 4개 이상 match가 되었을 때는 Swap했던 mainJewel을 기준으로 나머지 jewel들이 모이고 mainJewel은 승격된다.( 승격된 jewel은..
비주얼드, 애니팡 등으로 알려진 3 match 퍼즐게임을 만들기 위한 알고리즘을 만들어보자. 3 match 게임의 유일한 입력인 Swap을 먼저 구현보자. Swap은 터치 또는 마우스 입력을 받고 드래그를 감지하여 터치한 jewel과 드래그 한 방향의 jewel과 swap 되면서 이루어진다. Swap을 구현해야할 때 주의해야 할 특징은 다음과 같다.*입력을 한 즉시가 아닌 Swap Action( jewel이 실제로 화면에서 움직이는 행위 )이 이루어 지고 난 후 다음 동작( match 또는 rollback )이 이루어져야한다. *아래 코드들은 윈도우 애플리케이션 기준으로 작성한 코드이며, cocos2d-X엔진을 모티브로 작성한 엔진을 사용하여 실제 cocos2d-X 코드와 비슷하지만 내부적인 동작도 같은..
개요assert는 버그의 발생을 빠르고 쉽게 파악하기 위해 사용하는 매크로다. 이름에서 알 수 있듯 어떤 것을 단언하고 디버깅 중 참 거짓 검사를 통해 단언한 조건문이 거짓이 되면 에러 메세지를 띄우며 프로그램을 종료한다.assert 매크로는 릴리즈모드에서는 컴파일이 되지 않기 때문에 많이 써도 성능에 크게 영향을 주지 않는다. 현명하게 사용하면 버그없는(굉장히 적은) 프로그램을 만들 수 있겠다. 사용 방법assert를 사용하려면 다음 헤더를 추가해 주어야 한다. C : C++ : assert를 사용할 때 주의해야 할 점은 단언할 조건을 작성해야 한다는 것이다. 일반적인 논리에 따르면 참 일때 동작하는 코드들이 많지만 assert는 거짓일 때 동작하기 때문에 일어나면 안되는 조건이 아니라 꼭 일어나야 하..
개요C 또는 C++언어에서 함수의 매개변수를 가변적으로 전달하고자 하는 경우가 있다.그 경우의 수가 많지 않거나 가변적이지 않을 때는 함수 오버로딩으로 작성하여 해결할 수 있다. 함수의 매개변수로 int변수를 2~4개 받아야할 경우 void PrintInt(int a, int b); void PrintInt(int a, int b, int c); void PrintInt(int a, int b, int c, int d); 하지만 printf 또는 scanf 같은 함수처럼 몇개의 매개변수를 넘길지 그 경우가 가변적일 경우 가변인자를 사용한다. 가변인자가변인자는 ...으로 받을 수 있으며, ...에 전달된 매개변수들은 va_list로 저장되어 있고, va_list포인터로 접근할 수 있다. 함수로 전달되는 매..
namespace를 대충 알긴 하지만 한번도 제대로 써본 적이 없었다.실제 프로젝트에서도 사용할 수 있도록 namespace에 대해 더 알아보자. namespace 분할 컴파일namespace를 헤더에 정의해두고 전체 프로젝트에서 접근할 수 있도록 하려고 하니 header를 여러군데에서 include 했을 때 중복 정의되어 링크에러가 발생했다. 클래스가 선언과 정의를 분리하는 것처럼 namespace도 분리하여 구성하고 변수를 extern으로 설정하여 전역변수화 시키는 것으로 해결했다. // name2.hnamespace Name2{extern int a;void func();} // name2.cpp#include "name2.h" int Name2::a = 0; void Name2::func(){//..
게임 개발을 하다 보면 총알이나 파티클 등을 구현하기 위해 list 구조를 사용할 때가 있는데총알이나 파티클은 개수가 동적이기 때문에 메모리를 동적할당하여 구현한다. bullet을 구현한다고 할 때 아래처럼 구현할 수 있다. std::list _bullets; // 총알이 발사될 때 마다Bullet* bullet = new Bullet();_bullets.push_back(bullet); 나중에 필요에 의해 bullet을 삭제해야 한다면 그냥 erase()를 사용해서 삭제하면 메모리 누수가 일어난다.erase()는 동적할당한 메모리를 지우는 것이 아니라 해당 노드를 지우는 것이기 때문에 노드가 가리키는 메모리를 해제시키지 않는다. 따라서 아래처럼 삭제해야 한다. // 특정 노드를 삭제해야 한다면void ..
- Total
- Today
- Yesterday
- rxswift
- machine learing
- JSP
- Cocos2d-x
- SHADER
- 데이터베이스
- ios
- scala
- C++
- SwiftUI
- 알고리즘
- SOCKET
- 국내여행
- Java
- game
- Spring
- swift
- 드라마
- database
- OS
- Git
- 수학
- 자료구조
- mongoDB
- DesignPattern
- C
- winsock
- ue4
- 운영체제
- C/C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |