游戏开发论坛

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

求在MFC框架下,降雨效果的源代码(粒子系统)

[复制链接]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-12-12 08:36:00 | 显示全部楼层 |阅读模式
    本人是新手,现在正在尝试模拟降雨,有哪位前辈做过这个小模块,希望能借鉴下,在此多谢了

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-12-13 16:39:00 | 显示全部楼层

Re: 求在MFC框架下,降雨效果的源代码(粒子系统)

写了一个类,你自己看吧

//2008-10-16
//模拟粒子系统效果雨
//李世铭
#pragma once
#define PARTICLENUM 300

//雨点粒子结构
struct RAINVERTEX
{
        D3DXVECTOR3 vPos;
        DWORD                dwColor;
};
#define D3DFVF_RAINVERTEX                (D3DFVF_XYZ | D3DFVF_DIFFUSE)

struct RainParticle
{
        float x,y,z;        //位置;
        float fDspeed;        //下降速度;
};


class CRain
{
public:
        CRain(LPDIRECT3DDEVICE9 pDevice);
        ~CRain();
        HRESULT        InitRain(LPDIRECT3DDEVICE9 pDevice);
        VOID        UpDate(float fElapsedTime);
        VOID        Render();
        VOID    CleanUp();
private:
        LPDIRECT3DDEVICE9                m_pDevice;
        LPDIRECT3DVERTEXBUFFER9        _pRainVB;        //雨点粒子顶点缓冲
        D3DXMATRIXA16                        _matWorld;        //雨点世界矩阵
        D3DXVECTOR3                                _rainDir;        //雨点的下降方向
        RainParticle rain[PARTICLENUM];                //雨点粒子数组
};




#include "stdafx.h"

CRain::CRain(LPDIRECT3DDEVICE9 pDevice)
{
        m_pDevice = pDevice;
        _pRainVB = NULL;
}

CRain::~CRain()
{

}

HRESULT        CRain::InitRain(LPDIRECT3DDEVICE9 pDevice)
{
        //创建雨点顶点缓冲区
        if (FAILED(pDevice->CreateVertexBuffer( 2*sizeof(RAINVERTEX),
                0, D3DFVF_RAINVERTEX,
                D3DPOOL_MANAGED, &_pRainVB, NULL )))
        {
                return E_FAIL;
        }

        //填充雨点顶点缓冲区
        RAINVERTEX*                pRainVerteices;
        _pRainVB->Lock(0,0,(void**)&pRainVerteices,0);
        pRainVerteices[0].vPos = D3DXVECTOR3(1,4,0);
        pRainVerteices[0].dwColor = 0xFFDDDDDD;
        pRainVerteices[1].vPos = D3DXVECTOR3(2,1,0);
        pRainVerteices[1].dwColor = 0xFFDDDDDD;
        _pRainVB->Unlock();
       
        return S_OK;
}

VOID        CRain::UpDate(float fElapsedTime)
{
        //初始化雨点数组
        for (int i=0;i&ltARTICLENUM;i++)
        {
                //rain.x = GetRandFloat(-256,256);
                //rain.y = GetRandFloat(0,256);
                //rain.z = GetRandFloat(-256,256);
                //rain.fDspeed = GetRandFloat(1500,2000);
                rain.x = float(rand()%400-200);
                rain.z = float(rand()%400-200);
                rain.y = float(rand()%250);
                rain.fDspeed = 10.0f + (rand()%40);
        }
        //计算雨点下降方向
        //_rainDir = D3DXVECTOR3(GetRandFloat(0,3),0,GetRandFloat(3,8)) - D3DXVECTOR3(GetRandFloat(0,3),GetRandFloat(0,3),0);
        _rainDir = D3DXVECTOR3(3, 1, 0) - D3DXVECTOR3(1, 5, 0);;
        D3DXVec3Normalize(&_rainDir, &_rainDir);

        //计算每个雨点的当前位置
        for (int i=0;i<PARTICLENUM;i++)
        {
                if (rain.y < 0)
                {
                        rain.y = 2000.0f;
                }
                if (rain.x > 3500)
                {
                        rain.x = GetRandFloat(-50,0);
                }
                if (rain.z > 3500)
                {
                        rain.z = GetRandFloat(-50,0);
                }
                rain.x += rain.fDspeed * _rainDir.x *fElapsedTime;
                rain.y += rain.fDspeed * _rainDir.y * fElapsedTime;
                rain.z += rain.fDspeed * _rainDir.z * fElapsedTime;

        }

}

VOID        CRain::Render()
{
        m_pDevice->SetTexture( 0, NULL );

        for (int i=0;i<PARTICLENUM;i++)
        {
                D3DXMatrixTranslation(&_matWorld, rain.x, rain.y, rain.z);
                m_pDevice->SetTransform( D3DTS_WORLD,  &_matWorld );
                m_pDevice->SetStreamSource(0,_pRainVB,0,sizeof(RAINVERTEX));
                m_pDevice->SetFVF(D3DFVF_RAINVERTEX);
                m_pDevice->DrawPrimitive(D3DPT_LINELIST,0,1);
        }

}

VOID        CRain::CleanUp()
{
        SAFE_RELEASE(_pRainVB);
        SAFE_RELEASE(m_pDevice);
}

11

主题

336

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
发表于 2008-12-16 13:42:00 | 显示全部楼层

Re: 求在MFC框架下,降雨效果的源代码(粒子系统)

雨用粒子太浪费了=_=

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2008-12-18 10:37:00 | 显示全部楼层

Re: 求在MFC框架下,降雨效果的源代码(粒子系统)

那还有什么好的高效的方法吗?

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2008-12-19 10:54:00 | 显示全部楼层

Re:求在MFC框架下,降雨效果的源代码(粒子系统)

一楼这个类在调用的时候,是怎么调用的啊?我用的时候总是出现中断问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 16:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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