3dE.cpp
上传用户:hkb425
上传日期:2007-06-16
资源大小:34191k
文件大小:8k
- // 3dE.cpp: implementation of the C3dE class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "3dE.h"
- #include "heightmap.h"
- #include "math.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- C3dE::C3dE()
- {
- m_bControlled=true;
- m_bAttacked=false;
- m_bAttacking=false;
- m_Health=100;
- m_Height=8;
- m_baseHeight=255;
- m_eyePos=VERTEX(0,0,0);
- // m_boundary;
- m_RotX=0;
- m_RotY=180;
- m_RotZ=0;
- m_RunVector=NORMAL(0,0,0);
- m_JumpSpeed=0.4f;
- m_Acceleration=0.1f;
- m_MaxRunSpeed=2.1f;
- m_Decrease=0.04f;
- m_AirDecrease=0.0001f;
- m_Gravity=0.02f;
- m_bFlying=false;
- m_stepHeight=2;
- m_YBiasAngle=0;
- m_YBias=0;
- m_ZBiasAngle=0;
- m_bBiasLeft=true;
- m_gunYBias=0;
- m_gunZBias=0;
- m_gunState=0;
- m_VisualAngle=30; //half ,degree
- }
- C3dE::~C3dE()
- {
- }
- bool C3dE::Init3dExplorer(VERTEX eyePos,float rotY, bool bControlled)
- {
- m_bControlled =bControlled;
-
- if(!m_Weapon.InitMd2Loader("model/myGun.md2","model/myGun.BMP",0.1f))
- {
- MessageBox(0, "cMD2 error", "Error", MB_OK | MB_ICONERROR);
- return FALSE;
- }
- if(!m_cAmmoManager.InitAmmoManager())
- {
- MessageBox(0, "ammo error", "Error", MB_OK | MB_ICONERROR);
- return FALSE;
- }
- m_eyePos=eyePos;
- m_baseHeight=m_eyePos.ypos-m_Height;
- m_RotY=rotY;
- m_gunState=0;
- return true;
- }
- void C3dE::Update3dEAmmo()
- {
- // m_cAmmoManager.UpdateAmmoManager();
- ////////// launch bullet
- if(m_bAttacking)
- {
- float cosin=cosf(m_RotY*0.0174533f);
- float sinn =sinf(m_RotY*0.0174533f);
- float rightBias=-0.02f;
- float forward=-5.0f;//float(rand()%100)/100-2;
- VERTEX vert=VERTEX(m_eyePos.xpos+cosin*rightBias-sinn*forward,
- m_eyePos.ypos-0.1f,
- m_eyePos.zpos-sinn*rightBias-cosin*forward);
- // m_cAmmoManager.LaunchRocket(vert,m_RotX,m_RotY);
- m_cAmmoManager.LaunchRocket(vert,m_RotX,m_RotY);
- }
- }
- void C3dE::ProcessInput(INPUT *pInput)
- {
- static bool model;
- static bool lighting;
- if(pInput->keys['F'])
- {
- pInput->keys['F']=false;
- model=!model;
- }
- if(model)
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
-
- else
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- if(pInput->keys['L'])
- {
- pInput->keys['L']=false;
- lighting=!lighting;
- }
- if(!lighting)
- {
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- }
- else
- {
-
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
- }
- /////////////////////////////////
- glPushMatrix();
- glTranslatef(0.4f,
- sinf(m_gunYBias*0.0174533f )*0.1f-0.7f,
- -cosf(m_gunZBias*0.0174533f)*0.2f-0.0f);
- glRotatef(20,1.0f,0.0f,0.0f);
- glRotatef(-80,0.0f,1.0f,0.0f);
- m_Weapon.RenderOneFrame(20);
- glPopMatrix();
- //////////// backup my position
- VERTEX oldPos=m_eyePos;
- //////////// Process mouse and keyboard Input
- if(pInput->mouseButtons[0])
- {
- m_bAttacking=true;
- pInput->mouseButtons[0]=false;
- m_gunState=1;
- m_gunZBias+=60;
- }
- else
- {
- m_bAttacking=false;
- m_gunYBias+=5;
- }
- if (m_gunYBias >= 359.0f)
- m_gunYBias -= 359;
- if(m_gunState==1)
- {
- m_gunZBias+=60;
- if (m_gunZBias >= 359.0f)
- {
- m_gunZBias=0;
- m_gunState=0;
- }
- }
- m_RotY+=(400-pInput->mousePos.x)*0.1f;// /mouse Speed
- m_RotX-=(300-pInput->mousePos.y)*0.1f;
- // Center mouse
- SetCursorPos(400,300);
- // Keyboard input
- if (pInput->keys[VK_UP] && (!m_bFlying))
- {
- m_RunVector.nz-=m_Acceleration;
- if(m_RunVector.nz<-m_MaxRunSpeed)m_RunVector.nz=-m_MaxRunSpeed;
- ////////////////Y bias
- if (m_YBiasAngle >= 359)
- m_YBiasAngle = 0;
- else
- m_YBiasAngle+= 8;
- m_YBias=sinf(m_YBiasAngle*0.0174533f )/4.0f;
- ////////////// Z bias
- /* if(m_bBiasLeft)m_ZBiasAngle+=0.1f;
- else m_ZBiasAngle-=0.1f;
- if(m_ZBiasAngle>1)m_bBiasLeft=false;
- if(m_ZBiasAngle<-1)m_bBiasLeft=true;*/
- }
- else
- {
- if(! pInput->keys[VK_DOWN] && m_RunVector.nz<0 )
- {
- if(m_bFlying) m_RunVector.nz+=m_AirDecrease;
- else m_RunVector.nz+=m_Decrease;
- if(m_RunVector.nz>0)m_RunVector.nz=0;
-
- }
- }
- if (pInput->keys[VK_DOWN] && (!m_bFlying))
- {
- m_RunVector.nz+=m_Acceleration;
- if(m_RunVector.nz>m_MaxRunSpeed)m_RunVector.nz=m_MaxRunSpeed;
- }
- else
- {
- if (! pInput->keys[VK_UP] && m_RunVector.nz>0)
- {
- if(m_bFlying) m_RunVector.nz-=m_AirDecrease;
- else m_RunVector.nz-=m_Decrease;
- if(m_RunVector.nz<0)m_RunVector.nz=0;
- }
- }
- if (pInput->keys[VK_LEFT]&& (!m_bFlying))
- {
- m_RunVector.nx-=m_Acceleration;
- if(m_RunVector.nx<-m_MaxRunSpeed)m_RunVector.nx=-m_MaxRunSpeed;
- }
- else
- {
- if (!pInput->keys[VK_RIGHT] && m_RunVector.nx<0)
- {
- m_RunVector.nx+=m_Decrease;
- if(m_RunVector.nx>0)m_RunVector.nx=0;
- }
- }
- if (pInput->keys[VK_RIGHT]&& (!m_bFlying) )
- {
- m_RunVector.nx+=m_Acceleration;
- if(m_RunVector.nx>m_MaxRunSpeed)m_RunVector.nx=m_MaxRunSpeed;
- }
- else
- {
- if (! pInput->keys[VK_LEFT] && m_RunVector.nx>0)
- {
- m_RunVector.nx-=m_Decrease;
- if(m_RunVector.nx<0)m_RunVector.nx=0;
- }
- }
- if (pInput->keys[VK_SPACE] && (!m_bFlying))
- {
- m_RunVector.ny=m_JumpSpeed;
- m_bFlying=true;
- }
- if (pInput->mouseButtons[1] && (!m_bFlying))
- {
- }
- if (pInput->keys[VK_NEXT])
- {
- m_Height+=4;
- }
- if (pInput->keys[VK_PRIOR])
- {
- m_Height-=4;
- }
- ///////////////////////////////////////////
- /////// Now , Update eyePos
- ///////////////////////////////////////////
- m_eyePos.xpos +=m_RunVector.nz*sinf(m_RotY*0.0174533f)+m_RunVector.nx*cosf(m_RotY*0.0174533f);
- m_eyePos.ypos +=m_RunVector.ny + m_YBias;
- m_eyePos.zpos +=m_RunVector.nz*cosf(m_RotY*0.0174533f)-m_RunVector.nx*sinf(m_RotY*0.0174533f);
- //////// check new position
- m_baseHeight=m_eyePos.ypos-m_Height;
- float newHeight=m_Heightmap.GetHeight(&m_eyePos);
- if(m_bFlying)
- {
- m_RunVector.ny-=m_Gravity;
- if(m_baseHeight<newHeight)
- {
- m_baseHeight=newHeight;
- m_eyePos.ypos=newHeight+m_Height;
- m_RunVector.ny=0;
- m_bFlying=false;
- }
- return;
- }
- m_baseHeight=newHeight;
- m_eyePos.ypos=m_baseHeight+m_Height;
- /*
- if((newHeight-m_baseHeight)>m_stepHeight) /// collided
- m_eyePos=oldPos;
- else
- if((newHeight-m_baseHeight)>0)//up
- {
- float percent=1-(newHeight-m_baseHeight)/m_stepHeight;
- //if(percent<0)percent=-percent;
- m_baseHeight=m_baseHeight+(newHeight-m_baseHeight)*percent;
- m_eyePos.ypos=m_baseHeight+m_Height;
- m_eyePos.xpos=oldPos.xpos+(m_eyePos.xpos-oldPos.xpos)*percent;
- m_eyePos.zpos=oldPos.zpos+(m_eyePos.zpos-oldPos.zpos)*percent;
- }
- else//down
- {
- m_baseHeight=newHeight;
- m_eyePos.ypos=m_baseHeight+m_Height;
- }
- */
- UpdateHeightmap();
- }
- void C3dE::TransformWorld(int step)
- {
- //////////////////////////////////////////
- if(step==0)
- {
- glRotatef(float(m_RotX), 1.0f, 0.0f, 0.0f);
- glRotatef(float(m_ZBiasAngle), 0.0f, 0.0f, 1.0f);
- glRotatef(360.0f - m_RotY, 0.0f, 1.0f, 0.0f);
- glTranslated(0, 0, 0);
- }
- else
- {
- glTranslated(-m_eyePos.xpos, -m_eyePos.ypos, -m_eyePos.zpos);
- }
- }
- void C3dE::UpdateHeightmap()
- {
- m_Heightmap.m_pViewPos->xpos=m_eyePos.xpos;
- m_Heightmap.m_pViewPos->ypos=m_eyePos.ypos;
- m_Heightmap.m_pViewPos->zpos=m_eyePos.zpos;
- if(m_RotX>=360)m_RotX-=360;
- if(m_RotY>=360)m_RotY-=360;
- if(m_RotX<0)m_RotX+=360;
- if(m_RotY<0)m_RotY+=360;
- *m_Heightmap.m_pViewRotX =m_RotX;
- *m_Heightmap.m_pViewRotY =m_RotY;
- }