游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1836|回复: 6

哪位大哥帮我看看这程序,万分感谢啊!!

[复制链接]

12

主题

42

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2009-8-5 09:55:00 | 显示全部楼层 |阅读模式
很简单的粒子系统的初始化,更新,和渲染,但是不知道为什么会有堆栈错误,我检查了一个小时了,还是没有发现问题!
另外链表是我自己写的,对<LIST>不熟悉,不敢用!!谢谢了!!
struct CUS_VERTEX
{
        D3DXVECTOR3 pos;
        D3DCOLOR color;
};
const DWORD FVF = (D3DFVF_XYZ |  D3DFVF_DIFFUSE);

struct PARTICLE
{
        D3DXVECTOR3 p_pos;
        D3DXVECTOR3 p_vel;
        D3DCOLOR p_color;
        PARTICLE *p_next;
};
PARTICLE *particle;

PARTICLE* initParticle(int numParticle)
{
        PARTICLE *particleHead,*particleTemp,*particleEnd;
        particleHead=particleTemp=(PARTICLE*)malloc(sizeof(PARTICLE));
        particleTemp->p_pos=D3DXVECTOR3(-5.0f,-4.0f,0.0f);
        particleTemp->p_vel=D3DXVECTOR3((float)rand()/RAND_MAX,(float)rand()/RAND_MAX,(float)rand()/RAND_MAX);
        particleTemp->p_color=D3DCOLOR_ARGB(255,23,25,155);
        particleHead->p_next=particleTemp;
        if(numParticle==1)
        {
                particleTemp->p_next=NULL;;
        }
        else
        {
                do
                {
                particleEnd=(PARTICLE*)malloc(sizeof(PARTICLE));
                particleTemp->p_next=particleEnd;
                particleTemp=particleEnd;
                particleTemp->p_pos=D3DXVECTOR3(3.0f,0.0f,0.0f);
                particleTemp->p_vel=D3DXVECTOR3((float)rand()/RAND_MAX,(float)rand()/RAND_MAX,(float)rand()/RAND_MAX);
                particleTemp->p_color=D3DCOLOR_ARGB(255,23,25,155);
                numParticle--;
                }while(numParticle>1);
                particleTemp->p_next=NULL;
        }
        return particleHead;
}


void updateParticle(PARTICLE *tempParticle,int numParticle)
{
        PARTICLE *particle,*particlet;
        particle=tempParticle->p_next;
        for(int i=0;i<numParticle;i++)
        {
                particle->p_pos+=particle->p_vel*0.01f;
                particlet=particle->p_next;
                particle=particlet;
        }
}

void renderParticle(PARTICLE *tempParticle,int numParticle)
{
        g_pd3ddevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );

    g_pd3ddevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
    g_pd3ddevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );

        // enable pointsprite render states

        // turn on pointsprites
    g_pd3ddevice->SetRenderState( D3DRS_POINTSPRITEENABLE, TRUE );
        // enable scaling
    g_pd3ddevice->SetRenderState( D3DRS_POINTSCALEENABLE,  TRUE );
        // the point size to use when the vertex does not include this information
    g_pd3ddevice->SetRenderState( D3DRS_POINTSIZE,     FLOAT_TO_DWORD(1.0f) );
        // the minimum size of the points
    g_pd3ddevice->SetRenderState( D3DRS_POINTSIZE_MIN, FLOAT_TO_DWORD(1.0f) );
        // these three renderstates control the scaling of the pointsprite
    g_pd3ddevice->SetRenderState( D3DRS_POINTSCALE_A,  FLOAT_TO_DWORD(0.0f) );
    g_pd3ddevice->SetRenderState( D3DRS_POINTSCALE_B,  FLOAT_TO_DWORD(0.0f) );
    g_pd3ddevice->SetRenderState( D3DRS_POINTSCALE_C,  FLOAT_TO_DWORD(1.0f) );

        CUS_VERTEX* tempVertex;
        PARTICLE* particle;
        particle=tempParticle->p_next;
        Cube->Lock(0,numParticle*sizeof(CUS_VERTEX),(void**)&tempVertex,D3DLOCK_DISCARD);
        for(int i=0;i<numParticle;i++)
        {
                tempVertex->pos=particle->p_pos;
                tempVertex->color=particle->p_color;
                particle=particle->p_next;
                tempVertex++;
        }
        Cube->Unlock();
        g_pd3ddevice->SetTexture( 0, Map );
    g_pd3ddevice->SetStreamSource( 0, Cube, 0, sizeof(CUS_VERTEX) );
    g_pd3ddevice->SetFVF( FVF );
        g_pd3ddevice->DrawPrimitive( D3DPT_POINTLIST, 0, numParticle );

    // Reset render states...
    g_pd3ddevice->SetRenderState( D3DRS_POINTSPRITEENABLE, FALSE );
    g_pd3ddevice->SetRenderState( D3DRS_POINTSCALEENABLE,  FALSE );
    g_pd3ddevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
    g_pd3ddevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
}

