2D게임 만들기(2)
2023. 1. 14. 12:38ㆍ개인공부/Win32API
사각형과 사각형의 충돌
기존의 충돌 매니저는 충돌의 시점만을 판단했기 때문에 내가 만들 게임에서는 충돌이 발생하는 지점?.. 방향을 판단해야 했다. 그래서 기존 충돌매니저에서 조건을 더 추가해 주었다. 처음에는 머리가 복잡해서 어떤 방식으로 충돌을 판단해야 할지 생각했는데 서로의 충돌 좌표를 기준으로 조건을 나눴다. 차근차근 완성을 했지만 현재 window Y좌표는 반대이기 때문에 조건을 한 번 더 수정해서 디버깅을 했는데 일단은 잘 완성했다. 그 결과 충돌체는 어느 방향에서 자신이 충돌한 지 판단이 가능하게 됐다. 하지만 아마도 버그가 발생할거 같은 불길한 예감이 든다......
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
// 어느방향에서 충돌한지 검사
Vec2 pLeftPos = pLeftCol->GetPrevFinalPos();
Vec2 pRightPos = pRightCol->GetPrevFinalPos();
Vec2 pLeftScale = pLeftCol->GetScale();
Vec2 pRightScale = pRightCol->GetScale();
if (pLeftPos.x > pRightPos.x && pLeftPos.y <= pRightPos.y ) // 우상단
{
Vec2 pLeftVertex = pLeftPos + Vec2(-pLeftScale.x / 2, +pLeftScale.y / 2);
Vec2 pRightVertex = pRightPos + Vec2(pRightScale.x / 2, -pRightScale.y / 2);
if (pLeftVertex.y < pRightVertex.y)
{
pLeftCol->DirDownCollision();
pRightCol->DirUpCollision();
}
else
{
pLeftCol->DirLeftCollision();
pRightCol->DirRightCollision();
}
}
else if (pLeftPos.x > pRightPos.x && pLeftPos.y > pRightPos.y) // 우하단
{
Vec2 pLeftVertex = pLeftPos + Vec2(-pLeftScale.x / 2, -pLeftScale.y / 2);
Vec2 pRightVertex = pRightPos + Vec2(pRightScale.x / 2, +pRightScale.y / 2);
if (pLeftVertex.y < pRightVertex.y)
{
pLeftCol->DirLeftCollision();
pRightCol->DirRightCollision();
}
else
{
pLeftCol->DirUpCollision();
pRightCol->DirDownCollision();
}
}
else if (pLeftPos.x <= pRightPos.x && pLeftPos.y <= pRightPos.y) // 좌상단
{
Vec2 pLeftVertex = pLeftPos + Vec2(+pLeftScale.x / 2, +pLeftScale.y / 2);
Vec2 pRightVertex = pRightPos + Vec2(-pRightScale.x / 2, -pRightScale.y / 2);
if (pLeftVertex.y < pRightVertex.y)
{
pLeftCol->DirDownCollision();
pRightCol->DirUpCollision();
}
else
{
pLeftCol->DirRightCollision();
pRightCol->DirLeftCollision();
}
}
else if (pLeftPos.x <= pRightPos.x && pLeftPos.y > pRightPos.y) // 좌하단
{
Vec2 pLeftVertex = pLeftPos + Vec2(+pLeftScale.x / 2, -pLeftScale.y / 2);
Vec2 pRightVertex = pRightPos + Vec2(-pRightScale.x / 2, +pRightScale.y / 2);
if (pLeftVertex.y < pRightVertex.y)
{
pLeftCol->DirRightCollision();
pRightCol->DirLeftCollision();
}
else
{
pLeftCol->DirUpCollision();
pRightCol->DirDownCollision();
}
}
else
{
assert(nullptr);
}
|
cs |
'개인공부 > Win32API' 카테고리의 다른 글
2D 게임 만들기(4) (0) | 2023.01.17 |
---|---|
2D 게임만들기(3) (0) | 2023.01.15 |
2D게임 만들기(1) (2) | 2023.01.13 |
발판 구현 (0) | 2023.01.12 |
RigidBody2D (0) | 2023.01.11 |