3D烟花屏保

  • z8_740772
    了解作者
  • 5.5MB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-14 01:09
    上传日期
一个简单的用OPENGL编写的烟花屏保的例子,学习OPENGL不久的人可以借鉴一下。
2_495.rar
  • DEMO3
  • Release
  • 三维烟花屏保.scr
    52KB
  • background1.bmp
    1.8MB
  • DEMO3.CPP
    25.6KB
  • Particle.bmp
    3.1KB
  • fmod.dll
    122.5KB
  • DEMO3.ncb
    41KB
  • DEMO3.dsw
    535B
  • background5.bmp
    1.8MB
  • resource.rc
    2.2KB
  • background6.bmp
    1.8MB
  • background3.bmp
    1.8MB
  • Text.bmp
    6.8KB
  • background2.bmp
    1.8MB
  • fmodvc.lib
    147.2KB
  • resource.h
    504B
  • fmod.h
    42.6KB
  • DEMO3.opt
    52.5KB
  • back.mid
    5.5KB
  • background4.bmp
    1.8MB
  • resource.aps
    16.9KB
  • FIREWORK1.wav
    884KB
  • Debug
  • Heart.bmp
    6.8KB
  • DEMO3.plg
    1.2KB
  • firework.wav
    55.9KB
  • DEMO3.dsp
    4.2KB
