基于opengl的场景漫游,粒子系统出问题了怎么不下雨啊?求大神指教!!救命啊!!!

旅徒冰迹Lucky 2015-06-07 03:53:28
#include <windows.h>//windows头文件
#include <math.h>
#include <GL/glu.h>//实用库
#include <gl/glaux.h>
#include <gl/gl.h>
#include <stdio.h>
#include <io.h>
//**************************888888888888888888888888888888888888888
const float p=0.1f; //绘图比例尺 P个单位长度:1米
const float q=0.5f; //移动速度 1次移动q个单位长度

//粒子系统部分
#define MAX_PARTICLES 3000 //粒子数量
#define FADE 2000.0
#define SOURCE 30

bool keys[256]; //键盘数组
bool active=TRUE; //窗口是否最小化标志,缺省为ture
bool sp;
bool rp;
bool bRender = TRUE; // Polygon Flag Set To TRUE By Default (NEW)

float slowdown=2.0f; // 粒子减速
float xspeed; // X初速度
float yspeed; // Y初速度
float zoom=-40.0f; // Used To Zoom Out

GLuint loop; // 循环变量
GLuint col; // 当前颜色
GLuint texture[140]; // 存储粒子的纹理空间
typedef struct // 粒子结构
{
bool active; // 是否活跃
float life; // 粒子生命
float fade; // 褪色速度
float r; // Red
float g; // Green
float b; // Blue
float x; // X Position
float y; // Y Position
float z; // Z Position
float xi; // X Direction
float yi; // Y Direction
float zi; // Z Direction
float xg; // X Gravity
float yg; // Y Gravity
float zg; // Z Gravity
}
particles;

particles particle[MAX_PARTICLES]; //粒子数组
static GLfloat colors[3]={1.0,1.0,1.0}; // Rainbow Of Colors
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
AUX_RGBImageRec *LoadBMP(char *Filename) // 读取位图图象
{
FILE *File=NULL; // 文件句柄

if (!Filename) // 确定文件名已给出
{
return NULL; // 如果文件名未给出则返回NULL
}

File=fopen(Filename,"r"); // 检测文件是否存在
if (File) // 文件是否存在?
{
fclose(File); // 关闭文件
return auxDIBImageLoad(Filename); // 读取位图并返回一个指针
}
return NULL; //如果调用文件失败则返回NULL
}
int LoadGLTextures() //调用Bitmap并转换成纹理
{
int Status=FALSE; //状态确定

AUX_RGBImageRec *TextureImage[2]; //为纹理创建存储空间

memset(TextureImage,0,sizeof(void *)*2); //将指针设为NULL

//读取位图,检查错误。如果位图不存在则退出
//粒子的纹理
if (TextureImage[1]=LoadBMP("tupian/rain.bmp")) //创建雨滴纹理
{
Status=TRUE;
glGenTextures(1, &texture[22]);

glBindTexture(GL_TEXTURE_2D, texture[22]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data);
}
if (TextureImage[0]) //纹理是否存在
{
if (TextureImage[0]->data) //纹理图象是否存在
{
free(TextureImage[0]->data); //释放纹理图象所占用内存
}

free(TextureImage[0]); //释放图象结构
}
if (TextureImage[1])
{
if (TextureImage[1]->data)
{
free(TextureImage[1]->data);
}
free(TextureImage[1]);
}

return Status; //返回Status的值

}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) //重置opengl窗口大小
{
if (height==0) //防止被零除
{
height=1; //设为1
}

glViewport(0,0,width,height); //重置当前视口

glMatrixMode(GL_PROJECTION); //选择投影矩阵
glLoadIdentity(); //重置投影矩阵
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,200.0f);//设置视口大小,实现近大远小

glMatrixMode(GL_MODELVIEW); // 选择Modelview Matrix
glLoadIdentity(); // 重置 Modelview Matrix
}
//粒子部分
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置

{
if (!LoadGLTextures()) // 载入纹理
{
return FALSE;
}
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f,0.0f,0.0f,0.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);// 告诉系统对透视进行修正
glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
glEnable(GL_TEXTURE_2D);
for (loop=0;loop<MAX_PARTICLES;loop++) // 初始化每个粒子
{
particle[loop].active=true;
particle[loop].life=1.0f;
particle[loop].fade=float(rand()%100)/FADE+0.0025f; // 随机产生淡出速度(用作透明度)
particle[loop].r=colors[0];
particle[loop].g=colors[1];
particle[loop].b=colors[2];
particle[loop].xi=float((rand()%50)-26.0f)*3.0f; // 随机产生X速度
particle[loop].yi=float((rand()%50)-25.0f)*3.0f; // 随机产生Y速度
particle[loop].zi=float((rand()%50)-25.0f)*3.0f; // 随机产生Z速度
particle[loop].xg=0.0f;
particle[loop].yg=-0.8f;
particle[loop].zg=0.0f;
}


