헤더파일

Shape Shooter - OpenGL 3D 게임 본문

포트폴리오 정리

Shape Shooter - OpenGL 3D 게임

헤더파일 2019. 8. 13. 15:52

개발 환경

 

  • C++

  • OpenGL

게임 소개

 

  • 화살표 모양의화살표 모양의 플레이어가 도형의 면에 총알을 맞추면 같은 무작위 색깔로 바꿉니다.

  • 모든 면을 같은 색깔로 만들면 다음 스테이지로 넘어가는 게임입니다.

플레이 영상

스테이지7

 


게임 특징

 

텍스쳐


FreeImage 라이브러리를 이용해 이미지 파일을 Byte 형태로 변환했습니다. 원하는 너비와 크기로 바꿀 수 있고 Bind 함수를 이용해서 쉐이더에 바인딩할 수 있습니다.

 static BYTE* load_image(const char* fileName, GLsizei* width, GLsizei* height, unsigned int* bits)
 {
                    FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;

            FIBITMAP* dib = nullptr;

            fif = FreeImage_GetFileType(fileName, 0);

            if (fif == FIF_UNKNOWN)
                fif = FreeImage_GetFIFFromFilename(fileName);

            if (fif == FIF_UNKNOWN)
                return nullptr;

            if (FreeImage_FIFSupportsReading(fif))
                dib = FreeImage_Load(fif, fileName);
                
            BYTE* result = new BYTE[size];

            memcpy(result, pixels, size);

            FreeImage_Unload(dib);


            return result;
 }
void Texture::bind() const
{
	glBindTexture(GL_TEXTURE_2D, m_TID);
}

충돌 체크


기본 도형은 사각뿔이고 모든 도형은 피라미드를 조합해서 만듭니다. 각 피라미드는 삼각형 형태의 충돌체 목록을 가집니다. 

class Pyramid
{
public:
		    				 ...
                             
	TriangleList* GetCollider();
    
	TriangleList colliderPlane;
};

 

각 면에 대해 충돌을 처리해야 하기 때문에 평면의 방정식을 이용해서 충돌을 처리했습니다. 

bool PlaneCollision(Vector3* param, Vector3 point)
{
	Plane plane = PlaneEquation(param);
	float condition1 = plane.a*point.x + plane.b*point.y + plane.c*point.z + plane.d;
	float condition2 = plane.d;


	if (condition1*condition2 < 0)
	{
		Vector3 line[2];
		line[0] = { 0,0,0 };
		line[1].x =  point.x;
		line[1].y = point.y;
		line[1].z = point.z;
		float target = LineIntersectPlane(plane, line);
		float dist = sqrt(pow(point.x, 2) + pow(point.y, 2) + pow(point.z, 2));
		//cout << target << endl;
		if (dist < target+50)
		{
			return true;
		}
	}
	return false;
}

 

Comments