#include "Engine.h"
GLApplication * GLApplication::Create(const char * class_name)
{
CEngine * engine=new CEngine(class_name);
return (GLApplication *)engine;
}
CEngine::CEngine(const char * class_name) : GLApplication(class_name)
{
m_Fps=0;
m_objCnt=0;
memset(m_objs,0,sizeof(m_objs));
m_bMute=false;
m_nSkyBoxIndex=0;
m_nWeaponIndex=0;
m_bJu2=false;
memset(m_pExplosion,0,sizeof(m_pExplosion));
}
static int printCnt=0;
static char printContent[36][MAX_PATH];
void CEngine::InitPrint(char * str)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/***********初始画面***********/
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0,m_Window.GetWidth(),0,m_Window.GetHeight(),-1,1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_cBmpInitTex.ID);
glColor4f(1,1,1,1);
glBegin(GL_QUADS);
glTexCoord2f(0,0),glVertex3f(0,0,0);
glTexCoord2f(1,0),glVertex3f(m_Window.GetWidth(),0,0);
glTexCoord2f(1,1),glVertex3f(m_Window.GetWidth(),m_Window.GetHeight(),0);
glTexCoord2f(0,1),glVertex3f(0,m_Window.GetHeight(),0);
glEnd();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
/***********初始画面结束***********/
glPushAttrib(GL_CURRENT_BIT);
strcpy(printContent[printCnt++],str);
glColor3f(1,0,0);
for(int i=0;i<printCnt;++i)
m_cFont.PrintText(printContent[i],0,m_Window.GetHeight()-m_cFont.GetHeight()*(i+1));
m_cFont.PrintText(str,m_Window.GetWidth()-(m_cFont.GetWidth()+1)*strlen(str),m_Window.GetHeight()-m_cFont.GetHeight());
m_cFont.PrintText("Copyright (c) 2009 lucky dog",0,0);
glPopAttrib();
m_Window.SwapBuffers();
}
bool CEngine::Init()
{
glClearColor(0,0,0,0.5f);
glClearDepth(1);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
ResizeDraw(true);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
printCnt=0;
m_cBmpInitTex.Load("res/bmp/welcome.bmp");
if(! m_cFont.InitFont(12,24))
return false;
InitPrint("初始化: 字体 …… 完成.");
InitPrint("初始化: DirectShowMp3 ……");
mp3.Init();
mp3.Play("res/mp3/init.mp3");
--printCnt;
InitPrint("初始化: DirectShowMp3 …… 完成.");
InitPrint("初始化: DirectInput 输入 ……");
m_pInput=new CInputSystem();
m_pInput->Init(this->m_Window.GetHwnd(),(HINSTANCE)GetModuleHandle(NULL),true,IS_USEKEYBOARD | IS_USEMOUSE);
--printCnt;
InitPrint("初始化: DirectInput 输入 …… 完成.");
InitPrint("初始化: DirectSound 声音 ……");
if(! InitSounds("ini/snd.ini"))
{
MessageBox(NULL,TEXT("fail to init wavs!"),TEXT("ERROR"),MB_OK);
return false;
}
--printCnt;
InitPrint("初始化: DirectSound 声音 …… 完成.");
InitPrint("初始化: 加载所有纹理 ……");
if(! m_cTexMgr.Init("ini/textures.ini"))
return false;
--printCnt;
InitPrint("初始化: 加载所有纹理 …… 完成.");
InitPrint("初始化: 场景管理类 ……");
if(! m_cSceneMgr.Init())
return false;
--printCnt;
InitPrint("初始化: 场景管理类 …… 完成.");
InitPrint("初始化: 资源管理类 ……");
if(! m_cResMgr.Init())
return false;
--printCnt;
InitPrint("初始化: 资源管理类 …… 完成.");
InitPrint("初始化: MD2动画文件 ……");
if(! InitMD2Roles("ini/roles.ini"))
return false;
--printCnt;
InitPrint("初始化: MD2动画文件 …… 完成.");
InitPrint("初始化: 物体 ……");
if(! InitObjs("ini/objs.ini"))
{
MessageBox(NULL,TEXT("fail to init objects!"),TEXT("ERROR"),MB_OK);
return false;
}
--printCnt;
InitPrint("初始化: 物体 …… 完成.");
m_cCamera.setCamera(
MAP_WIDTH/2,m_cSceneMgr.m_terrain.getAveHeight(MAP_WIDTH/2,MAP_WIDTH/2),MAP_WIDTH/2,
MAP_WIDTH/2+1,m_cSceneMgr.m_terrain.getAveHeight(MAP_WIDTH/2,MAP_WIDTH/2),MAP_WIDTH/2,
0,1,0);
InitPrint("初始化: 成功完成!");
Sleep(1000);
mp3.Stop();
mp3.Release();
mp3.Init();
mp3.Play("res/mp3/banshuxuanyan.mp3");
return true;
}
bool CEngine::InitObjs(char * iniFile)
{
FILE * fp=fopen(iniFile,"r");
if(! fp)
{
MessageBox(NULL,TEXT("can not open iniFile!"),TEXT("ERROR"),MB_OK);
return false;
}
m_objCnt=1+ROLE_COUNT+MAX_BULLET_NUM;
m_objs[0]=new CHero;
SSphere sphere;
Vector3 speed;
char kind[MAX_PATH],buf[MAX_PATH],texFile[MAX_PATH];
while(fgets(buf,sizeof(buf),fp))
{
sscanf(
buf,"%s %f %f %f %f %f %f %f %s",
kind,&sphere.m_vPos.x,&sphere.m_vPos.y,&sphere.m_vPos.z,
&sphere.m_fRadius,&speed.x,&speed.y,&speed.z,texFile);
sphere.m_vPos.y=m_cSceneMgr.m_terrain.getAveHeight(sphere.m_vPos.x,sphere.m_vPos.z)+sphere.m_fRadius;
if(strcmp(kind,"ball")==0)
m_objs[m_objCnt++]=new CBall(sphere,speed,m_cTexMgr.GetID(texFile));
else if(strcmp(kind,"cube")==0)
m_objs[m_objCnt++]=new CCube(sphere,speed,m_cTexMgr.GetID(texFile));
}
m_objs[m_objCnt++]=new CMD2Role(&m_cResMgr.m_MD2s[0]);
return true;
}
bool CEngine::InitMD2Roles(char * iniFile)
{
for(int i=1;i<=ROLE_COUNT;++i)
{
m_objs[i]=new CMD2Role(&m_cResMgr.m_MD2s[rand()%m_cResMgr.m_nMd2Cnt]);
((CMD2Role *)m_objs[i])->Init(
Vector3(rand()%m_cSceneMgr.m_terrain.m_nWidth,ROLE_HEIGHT,rand()%m_cSceneMgr.m_terrain.m_nWidth),
Vector3(rand()%ROLE_MAX_SPEED-ROLE_MAX_SPEED/2,rand()%ROLE_MAX_SPEED-ROLE_MAX_SPEED/2,rand()%ROLE_MAX_SPEED-ROLE_MAX_SPEED/2),
ROLE_HEIGHT,rand(),ROLE_SCALE);
}
return true;
}
void CEngine::RenderObjs()
{
for(int i=0;i<m_objCnt;++i)
{
if(m_objs[i])
m_objs[i]->Render();
}
}
void CEngine::Uninit()
{
if(m_pInput)
{
delete m_pInput;
m_pInput=NULL;
}
}
void CEngine::UpdateCamera(DWORD milliseconds)
{
m_cCamera.setViewByMouse();
m_pInput->Update();
if(m_pInput->GetMouse()->IsLButtonPressed())
//if(m_Keys.IsPressed(MAX_KEYS-1))
{
Fire();
}
if(m_pInput->GetMouse()->IsRButtonPressed())
m_bJu2=! m_bJu2;
//if(m_Keys.IsPressed(VK_SHIFT))
if(m_pInput->GetKeyboard()->KeyDown(DIK_LSHIFT))
m_cCamera.setSpeed(LOW_CAMERA_SPEED);
//if(! m_Keys.IsPressed(VK_SHIFT))
if(! m_pInput->GetKeyboard()->KeyDown(DIK_LSHIFT))
m_cCamera.setSpeed(HIGH_CAMERA_SPEED);
if(m_pInput->GetKeyboard()->KeyDown(DIK_Q))
m_nWeaponIndex=1-m_nWeaponIndex;
if(m_pInput->GetKeyboard()->KeyDown(DIK_E))
m_nSkyBoxIndex=1-m_nSkyBoxIndex;
if(m_pInput->GetKeyboard()->KeyDown(DIK_R))
m_cCamera.setSpeed(HIGH_CAMERA_SPEED*3);
//if(m_Keys.IsPressed(VK_UP) || m_Keys.IsPressed('W'))
bool move;
if(m_pInput->GetKeyboard()->KeyDown(DIK_W))
{
move=true;
Vector3 tmp=m_cCamera.getPosition()+(m_cCamera.getView()-m_cCamera.getPosition()).normalize()*milliseconds/1000.0f*m_cCamera.getSpeed();
for(int i=1;i<m_objCnt;++i)
{
if(m_objs[i]==NULL) continue;
if((tmp-m_cCamera.getPosition()).dotProduct(m_objs[i]->m_sSphere.m_vPos-m_cCamera.getPosition())>0 &&
distance(tmp,m_objs[i]->m_sSphere.m_vPos)<(10+m_objs[i]->m_sSphere.m_fRadius))
{
move=false;
break;
}
}
if(move)
m_cCamera.moveCamera(m_cCamera.getSpeed());
}
//if(m_Keys.IsPressed(VK_DOWN) || m_Keys.IsPressed('S'))
if(m_pInput->GetKeyboard()->KeyDown(DIK_S))
{
move=true;
Vector3 tmp=m_cCamera.getPosition()+(m_cCamera.getPosition()-m_cCamera.getView()).normalize()*milliseconds/1000.0f*m_cCamera.getSpeed();
for(int i=1;i<m_objCnt;++i)
{
if(m_objs[i]==NULL) continue;
if((tmp-m_cCamera.getPosition()).dotProduct(m_objs[i]->m_sSphere.m_vPos-m_cCamera.getPosition())>0 &&
distance(tmp,m_objs[i]->m_sSphere.m_vPos)<(10+m_objs[i]->m_sSphere.m_fRadius))
{
move=false;
break;
}
}
if(move)
m_cCamera.moveCamera(-m_cCamera.getSpeed());
}
//if(m_Keys.IsPressed(VK_LEFT) || m_Keys.IsPressed('A'))
if(m_pInput->GetKeyboard()->KeyDown(DIK_A))
{
move=true;
Vector3 tmp=m_cCamera.getPosition()+(m_
luosiyong
- 粉丝: 15
- 资源: 29
最新资源
- 永磁同步电机无传感,高频脉振注入,采用如图观测器,结果如图,可以跟踪上给定
- 光伏并网逆变器设计方案,附有相关的matlab电路文件,以及DSP的程序代码,方案、仿真文件、代码三者结合使用效果好,事半功倍 备注:赠送逆变器并联环流matlab文件,基于矢量控制的环流抑制策略和
- 西门子1214PLC博图程序例程,版本V16及以上,加KTP700Basic PN触摸屏画面,双相机四轴多工位检测设备案例 程序主要有: 上下双工位4轴脉冲控制步进电机; 与上位机双相机的TCP I
- 计及碳捕集电厂低碳特性需求响应综合能源系统多时间尺度调度模型 关键词:碳捕集电厂 综合灵活运行方式 需求响应 日前调度 实时调度 多时间尺度 参考文档:计及碳捕集电厂低碳特性的含风电电力系统源
- 电力系统随机潮流概率潮流计算MATLAB程序包含蒙特卡洛模拟法、半不变量法+级数展开(Gram-Charlie,Cornish-Fisher); 考虑光伏不确定性(Beta分布),以IEEE34节点为
- 西门子1200伺服步进FB块程序 程序内含两个FB,一个是scl写的,一个是梯形图,可以多轴多次调用,中文注释详细 真实可用,经过在专用设备真实调试运行,可以直接应用到实际项目中 此FB块适合PTO
- 基于单片机家庭安全监控 安全防护设计-仿真原理图程序 主要功能:温度检测、火焰报警、PM2.5检测、按键设置 仿真、原理图、程序
- MATLAB代码:基于主从博弈理论的共享储能与综合能源微网优化运行研究 关键词:主从博弈 共享储能 综合能源微网 优化调度 参考文档:《基于主从博弈理论的共享储能与综合能源微网优化运行研究》完全复现
- 三相两电平并网逆变器仿真模型,电流环双闭环控制,单位功率因数,锁相环
- MATLAB代码:基于概率距离快速削减法的风光场景生成与削减方法 关键词:风光场景生成 场景削减 概率距离削减法 蒙特卡洛法 参考文档:《含风光水的电厂与配电公司协调调度模型》完全复现场景削减部分 仿
- MATLAB代码:含电热联合系统的微电网运行优化 关键词:微网 电热联合系统 优化调度 火参考文档:《含电热联合系统的微电网运行优化》完全复现 仿真平台:MATLAB yalmip+cplex
- MATLAB代码:含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度 关键词:冰蓄冷空调 CCHP-MG 多时间尺度优化 冷热电联供 参考文档:《含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度》完全
- BLDC有感仿真模型 双闭环控制,带霍尔传感器,其中霍尔处理,相逻辑用代码实现的,容易理解,为方便转化到代码
- 基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成) 摘要:代码主要做的是一种基于改进ISODATA算法的负荷场景曲线聚类,代码中,主要做了四种聚类算法,包括基础的K-means算法、I
- 转速、电流双闭环直流调速系统控制器设计 额定功率185w,电压220v,转速1600,电枢电流1.1A 电源电压为5或10v 分别用工程设计法和超前校正发进行仿真,均对空载、额定负载、突加负载(
- 基于PSO算法的光伏MPPT的Simulink仿真实现,可以定制其他算法优化的MPPT,比如:GWO,SSA等 代码质量极高,方便学习
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
前往页