return TRUE;
}



//此部分和下边有些重复,待修改**************************************************************************************************************
//int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
// 绘制场景
//{

//}
//***********************************************************************************************************************************************


//窗口部分
HWND hWnd=NULL; //窗口句柄
HDC hDC=NULL; //设备描述表句柄
HGLRC hRC=NULL; //窗口着色描述句柄
HINSTANCE hInstance; //保存程序实例
RECT rect;
int sw=800; //设定窗口宽度为800
int sh=600; //设定窗口高度为600
const double pi=3.1415926536; //定义常量π
int i=1; //花坛墙循环变量
bool fullscreen=1; //是否全屏
GLfloat aspect;
const float piover180=0.0174532925f; //角度转换到弧度
float heading;
float xpos;
float zpos=7.0f;
//按键部分
GLfloat yup; //y平移|
GLfloat xup; //X平移 --
GLfloat zup; //z平移 --
GLfloat xrot; //x轴旋转
GLfloat yrot; //y轴旋转
//GLfloat walkbias=0; //模拟行走的参数变量
//GLfloat walkbiasangle=0; //模拟行走的参数变量
GLfloat lookupdown=-5.0f;
//GLfloat xspeed; //x轴的旋转速度
//GLfloat yspeed; //y轴的旋转速度

bool goodlight; //路灯开关
bool light; //光源-开关
bool blend; //混合 开关
bool lp; //L键是否按下
//bool fp; //F键是否按下
bool bp; //B键是否按下
GLfloat LightAmbient[]={ 0.5f, 0.5f, 0.5f, 1.0f}; //环境光的值RGBA
GLfloat LightDiffuse[]={ 1.0f, 1.0f, 1.0f, 1.0f}; //散射光的值
GLfloat LightPosition[]={ 0.0f, 0.0f, -p*20.0f, 1.0f}; //光照位置XYZA
GLuint filter; //过滤器的选择
//GLuint texture[140]; //纹理的存储空间共140个纹理空间
#pragma comment( lib, "opengl32.lib") //连接时使用的OpenGL库
#pragma comment( lib, "glu32.lib")
#pragma comment( lib, "glaux.lib")
//读取位图部分
...全文
402 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
旅徒冰迹Lucky 2016-11-16
  • 打赏
  • 举报
回复
VC下运行的,我运行也是一堆错误,当时想知道粒子系统怎么运行的就
707wk 2015-06-11
  • 打赏
  • 举报
回复
编译问题请说明编译环境,操作系统
天命王子 2015-06-11
  • 打赏
  • 举报
回复
楼主,你的代码要在什么环境下运行啊,我用VC++运行之后有一大堆错误啊,能否重发一下正确代码。里面有一些OpenGL的函数还不了解惹。
赵4老师 2015-06-08
  • 打赏
  • 举报
回复
搜网络教程“学OpenGL编3D游戏”。
旅徒冰迹Lucky 2015-06-07
  • 打赏
  • 举报
