분류 전체보기

WIN32API FrameWork/원본

220509_FrameWork_7-1_스킬 만들기

* 생성시킨 객체 주변을 회전하는 총알 n개를 만들어 보자 * 스킬 사용 버튼을 누를 시 회전 속도와 범위가 늘어난다. * LOL의 챔피언 '아우렐리온 솔'의 W스킬과 비슷함. //Class CRotatingBullet: public CGameObject //RotatingBullet.h #pragma once #include "GameObject.h" //소환한 클래스의 주변에 3개 생성되어 주변을 도는 총알 class CRotatingBullet : public CGameObject { friend class CScene; protected: CRotatingBullet(); CRotatingBullet(const CRotatingBullet& obj); virtual ~CRotatingBullet(..

WIN32API FrameWork/원본

220509_WIN32API_6-3_총알 발사 - 스킬 쿨타임 구현

1. 총알의 쿨타임을 저장할 '구조체'를 생성한다. 이 구조체에는 (float)총알의 쿨타임, (bool)현재 쿨타임에 진입했는지, (float)남은 쿨타임 시간 3가지 변수를 저장한다. 2. 이 쿨타임 구조체는 총알 발사 뿐만 아니라 스킬 시전에도 사용할 예정이므로, 이 스킬 쿨타임 구조체들을 저장할 배열(vector)을 생성한다. 3. 실제로 사용할 객체를 초기화할 때 구조체를 생성해 초기화( = {};) 하고, 쿨타임만 지정해 준다. cf)bool 타입은 초기화하면 false(0)이다. 4. 생성한 구조체를 배열에 삽입한다. 5. 스킬을 사용하면 쿨타입 진입 bool 변수를 true로 바꾸고, 남은 쿨타임 시간에 지정했던 쿨타임을 대입한다. 6. 이후 객체의 Update 함수 안에서 반복문을 통해 ..

WIN32API FrameWork/원본

220509_WIN32API_6-2_총알 발사 - 쿨타임 구현과 실제 발사

1. GameObject class를 상속받는 총알 클래스를 만들어 준다. 2. 총알을 발사할 객체에서 총알 발사 입력이 들어오면 총알을 생성한다. 3. 총알을 생성하고, 방향과 속도를 지정해 준다. 지난 번에 Player 객체를 구현할 때 총구의 방향은 이미 계산을 했었다. //총구가 향하는 방향 구하기 m_Dir; m_Dir.x = cosf(DegreeToRadian(m_GunAngle)); m_Dir.y = sinf(DegreeToRadian(m_GunAngle)); m_GunPos.x = m_Pos.x + m_Dir.x * m_GunLength; m_GunPos.y = m_Pos.y + m_Dir.y * m_GunLength; 총알은, 여기서 계산한 방향으로 나아가도록 생성해주면 된다. void ..

WIN32API FrameWork/원본

220509_WIN32API_6-1_총알 발사 - 총알 클래스 구현

1. GameObject class를 상속받는 총알 클래스를 만들어 준다. 2. 총알을 발사할 객체에서 총알 발사 입력이 들어오면 총알을 생성한다. 3. 총알을 생성하고, 방향과 속도를 지정해 준다. 1. GameObject class를 상속받는 총알 클래스를 만들어 준다. #pragma once #include "GameObject.h" class CBullet : public CGameObject { friend class CScene; protected: CBullet(); CBullet(const CBullet& obj); virtual ~CBullet(); virtual bool Init(); virtual void Update(float DeltaTime); virtual void Render..

WIN32API FrameWork/원본

220504_WIN32API_Framework_5-3_실제 Scene 만들고 실행(MainScene)

* 이제 각 Scene은 코드가 간단해진다. * Scene 별로 Init 함수에 생성할 게임오브젝트를 생성해 주면 끝 -> 각 Scene에서는 배치할 GameObject를 생성 -> SceneManager에서는 Scene을 생성 * 일단 작동하는 개체가 Player 뿐이므로 Player 객체를 생성해서 작동하는지 확인해 보자 * MainScene을 아래와 같이 만들어 준다. //Class CMainScene //MainScene.h #pragma once #include "Scene.h" class CMainScene : public CScene { friend class CSceneManager; protected: CMainScene(); virtual ~CMainScene(); public: boo..

WIN32API FrameWork/원본

220504_WIN32API_Framework_5-2_Class Scene

