DirectX/DirectX 2D_(구)

DX_Collider [1 / 3]

컴맹학자 2021. 1. 18. 20:18
728x90

Collider.cpp는 우선 총 3단계 나눠서 진행할 예정.... 수학을 더럽게 못해서 원리 및 이해를 하고선 쓸 예정

 

우선 1단계는 간단하게 캐릭터 및 오브젝트에다가 박스 형태로 감싸는 선을 그려줄 예정

 

그림으로 간단하게 정의 하면 이런 형태

 

Collider.cpp

더보기
#include "stdafx.h"
#include "collider.h"

Collider::Collider()
	: bDrawColliderColor(false)
{
	shader = new Shader(L"Bounding.fx");
	CreateBuffer();
	D3DXMatrixIdentity(&world);
    
    // 쉐이더 파일에 있는 변수 정의
	sWorld = shader->AsMatrix("World");
	sView = shader->AsMatrix("View");
	sProjection = shader->AsMatrix("Projection");
	sColor = shader->AsVector("LineColor");
	
    //선색상
	initLineColor = D3DXCOLOR(0, 1, 0, 1);
}

//버퍼 만들기
void Collider::CreateBuffer()
{
	Vertex vertices[5];
	vertices[0].Positon = D3DXVECTOR3(-0.5f, -0.5f, 0.0f);
	vertices[1].Positon = D3DXVECTOR3(-0.5f, +0.5f, 0.0f);
	vertices[2].Positon = D3DXVECTOR3(+0.5f, +0.5f, 0.0f);
	vertices[3].Positon = D3DXVECTOR3(+0.5f, -0.5f, 0.0f);
	vertices[4].Positon = D3DXVECTOR3(-0.5f, -0.5f, 0.0f);

	//Create VertexBuffer
	{
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.ByteWidth = sizeof(Vertex) * 5;
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

		D3D11_SUBRESOURCE_DATA data;
		ZeroMemory(&data, sizeof(D3D11_SUBRESOURCE_DATA));
		data.pSysMem = vertices;

		HRESULT hr = Device->CreateBuffer(&desc, &data, &vertexBuffer);
		assert(SUCCEEDED(hr));
	}
}

//업데이트
void Collider::Update(D3DXMATRIX & V, D3DXMATRIX & P)
{
	sWorld->SetMatrix(world);
	sView->SetMatrix(V);
	sProjection->SetMatrix(P);
}

void Collider::Render()
{
	UINT stride = sizeof(Vertex);
	UINT offset = 0;

	DeviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
	DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP);
	sColor->SetFloatVector(bDrawColliderColor ? collidedColor : initLineColor);
	shader->Draw(0, 0, 5);
}

Collider::~Collider()
{
	SAFE_RELEASE(vertexBuffer);
	SAFE_DELETE(shader);
}

Collider.h

더보기
#pragma once

class Collider
{
public:
	Collider();
	~Collider();

	void Update(D3DXMATRIX& V, D3DXMATRIX& P);
	void Render();

	//오브젝트의 월드 좌표를 가져와서 자기한테 적용
	void World(D3DXMATRIX& world) { this->world = world; }
	D3DXMATRIX World() { return world; }


private:
	void CreateBuffer();

private:
	struct Vertex
	{
		D3DXVECTOR3 Positon;
	};
	
private:
	Shader* shader;
	ID3D11Buffer* vertexBuffer;
	
	D3DXMATRIX world;

	D3DXCOLOR initLineColor; // 기본색

	// 쉐이더 변수 접근
	ID3DX11EffectMatrixVariable* sWorld;
	ID3DX11EffectMatrixVariable* sView;
	ID3DX11EffectMatrixVariable* sProjection;
	ID3DX11EffectVectorVariable* sColor;
};

Bounding.fx

더보기
float4 LineColor;
cbuffer CB_PerFrame
{
    matrix View;
    matrix Projection;
}
matrix World;

struct VertexInput
{
    float4 Position : POSITION0;
};

struct VertexOutput
{
    float4 Position : SV_POSITION0;
};


VertexOutput VS(VertexInput input)
{
    VertexOutput output;
    //output.Position = input.Position;
    output.Position = mul(input.Position, World);
    output.Position = mul(output.Position, View);
    output.Position = mul(output.Position, Projection);

    return output;
}

Texture2D DiffuseMap;
SamplerState Sampler;

float4 PS(VertexOutput input) : SV_TARGET0
{
    return LineColor;;
}


technique11 T0
{
    pass P0
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS()));
    }
}

 

S01_Collider

더보기

헤더파일

#pragma once
#include "Scene.h"

class S01_Collider : public Scene {
public:
	S01_Collider(SceneValues* values);
	~S01_Collider();

	// Scene을(를) 통해 상속됨
	void Update() override;
	void Render() override;

private:
	class Background * background;
	class Prinny * Ply;

	Collider* col;

};

 

cpp 파일

#include "stdafx.h"
#include "S01_Collider.h"
#include "Viewer/Following.h"

//그림 불러오기
#include "Object/Background.h"

#include "Object/Move.h"

S01_Collider::S01_Collider(SceneValues * values) : Scene(values)
{
	//파일경로
	wstring shaderFile = L"Effect.fx";
	background = new Background(shaderFile);
	
	Ply = new Move(Vector2(0.0f, 0.0f), Vector2(3.0f, 3.0f));
	
	col = new Collider();

	//카메라 제설정
	SAFE_DELETE(values->MainCamera);
	values->MainCamera = new Following(Ply);
}

S01_Collider::~S01_Collider()
{
	SAFE_DELETE(col);
	SAFE_DELETE(Ply);
	SAFE_DELETE(background);
}

void S01_Collider::Update()
{
	D3DXMATRIX V = values->MainCamera->View();
	D3DXMATRIX P = values->Projection;	
	{
		col->World(Ply->GetSprite()->World());
		col->Update(V, P);	

	}
	background->Update(V, P);
	Ply->Update(V, P);
}

void S01_Collider::Render()
{
	background->Render();
	Ply->Render();
	col->Render();
}


 

지금은 단순히 보여주는 형식의 박스 이지만 추후 2,3단계에서 앞으로 충돌 이벤트 관련 소스 코드로 작성하기 

때문에 아주 중요한 클래스 이기도 하다. 

'DirectX > DirectX 2D_(구)' 카테고리의 다른 글

DX_Collider [3 / 3] OBB 충돌  (0) 2021.01.26
DX_Collider [2 / 3] AABB 충돌  (0) 2021.01.20
DX_카메라 시점변환  (0) 2021.01.05
DX_Move  (0) 2020.12.23
DX_Keyboard  (0) 2020.12.21