// 学程序编游戏系列丛书
// 唐明理 E_mail: cqtmL@163.com
//====================================================================
#include "stdafx.h"
#include "baiscobj.h"
#include "yuna.h"
#include "include/BITMAP.H"
#include "mdlobj.h"
#define GL_CLAMP_TO_EDGE 0x812F // 保存天空纹理
extern mdlobj m_mdlobj;
extern GLfloat r; //飞机盘旋角度
float gao=17.8f;
extern CString test; //场景信息
extern yuna* m_yuna;
extern HWND hWnd; //窗口句柄,主定义在主程序
extern bool Lbutdown;//鼠标左键,主定义在主程序
extern int rnshu; //人数计数
extern int ZANAIS;
//对象数,主定义在OpenGL类
//////////////////////////////////////////////////////////////////////
baiscobj::baiscobj()
{ g_eye[0]= 400;//
g_eye[2]= -400;//
g_Angle=0;//
g_elev=-0;//
//A、设置数据目录
char appdir[256];
GetCurrentDirectory(256,appdir);
CString dir=appdir;
if(dir.Right(8)!="./")
SetCurrentDirectory("./");
//B、调入场景文件和相关贴图
rnshu=0; //人数计数清0
loadobj("data/aa.txt"); //调场景文件
//H
//m_mdlobj.InitGL(0,name[4]);//调MDL动画模型
//m_mdlobj.z_rot3=90.0f;
LoadT8(name[0], g_cactus[0]); //调地面帖图
g_imageData = LoadBit(name[1],&g_bit); //调等高地形图
char cc[64];
dir= "data/images/"; //天空贴图目录
sprintf(cc,"%s%sRBack.bmp",dir,name[2]);LoadT8(cc,g_cactus[2]);//调天贴图
sprintf(cc,"%s%sFront.bmp",dir,name[2]);LoadT8(cc,g_cactus[3]);//调天贴图
sprintf(cc,"%s%sTop.bmp" ,dir,name[2]);LoadT8(cc,g_cactus[4]);//调天贴图
sprintf(cc,"%s%sLeft.bmp" ,dir,name[2]);LoadT8(cc,g_cactus[5]);//调天贴图
sprintf(cc,"%s%sRight.bmp",dir,name[2]);LoadT8(cc,g_cactus[6]);//调天贴图
LoadT16("data/images/CACTUS0.BMP",g_cactus[11]); //树1帖图
LoadT16("data/images/CACTUS1.BMP",g_cactus[12]); //树2帖图
LoadT16("data/images/CACTUS2.BMP",g_cactus[13]); //树3帖图
LoadT16("data/images/CACTUS3.BMP",g_cactus[14]); //树4帖图
InitTerrain(5); //初始化地面
//C、初始化3D动画模型
m_yuna->model[0]=NULL; m_yuna->model[1]=NULL; //动画模型清空
m_yuna->texture[0]=NULL;m_yuna->texture[1]=NULL;//动画贴图清空
m_yuna->getobj(name[3]); //调动画模型
//D、调入3DS模型
m_3ds=new CLoad3DS(); //初始化3DS类变量
load3dobj("data/3ds/","wutai.3ds", 3); //调3DS模型 //调3DS模型
//E、射击、爆炸初始化
LoadT16("data/images/explosion.bmp",g_cactus[15]); //粒子帖图
isExplosion = true; //
explosion=NULL; //
Explosion(0,0,0,1,1); //爆炸初始化
inputSys = new CInputSystem; //初始化鼠标类变量
bool useDInput =
inputSys->Initialize(hWnd,(HINSTANCE)GetModuleHandle(NULL),
true,IS_USEKEYBOARD|IS_USEMOUSE);//初始化鼠标接口
Lbutdown=false; //没按鼠标左键
rocketX=0,rocketZ=0,rocketY=2000; //子弹位置初值
rad_xz=0; //视角(弧度)清0
Expl=0; //子弹距离计数清0
}
baiscobj::~baiscobj()
{ for(int i=0;i<16;i++) glDeleteTextures(1, &g_cactus[i]);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
//场景===========================================================
void baiscobj::light0()
{ GLfloat light_position[] = {1.0,25.0,1.0,128};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
}
////////////////////////////////////////////////////////////////
void baiscobj::initdata(int shu)//产生新数据
{ g_eye[0]=300;//MAP;//
g_eye[2]=-400;//-MAP;//
g_Angle=6;//
g_elev= 0;//
srand(timeGetTime());//产生树的固定随机数种子
int i;
i=0;
objposi[i].x= MAP; //位置x
objposi[i].z= -MAP; //位置z
objposi[i].sizew=2.0f;
objposi[i].sizel=2.0f;
objposi[i].sizeh=0;
objposi[i].cactus=1000;
objposi[i].scale=0; //比例,深浅
objposi[i].ry=0;
/////////////////////////////////////////////////////////////
objposi[i+1].x=400.0f;
objposi[i+1].z=400.0f;
objposi[i+1].sizew=12.9f;
objposi[i+1].sizel=21.0f;
objposi[i+1].sizeh=13.2f;
objposi[i+1].scale=0.35f;
objposi[i+1].cactus=2003;
objposi[i+1].ry=335;
//////////////////////////////////////////////////////////////
ZANAIS=2;
strcpy(name[0],"data/images/sand0.bmp");//地面帖图
strcpy(name[1],"data/images/terrain1.bmp");//等高地势图
strcpy(name[2],"3");
strcpy(name[3],"data/模型/士兵0/");
strcpy(name[4],"data/mdl模型/qian1.mdl");
m_yuna->man[0].qd[0]=353; //终点
m_yuna->man[0].qd[1]=400;//
m_yuna->man[0].zd[0]=m_yuna->man[i].qd[0]; //终点
m_yuna->man[0].zd[1]=m_yuna->man[i].qd[1];
m_yuna->man[0].dz=1; //初始动作,跑。
m_yuna->man[0].death=0;//死亡帧
m_yuna->man[1].qd[0]=393; //终点
m_yuna->man[1].qd[1]=400;//
m_yuna->man[1].zd[0]=m_yuna->man[i].qd[0]; //终点
m_yuna->man[1].zd[1]=m_yuna->man[i].qd[1];
m_yuna->man[1].dz=1; //初始动作,跑。
m_yuna->man[1].death=0;
rnshu=RNSHU;
}
void baiscobj::loadobj(CString na)//调场景
{
initdata(300);
}
void baiscobj::saveobj(CString na)//保存场景
{ FILE *f;
int i;
f=fopen(na,"w");
if(f==NULL) {AfxMessageBox("不能写文件!!!");return;}
fprintf(f,"%s\n",name[0]); //地面帖图
fprintf(f,"%s\n",name[1]); //等高地势图
fprintf(f,"%s\n",name[2]); //天空
fprintf(f,"%s\n",name[3]); //MD2动画模型
fprintf(f,"%s\n",name[4]); //MDL动画模型
fprintf(f,"%f\n",g_eye[0]); //视点X
fprintf(f,"%f\n",g_eye[2]); //视点Z
fprintf(f,"%f\n",g_Angle); //方位角
fprintf(f,"%f\n",g_elev); //俯仰角
fprintf(f,"%d\n",ZANAIS); //对象数
for (i=0;i<ZANAIS;i++)
{fprintf(f,"%f\n",objposi[i].x); //位置x
fprintf(f,"%f\n",objposi[i].z); //位置y
fprintf(f,"%f\n",objposi[i].sizew);//大小
fprintf(f,"%f\n",objposi[i].sizel);//大小
fprintf(f,"%f\n",objposi[i].sizeh);//深浅
fprintf(f,"%f\n",objposi[i].scale);
fprintf(f,"%d\n",objposi[i].cactus);//类型或树形随机4种
fprintf(f,"%d\n",objposi[i].ry);
}
for (i=0;i<RNSHU;i++)
{fprintf(f,"%f\n",m_yuna->man[i].qd[0]); //起点
fprintf(f,"%f\n",m_yuna->man[i].qd[1]);
fprintf(f,"%f\n",m_yuna->man[i].zd[0]); //终点
fprintf(f,"%f\n",m_yuna->man[i].zd[1]);
fprintf(f,"%d\n",m_yuna->man[i].dz); //动作
fprintf(f,"%d\n",m_yuna->man[i].death); //死亡帧
}
fclose(f);
}
/////////////////////////////////////////////////////////////////
BOOL baiscobj::DisplayScene()//摄像漫游
{ float speed=0.5f; //步长
int mouseX, mouseY; //定义鼠标的轨迹变化量X、Y
inputSys->Update(); //清除鼠标接口
inputSys->GetMouseMovement(mouseX,mouseY);//获取鼠标的轨迹变化量X、Y
g_Angle += mouseX*.2f; //场景方位角加上鼠标轨迹变化量X
g_elev += -mouseY*.2f; //场景俯仰角加上鼠标轨迹变化量Y
float x=g_eye[0],y=g_eye[2],z=g_eye[2];
// if (KEY_DOWN(VK_SHIFT)) speed =speed*2;//按SHIFT时的加速true
// if (KEY_DOWN(VK_LEFT)) g_Angle-=speed*2;//左转,方位角-
// if (KEY_DOWN(VK_RIGHT)) g_Angle+=speed*2;//右转,方位角+
rad_xz = float (3.13149* g_Angle/180.0f); //计算左右旋转角度
// if (KEY_DOWN(33)) g_elev +=speed; //Page UP 键
// if (KEY_DOWN(34)) g_elev -=speed; //Page Down键
if (g_elev<-360) g_elev =-360; //仰俯角
if (g_elev> 360) g_elev = 360; //仰俯角
if (KEY_DOWN(VK_LEFT)) //后退
{ g_eye[2]-=(float)sin(rad_xz)*speed; //视点的x分量
g_eye[0]-=(float)cos(rad_xz)*speed; //视点的Z分量
}
//控制到摄像机不离开地面
if(g_eye[0]< MAP_SCALE) g_eye[0]= MAP_SCALE;
if(g_eye[0]> (MAP_W-2)*MAP_SCALE) g_eye[0]= (MAP_W-2)*MAP_SCALE;
if(g_eye[2]<-(MAP_W-2)*MAP_SCALE) g_eye[2]=-(MAP_W-2)*MAP_SCALE;
if(g_eye[2]> -MAP_SCALE) g_eye[
- 1
- 2
前往页