回复
bool ChangeResolution(int w,int h,int bitdepth) //改变屏幕分辨率 { DEVMODE devMode; int modeSwitch; int closeMode=0; EnumDisplaySettings(NULL, closeMode,&devMode); devMode.dmBitsPerPel=bitdepth; devMode.dmPelsWidth=w; devMode.dmPelsHeight=h; devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; modeSwitch=ChangeDisplaySettings(&devMode,CDS_FULLSCREEN); if(modeSwitch==DISP_CHANGE_SUCCESSFUL) { return true; } else { ChangeDisplaySettings(NULL,0); return false; } } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) //消息处理函数 { switch(message) { case WM_CREATE: GetWindowRect(hWnd,&rect); sw=rect.right-rect.left; sh=rect.bottom-rect.top; SceneResizeViewport(sw,sh); return 0; case WM_SIZE: if(!fullscreen) { GetWindowRect(hWnd,&rect); sw=rect.right-rect.left; sh=rect.bottom-rect.top; if(sw>0&&sh>0) SceneResizeViewport(sw,sh); } else { SceneResizeViewport(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); } return 0; case WM_CLOSE: ShowWindow(hWnd,SW_HIDE); PostQuitMessage(0); return 0; case WM_DESTROY: return 0; case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: PostMessage(hWnd,WM_CLOSE,0,0); break; case VK_PRIOR: //page up lookupdown -= 1.0f; break; case VK_NEXT: //page down lookupdown +=1.0f; break; case VK_UP://////// xpos -=q* (float)sin(heading*piover180)*0.5f; zpos -=q* (float)cos(heading*piover180)*0.5f; // if (walkbiasangle>=359.0f){walkbiasangle=0.0f;} // else {walkbiasangle+=10;} // walkbias=(float)sin(walkbiasangle*piover180)/20.0f; break; case VK_DOWN:///// xpos +=q* (float)sin(heading*piover180)*0.5f; zpos +=q* (float)cos(heading*piover180)*0.5f; // if (walkbiasangle<=1.0f){walkbiasangle=359.0f;} // else {walkbiasangle-=10;} // walkbias=(float)sin(walkbiasangle*piover180)/20.0f; break; case VK_RIGHT:///////////// heading -=2.0f; yrot = heading; break; case VK_LEFT: heading +=2.0f; yrot = heading; break; //////////-----XY轴旋转 case 'A': xup +=q* (float)cos(-heading*piover180)*0.25f; zup +=q* (float)sin(-heading*piover180)*0.25f; break; case 'D': //y xup -=q* (float)cos(-heading*piover180)*0.25f; zup -=q* (float)sin(-heading*piover180)*0.25f; break; case 'W': //y上 yup -=q*0.4f; break; case 'S': //y下 yup +=q*0.4f; break; ////////////////////////////////////// case 'B': if(!bp) { bp=TRUE; blend=!blend; if(blend) { glEnable(GL_BLEND); //打开混合功能 glDisable(GL_DEPTH_TEST); //关闭深度测试 } else { glDisable(GL_BLEND); //关闭混合功能 glEnable(GL_DEPTH_TEST); //打开深度测试 } } else { bp=FALSE; } break; //////////------路灯开关------------ case 'G': if(!goodlight) { goodlight=TRUE; } else { goodlight=FALSE; } break; //////////-----透明开关------------ case 'L': if(!lp) { lp=TRUE; light=!light; if(!light) { glDisable(GL_LIGHTING); } else { glEnable(GL_LIGHTING); } } else { lp=FALSE; } break; } return 0; case WM_LBUTTONDOWN: //是否按下鼠标左键 { bRender=!bRender; return 0; } default: return DefWindowProc(hWnd,message,wParam,lParam); } } GLvoid KillGLWindow(GLvoid) { if (fullscreen) { ChangeDisplaySettings(NULL,0); ShowCursor(TRUE); } if (hRC) { if (!wglMakeCurrent(NULL,NULL)) { MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } if (!wglDeleteContext(hRC)) { MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } hRC=NULL; } if (hDC && !ReleaseDC(hWnd,hDC)) { MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hDC=NULL; } if (hWnd && !DestroyWindow(hWnd)) { MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hWnd=NULL; } if (!UnregisterClass("OpenGL",hInstance)) { MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hInstance=NULL; } }
旅徒冰迹Lucky 2015-06-07
  • 打赏
  • 举报
回复
GLvoid glDrawCube() // 绘制立方体 { glBegin(GL_QUADS); // 前面 glNormal3f( 0.0f, 0.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 后面 glNormal3f( 0.0f, 0.0f,-1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 上面 glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 下面 glNormal3f( 0.0f,-1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 右面 glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 左面 glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); } //天空盒的函数实现 void skybox() { glBindTexture(GL_TEXTURE_2D, texture[30]);//南 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f( 50.0f, -50.0f, 50.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( -50.0f, -50.0f, 50.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( -50.0f, 50.0f, 50.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 50.0f, 50.0f, 50.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[1]);//东 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f( 50.0f, -50.0f, -50.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 50.0f, -50.0f, 50.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 50.0f, 50.0f, 50.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 50.0f, 50.0f, -50.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[2]);//北 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f( -50.0f, -50.0f, -50.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 50.0f, -50.0f, -50.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 50.0f, 50.0f, -50.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( -50.0f, 50.0f, -50.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[3]);//西 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f( -50.0f, -50.0f, 50.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( -50.0f, -50.0f, -50.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( -50.0f, 50.0f, -50.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( -50.0f, 50.0f, 50.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[4]);//底 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f( 50.0f, -50.0f, -50.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( -50.0f, -50.0f, -50.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( -50.0f, -50.0f, 50.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 50.0f, -50.0f, 50.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[5]);//顶 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f( 50.0f, 50.0f, 50.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( -50.0f, 50.0f, 50.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( -50.0f, 50.0f, -50.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 50.0f, 50.0f, -50.0f); glEnd(); } void EnableOpenGL() { PIXELFORMATDESCRIPTOR pfd; int iFormat; hDC=GetDC(hWnd); ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags= PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=16; pfd.cDepthBits=16; pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(hDC,&pfd); SetPixelFormat(hDC,iFormat,&pfd); hRC=wglCreateContext(hDC); wglMakeCurrent(hDC,hRC); } //取消OPENGL void DisableOpenGL() { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); if (fullscreen) { ChangeDisplaySettings(NULL,0); ShowCursor(TRUE); } if (hRC) { if (!wglMakeCurrent(NULL,NULL)) { MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } if (!wglDeleteContext(hRC)) { MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } hRC=NULL; } if (hDC && !ReleaseDC(hWnd,hDC)) { MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hDC=NULL; } if (hWnd && !DestroyWindow(hWnd)) { MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hWnd=NULL; } if (!UnregisterClass("OpenGL",hInstance)) { MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hInstance=NULL; } }
旅徒冰迹Lucky 2015-06-07
  • 打赏
  • 举报