内容介绍
/* * This Code Was Created By Jeff Molofee 2000 * A HUGE Thanks To Fredric Echols For Cleaning Up * And Optimizing The Base Code, Making It More Flexible! * If You've Found This Code Useful, Please Let Me Know. * Visit My Site At nehe.gamedev.net */ #include <windows.h> // Header File For Windows #include <gl\gl.h> // Header File For The OpenGL32 Library #include <gl\glu.h> // Header File For The GLu32 Library //#include <gl\glaux.h> // Header File For The Glaux Library #include <time.h> #include <math.h> #include <scrnsave.h> #include "fmod.h" #include "resource.h" #include "commctrl.h " #pragma comment(lib, "comctl32.lib ") struct Image { unsigned long sizeX; unsigned long sizeY; char *data; }; typedef struct tag_PARTICLE { GLfloat xpos;//(xpos,ypos,zpos)为粒子的位置 GLfloat ypos; GLfloat zpos; GLfloat xspeed;//(xspeed,yspeed,zspeed)为粒子的速度 GLfloat yspeed; GLfloat zspeed; GLfloat r;//(r,g,b)为粒子的颜色 GLfloat g; GLfloat b; GLfloat life;//粒子的寿命 GLfloat fade;//粒子的衰减速度 GLfloat size;//粒子大小,可以接合粒子位置,计算边缘值 GLbyte bFire;//是否为烟花粒子,即代表烟花的粒子,这种粒子小于最大烟花数 GLbyte nExpl;//对应的爆炸效果,我们根据该值的不同来绘制多种效果 GLbyte bAddParts;//该粒子是否含有尾巴粒子 GLfloat AddSpeed;//尾巴粒子的增加速度 GLfloat AddCount;//尾巴粒子的增加量 tag_PARTICLE* pNext;//下一粒子结点 tag_PARTICLE* pPrev;//上一粒子结点 } Particle,*pParticle; pParticle Particles=NULL; //粒子链表 #define MAX_PARTICLES 1000 //最大粒子数 //#define MAX_FIRES 5 //最大烟花数 UINT MAX_FIRES = 5; //可以设置烟花数 UINT nOfFires=0; //当前的烟花数 UINT Tick1=0, Tick2=0; //由CPU的时钟来控制速度,防止在有些机器上粒子速度太快,效果不好 UINT Tick3=0, Tick4=0; float DTick; GLfloat grav=0.00003f; //引力大小为常量,但我们的烟花可不是物理真实的 GLuint textureID[7]; //粒子纹理和背景图片 Image *TextTexture[2];//另外网张用到的纹理图,这里保存其数据 const GLfloat PIAsp=0.0055555f*3.1416f;//1*PI/180 typedef struct tag_COLSH { float r; float g; float b; } ColSh; ColSh Col[2]; int nTexture=0; int nFixStyle=0; int fxTimer=10000; HDC hDC=NULL; // Private GDI Device Context HGLRC hRC=NULL; // Permanent Rendering Context HWND hWnd=NULL; // Holds Our Window Handle HINSTANCE hInstance; // Holds The Instance Of The Application bool keys[256]; // Array Used For The Keyboard Routine bool active=TRUE; // Window Active Flag Set To TRUE By Default bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default int fst=0; GLuint background; UINT uTimer; //################################# //------------------ sound system # //################################# FSOUND_STREAM *sound[3]; void CreateSound(char name[80], int num) { sound[num] = FSOUND_Stream_OpenFile(name, FSOUND_HW3D || FSOUND_LOOP_OFF,0); } void InitSound(void) { FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND); FSOUND_SetBufferSize(50); FSOUND_SetDriver(0); FSOUND_Init(44100, 32, 0); CreateSound("back.mid", 2); CreateSound("firework.wav", 0); CreateSound("firework1.wav", 1); } void BindSound(int num) { FSOUND_Stream_Play(FSOUND_FREE, sound[num]); } void CloseSound(int num) { FSOUND_Stream_Close(sound[num]); } void CloseAllSound() { for (int i=0;i<3;i++) { CloseSound(i); } } //粒子处理函数 //在粒子链表Particles中增加一个粒子 void AddParticle(Particle ex) { pParticle p; p=new Particle;//new 出一个粒子来 p->pNext=NULL;//以下开始填充粒子的各个属性 p->pPrev=NULL; p->b=ex.b; p->g=ex.g; p->r=ex.r; p->fade=ex.fade; p->life=ex.life; p->size=ex.size; p->xpos=ex.xpos; p->ypos=ex.ypos; p->zpos=ex.zpos; p->xspeed=ex.xspeed; p->yspeed=ex.yspeed; p->zspeed=ex.zspeed; p->AddCount=ex.AddCount; p->AddSpeed=ex.AddSpeed; p->bAddParts=ex.bAddParts; p->bFire=ex.bFire; p->nExpl=ex.nExpl; if(!Particles)//当前的粒子链表为空,也就是现在这个是第一个粒子 { Particles=p; return; } Particles->pPrev=p;//插入粒子,可以看出这是前插,你也可以改用后插的 p->pNext=Particles; Particles=p; } //删除一个指定的粒子 void DeleteParticle(pParticle* p) { if(!(*p))//当前结点为空,不作任何处理 return; if(!(*p)->pNext && !(*p)->pPrev)//孤立结点,直接删除 { delete (*p); *p=NULL; return; } pParticle tmp; if(!(*p)->pPrev)//首节点,需要记住下一个结点并使其成为首节点,然后再删除 { tmp=(*p); *p=(*p)->pNext; Particles=*p; (*p)->pPrev=NULL; delete tmp; return; } if(!(*p)->pNext)//末节点,使其前结点成为末节点,然后删除 { (*p)->pPrev->pNext=NULL; delete (*p); *p=NULL; return; } //一般情况,修改指针链,再删除 tmp=(*p); (*p)->pPrev->pNext=(*p)->pNext; (*p)->pNext->pPrev=(*p)->pPrev; *p=(*p)->pNext; delete tmp; } //删除所有的粒子 void DeleteAll(pParticle* Part) { while((*Part)) DeleteParticle(Part); } void InitParticle(Particle& ep) { ep.b=float(rand()%100)/60.0f;//初始颜色随机 ep.g=float(rand()%100)/60.0f; ep.r=float(rand()%100)/60.0f; ep.life=1.0f;//初始生命值满 ep.fade=0.005f+float(rand()%21)/10000.0f;//衰减速度随机 ep.size=1;//大小 ep.xpos=30.0f-float(rand()%601)/10.0f;//x、z的位置在屏幕范围内,y值固定在屏幕底部 ep.ypos=-24.0f; ep.zpos=20.0f-float(rand()%401)/10.0f; if(!int(ep.xpos))//初始化x方向速度,保证屏幕两侧的粒子都向中间运动 { ep.xspeed=0.0f; } else { if(ep.xpos<0) { ep.xspeed=(rand()%int(-ep.xpos))/1500.0f; } else { ep.xspeed=-(rand()%int(-ep.xpos))/1500.0f; } } ep.yspeed=0.04f+float(rand()%11)/1000.0f;//y方向的速度为正值,这样粒子才能朝上运动 if(!int(ep.zpos))//z方向的速度和x类似 { ep.zspeed=0.0f; } else { if(ep.zpos<0) { ep.zspeed=(rand()%int(-ep.zpos))/1500.0f; } else { ep.zspeed=-(rand()%int(ep.zpos))/1500.0f; } } ep.bFire=1;//烟花粒子标志 ep.nExpl=1+rand()%6;//粒子效果随机,从1到6 ep.bAddParts=1;//初始烟花粒子有尾巴 ep.AddCount=0.0f; ep.AddSpeed=0.2f; nOfFires++;//当前粒子数加1 AddParticle(ep);//加入粒子链表 BindSound(1); } void Explosion1(Particle* par) { Particle ep; for(int i=0;i<100;i++) { ep.b=float(rand()%100)/60.0f;//以下初始化粒子的各个属性 ep.g=float(rand()%100)/60.0f; ep.r=float(rand()%100)/60.0f; ep.life=1.0f; ep.fade=0.01f+float(rand()%31)/10000.0f; ep.size=0.8f; ep.xpos=par->xpos; ep.ypos=par->ypos; ep.zpos=par->zpos; ep.xspeed=0.02f-float(rand()%41)/1000.0f;//各个粒子的速度是随机的,因此运动方向随机 ep.yspeed=0.02f-float(rand()%41)/1000.0f;//你可以改变这些值,观察运动情况 ep.zspeed=0.02f-float(rand()%41)/1000.0f; ep.bFire=0;//这是爆炸粒子,不是烟花粒子,因此标志为0 ep.nExpl=0;//爆炸粒子不再产生爆炸效果了,因此标志为0 ep.bAddParts=0;//该爆炸产生的粒子没有尾巴 ep.AddCount=0.0f; ep.AddSpeed=0.0f; AddParticle(ep); } } void Explosion2(Particle* par) { Particle ep; for(int i=0;i<1000;i++) { ep.b=par->b; ep.g=par->g; ep.r=par->r; ep.life=1.0f; ep.fade=0.01f+float(rand()%31)/10000.0f; ep.size=0.8f; ep.xpos=par->xpos; ep.ypos=par->ypos; ep.zpos=par->zpos; ep.xspeed=0.02f-float(rand()%41)/1000.0f; ep.yspeed=0.02f-float(rand()%41)/1000.0f; ep.zspeed=0.02f-float(rand()%41)/1000.0f; ep.bFire=0; ep.nExpl=0; ep.bAddParts=0;//该爆炸产生的粒子没有尾巴 ep.AddCount=0.0f; ep.AddSpeed=0.0f; AddParticle(ep); } } void Explosion3(Particle* par) { Particle ep; for(int i=0;i<30;i++) { float angle=float(rand()%360)*PIAsp;//产生一个0到360度范围的角度,这里是弧度值,因为cos和sin需要弧度参数 ep.b=float(rand()%100)/60.0f; ep.g=float(rand()%100)/60.0f; ep.r=float(rand()%100)/60.0f; ep.life=1.5f; ep.fade=0.01f+float(rand()%31)/10000.0f; ep.size=0.8f; ep.xpos=par->xpos; ep.ypos=par->ypos; ep.zpos=par->zpos; ep.xspeed=(float)sin(angle)*0.01f;//由极坐标公式,角度余弦为
评论
    相关推荐
    • 3D GIS
      3D GIS中三维地形模拟与树木实体造型的研究
    • buildu3d
      buildu3d
    • 3dmax
      水晶吊顶灯制作成品,3dmax实战项目1
    • cub3d
      cub3d
    • simEngine3D
      simEngine3D
    • cub3d
      cub3d
    • Milkshape3D
      Milkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zipMilkshape3D.zip
    • spindle3d
      一个斐济插件,用于自动测量有丝分裂纺锤体体积图像的3D形态学参数。 安装 安装 启动斐济并: 主轴3D 3D ImageJ套件 重新启动斐济
    • PerspectiveMatrix3D
      开发Stage3D时所用到的两个adobe工具包中的两个类PerspectiveMatrix3D 和 AGALMiniAssembler。
    • 3d
      3D