如何用c語言實現多線程動畫程序呢?想要了解的朋友,以下是為大家分享的`c語言實現多線程動畫程序的範例,供大家參考借鑑,歡迎瀏覽!
該程序是利用opengl圖形庫與fmod音頻庫寫的一個簡單3d動畫程序。該程序在vs下運行良好,若缺少相關dll文件請確認已配製fmod與opengl庫。
複製代碼 代碼如下:
// : 定義控制枱應用程序的入口點。
//
#include "stdafx.h"
//定義一個線程
DWORD WINAPI SoundProc(
LPVOID LPVIDEOPARAMETERS);
//光照變量
GLfloat whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };
//貼圖變量
GLuint toTextures[4];
char* szFiles[4] = {"bcb.bmp","sun.bmp","earth.bmp","moon.bmp"};
//聲音引擎查錯函數
void ERRCHECK(FMOD_RESULT result)
{
if(result != FMOD_OK)
{
printf("FMOD error!(%d) %sn",result,FMOD_ErrorString(result));
//exit(-1);
}
}
void Initial()
{
AUX_RGBImageRec* Image[4];
int i;
glEnable(GL_DEPTH_TEST);// 啟用深度測試
glFrontFace(GL_CCW);// 指定逆時針繞法表示多邊形正面
glEnable(GL_CULL_FACE);// Do not calculate inside of jet
// Enable lighting
glEnable(GL_LIGHTING);
// Setup and enable light 0
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glEnable(GL_LIGHT0);
// Enable color tracking
glEnable(GL_COLOR_MATERIAL);
// Set Material properties to follow glColor values
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );//背景為黑色
glGenTextures(4, toTextures);
for(i=0;i<4;i++)
{
// Load environment map
glBindTexture(GL_TEXTURE_2D, toTextures[i]);
Image[i] = auxDIBImageLoadA(szFiles[i]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, Image[i]->sizeX, Image[i]->sizeY, 0, GL_RGB , GL_UNSIGNED_BYTE, Image[i]->data);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
}
void drawsphere()
{
static float fElect1 = 0.0f;
glTranslatef(0.0f, 0.0f, -250.0f);
glBindTexture(GL_TEXTURE_2D,toTextures[1]);
glDisable(GL_LIGHTING);
// 繪製紅色的太陽模型
//glShadeModel(GL_SMOOTH);
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(12.0f, 100, 100);
glEnable(GL_LIGHTING);
// 當前繪製顏色變為藍色
//glShadeModel(GL_FLAT);
glBindTexture(GL_TEXTURE_2D,toTextures[2]);
glColor3f(0.0f, 0.0f, 1.0f);
//繪製地球
//保存當前的模型視圖矩陣
//glPushMatrix();
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glRotatef(fElect1, 0.0f, 1.0f, 0.0f);//繞y軸旋轉一定的角度
glTranslatef(90.0f, 0.0f, 0.0f);//平移一段距離
glutSolidSphere(9.0f, 100, 100);
glBindTexture(GL_TEXTURE_2D,toTextures[3]);
glColor3f(1.0f,1.0f,0.0f);
glRotatef(fElect1*4, 0.0f, 1.0f, 0.0f);
glTranslatef(40.0f, 0.0f, 0.0f);
glutSolidSphere(5.0f, 100, 100);
// 恢復矩陣
glPopMatrix();
// 增加旋轉步長
fElect1 += 5.0f;
if(fElect1 > 360.0f)fElect1 = 5.0f;
}
void ChangeSize(int w, int h)
{
if(h == 0)h = 1;
// 設置視區尺寸
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 設置修剪空間
GLfloat fAspect;
fAspect = (float)w/(float)h;
gluPerspective(45.0, fAspect, 1.0, 500.0);
/*
if (w <= h)
glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);
else
glOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f);
*/
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void RenderScene(void)
{
// 旋轉的角度
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 重置模型視圖矩陣
//glMatrixMode(GL_MODELVIEW);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0.0f, 1.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glBindTexture(GL_TEXTURE_2D, toTextures[0]);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDepthMask(GL_FALSE);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.0f, 1.0f);
glEnd();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
//glLoadIdentity();
//
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glDepthMask(GL_TRUE);
//glLoadIdentity();
glPushMatrix();
//將圖形沿z軸負向移動
drawsphere();
glutSwapBuffers();
}
void TimerFunc(int value)
{
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1);
}
//背景音樂的調度函數
void bcsound()
{
FMOD_RESULT result;
FMOD::System *system;
FMOD::Channel *channel;
result = FMOD::System_Create(&system); // 創造FMOD的系統內核對象
ERRCHECK(result);
result = system->setSpeakerMode(FMOD_SPEAKERMODE_5POINT1); // 設置5.1聲道模式
ERRCHECK(result);
result = system->setSoftwareChannels(100); // 調整軟件混合
ERRCHECK(result);
result = system->setHardwareChannels(32); // 調整硬件混合
ERRCHECK(result);
result = system->init(200, FMOD_INIT_NORMAL, 0); // 初始化FMOD,音量大小為200
ERRCHECK(result);
FMOD::Sound *sound;
result = system->createSound("", FMOD_DEFAULT, 0, &sound); //載入磁盤文件到內存,(全部載入後返回)
ERRCHECK(result);
unsigned int lenms;
result = sound->getLength(&lenms,FMOD_TIMEUNIT_MS);
ERRCHECK(result);
result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);//播放
ERRCHECK(result);
Sleep(lenms);
result = system->createSound("End 3", FMOD_DEFAULT, 0, &sound); //載入磁盤文件到內存,(全部載入後返回)
ERRCHECK(result);
result = sound->getLength(&lenms,FMOD_TIMEUNIT_MS);
ERRCHECK(result);
result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);//播放
ERRCHECK(result);
Sleep(lenms);
system->release();//釋放
}
//動畫功能函數
void graph(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600,350);
glutCreateWindow("日月地模型示例");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutTimerFunc(500, TimerFunc, 1);
Initial();
glutMainLoop();
}
int main(int argc, char* argv[])
{
HANDLE hThread1;
hThread1 = CreateThread(NULL,0,SoundProc,NULL,0,NULL);
CloseHandle(hThread1);
graph(argc,argv);
Sleep(3000);
return 0;
}
DWORD WINAPI SoundProc(
LPVOID LPVIDEOPARAMETERS)
{
bcsound();
return 0;
}