游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3630|回复: 2

像素碰撞问题

[复制链接]

5

主题

21

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2012-10-10 17:28:00 | 显示全部楼层 |阅读模式
bool CDemoGame::isCollision(CSprite* pSprite1,CSprite* pSprite2)
{
        if (!pSprite1->CollideWith((*pSprite2)))
        {
                return false;
        }
       
       
        int intersectLeft = pSprite1->GetSpriteRect()->left > pSprite2->GetSpriteRect()->left ? pSprite1->GetSpriteRect()->left : pSprite2->GetSpriteRect()->left;
        int intersectTop = pSprite1->GetSpriteRect()->top > pSprite2->GetSpriteRect()->top  ? pSprite1->GetSpriteRect()->top : pSprite2->GetSpriteRect()->top ;
        int intersectRight = pSprite1->GetSpriteRect()->right < pSprite2->GetSpriteRect()->right  ? pSprite1->GetSpriteRect()->right  : pSprite2->GetSpriteRect()->right ;
        int intersectBottom = pSprite1->GetSpriteRect()->bottom  < pSprite2->GetSpriteRect()->bottom ? pSprite1->GetSpriteRect()->bottom  : pSprite2->GetSpriteRect()->bottom ;
        int intersectWidth = intersectRight - intersectLeft;
        int intersectHeight = intersectBottom - intersectTop;


        int thisImageXOffset = intersectLeft - pSprite1->GetSpriteRect()->left;
        int thisImageYOffset = intersectTop - pSprite1->GetSpriteRect()->top;
        int otherImageXOffset = intersectLeft - pSprite2->GetSpriteRect()->left;
        int otherImageYOffset = intersectTop - pSprite2->GetSpriteRect()->top;



        LPDIRECT3DTEXTURE9 pTexture1;
        LPDIRECT3DTEXTURE9 pTexture2;

        pTexture1 = (LPDIRECT3DTEXTURE9)(pResManager->GetResource(RES_TEX,pSprite1->GetResName()))->dwHandle;
        pTexture2 = (LPDIRECT3DTEXTURE9)(pResManager->GetResource(RES_TEX,pSprite2->GetResName()))->dwHandle;

        bool isCollison = DoPixelCollison(thisImageXOffset,thisImageYOffset,otherImageXOffset,
                otherImageYOffset,pTexture1,pTexture2,
                intersectWidth,intersectHeight);
        return isCollison;
}

bool CDemoGame:oPixelCollison(int firstXOffset, int firstYOffset, int secondXOffset, int secondYOffset,
        LPDIRECT3DTEXTURE9 pTexture1, LPDIRECT3DTEXTURE9 pTexture2, int intersectWidth, int intersectHeight)
{
        D3DLOCKED_RECT lock1;
        D3DLOCKED_RECT lock2;

        DWORD *pPixel1 = new DWORD[intersectHeight*intersectWidth];
        DWORD *pPixel2 = new DWORD[intersectHeight*intersectWidth];
        memset(pPixel1,0,intersectHeight*intersectWidth);
        memset(pPixel2,0,intersectHeight*intersectWidth);

        RECT rt1 = {firstXOffset,firstYOffset,firstXOffset+intersectWidth,firstYOffset+intersectHeight};
        RECT rt2 = {secondXOffset,secondYOffset,secondXOffset+intersectWidth,secondYOffset+intersectHeight};


        pTexture1->LockRect(0,&lock1,&rt1,0);
        DWORD *p = (DWORD*)lock1.pBits;
        for (int row = 0; row < intersectHeight; row++)
        {
                for (int col = 0; col < intersectWidth; col++)
                {
                        pPixel1[row * intersectWidth + col] = p[row * intersectWidth + col];
                        p[row * intersectWidth + col] = D3DXCOLOR(1,1,1,1);
                }
        }
        pTexture1->UnlockRect(0);

        pTexture2->LockRect(0,&lock2,&rt2,0);
        DWORD *p1 = (DWORD*)lock2.pBits;
        for (int row1 = 0; row1 < intersectHeight; row1++)
        {
                for (int col1 = 0; col1 < intersectWidth; col1++)
                {
                        pPixel2[row1 * intersectWidth + col1] = p1[row1 * intersectWidth + col1];

                        p1[row1 * intersectWidth + col1] = D3DXCOLOR(1,1,1,1);
                }
        }
        pTexture2->UnlockRect(0);
       
        for (int n = 0; n< intersectHeight; n++)
        {
                for (int m = 0; m < intersectWidth; m++)
                {
                        D3DXCOLOR c1 = (D3DXCOLOR)pPixel1[n * intersectWidth + m];
                        D3DXCOLOR c2 = (D3DXCOLOR)pPixel2[n * intersectWidth + m];

                        if (c1.a !=0 &&c2.a!=0)
                        {
               
                                delete []pPixel1;
                                delete []pPixel2;
                                pPixel1 = NULL;
                                pPixel2 = NULL;
                                return true;
                        }
                }
        }
       
        delete []pPixel1;
        delete []pPixel2;
        pPixel1 = NULL;
        pPixel2 = NULL;
        return false;
}

我这里的像素碰撞总是出问题。。
求大神解答..
求技术实现细节

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-10-15 18:30:00 | 显示全部楼层

Re: 像素碰撞问题

你的代码,好乱,我还是直接贴我自己的代码吧,纯C函数,也无封装.
PS:我拿他做过游戏,可以保证是没有问题的。

5

主题

21

帖子

82

积分

注册会员

Rank: 2

积分
82
 楼主| 发表于 2012-10-16 13:38:00 | 显示全部楼层

Re: Re: 像素碰撞问题

微无渊: Re: 像素碰撞问题

你的代码,好乱,我还是直接贴我自己的代码吧,纯C函数,也无封装.
PS:我拿他做过游戏,可以保证是没有问题的。

感谢你,搞定了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-27 12:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表