7. 적과의 충돌체크

DX 2D비행슈팅강좌 | 2009/07/11 03:23 | 날자고도
====== DX 2D비행슈팅강좌 ======
===== 7. 적과의 충돌체크 =====
엘군의 요청에 따라 충돌체크


1. 적의 게이지를 만들어준다.
2. 적도 보이기 상태를 TRUE로 해준다.
3. 충돌체크하고 게이지 깍기
4. 적의 게이지 판별
5, 적 그릴때 그릴지 판별






1. 적의 게이지를 만들어준다.
INT g_EnemyGage = 200;





2. 적도 보이기 상태를 TRUE로 해준다.
g_Enemy.Visible = TRUE;





3. 충돌체크하고 게이지 깍기
for (INT i=0; i<100; ++i)
{
        // 보이는 총알 중에
        if ( g_Bullet[i].Visible == TRUE )
        {

                // 충돌 되었으면
                if ( g_Bullet[i].Position.x < g_Enemy.Position.x + g_Enemy.Source.right
                        &&g_Enemy.Position.x < g_Bullet[i].Position.x + g_Bullet[i].Source.right
                        &&g_Bullet[i].Position.y < g_Enemy.Position.y + g_Enemy.Source.bottom
                        &&g_Enemy.Position.y < g_Bullet[i].Position.x + g_Bullet[i].Source.bottom
                        )
                {

                        // 충돌한 총알은 안보이고, 게이지 깍기
                        if ( g_EnemyGage >= 0 )
                        {
                                g_Bullet[i].Visible = FALSE;
                                g_EnemyGage--;
                        }
                }

        }

}

2개의 사각형이 겹치면 충돌체크로 판단한다.
100개의 총알을 하나하나씩 충돌체크를 하며,
충돌판정이 일어나면, 적의 게이지를 깍는다.
그리고, 총알을 보이지 않게 한다.





4. 적의 게이지 판별
if ( g_EnemyGage <= 0 )
{
        g_Enemy.Visible = FALSE;
}

적의 게이지가 0보다 작으면 안보이게 한다.





5, 적 그릴때 그릴지 판별
if ( g_Enemy.Visible == TRUE )
        g_pSprite->Draw( g_Enemy.Texture, &g_Enemy.Source, &g_Enemy.Center, &g_Enemy.Position, 0xffffffff );

이전에는 그냥 그렸는데, 지금은 적의 그릴지 여부를 판단해서 그린다.

6. 적등장시키기

DX 2D비행슈팅강좌 | 2009/07/11 03:22 | 날자고도
====== DX 2D비행슈팅강좌 ======
===== 6. 적등장시키기 =====
1. 구조체이름바꾸기
2. 적 인스턴스 생성
3. 적 이미지를 초기화
4. 플레이어 위치 수정
5. 적이미지 로딩
6. 적cirno양 그리기




1. 구조체이름바꾸기
struct Image
{
        BOOL Visible;
        LPDIRECT3DTEXTURE9 Texture;
        RECT Source;
        D3DXVECTOR3 Position;
        D3DXVECTOR3 Center;
};

구조체 내용이 이미지를 담고 있어서 Image로 수정하였습니다





2. 적 인스턴스 생성
Image g_Enemy;





3. 적 이미지를 초기화
ZeroMemory(&g_Enemy, sizeof(g_Enemy));
g_Enemy.Source.left = 0;
g_Enemy.Source.top = 0;
g_Enemy.Source.right = 179;
g_Enemy.Source.bottom = 238;

g_Enemy.Position.x = 150.0f;
g_Enemy.Position.y = 10.0f;

이미지 크기대로 넣어주었고, 처음 위치를 x150.0f y10.0f로 하였습니다.





4. 플레이어 위치 수정
vecPosition.x = 300.0f;
vecPosition.y = 450.0f;

이제 적도 생겼으니, 플레이어가 내려와야 겠죠.



