⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anmobj.cpp

📁 碰撞检测.,用c++ opengl 实现
💻 CPP
字号:
// anmobj.cpp: implementation of the anmobj class.
// 学程序编游戏系列丛书
// 唐明理 E_mail: cqtmL@163.com
//====================================================================
#include "stdafx.h"
#include "anmobj.h"
#include "baiscobj.h"
//////////////////////////////////////////////////////////////////////
int dongzuo[7]={0,2,2,7,12,14,14};

extern baiscobj* m_baiscobj;

//////////////////////////////////////////////////////////////////////
anmobj::anmobj()
{
}
anmobj::~anmobj()
{}
bool anmobj::manmove(int i)//对象的移动
{	float stx=.5f,stz=.5f;								//走步长
	float qx=man[i].qd[0]-man[i].zd[0];					//x当前,目标位置差
	float qz=man[i].qd[1]-man[i].zd[1];					//z当前,目标位置差
	float qxa=abs(qx);									//x位置差绝对值
	float qza=abs(qz);									//z位置差绝对值
	if((int)qx==0&&(int)qz==0)	return true;			//为0,没动(到达)返回
	if(qxa<stx)  stx=qxa;								//位置差不足步长,步长为差
	if(qza<stz)  stz=qza;								//
	if((int)qx!=0) man[i].qd[0]-=qxa/qx*stx;			//当前位置加步长
	if((int)qz!=0) man[i].qd[1]-=qza/qz*stz;			//[qya/qy]单位绝对值
	if((int)qx>0&&(int)qz<0) {re[i]=45*1;return false;}	//取东北向
	if((int)qx>0&&(int)qz>0) {re[i]=45*3;return false;}	//取东南向
	if((int)qx<0&&(int)qz>0) {re[i]=45*5;return false;}	//取西南向
	if((int)qx<0&&(int)qz<0) {re[i]=45*7;return false;}	//取西北向

	if			 ((int)qz<0) {re[i]=45*0;return false;}	//取北向
	if((int)qx>0)			 {re[i]=45*2;return false;}	//取东向
	if           ((int)qz>0) {re[i]=45*4;return false;}	//取南向
	if((int)qx<0)			 {re[i]=45*6;return false;}	//取西向
	return false;
}
void anmobj::setman(int i,float y)//显示人
{	if(model[0]==NULL) return;				//模型为空返回
	srand(timeGetTime());					//
	man[i].qd[2]=y;							//所在高度
	counter[i]++;							//模型i计数指针加一
	if(counter[i]>2)						//用于动作延时
	{	counter[i]=0;						//模型i计数置0 
		if(man[i].dz!=19) frame[i]++;		//是活的动作序列号+1
		else {frame[i]=man[i].death;}
		if(man[i].dz==1)					//跑动中
		{if(manmove(i)==true)				//到目标点
		 {if(man[i].dz>15) 
			{if(man[i].dz==16) man[i].death=177;//死亡帧
			 if(man[i].dz==17) man[i].death=183;//死亡帧
			 if(man[i].dz==18) man[i].death=189;//死亡帧
			 man[i].dz=19;frame[i]-=1;
			 return;
			}//完成倒地 
		  man[i].dz=dongzuo[rand()%7];		//随机选取一个动作
		  frame[i]=anim[0][man[i].dz].start;//取被选取动作的开始帧
		 }
		}
		if(frame[i]>anim[0][man[i].dz].end) //到动作尾帧了吗?
		{ if(man[i].dz>15) 
			{if(man[i].dz==16) man[i].death=177;//死亡帧
			 if(man[i].dz==17) man[i].death=183;//死亡帧
			 if(man[i].dz==18) man[i].death=189;//死亡帧
			 man[i].dz=19;frame[i]-=1;
			 return;
			}//完成倒地
		  if(man[i].dz!=1)					//停下的
			{ man[i].dz=dongzuo[rand()%7];	//随机选取一个动作
			  if(rand()%10==0)				//1/10的慨率
				{man[i].dz=1;				//跑
				 man[i].zd[0]=RAND_COORD((MAP_W-1)*MAP_SCALE);//随机目标X分量
				 man[i].zd[1]=RAND_COORD((MAP_W-1)*MAP_SCALE);//随机目标Z分量
				}
			}
		  frame[i]=anim[0][man[i].dz].start;//取被选取动作的开始帧
		}
	}
///////////////////////////////////////////////////////////////////
	glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属性
	glPushMatrix();//glPopMatrix();
	glTranslatef(man[i].qd[0],man[i].qd[2], -man[i].qd[1]);//位置
	glRotatef(re[i]+90,0,1,0);//
	glScaled(.06f,.06f,.06f);//
	glEnable(GL_TEXTURE_2D);//
	if(model[0]!=NULL)
	{	texture[0]->ChangeSettings(GL_LINEAR,GL_LINEAR_MIPMAP_LINEAR,
	                             GL_CLAMP,GL_CLAMP,0);//GL_MODULATE);//
		md2_drawModel (model[0],(int)frame[i],0,0);//
	}
	if(model[1]!=NULL && man[i].dz<size[1]-1)
	{	texture[1]->ChangeSettings(GL_LINEAR,GL_LINEAR_MIPMAP_LINEAR,
	                             GL_CLAMP,GL_CLAMP,0);//GL_MODULATE);//
		md2_drawModel (model[1],(int)frame[i],0,0);//
	}
	glDisable(GL_TEXTURE_2D);//
	glPopMatrix();//
	glPopAttrib();//恢复前一属性
}
void anmobj::getobj(CString na)//
{	anim[0]=anim[1]=NULL;			//动作序列
	if(model[0]!=NULL) {delete[] model[0];model[0]=NULL;}
	if(model[1]!=NULL) {delete[] model[1];model[1]=NULL;}
	model[0]   = md2_readModel(na+"tris.md2");
	texture[0] = new Texture(na+"tris.PCX");
	model[1]   = md2_readModel(na+"weapon.md2");
	texture[1] = new Texture(na+"weapon.pcx");
	if(model[1]!=NULL) size[1] = md2_getAnimationCount(model[1]);
	if(model[0]!=NULL) 
	{size[0] = md2_getAnimationCount(model[0]);
	 animations (model[0],0);//
	 for(int i=0;i<RNSHU;i++)
		{counter[i]=0;
		 frame[i]=(float)(40+rand()%5);//
		}
	}
}
animation* anmobj::animations (md2_model_t* model,int p)
{	if (size[p] == 0) return 0;//
	if(anim[p]!=NULL) delete[] anim[p];//
	anim[p] = new animation[size[p]];//
	for (int i=0; i<size[p]; i++)//
	{	strcpy (anim[p][i].name,md2_getAnimationName(model,i));//
		md2_getAnimationFrames(model,i,&anim[p][i].start,&anim[0][i].end);//
	}
	return 0;//
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -