목록Game Dev (264)
KoreanFoodie's Study

윈도우 API 프로그래밍 8 : 객체 지향적인 윈도우 API 프로그래밍 "모든 것은 객체로 이루어져 있다". 객체 지향적으로 코드를 짜면 유지 보수가 편하며 새로운 기능을 안전하고 효율적으로 구현할 수 있다. 이 글에서는 실제 기능 구현을 보며 그 부분에 대한 기초를 간략히 서술한다. 기능 예시1 . 더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!

윈도우 API 프로그래밍 7 : 게임 프레임워크 구성 지금은 간단한 게임이니까 WindowsProject1.cpp라는 단일 파일에 모든 기능을 구현했지만, 프로그램이 복잡해지면 사실 필요한 코드를 필요한 파일에 분할해서 구성해야 한다. 이 글에서는 이를 위한 밑작업을 어떻게 하는지를 다루고자 한다. GameNode : 먼저 스켈레톤 클래스를 만들자 #pragma once class GameNode { public: GameNode(); ~GameNode(); virtual void Init() = 0; // 순수 가상 함수 virtual void Update() = 0; virtual void Render() = 0; }; 먼저 가장 기본적으로 Init, Update, Render라는 가상 메소드를 가진..

윈도우 API 프로그래밍 6 : 간단한 UI 구현과 똥피하기 게임 예제 이전 글에 이어서 추가적인 기능을 약간 추가해 보자. 전역 변수 재설정 struct tagBox { RECTrt; floatspeed; }; vectorvecBox;// 떨어지는 렉트들의 정보 intnDelay = 50; struct tagBox를 새로 선언하여 RECT를 대체했다. 그 이유는, 각각의 상자마다 떨어지는 속도를 다르게 만들기 위해서인데, 이는 난이도나 약간의 재미 요소를 첨가하는데 사용될 수 있다. WM_TIMER : 점수 계산과 타입 수정 case WM_TIMER:// 타이머에 의해서 호출 { InvalidateRect(hWnd, NULL, true); nLevel = nScore / 100 + 1; // 포지션 위..

윈도우 API 프로그래밍 5 : 물체 떨어뜨리기 이번 글에서는 간단한 물체를 떨어뜨리는 기능을 구현하며 다른 디테일을 설명한다. WM_CREATE case WM_CREATE:// 프로그램이 실행 될 때 한번 호출 된다. (초기화) SetTimer(hWnd, 1, 10, NULL); srand(time(NULL)); break; 초기화 함수를 통해 타이머를 SET 하고, 랜덤 함수를 호출한다. WM_TIMER case WM_TIMER:// 타이머에 의해서 호출 { InvalidateRect(hWnd, NULL, true); // 포지션 위치에 따른 렉트 정보 업데이트 rtBox1 = RECT_MAKE(ptPos1.x, ptPos1.y, 50); if (nDelay == 50) { RECT rt; rt.le..

윈도우 API 프로그래밍 4 : 충돌 검사 (IntersectRect...) 이번 글에서는 도형이 다른 도형과 만났을 때 이를 어떻게 구현하고 처리하는지를 살펴본다. WM_TIMER에서 IntersectRect를 넣어보자 // 아래 두 줄은 전역변수로 선언함 enum MOVE_DIR { MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN }; MOVE_DIReMoveDir; // ... case WM_TIMER:// 타이머에 의해서 호출 InvalidateRect(hWnd, NULL, true); // 포지션 위치에 따른 렉트 정보 업데이트 rtBox1 = RECT_MAKE(ptPos1.x, ptPos1.y, 100); rtBox2 = RECT_MAKE(ptPos2.x, ptPos..

윈도우 API 프로그래밍 3 : 키 입력과 게임 업데이트 이번 글에서는 WIM_KEYDOWN을 통한 키 입력에 대해 알아보도록 한다. 키 입력 처리하기 case WM_CREATE:// 프로그램이 실행 될 때 한번 호출 된다. (초기화) SetTimer(hWnd, 1, 10, NULL); break; case WM_TIMER:// 타이머에 의해서 호출 InvalidateRect(hWnd, NULL, true); break; case WM_KEYDOWN:// 키 입력이 있을 때 마다 호출 된다. switch (wParam) { // 삼항식 (조건) ? 참일 때 : 거짓일 때 case 'A': case VK_LEFT: ptPos.x -= (ptPos.x > 0) ? 1 : 0; break; case 'D': ..

윈도우 API 프로그래밍 1 : 창 생성 및 기본 세팅 먼저 비주얼 스튜디오(2019)에서 Windows 데스크탑 애플리케이션 프로젝트를 생성하자. 그럼 아래와 같은 식으로 프로젝트가 생성되는데, 이중 framework.h, WindowsProject1.cpp 파일이 자동 생성되고, 이 부분을 고치면서 기능을 구현한다. framwork.h 파일은 헤더 파일이나 매크로 선언, 변경이 거의 없는 변수 등을, WindowsProject1.cpp 파일에서는 타이머나 페인팅을 포함하고 있다. framework.h // header.h: 표준 시스템 포함 파일 // 또는 프로젝트 특정 포함 파일이 들어 있는 포함 파일입니다. // #pragma once #include "targetver.h" #define WIN..

벡터 벡터는 방향과 크기를 가진다. 벡터 (1, 0, 2)이 있을때, 해당 벡터의 크기는 sqrt(1^2 + 2^2)이 된다. 유니티는 Vector2, Vector3, Vector4 타입을 지원한다. 새로운 벡터를 만들 때는 생성자를 호출하면 된다. // Vector는 클래스가 아니라 구조체이다! public struct Vector3 { public float x; public float y; public float z; // Vector3 내부 코드 } Vector3 a = new Vector3(0, 0, 0); Vector3 b = a; b.x = 100; 벡터의 연산 내적과 외적의 의미를 이해하는 것이 중요하다. 백터의 내적은 Dot Product라고하는데, a · b 라고 하면, 벡터 b를 a의..

바닥 회전 Rotate( ) 메서드를 이용해서 물체를 회전시킬 수 있다. public class Rotator : MonoBehaviour { public float rotationSpeed = 60f; // Update is called once per frame void Update() { transform.Rotate(0f, rotationSpeed * Time.deltaTime, 0f); } } 위에서 rotationSpeed에 Time.deltaTime을 곱합으로써, 어떤 기기에서도 안정적으로 1초마다 rotationSpeed만큼의 각도의 회전을 줄 수 있다. Update( ) 는 1프레임마다 실행되며, Time.deltaTime은 ( 1 / 초당 프레임 수)이므로, 프레임이 60이든 120이든..

프리팹 게임 오브텍트는 프리팹으로 만들어 재활용할 수 있다. 마치, 칼을 찍어내는 주물이라고 생각하면 된다! 사용법은 간단하다. Hierarchy에 있는 오브젝트를 프로젝트 창에 드래그&드랍 해주기만 하면 된다! Use Gravity 리지드 바디 컴포넌트의 Use Gravity 필드를 해제하면 중력의 영향을 받지 않는다. transform 변수 transform은 스크립트에서 자신의 트랜스폼 컴포넌트로 바로 접근하는 지름길이다! Destroy( ) void Start() { // 이동에 사용할 리지드바디 컴포넌트 할당 bulletRigidbody = GetComponent(); // 리지드바디의 속도 = 앞쪽 방향 * 이동 속력 bulletRigidbody.velocity = transform.forwa..