游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1875|回复: 4

在线等待:链表的问题

[复制链接]

7

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2007-11-24 10:25:00 | 显示全部楼层 |阅读模式
我写一段绘图的代码,缩略如下:
大意是循环精灵链表,将之绘出:
void CGame:rawUFO()
{
          CUFO*p = pUFO;//pUFO是链首
         for(p;p->next!=NULL;p=p->GetNext())
        {
                p->draw(m_lpDDBack,m_lpDDEnemy[1]);
             }
}
上面的代码是可行的,但是改成下面的:
void CGame::DrawUFO()
{
         for(pUFO;pUFO->next!=NULL;pUFO=p->GetNext())
        {
               pUFO->draw(m_lpDDBack,m_lpDDEnemy[1]);
             }
}
结果啥也没画出来;
把for语句改成while语句:
while(pUFO!=NULL)
        {
        pUFO->draw(m_lpDDBack,m_lpDDEnemy[1]);
                pUFO= pUFO->GetNext();
        }
这时候那几个图终于出来了,但是不会运动,
draw函数如下:
BOOL CUFO::draw(LPDIRECTDRAWSURFACE oragin, LPDIRECTDRAWSURFACE source)
{
RECT                rcRect;
//                HRESULT                hRet;
                int                        iDiffRight;
                int                        iDiffLeft;
                int                        iDiffBottom;
        rcRect.left = ArgPosX;
        rcRect.top = ArgPosY;
        rcRect.right = rcRect.left +70;
        rcRect.bottom = rcRect.right +70;
                rcRect.left = ArgPosX;
                        rcRect.top = ArgPosY;
                        rcRect.right = ArgPosX + 70;
                        rcRect.bottom = ArgPosY + 70;
                       
                        if (m_x+70>640)
                        {
                                iDiffRight = m_x+70-640;
                                rcRect.right -= iDiffRight;
                        }
                        else
                                iDiffLeft = 0;

                        if (m_x<0)
                        {
                                iDiffLeft = m_x * (-1);
                                rcRect.left += iDiffLeft;
                        }
                        else
                                iDiffLeft = 0;
                        if (m_y < 0)
                        {
                                iDiffBottom = m_y * (-1);
                                rcRect.top += iDiffBottom;
                        }
                        else
                                iDiffBottom = 0;
   oragin->BltFast(m_x+iDiffLeft, m_y+iDiffBottom, source, &rcRect, TRUE);
        move();
       
        ArgPosX +=70;
        if(ArgPosX ==350)
        {
                ArgPosX = 0;
                ArgPosY +=70;
                if(ArgPosY == 700)
                        ArgPosY = 0;
        }
    return TRUE;
}

为啥会这样啊!!!

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-11-24 11:46:00 | 显示全部楼层

Re:在线等待:链表的问题

你用判断NULL的方法跳出循环,但是循环链表一般情况下没有next是NULL的节点啊,那不就成了死循环。
你的链表是用来存一套精灵动画的不同帧,还是存一堆UFO的?如果是存不同帧,那应该每次DrawUFO()时直接画一帧当前节点的图,再把链表当前节点转到next上就行了。

7

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2007-11-24 12:24:00 | 显示全部楼层

Re:在线等待:链表的问题

我这个链表并非循环链表:
        pUFO= new CUFO;
                        pUFO->SetPos(20,300);
                        pUFO->setPrevious(NULL);
                        pUFO->setSeep(20);

                        CUFO*one = new CUFO;
                        one->SetPos(100,50);
                        pUFO->setNext(one);
                        one->setPrevious(pUFO);
                        one->setSeep(20);

            CUFO*two = new CUFO;
                        two->SetPos(70,80);
                        one->setNext(two);
                        two->setPrevious(one);
                        two->setSeep(20);

                        CUFO*three = new CUFO;
                        three->SetPos(100,110);
                        two->setNext(three);
                        three->setPrevious(two);
                        three->setSeep(20);

                        CUFO*four = new CUFO;
                        four->SetPos(150,50);
                        four->setPrevious(three);
                        three->setNext(four);
                        four->setSeep(20);

                        CUFO*five = new CUFO;
                        five->SetPos(180,80);
                        four->setNext(five);
                        five->setPrevious(four);
            five->setSeep(20);

                        CUFO*six = new CUFO;
                        six ->setPrevious(five);
                        five->setNext(six);
                        six->SetPos(150,110);
            six->setSeep(20);

                        six->setNext(NULL);
仅仅如此而已;链表中 存的是UFO的坐标,速度,
帮帮忙啊!

7

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2007-11-24 12:43:00 | 显示全部楼层

Re:在线等待:链表的问题

解决了,忘了重置重置链表头,谢谢您的帮忙!

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-11-24 15:03:00 | 显示全部楼层

Re:在线等待:链表的问题

你这是双链表啊

而且,你用p->next!=NULL作为继续执行循环的判断,会导致(以你的代码为例)six->draw(...)得不到执行,因为six->next就是NULL。你想飞6架UFO,实际上的确飞了6架,但是却用了7个链表节点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 08:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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