c语言实现多线程动画程序示例

该程序是利用opengl图形库与fmod音频库写的一个简单3d动画程序。该程序在vs下运行良好,若缺少相关dll文件请确认已配制fmod与opengl库。

mixmodel.cpp


代码如下:

// mixmodel.cpp : 定义控制台应用程序的入口点。
//

#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) %s\n",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("P115.ogg", 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 Theme.mp3", 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;
}

(0)

相关推荐

  • C语言编程中借助pthreads库进行多线程编程的示例

    运行之前需要做一些配置: 1.下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可)    http://sourceware.org/pthreads-win32/ ,解压到一个目录. 2.找到include和lib文件夹,下面分别把它们添加到VC++6.0的头文件路径和静态链接库路径下面:    a).Tools->Options,选择Directory页面,然后在Show directories for:中选择Includ

  • c语言多线程编程使用示例

    复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <pthread.h> #define THREAD_NUM 10 void *test(void *args) { printf("tid %d: i say 'Hello'.\n", args); return NULL;} int main() { int i, err; pthread_t child[THREAD_NUM]; f

  • c语言socket多线程编程限制客户端连接数

    先上一些多线程需要使用的函数定义: 复制代码 代码如下: DWORD WINAPI ProcessClientRequests(LPVOID lpParam)  //新线程将会执行的函数定义{      return 0;} HANDLE handler=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, NULL);   //这里比较简单,&clientsocket是个指针,是从主线程传入新线程的参数 WaitFo

  • c语言实现多线程动画程序示例

    该程序是利用opengl图形库与fmod音频库写的一个简单3d动画程序.该程序在vs下运行良好,若缺少相关dll文件请确认已配制fmod与opengl库. mixmodel.cpp 复制代码 代码如下: // mixmodel.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" //定义一个线程DWORD WINAPI SoundProc( LPVOID LPVIDEOPARAMETERS);//光照变量GLfloat  whiteLight[] =

  • iOS开发探索多线程GCD队列示例详解

    目录 引言 进程与线程 1.进程的定义 2.线程的定义 3. 进程和线程的关系 4. 多线程 5. 时间片 6. 线程池 GCD 1.任务 2.队列 3.死锁 总结 引言 在iOS开发过程中,绕不开网络请求.下载图片之类的耗时操作,这些操作放在主线程中处理会造成卡顿现象,所以我们都是放在子线程进行处理,处理完成后再返回到主线程进行展示. 多线程贯穿了我们整个的开发过程,iOS的多线程操作有NSThread.GCD.NSOperation,其中我们最常用的就是GCD. 进程与线程 在了解GCD之前

  • linux下c语言的多线程编程

    我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执行的最小单元. 一般一个最简单的程序最少会有一个线程,就是程序本身,也就是主函数(单线程的进程可以简单的认为只有一个线程的进程) 一个线程阻塞并不会影响到另外一个线程. 多线程的进程可以尽可能的利用系统CPU资源. 1创建线程 先上一段在一个进程中创建一个线程的简单的代码,然后慢慢深入. #incl

  • C语言中的正则表达式使用示例详解

    正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE).正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 在c语言中,用regcomp.regexec.regfree 和regerror处理正则表达式.处理正则表达式分三步: 编译正则表达式,regcomp: 匹配正则表达式,regexec: 释放正则表达式,regfree. 函数原型 /* 函数说明:Regcomp将正则表达式字符串regex编译

  • 详解易语言启动多线程

    用易语言写多线程应用要么使用多线程相关的api,支持库或模块,其实那些支持库或模块也都是封装的api,但是要比api使用方便. 总体来说易语言官方的多线程支持库要比一些杂七杂八的模块好多了. 支持库勾选上之后就可以使用易语言的多线程支持库了. 首先看用易语言多线程支持库创建线程的命令:启动线程: 命令名:启动线程 创建并启动一条线程,可重复使用以创建多条线程,成功返回真,失败返回假. 参数 数据类型 说明   参数<1>的名称为"欲执行的子程序" 子程序指针(SubPtr)

  • 基于JavaScript的数据结构队列动画实现示例解析

    ###一 摘要 今天给大家介绍一个基于数据结构中的队列的一个动画,在实现这个动画之前呢,还是给大家讲讲,在JavaScript中我们如何实现一个队列. ###二 队列 队列是一种列表,不同的是队列只能在末尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据.先进先出.这点和栈不一样,在栈中,最后入栈的元素反被优先处理.可以将队列想象成银行排队办理业务的人,排队在第一个的人先办理业务,其它人只能排着,直到轮到他们为止. 队列是一种先进先出(FIFO)的数据结构.队列被用在很多地方.比如提交操作

  • 关于C语言位运算的简单示例

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. 1.输入一个float型数,以十六进制形式输出其32位机器数. #include<stdio.h> void main() { float a; int *p; printf("Input a float number:\n"); scanf("%f",

  • C语言实现多线程定时器实例讲解

    1. 大致功能介绍 实现任务列表,定时器会间隔一段时间遍历列表发现要执行的任务 任务列表中的所有任务并行执行 每个任务都可以有自己的定时器,并且可以选择是否要重复执行 定义方便的任务函数实现接口 定时器可以由用户自定义何时启动和停止 提供等待功能,保证任务列表中的所有任务执行完成 提供任务列表的传参功能 2. API库介绍 void setTick(int val); 设置定时间的间隔时间tick,若设置tick为1000,且任务的定时器时间为1000,则任务会在1秒后执行,默认tick为1秒,

  • SpringBoot中使用多线程的方法示例

    一.介绍 Spring是通过任务执行器(TaskExecutor)来实现多线程和并发编程,使用Spring提供的ThreadPoolTaskExecutor来创建一个基于线城池的TaskExecutor.在使用线程池的大多数情况下都是异步非阻塞的.节省更多的时间,提高效率. 工作原理 当主线程中调用execute接口提交执行任务时:则执行以下步骤:注意:线程池初始时,是空的. 如果当前线程数<corePoolSize,如果是则创建新的线程执行该任务 如果当前线程数>=corePoolSize,

  • Go语言基础单元测试与性能测试示例详解

    目录 概述 单元测试 代码说明如下 问题 注意 性能测试 基本使用 自定义测试时间 概述 测试不是Go语言独有的,其实在很多语言都有测试,例如:Go.Java.Python- 要想成为一名合格的大牛,这是程序员必须具备的一项技能,特别是一些大公司,这是加分的一项,主要有如下优点: 代码可以随时测试,保证代码不会产生错误 写出更加高效的代码 testing文档 Testing_flags文档 单元测试 格式:func TestXXX(t *testing.T) //add.go package c

随机推荐