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