car.cpp
来自「极限赛车CarGameDemo DirectX9」· C++ 代码 · 共 224 行
CPP
224 行
#include "StdAfx.h"
#include "../common/myd3d.h"
#include "mesh.h"
#include "car.h"
Car::Car(void)
{
}
Car::~Car(void)
{
}
D3DXVECTOR3 Car::GetLook(void)
{
return _look;
}
D3DXVECTOR3 Car::GetRight(void)
{
return _right;
}
float Car::GetSpeed(void)
{
return _speed;
}
D3DXVECTOR3 Car::GetPosition(D3DXVECTOR3* pos)
{
if(pos == NULL)
return _pos;
else
{
*pos = _pos;
return _pos;
}
}
void Car::SetPosition(D3DXVECTOR3* pos)
{
_pos = *pos;
}
void Car::SetSpeed(float sp)
{
_speed = sp;
}
void Car::SetMaxSpeed(float sp)
{
_maxSpeed = sp;
}
void Car::SavePosMatrix(void)
{
// 保持车的自身坐标互相垂直
D3DXVec3Normalize(&_look, &_look);
D3DXVec3Cross(&_up, &_look, &_right);
D3DXVec3Normalize(&_up, &_up);
D3DXVec3Cross(&_right, &_up, &_look);
D3DXVec3Normalize(&_right, &_right);
// 创建位置变换矩阵(注:不同于Camera类的坐标变换矩阵)
float x = _pos.x;
float y = _pos.y;
float z = _pos.z;
_world(0,0) = _right.x; _world(0, 1) = _right.y; _world(0, 2) = _right.z; _world(0, 3) = 0.0f;
_world(1,0) = _up.x; _world(1, 1) = _up.y; _world(1, 2) = _up.z; _world(1, 3) = 0.0f;
_world(2,0) = _look.x; _world(2, 1) = _look.y; _world(2, 2) = _look.z; _world(2, 3) = 0.0f;
_world(3,0) = x; _world(3, 1) = y; _world(3, 2) = z; _world(3, 3) = 1.0f;
}
void Car::AddSpeed(float units)
{
_speed += units;
if( _speed > _maxSpeed )
{
_speed = _maxSpeed;
}
}
void Car::SubSpeed(float units)
{
_speed -= units;
if( _speed < MINSPEED )
{
_speed = MINSPEED;
}
}
void Car::Move(float units)
{
_pos += D3DXVECTOR3(_look.x, 0.0f, _look.z) * _speed * units;
/*m_pos += m_look * (m_speed * units);*/
}
void Car::LPmove(float units)
{
_pos -= D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;
}
void Car::RPmove(float units)
{
_pos += D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;
}
void Car::GoLeft(float angle)
{
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T, &_up, -angle);
D3DXVec3TransformCoord(&_right,&_right, &T);
D3DXVec3TransformCoord(&_look,&_look, &T);
}
void Car::GoRight(float angle)
{
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T, &_up, angle);
D3DXVec3TransformCoord(&_right,&_right, &T);
D3DXVec3TransformCoord(&_look,&_look, &T);
}
void Car::Update(float timeDelta)
{
if(_isAlive)
{
SavePosMatrix();
for(int i=0; i<5; i++)
{
D3DXVec3TransformCoord(&_bBox._Nvxz[i], &_bBox._vxz[i], &_world);
}
D3DXVec3TransformCoord(&_bSphere._Ncenter, &_bSphere._center, &_world);
//生命检测
if( _lifeNum <= 0 )
{
Kill();
}
//将生命和圈数放在字符串中
sprintf_s(_lifeString, "HP:%d", _lifeNum);
_lifeString[SIZE-1] = '\0';
sprintf_s(_circleString, "LAPS:%d", _circleNum);
_circleString[SIZE-1] = '\0';
sprintf_s(_speedString, "SPEED:%d", (int)_speed);
_speedString[SIZE-1] = '\0';
}
_carExp.Update(timeDelta);
_bullet.Update(timeDelta);
}
//重写Init方法
bool Car::Init(LPCSTR carFN, LPCSTR bulletFN, LPCSTR expFN)
{
_pos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
_right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
_up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
_look = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
_speed = 0.0f;
_maxSpeed = 80.0f;
_haveBullet = true;
_isAlive = true;
_lifeNum = 3;
_circleNum = 0;
Mymesh::Init( carFN );
_bullet.Init( bulletFN, expFN );
_carExp.Init( Explosion::CAR,expFN );
return true;
}
//重写Draw方法
bool Car::Draw()
{
if(_isAlive)
{
Mymesh::Draw();
}
_bullet.Draw();
_carExp.Rend();
return true;
}
//重写Clean方法
void Car::Clean()
{
Mymesh::Clean();
_bullet.Clean();
_carExp.Clean();
}
void Car::Fire()
{
if( _haveBullet)
{
_bullet._speed =_bullet.NORMALSPEED + _speed;
_bullet._pos = _pos ;
_bullet._right = _right;
_bullet._up = _up;
_bullet._look = _look;
_bullet._world = _world;
_bullet._isAlive = true;
_haveBullet = false;
}
}
bool Car::Kill()
{
_bullet.Kill();
_haveBullet = true;
//设置爆炸
_carExp.setPos( _pos );
_carExp.getExpTime();
_carExp._isExp = true;
_lifeNum =0;
_isAlive = false;
return true;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?