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 ..
* 이제 각 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..
* Scene 클래스는 모든 개별 클래스의 최상위 부모 클래스이다. * 생성자와 소멸자를 protected로 선언하고, SceneManager만 frend class로 등록하여 SceneManager를 통해서만 처리할 수 있게 만들어 준다. class CScene { friend class CSceneManager; protected: CScene(); virtual ~CScene(); * 해당 씬에서 생성된 GameObject의 주소를 모두 담아놓을 list를 전방 선언한다. 일반 포인터 변수가 아닌 공유 포인터 클래스로 선언하여 메모리 릭을 방지해 준다. protected: std::list m_ObjList; * GameObject를 생성하는 데 사용되는 템플릿 함수 CreateObject를 선언 ..
* Scene을 관리할 SceneManager 클래스를 싱글턴 패턴으로 미리 작성해놓은 매크로를 통해 선언한다. 하나의 SceneManager에서 Scene을 그때그때 바꿔 가며 실행할 것이다. DECLARE_SINGLETON(CSceneManager) * 실행되고 있는 Scene 주소를 담아놓을 포인터를 선언한다. private: //씬매니저에서 씬 하나를 관리. 씬은 단 하나만 들고있을 예정. class CScene* m_Scene; * 앞으로 모든 GameObject의 Update와 Render 함수 처리는 모두 SceneManager 클래스에서 시작한다. bool CSceneManager::Init() { //템플릿에 CMainScene을 넣어 CreateScene 함수를 통해 생성 CreateS..
* 추가 정보: 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 속도가 느림. * 스마트 포인터 -..
코사인과 사인함수 값을 조합시켜 활용하면, 총의 각도를 구할 수 있다. * 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); //충돌 함수는 별도로 구현할 것이므로 만들지 ..
* 벡터2 구조체를 만들고, 관련 연산자들을 재정의해서 편의성 있게 사용 가능하도록 함 //Vector2.h #pragma once //프로그래밍에서 수학은 //손으로 푸는것이 중요한 게 아니라 이 수학 공식을 사용하면 어떻게 되는지 //정도만 알면 된다. #include //라디안 등 여러 곳에 원주율이 두루두루 쓰이므로 상수로 등록해 놓는다. const float PI = 3.141592f; struct Vector2 { float x, y; //아무것도 안넣으면 0으로 초기화 Vector2() : x(0.f), y(0.f) {} //두개의 값을 인자로 받으면 각각 x, y로 Vector2(float _x, float _y) : x(_x), y(_y) {} //한개의 값을 인자로 받으면 x, y 동일..