* Scene 클래스는 모든 개별 클래스의 최상위 부모 클래스이다. * 생성자와 소멸자를 protected로 선언하고, SceneManager만 frend class로 등록하여 SceneManager를 통해서만 처리할 수 있게 만들어 준다. class CScene { friend class CSceneManager; protected: CScene(); virtual ~CScene(); * 해당 씬에서 생성된 GameObject의 주소를 모두 담아놓을 list를 전방 선언한다. 일반 포인터 변수가 아닌 공유 포인터 클래스로 선언하여 메모리 릭을 방지해 준다. protected: std::list m_ObjList; * GameObject를 생성하는 데 사용되는 템플릿 함수 CreateObject를 선언 ..

WIN32API FrameWork/원본

220504_WIN32API_Framework_5-1_SceneManager

* Scene을 관리할 SceneManager 클래스를 싱글턴 패턴으로 미리 작성해놓은 매크로를 통해 선언한다. 하나의 SceneManager에서 Scene을 그때그때 바꿔 가며 실행할 것이다. DECLARE_SINGLETON(CSceneManager) * 실행되고 있는 Scene 주소를 담아놓을 포인터를 선언한다. private: //씬매니저에서 씬 하나를 관리. 씬은 단 하나만 들고있을 예정. class CScene* m_Scene; * 앞으로 모든 GameObject의 Update와 Render 함수 처리는 모두 SceneManager 클래스에서 시작한다. bool CSceneManager::Init() { //템플릿에 CMainScene을 넣어 CreateScene 함수를 통해 생성 CreateS..

자습

SharedPtr, Reference Counting 구현과 이해

//Class CRef //Ref.h /* [스마트 포인터] * 파이썬 또는 자바의 경우 가비지 컬렉터라는 프로그램이 계속 작동함. - 댕글링 포인터들을 자동으로 청소 but 속도가 느림. * 스마트 포인터 - 공유 포인터 - 원래 기본 기능으로 지원하지만 게임엔진 등에서는 직접 만들어서 쓰는 편이다. * 어떤 주소를 3개의 포인터가 참조하다가 한 포인터에서 delete를 했을 시 나머지 2개 포인터는 댕글링 포인터가 되어 버린다. 매우 위험한 상황. * 그래서 레퍼런스 카운터라는 방법을 사용한다. - 모든 주소는 RC라는 값을 가지고 있고, - delete를 할때 RC값이 0이 아니면 할당을 해제하는 것이 아니라 RC값을 하나 줄인다. - 위의 상황에서 한 포인터에서 delete를 할 경우에 주소가 할..

자습

스택에 생성된 객체는 delete가 되지 않는다

int main() { //포인터는 공유 포인터로 생성해준다. CSharedPtr TestClass1 = new CTestClass; delete &TestClass1; } 너무 당연한건데 실수해서 기록

WIN32API FrameWork/원본

220504_WIN32API_Framework_4_스마트 포인터(참조 카운트)

* 추가 정보: https://hyrule.tistory.com/95 SharedPtr, Reference Counting 구현과 이해 //Class CRef //Ref.h /* [스마트 포인터] * 파이썬 또는 자바의 경우 가비지 컬렉터라는 프로그램이 계속 작동함. - 댕글링 포인터들을 자동으로 청소 but 속도가 느림. * 스마트 포인터 - 공유 포인터 - hyrule.tistory.com 1. 참조 카운트 클래스 - Ref.h, Ref.cpp 2. 공유 포인터 클래스 - SharedPtr.h //Class CRef //Ref.h /* [스마트 포인터] * 파이썬 또는 자바의 경우 가비지 컬렉터라는 프로그램이 계속 작동함. - 댕글링 포인터들을 자동으로 청소 but 속도가 느림. * 스마트 포인터 -..

WIN32API FrameWork/원본

220503_WIN32API_3-3_조작에 따라 회전하는 총 만들기(삼각함수)

코사인과 사인함수 값을 조합시켜 활용하면, 총의 각도를 구할 수 있다. * Player.h * Player.cpp //Class Cplayer: public CCharacter //Player.h #pragma once #include "Character.h" class CPlayer : public CCharacter { public: CPlayer(); //상속할 것이므로 가상함수로 소멸자 선언 virtual ~CPlayer(); public: virtual bool Init(); virtual void Update(float DeltaTime); virtual void Render(HDC hDC, float DeltaTime); //충돌 함수는 별도로 구현할 것이므로 만들지 ..

WIN32API FrameWork/원본

220503_WIN32API_Framework_3-2_입력받은대로 캐릭터 이동

* WIN32API에서 플레이어를 출력하려면 HDC 인자가 필요하므로 Render() 함수에 인자로 넘겨주도록 추가해 주었음. - 상속받는 모든 자식 클래스도 변경해 줄것 virtual void Render(HDC hDC, float DeltaTime); * 최상위 클래스인 GameObject에 변수 추가 - 오브젝트의 위치를 나타내는 m_Pos - 오브젝트의 크기 m_Size - 오브젝트의 중심점을 잡을 수 있게 해주는 m_Pivot //Class CGameObject //GameObject.h #pragma once //Include/GameObject/GameObject.h -> Include/GameInfo.h 이므로 #include "../GameInfo.h" /* * 게임오브젝트: 상속구조로 ..