#include "Game2D.h"
#include "Examples/PrimitivesGallery.h"
#include "RandomNumberGenerator.h"
#include <vector>
#include <memory>
#include "Triangle.h"
#include "Circle.h"
#include "Box.h"
namespace jm
{
class Example : public Game2D
{
public:
std::vector<std::unique_ptr<GeometricObject>> my_objs;
Example()
: Game2D()
{
my_objs.push_back(std::make_unique<Triangle>(Colors::gold, vec2{ -0.5f, 0.2f }, 0.25f));
my_objs.push_back(std::make_unique<Circle>(Colors::olive, vec2{ 0.1f, 0.1f }, 0.2f));
my_objs.push_back(std::make_unique<Box>(Colors::blue, vec2{ 0.0f, 0.5f }, 0.15f, 0.25f));
}
main.cpp 상단부에 계속해서 헤더파일들이 추가되면서 길어지고있다. 따라서 자식 타입별로 리턴 받는 함수를 한 헤더파일에 몰아 넣어서 main.cpp에서 그 헤더파일만 추가하면 되는 시스템을 만들고자한다.
공장 패턴
공장에서 다양한 객체를 찍어내듯이, ‘팩토리’가 되는클래스 한개가 모든 기능을 처리하도록 설계하는 패턴
GeometricObject.h
#pragma once
#include "Game2D.h"
namespace jm
{
class GeometricObject
{
public:
vec2 pos;
RGB color;
void init(const RGB & _color, const vec2 & _pos)
{
color = _color;
pos = _pos;
}
virtual void drawGeometry() const = 0;
void draw()
{
beginTransformation();
{
translate(pos);
drawGeometry();
}
endTransformation();
}
// 선언만. 구현은 GeometircObject.cpp 에서
static GeometricObject * makeTriangle(const RGB & _color, const vec2 & _pos, const float & _size);
static GeometricObject * makeCircle(const RGB & _color, const vec2 & _pos, const float & _size);
static GeometricObject * makeBox(const RGB & _color, const vec2 & _pos, const float & _width, const float &_height);
static GeometricObject * makeStar(const RGB & _color, const vec2 & _pos, const float & _os, const float & _is);
};
}
아래에 각각의 도형을 구현하는 함수만 선언해두었다. 함수의 바디는 GeometricObject.cpp 에서 구현한다.
GeometricObject.cpp
#include "GeometricObject.h"
#include "Triangle.h"
#include "Circle.h"
#include "Box.h"
#include "Star.h"
namespace jm
{
/* 각 자식 객체를 생성하고 초기화하고 포인터를 리턴하는 함수*/
GeometricObject * GeometricObject::makeTriangle(const RGB & _color, const vec2 & _pos, const float & _size)
{
return new Triangle(_color, _pos, _size);
}
GeometricObject * GeometricObject::makeCircle(const RGB & _color, const vec2 & _pos, const float & _size)
{
return new Circle(_color, _pos, _size);
}
GeometricObject * GeometricObject::makeBox(const RGB & _color, const vec2 & _pos, const float & _width, const float & _height)
{
return new Box(_color, _pos, _width, _height);
}
GeometricObject * GeometricObject::makeStar(const RGB & _color, const vec2 & _pos, const float & _os, const float & _is)
{
return new Star(_color, _pos, _os, _is);
}
}
상단부에 헤더파일들이 무더기로 선언이 된것이 보인다.
main.cpp
#include "Game2D.h"
#include "Examples/PrimitivesGallery.h"
#include "RandomNumberGenerator.h"
#include <vector>
#include <memory>
//#include "Triangle.h"
//#include "Circle.h"
//#include "Box.h"
#include "GeometricObject.h"
namespace jm
{
class Example : public Game2D
{
public:
std::vector<GeometricObject*> my_objs;
Example()
: Game2D()
{
my_objs.push_back(GeometricObject::makeTriangle(Colors::gold, vec2{ -0.5f, 0.2f }, 0.25f));
my_objs.push_back(GeometricObject::makeCircle(Colors::olive, vec2{ 0.1f, 0.1f }, 0.2f));
my_objs.push_back(GeometricObject::makeBox(Colors::blue, vec2{ 0.0f, 0.5f }, 0.15f, 0.25f));
my_objs.push_back(GeometricObject::makeStar(Colors::gold, vec2{ 0.0f, -0.5f }, 0.25f, 0.15f));
/*my_objs.push_back(new Triangle(Colors::gold, vec2{ -0.5f, 0.2f }, 0.25f));
my_objs.push_back(new Circle(Colors::olive, vec2{ 0.1f, 0.1f }, 0.2f));
my_objs.push_back(new Box(Colors::black, vec2{ 0.0f, 0.5f }, 0.15f, 0.25f));*/
}
~Example()
#include "Triangle.h"
#include "Circle.h"
#include "Box.h"
대신 이제는
#include "GeometricObject.h" 하나만 선언해도 모든 자식들에 접근할 수 있다.
게임 구현시
- 게임에서는 객체 생성에 대해 이런식의 하드 코딩은 하지 않는 편, 위 내용은 밑바닥 엔진을 만든다고 생각하면 된다.
- 게임 제작에서는 주로
- 스크립트 파일로 객체들의 정보를 입력받는다
- ex) 장애물, 탱크 어디에 위치한다 등
- 마우스로 클릭해서 객체 배치
- 스크립트 파일로 객체들의 정보를 입력받는다
'공부 일지 > C++' 카테고리의 다른 글
[C++] 2.6 싱글톤 패턴 singleton pattern (0) | 2023.09.20 |
---|---|
[C++] 2.5 명령 패턴 command pattern (0) | 2023.09.20 |
[C++] 2.3 다형성(std::vector, auto, new&delete, 스마트포인터) (0) | 2023.09.16 |
[C++] 2.2 상속 (0) | 2023.09.16 |
[C++] 2.1 클래스와 캡슐화 (0) | 2023.09.13 |
#include "Game2D.h"
#include "Examples/PrimitivesGallery.h"
#include "RandomNumberGenerator.h"
#include <vector>
#include <memory>
#include "Triangle.h"
#include "Circle.h"
#include "Box.h"
namespace jm
{
class Example : public Game2D
{
public:
std::vector<std::unique_ptr<GeometricObject>> my_objs;
Example()
: Game2D()
{
my_objs.push_back(std::make_unique<Triangle>(Colors::gold, vec2{ -0.5f, 0.2f }, 0.25f));
my_objs.push_back(std::make_unique<Circle>(Colors::olive, vec2{ 0.1f, 0.1f }, 0.2f));
my_objs.push_back(std::make_unique<Box>(Colors::blue, vec2{ 0.0f, 0.5f }, 0.15f, 0.25f));
}
main.cpp 상단부에 계속해서 헤더파일들이 추가되면서 길어지고있다. 따라서 자식 타입별로 리턴 받는 함수를 한 헤더파일에 몰아 넣어서 main.cpp에서 그 헤더파일만 추가하면 되는 시스템을 만들고자한다.
공장 패턴
공장에서 다양한 객체를 찍어내듯이, ‘팩토리’가 되는클래스 한개가 모든 기능을 처리하도록 설계하는 패턴
GeometricObject.h
#pragma once
#include "Game2D.h"
namespace jm
{
class GeometricObject
{
public:
vec2 pos;
RGB color;
void init(const RGB & _color, const vec2 & _pos)
{
color = _color;
pos = _pos;
}
virtual void drawGeometry() const = 0;
void draw()
{
beginTransformation();
{
translate(pos);
drawGeometry();
}
endTransformation();
}
// 선언만. 구현은 GeometircObject.cpp 에서
static GeometricObject * makeTriangle(const RGB & _color, const vec2 & _pos, const float & _size);
static GeometricObject * makeCircle(const RGB & _color, const vec2 & _pos, const float & _size);
static GeometricObject * makeBox(const RGB & _color, const vec2 & _pos, const float & _width, const float &_height);
static GeometricObject * makeStar(const RGB & _color, const vec2 & _pos, const float & _os, const float & _is);
};
}
아래에 각각의 도형을 구현하는 함수만 선언해두었다. 함수의 바디는 GeometricObject.cpp 에서 구현한다.
GeometricObject.cpp
#include "GeometricObject.h"
#include "Triangle.h"
#include "Circle.h"
#include "Box.h"
#include "Star.h"
namespace jm
{
/* 각 자식 객체를 생성하고 초기화하고 포인터를 리턴하는 함수*/
GeometricObject * GeometricObject::makeTriangle(const RGB & _color, const vec2 & _pos, const float & _size)
{
return new Triangle(_color, _pos, _size);
}
GeometricObject * GeometricObject::makeCircle(const RGB & _color, const vec2 & _pos, const float & _size)
{
return new Circle(_color, _pos, _size);
}
GeometricObject * GeometricObject::makeBox(const RGB & _color, const vec2 & _pos, const float & _width, const float & _height)
{
return new Box(_color, _pos, _width, _height);
}
GeometricObject * GeometricObject::makeStar(const RGB & _color, const vec2 & _pos, const float & _os, const float & _is)
{
return new Star(_color, _pos, _os, _is);
}
}
상단부에 헤더파일들이 무더기로 선언이 된것이 보인다.
main.cpp
#include "Game2D.h"
#include "Examples/PrimitivesGallery.h"
#include "RandomNumberGenerator.h"
#include <vector>
#include <memory>
//#include "Triangle.h"
//#include "Circle.h"
//#include "Box.h"
#include "GeometricObject.h"
namespace jm
{
class Example : public Game2D
{
public:
std::vector<GeometricObject*> my_objs;
Example()
: Game2D()
{
my_objs.push_back(GeometricObject::makeTriangle(Colors::gold, vec2{ -0.5f, 0.2f }, 0.25f));
my_objs.push_back(GeometricObject::makeCircle(Colors::olive, vec2{ 0.1f, 0.1f }, 0.2f));
my_objs.push_back(GeometricObject::makeBox(Colors::blue, vec2{ 0.0f, 0.5f }, 0.15f, 0.25f));
my_objs.push_back(GeometricObject::makeStar(Colors::gold, vec2{ 0.0f, -0.5f }, 0.25f, 0.15f));
/*my_objs.push_back(new Triangle(Colors::gold, vec2{ -0.5f, 0.2f }, 0.25f));
my_objs.push_back(new Circle(Colors::olive, vec2{ 0.1f, 0.1f }, 0.2f));
my_objs.push_back(new Box(Colors::black, vec2{ 0.0f, 0.5f }, 0.15f, 0.25f));*/
}
~Example()
#include "Triangle.h"
#include "Circle.h"
#include "Box.h"
대신 이제는
#include "GeometricObject.h" 하나만 선언해도 모든 자식들에 접근할 수 있다.
게임 구현시
- 게임에서는 객체 생성에 대해 이런식의 하드 코딩은 하지 않는 편, 위 내용은 밑바닥 엔진을 만든다고 생각하면 된다.
- 게임 제작에서는 주로
- 스크립트 파일로 객체들의 정보를 입력받는다
- ex) 장애물, 탱크 어디에 위치한다 등
- 마우스로 클릭해서 객체 배치
- 스크립트 파일로 객체들의 정보를 입력받는다
'공부 일지 > C++' 카테고리의 다른 글
[C++] 2.6 싱글톤 패턴 singleton pattern (0) | 2023.09.20 |
---|---|
[C++] 2.5 명령 패턴 command pattern (0) | 2023.09.20 |
[C++] 2.3 다형성(std::vector, auto, new&delete, 스마트포인터) (0) | 2023.09.16 |
[C++] 2.2 상속 (0) | 2023.09.16 |
[C++] 2.1 클래스와 캡슐화 (0) | 2023.09.13 |