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 |