5. 적이미지 로딩
D3DXCreateTextureFromFileEx( g_pd3dDevice, "cirno.jpg",
        D3DX_DEFAULT_NONPOW2 , D3DX_DEFAULT_NONPOW2 ,
        1, NULL, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
        D3DX_FILTER_NONE, D3DX_FILTER_NONE, NULL, NULL, NULL, &g_Enemy.Texture);

오늘의 가상적으로 cirno양이 수고해 주셨습니다.
그런데 이미지를 불러오는 함수를 바꾸었습니다.
이 함수가 좋은것은 세부 인자값을 줄수 있습니다.
저번에 사용한 함수로 하면, 늘어져서 나옵니다.
그래서, 이미지를 늘리지말고, 필터를 주지 말라고 넣었습니다.




6. 적cirno양 그리기
g_pSprite->Draw( g_Enemy.Texture, &g_Enemy.Source, &g_Enemy.Center, &g_Enemy.Position, 0xffffffff );

별거 없습니다. 한줄 더 추가 한것 밖에

5. 여러개의 총알발사

DX 2D비행슈팅강좌 | 2009/07/11 03:22 | 날자고도
====== DX 2D비행슈팅강좌 ======
===== 5. 여러개의 총알발사 =====
1. 총알 구조체 생성
2. 구조체의 인스턴스 생성
3. 이미지의 좌표설정
4. 이미지 부르기
5. 이미지와, 이미지의 영역복사
6. 보이지 않는것을 찾아서 발사
7. 총알 이동
8. 총알을 모두 그리기





1. 총알 구조체 생성
struct Bullet
{
        BOOL Visible;
        LPDIRECT3DTEXTURE9 Texture;
        RECT Source;
        D3DXVECTOR3 Position;
        D3DXVECTOR3 Center;
};

보여주고 있는지, 이미지의 좌표등등을 담은 구조체를 생성한다.





2. 구조체의 인스턴스 생성
Bullet g_Bullet[100];

넉넉하게 100개를 만든다.




3. 이미지의 좌표설정
ZeroMemory(&g_Bullet, sizeof(g_Bullet));
g_Bullet[0].Source.left = 0;
g_Bullet[0].Source.top = 0;
g_Bullet[0].Source.right = 13;
g_Bullet[0].Source.bottom = 26;

하나만 설정한다.





4. 이미지 부르기
D3DXCreateTextureFromFile(g_pd3dDevice, "bullet.jpg", &g_Bullet[0].Texture);

대표로 하나만 부른다.




5. 이미지와, 이미지의 영역복사
for (INT i=1; i<100; ++i)
{
        g_Bullet[i].Texture = g_Bullet[0].Texture;
        g_Bullet[i].Source = g_Bullet[0].Source;
}

나머지 99개가 같으므로 복사를 한다.





6. 보이지 않는것을 찾아서 발사
if (GetKeyState(0x5a) & 0x80000000)
{
        for (INT i=0; i<100; ++i)
        {
                if ( g_Bullet[i].Visible == FALSE )
                {
                        g_Bullet[i].Visible = TRUE;
                        g_Bullet[i].Position.x = vecPosition.x + 60.0f - 6.0f;
                        g_Bullet[i].Position.y = vecPosition.y;
                        break;
                }
        }
}

총알발사를 누르면, 보이지 않는 오브젝트를 보이기값에 TRUE를 넣고,
위치를 설정한다.






7. 총알 이동
for (INT i=0; i<100; ++i)
{
        if ( g_Bullet[i].Visible == TRUE )
        {
                g_Bullet[i].Position.y -= 5.0f;
        }

        if ( g_Bullet[i].Position.y < -40.0f )
        {
                g_Bullet[i].Visible = FALSE;
        }

}

총알이 보이기 상태이면, 이동하고,
위치가 화면을 벗어나면, 보이기 상태를 해제한다.





