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 + -
显示快捷键?