📄 anmobj.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 + -