注册 登录
编程论坛 VC++/MFC

我要崩溃了 怎么都找不出来为什么

死了都要C 发布于 2012-02-26 17:40, 738 次点击

我做的是推箱子程序,逻辑是没问题的,但是现在画图出问题了。
 
先看图吧
 
这说要推时的样子:
  

只有本站会员才能查看附件,请 登录



这是推了后样子, 空位直接被覆盖掉了,问题就是这里, 怎么都找不到原因。
 
只有本站会员才能查看附件,请 登录



但是推箱子的英雄却是没问题的啊蓝色圆圈:


只有本站会员才能查看附件,请 登录



 
下面是画图的代码:
程序代码:
        case WM_PAINT:
        {
            HDC hdc;
            PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd, &ps);

            mg.SetGDC(hdc);

            mg.DrawMap(txz.GetZAV());
            mg.DrawMB(txz.GetMBV());
            mg.DrawXZ(txz.Getxzv());
            mg.DrawHR(txz.GetHP());
           
            EndPaint(hwnd,&ps);
        }



void CXZMG:: DrawMap(vector<POINT>* _za) //绘制地图迷宫
{
    if (m_hdc != NULL)
    {
        HBRUSH  brush1 = CreateSolidBrush(0x00000000), oldbrs;    //黑色画刷
        oldbrs = (HBRUSH)SelectObject(m_hdc, brush1);            //换画刷
        Rectangle(m_hdc, SX, SY, SX + m_W*(JS + JG) - JG, SY + m_H*(JS + JG) - JG);//画黑色背景

        HBRUSH  brush2 = CreateSolidBrush(0x000000FF);  //换红色画刷
        SelectObject(m_hdc, brush2);

        vector<POINT>::iterator b = _za->begin(), e = _za->end();
        for (; b != e; ++b)
        {
            int  l = SX + (*b).x * (JS + JG), t = SY + (*b).y * (JS + JG);
            int  r = l + JS, b = t + JS;

            Rectangle(m_hdc, l, t, r, b); //根据每个障碍障碍物的坐标画障碍物
        }

        SelectObject(m_hdc, oldbrs);//恢复原来的刷子

        DeleteObject(brush1);
        DeleteObject(brush2);
    }
}

void CXZMG:: DrawMB(vector<POINT>* mbv)
{
    if (m_hdc != NULL)
    {
        HBRUSH  brush = CreateSolidBrush(0x00FFFFFF),oldbrs;      
        HPEN    pen   = CreatePen(PS_SOLID,2,0x0000FF00), oldpen;

        oldbrs = (HBRUSH)SelectObject(m_hdc, brush);//换白色刷子刷白色空心
        oldpen = (HPEN)SelectObject(m_hdc, pen);    //换绿色画笔画边框

        vector<POINT>::iterator b = mbv->begin(), e = mbv->end();
        for (; b != e; ++b)
        {
            int  l = SX + (*b).x * (JS + JG), t = SY + (*b).y * (JS + JG);
            int  r = l + JS, d = t + JS;

            Rectangle(m_hdc, l, t, r, d);//画空位
        }

        SelectObject(m_hdc, oldbrs);//恢复
        SelectObject(m_hdc, oldpen);//恢复
        DeleteObject(brush);
        DeleteObject(pen);
    }
}

void CXZMG:: DrawXZ(vector<POINT>* _xz)//绘制所有箱子 传入箱子的坐标点表
{
    if (m_hdc != NULL)
    {
        HBRUSH  brush = CreateHatchBrush(HS_DIAGCROSS,0x000000ff),oldbrs;
        HPEN    pen   = CreatePen(PS_SOLID,1, 0x00ffffff),oldpen;

        oldbrs = (HBRUSH)SelectObject(m_hdc, brush);    //换网格刷子
        oldpen = (HPEN)SelectObject(m_hdc, pen);        //白色边框

        vector<POINT>::iterator b = _xz->begin(), e = _xz->end();
        for (; b != e; ++b)
        {
            int  l = SX + (*b).x * (JS + JG), t = SY + (*b).y * (JS + JG);
            int  r = l + JS, d = t + JS;

            Rectangle(m_hdc,l+3, t+3, r-3, d-3);
        }
        SelectObject(m_hdc, oldbrs);//恢复
        SelectObject(m_hdc, oldpen);//恢复
        DeleteObject(pen);
        DeleteObject(brush);
    }
}

void CXZMG:: DrawHR(POINT hp)    //绘制英雄 传入英雄的坐标
{
    if (m_hdc != NULL)
    {
        HBRUSH  brush = CreateSolidBrush(0x00FF0000),oldbrs;
        HPEN    pen   = CreatePen(PS_SOLID,1, 0x00FF0000),oldpen;

        oldbrs = (HBRUSH)SelectObject(m_hdc, brush); //蓝色画刷
        oldpen = (HPEN)SelectObject(m_hdc, pen);     //蓝色边框

        Ellipse(m_hdc, SX + hp.x * (JS+JG)+JG,
                       SY + hp.y * (JS+JG)+JG,
                       SX + hp.x * (JS+JG)+JS -JG-1,
                       SY + hp.y * (JS+JG)+JS -JG-1);

        SelectObject(m_hdc, oldbrs);//恢复
        SelectObject(m_hdc, oldpen);//恢复
        DeleteObject(pen);
        DeleteObject(brush);
    }





[ 本帖最后由 死了都要C 于 2012-2-26 17:44 编辑 ]
7 回复
#2
死了都要C2012-02-26 17:55
坐等···
#3
死了都要C2012-02-26 18:11
不等了
#4
yuccn2012-02-29 14:19
只有本站会员才能查看附件,请 登录


我这边绘图很正常。。
怀疑你绘图没有问题的,应该是
mg.DrawMB(txz.GetMBV());
和mg.DrawXZ(txz.Getxzv());

中txz.GetMBV 和txz.Getxzv没有重叠点,应该是程序逻辑有问题的。每一关中,txz.GetMBV中的数据是不变的,是不是你的程序在某个箱子移动到了那个位置时候,对应的GetMBV值被改变了而没有画出来?

代码还有个严重的问题,可读性很差。。命名方面注意一点。

加油。
#5
mayuebo2012-03-01 10:46
算法设计有问题.设置墙壁和箱子不可以走
#6
BianChengNan2012-03-02 15:25
回去跑一下,跟一下
#7
豆腐佬2012-03-06 14:10
我之前见了个控制台程序和这个类似,调试一下就知道错在哪里了。
我猜是在接收“上下左右”消息时,根据下一个iGk[next](一个10*10的数组来表示第一关)是什么(比如箱子/空位/目的地/箱子在目的地),然后对应的改变数组,就是在改变数组这个地方出的错。具体一点,就是当按了下时,若前方是箱子,箱子的前方是目的地,移动了之后,就应该是当前为空位,前方为人,前前方为“箱子在目的地”而不是“箱子”.
#8
豆腐佬2012-03-06 15:33
回复 7楼 豆腐佬
还有一种可能就是画图时,画“箱子在目的地”时画错
1