8. 총알을 모두 그리기
for ( INT i=0; i<100; ++i )
{
        if ( g_Bullet[i].Visible == TRUE )
        {
                g_pSprite->Draw(g_Bullet[i].Texture, &g_Bullet[i].Source, &g_Bullet[i].Center, &g_Bullet[i].Position, 0xffffffff);
        }
}

아까와는 달리 인스턴스의 보이기값을 판별하여 그린다.

4. 총알 발사 시키기

DX 2D비행슈팅강좌 | 2009/07/11 03:21 | 날자고도
====== DX 2D비행슈팅강좌 ======
===== 4. 총알 발사 시키기 =====
1. 총알이미지 불러오기
2. 총알 이미지좌표설정
3. 총알 위치를 기억할 인스턴스 생성
4. 총알좌표 세팅
5. 총알 이동
6. 추가된 총알 이미지를 그린다.




1. 총알이미지 불러오기
LPDIRECT3DTEXTURE9 g_pBullet = NULL;
D3DXCreateTextureFromFile(g_pd3dDevice, "bullet.jpg", &g_pBullet);

별다른 내용이 없다. 총알이미지를 그림판에서 그려서 그 파일명만 넣었다.



2. 총알 이미지좌표설정
RECT rcSrcBullet;
rcSrcBullet.left = 0;
rcSrcBullet.top = 0;
rcSrcBullet.right = 13;
rcSrcBullet.bottom = 26;

그림의 이미지 영역을 넣는다.
이미지를 모두 사용하므로 13x26크기 만큼 넣었다.



3. 총알 위치를 기억할 인스턴스 생성
D3DXVECTOR3 vecPosBullet;

총알의 위치는 계속 기억되어야 하므로 전역으로 하나 만들었다.



4. 총알좌표 세팅
if (GetKeyState(0x5a) & 0x80000000)
{
        vecPosBullet.x = vecPosition.x + 60.0f - 6.0f;
        vecPosBullet.y = vecPosition.y;
        vecPosBullet.z = vecPosition.z;
}

총알의 동작원리는 간단하다.
사용자가 총알발사를 누르면, 비행기의 위치를 기준으로
총알 좌표를 이동한다.
60.0f는 비행기의 중심점이고, 6.0f는 총알의 반크기이다.
좌표는 좌상단기준이므로 6.0만큼 왼쪽으로 움직이면,
정중앙에 세팅하게 된다.



5. 총알 이동
if ( vecPosBullet.y > -40.0f )
{
        vecPosBullet.y -= 5.0f;
}

총알의 좌표가 화면영역안에 있으면,
위로 좌표를 이동한다.



6. 추가된 총알 이미지를 그린다.
g_pSprite->Draw(g_pBullet, &rcSrcBullet, &vecCenter, &vecPosBullet, 0xffffffff);

3. 이미지 이동하기

DX 2D비행슈팅강좌 | 2009/07/05 21:24 | 날자고도
====== DX 2D비행슈팅강좌 ======
===== 3. 이미지 이동하기 =====



if (GetKeyState(VK_LEFT) & 0x80000000)
{
        vecPosition.x -= 10.0f;
}

if (GetKeyState(VK_RIGHT) & 0x80000000)
{
        vecPosition.x += 10.0f;
}

if (GetKeyState(VK_UP) & 0x80000000)
{
        vecPosition.y -= 10.0f;
}

if (GetKeyState(VK_DOWN) & 0x80000000)
{
        vecPosition.y += 10.0f;
}



위치변수는 계속기억해야 하므로 전역으로 하였다.
윈도의 메시지 방식으로 키를 이동하면, 키속도 설정에따라
우리가 원하는 이동속도를 만들수가 없다.
그래서, 게임에서 이동은 GetKeyState함수를 사용하여 이동한다.
좌표값을 누적하므로 그렇게 어려운 기능은 아니다.
Prev 1 ... 15 16 17 18 19 20 Next