12

主题

42

帖子

46

积分

注册会员

Rank: 2

积分
46
 楼主| 发表于 2009-8-5 12:20:00 | 显示全部楼层

Re: 哪位大哥帮我看看这程序,万分感谢啊!!

帮帮忙啊给位,我整了一上午了,还是不能运行!!

0

主题

10

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2009-8-5 16:02:00 | 显示全部楼层

Re:哪位大哥帮我看看这程序,万分感谢啊!!

updateParticle里面“particle=tempParticle->p_next”要改成“particle=tempParticle”否则直接跳过了第一个节点,遍历的时候多往后了一个节点,遍历到最后一个元素就出错了,renderParticle里面也是一样道理,“particle=tempParticle->p_next”改成“particle=tempParticle”。看来楼主还不太清楚链表的结构啊,不过像这里这种情况完全可以用数组嘛,因为粒子数最大值是确切知道的。

12

主题

42

帖子

46

积分

注册会员

Rank: 2

积分
46
 楼主| 发表于 2009-8-5 16:36:00 | 显示全部楼层

Re:哪位大哥帮我看看这程序,万分感谢啊!!

但是我不明白,传递给tempParticle只是一个头指针,这个头这指针并没有实际的.p_pos.p_vel.p_color这些元素啊!!
而且我在initParticle里设计的形式是,传递数值1,生成particleHead->particleTemp这种形式的链表啊!!

12

主题

42

帖子

46

积分

注册会员

Rank: 2

积分
46
 楼主| 发表于 2009-8-5 16:47:00 | 显示全部楼层

Re:哪位大哥帮我看看这程序,万分感谢啊!!

三楼的大哥果然是对的,但是我还是不是很明白,我觉得我是这样的的比如我初始化十个粒子,那生成的链表就是这样!!
particleHead->particle1->particle2->particle3->particle4->particle5->particle6->particle7->particle8->particle9->particle10->NULL,我认为的是particleHead基本上就.p_next有资料,别的可以认为是废料或者没资料。
然后把particleHead传入updateParticle(particleHead,10),这个particle=tempParticle->p_next是在循环外面,直接从particle1开始,一个for循环10次,renderParticle同理,为什么有错??

0

主题

10

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2009-8-5 17:58:00 | 显示全部楼层

Re:哪位大哥帮我看看这程序,万分感谢啊!!

抛弃头指针是可以的,但是你在initParticle里所写的又似乎是跟这一想法相悖的。
你首先particleHead=particleTemp=(PARTICLE*)malloc(sizeof(PARTICLE));
事实上是把particleHead和particleTemp两个指针指向了同一片被malloc分配的内存,而不是两个指针各开辟一个地址,所以之后particleTemp->p_pos=D3DXVECTOR3(3.0f,0.0f,0.0f);什么的这些其实等同于给particleHead赋值
。然后particleHead->p_next=particleTemp;事实上是head的next指向了自己!
所以感觉楼主对指针的概念还是很模糊哦!

12

主题

42

帖子

46

积分

注册会员

Rank: 2

积分
46
 楼主| 发表于 2009-8-5 18:09:00 | 显示全部楼层

Re: 哪位大哥帮我看看这程序,万分感谢啊!!

哦,谢谢谢谢,这回真的弄懂了!高人!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-21 16:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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