回复
void SceneInit (int w,int h) { LoadGLTextures(); //条到处理调用位图并用此位图建立纹理的子程序 glEnable(GL_TEXTURE_2D); //纹理被创建,并允许2D纹理贴图 glShadeModel(GL_SMOOTH); glClearColor(0.0,0.0,0.0,0.5); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //设置光源参数 glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient); //设置环境光 glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse); //设置漫反射光 glLightfv(GL_LIGHT1,GL_POSITION,LightPosition); //光源的位置 glEnable(GL_LIGHT1); //允许光源一 glColor4f( 1.0f, 1.0f, 1.0f, 0.5); //全亮度,50%的透明 glBlendFunc(GL_SRC_ALPHA,GL_ONE); //基于半透明的混合方式 } void SceneResizeViewport(GLsizei w, GLsizei h) { if(h==0) {h=1;} aspect=(GLfloat)w/(GLfloat)h; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); //选择投影句镇 glLoadIdentity(); gluPerspective(45.f,aspect,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } ///////////////这里进行说有的绘图工作//////////////////////////////////////// int SceneShow(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清屏和清除深度缓冲区 glLoadIdentity(); //重置当前MODELVIEW矩阵 glDisable(GL_BLEND); glDisable(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); GLfloat xtrans=-xpos; GLfloat ztrans=-zpos; GLfloat ytrans=-0.25f; GLfloat sceneroty=360.0f-yrot; //开始绘图 //开始绘图 glRotatef(lookupdown,1.0f,0,0); //X旋转 glRotatef(sceneroty,0,1.0f,0); //y旋转 skybox(); glTranslatef(xtrans+xup,ytrans+yup,ztrans+zup); //移动 //-------------------------------------------------------------------- if(keys[VK_TAB]) { glBindTexture(GL_TEXTURE_2D,texture[22]);//绘制雨滴粒子 for(int i=SOURCE/2;i<SOURCE;i++) { for (loop=(i)*(MAX_PARTICLES/SOURCE);loop<(i+1)*(MAX_PARTICLES/SOURCE);loop++) { if (particle[loop].active) { float x=particle[loop].x=-25+(i-SOURCE/2)*(100/SOURCE); float y=particle[loop].y+40; float z=particle[loop].z+zoom; glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z); glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z); glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z); glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z); glEnd(); particle[loop].x+=particle[loop].xi/(slowdown*1000); particle[loop].y+=particle[loop].yi/(slowdown*1000); particle[loop].z+=particle[loop].zi/(slowdown*1000); particle[loop].xi+=particle[loop].xg; particle[loop].yi+=particle[loop].yg; particle[loop].zi+=particle[loop].zg; particle[loop].life-=particle[loop].fade; if (particle[loop].life<0.0f) { particle[loop].life=1.0f; particle[loop].fade=float(rand()%100)/FADE+0.002f; particle[loop].x=0.0f; particle[loop].y=0.0f; particle[loop].z=0.0f; particle[loop].xi=xspeed+float((rand()%60)-32.0f); particle[loop].yi=yspeed+float((rand()%60)-30.0f); particle[loop].zi=float((rand()%60)-30.0f); particle[loop].r=colors[0]; particle[loop].g=colors[1]; particle[loop].b=colors[2]; } } } } } return TRUE; }

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