일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Tips프로그래밍강좌
- Direct2D
- c#
- Programming
- Visual Studio
- c
- c++
- 프로그래밍
- 김성엽
- 문법
- 이지스퍼블리싱
- 지식나눔강좌
- 연산자
- 백준
- Tips강좌
- CS
- Kotlin
- 알고리즘
- Desktop
- doit코틀린프로그래밍
- 티스토리
- Javascript
- VS ERROR
- Win32
- Windows
- 포인터
- 리뷰
- 배열
- tipssoft
- 함수
- Yesterday
- Today
- Total
목록DEV/Direct2D (31)
F.R.I.D.A.Y.
실제 기능 구현 윈도우 생성 이전 두 개의 포스트를 통해 그리기 작업과, 맵데이터 관리/처리는 해결했다. 이제, 그래픽 작업과 맵데이터를 작동시키기 위한 메인 윈도우를 구성하자. 멤버 윈도우에서 관리할 멤버들은 다음과 같다. DrawTool* TextTool* IMap* D2D1_POINT_2F MovePoint size_t window_padding, window_gap 여기에서 MovePoint는 메서드 처리 후, 그리기 처리를 할 때 필요다. 그리고 window_padding과 window_gap은 각 블럭 사이 간격과 window border와 블럭간의 거리를 상수로 처리한 것이다. 메서드 이벤트 처리를 위한 메서드는 총 6개로, 다음과 같다. OnLButtonDown OnRButtonDown O..
지뢰찾기의 각종 정보를 저장하고 관리하는 맵데이터 맵 데이터 지뢰찾기를 구성하려면 블럭이 열린 상태인지, 선택된 상태인지, 열리지 않은 상태인지를 저장하는 공간과 함께 해당 요소가 지뢰로 동작하도록 처리가 되었는지 저장하는 상태 정보 저장용 블럭이 필요하다. Block 지뢰 찾기를 구성할 때 각 셀의 정보를 저장하기 위해 구현한 클래스이다. Block 클래스에서 관리해야할 항목은 총 세가지이다. 블럭의 지뢰 활성화 여부 블럭의 공개 상태 블럭 주변의 지뢰 수 마지막 항목인 주변 지뢰 수의 경우에는 굳이 관리를 하지 않아도 상관은 없지만, 일단 한번에 처리를 해야 나중에 연산을 줄일 수 있기 때문에 처리를 했다. 포함 멤버 위에서 설명한 데이터를 관리하기 위해 총 세 개의 멤버로 구성되어 있다. BLOCK..
지뢰찾기 그래픽 처리를 위한 구성 그리기 작업 GUI 프로그래밍을 위해서 그리기 툴을 구성해봤다. 그리고, 해당 그리기 툴을 다른 곳에서도 이어서 사용할 수 있도록 그리기 정보를 담고 있는 객체를 생성 및 이들을 관리하는 클래스를 구성해봤다. 그리기 툴 DrawTool 그래픽 엔진은 Direct2D를 이용했고, 이를 다른 프로그램에서 쉽게 이용할 수 있도록 정형화했다. 먼저 구성할 메서드는 다음과 같다. OnPaint(DrawSet*) OnSize 위 두 메서드는 그리기 작업에 영향을 주는 WM_PAINT와 WM_SIZE 메시지가 들어왔을 때 해당 프로시저에서 각각 연결해주면 된다. OnPaint에 인자로 넘기는 은 하단에 설명을 잇는다. 생성자 ID2D1HwndRenderTarget을 생성할 때는 기본..
지뢰찾기 지뢰찾기는 정말 고전 게임이다. 동시에 게임의 기본을 배움에 있어 도움이 될 것 같기도 하다. 구현 또한 그리 어렵다고 느끼지 않기 때문이다.[# 적어도 내가 느끼기엔 그랬다.] 지뢰찾기 룰은 게임상 존재하는 모든 지뢰를 찾아낸다는 점을 제외하고는 잘 몰랐다. 때문에 지뢰찾기를 구현하기에 앞서 게임의 룰을 생각했다. 지뢰찾기 룰 생각한 지뢰찾기는 아래와 같았다. 게임 클리어 조건은 애매모호한 점이 많아서 구글에서 인스턴스 게임으로 제공하는 지뢰찾기 룰을 이용했다.[# 게임은 그렇게 못해서, 클리어 조건을 체크하는데 시간이 좀 걸렸다.] 주변 팔방[# 상하좌우 네 방향 및 그 대각선 네 방향]에 지뢰가 존재할 경우 그 수를 세고, 열었을 때 보여준다. 주변 팔방에 지뢰가 존재하지 않는경우, 주변 ..
물리엔진 - 벽 충돌 part1. 바닥 구현 이전 시간의 중력 구현에 이어 이번에는 지나갈 수 없는 벽을 구현해봅니다. 벽 물리엔진을 구성하다보니 주로 게임에 빗대는 경우가 많은데, 벽이라 함은 물체가 뚫고 지나갈 수 없는 것을 pang2h.tistory.com 위 시리즈와 연계해 작성합니다. 프로젝트 코드는 다음에서 이어집니다. 좌우 벽 충돌 플래시 게임 등에서 바닥을 형성한 것 외에 추가로 구현한 것이 있습니다. 좌우로 벽을 만났을 때 캐릭터가 이동하지 못하도록 하는 것입니다. 이것 또한 Calculate 메서드에서 처리하면 구현할 수 있습니다. 과 방향만 다르지 동일한 내용이기 때문에 해당 코드를 참고해 역으로 계산하면 수비게 코드를 작성할 수 있습니다. 또한, 좌우 이동은 서로 상반된 명령이기 때..
바로 전 시리즈에선 바닥 구현을 했습니다. 좌우로만 이동하면 이제 제대로 된 캐릭터 이동이 가능해지겠네요. 프로젝트 업데이트 이번 포스트부터는 기존 제공한 프로젝트와 해당 프로젝트로 구성한 중력구현 등을 포함한 버전의 새로운 프로젝트를 사용합니다. 프로그램 사용이 보다 접근성이 높아야 흥미를 느낄 수도 있을것 같아 몇가지 기능을 추가했으니 참고해주세요. 본 파일에 추가된 기능/소스코드는 다음과 같습니다. 마우스 좌측버튼 및 마우스 끌기로 블럭 형성이 가능합니다.[# 이렇게 만들어진 블럭에 대해서도 중력 구현 및 충돌의 영향을 받도록 구성해 캐릭터가 그 위에 놓였을 때 더이상 내려가지 않습니다] 마우스 우측버튼으로 형성된 블럭을 삭제할 수 있습니다.[# 프로그램 생성부터 나온 하단의 메인 블럭은 지우지 않..
이전 시간에는 캐릭터가 바닥을 만났을 때, 더이상 아래로 내려가지 않도록 했습니다. 이번에는 점프를 구현해보겠습니다. 점프 구현 단순히 만들면 그냥 키 입력을 받았을 때 이동속도로 음수(-)값을 주면 됩니다. 근데, 이러면 다시 점프가 가능해지죠. 그래서 우리는 키 상태를 저장하고 실 계산은 Calculate 메서드에서 처리하도록 구성할겁니다. 키 상태를 저장하는 방법은 아래 포스트를 참고하세요. Win32 - 키보드 입력으로 사각형 움직이기 키보드 입력으로 사각형을 움직여봅니다. # Win32 프로그래밍을 이해하고 있어야합니다. # 알지 못하는 경우 여기에서부터 시작할 것을 권장합니다. # 본 문서는 Direct2D 기반으로 구현합니다. Win3 pang2h.tistory.com 위 페이지의 정보대로 ..
이전 시간의 중력 구현에 이어 이번에는 지나갈 수 없는 벽을 구현해봅니다. 벽 물리엔진을 구성하다보니 주로 게임에 빗대는 경우가 많은데, 벽이라 함은 물체가 뚫고 지나갈 수 없는 것을 말하죠. 우리가 윈도우에 사각형을 그려넣는다고 그 사각형이 바로 벽이 되지는 않습니다. 연산을 통해 벽으로 인식되는 사각형을 대상이 뚫고 움직이지 못하도록 해야하죠. 이전 시간에 우리는 중력을 구현했기 때문에 중력이 적용된 시스템으로 구현해볼 것입니다. 중력을 구현한 방식과 중력을 구현하지 않은 방식은 약간의 차이가 존재하니까요. 접근 대상이 벽에 접근할 때는 네가지 방향에서 접근할 수 있습니다. 그리고 네 방향을 모두 점검하는 것은 좋지 않죠. 따라서 우리는 각 방향의 접근을 알아내고 그에 맞게 코드를 작성하겠습니다. 그..
이전 포스트의 마지막 부분에서 문제점 하나를 언급했었죠, 이번 포스트에서는 그 문제점을 해결하는 방법을 풀어봅니다. # Direct2D를 활용합니다. 문제점 이전 포스트에서 만든 프로그램의 문제는 다음과 같았습니다. 바닥에 닿지 않았는데 초기 위치로 돌아가버린다 이 문제는 언급했듯이, 이동 속도가 남은 공간보다 커서 공간을 넘어서다보니 초기 위치로 돌아가도록 명령이 실행됐기 때문입니다. 문제 해결하기 문제점에서 언급한 것처럼 그럼 이동 속도를 조절해주면 되겠네요. 첫 번째 if 구문은 현재 위치에 대한 판단을, 두 번째 if는 다음 위치에 대한 판단을 통해 이동 속도를 조절합니다. 두 if 구문 중 하나만 실행하면 되므로 else 로 묶어서 속도 향상을 꾀합니다. if (rcCenter.y + rcSiz..
지구에서는 지구 중력의 영향으로 물체를 공중에 놓으면 바닥으로 떨어집니다. 이런 식으로 중력에 영향을 받는 듯한 코드를 작성해봅니다. # Direct2D를 활용합니다. 기본 코드 기본 코드는 아래의 압축파일을 기준으로 합니다. 프로젝트 내 baseWin.h에 오류가 있습니다. 프로젝트 기준 baseWin.h > BaseWindow 클래스 > static WindowProc 함수에서 (LONG)을 (LONG_PTR)로 변경시 오류가 사라집니다. static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { DERIVED_TYPE* pThis = nullptr; if (uMsg == WM_NCCREATE) { C..