📄 cship.cpp
字号:
#include "CShip.h"
#include <stdio.h>
//using namespace std;
#include "CGDevice.h"
CShip::CShip():tex(0),pIB(0)
{
memset(Vertices,0,sizeof(VERTEX_COLOR_TEXTURE)*27);
D3DXMatrixIdentity(&mat);
D3DXMatrixIdentity(&totalMat);
eye=D3DXVECTOR3(0.0f,0.0f,0.0f);
look=D3DXVECTOR3(0.0f,0.0f,1.0f);
moveX=moveZ=rot=0.0f;
}
CShip::~CShip()
{
SAFE_RELEASE(tex);
SAFE_RELEASE(pIB);
}
HRESULT CShip::Create()
{
VERTEX_COLOR_TEXTURE tempVertex[]=
{
//底
{-1,0,0,0xFFFFFFFF,0.5f,1.0f},
{0,0,3,0xFFFFFFFF,0.75f,0.0f},
{1,0,0,0xFFFFFFFF,1.0f,1.0f},
{-1,1,0,0xFFFFFFFF,0.5f,1.0f},
{0,1,3,0xFFFFFFFF,0.75f,0.0f},
{1,1,0,0xFFFFFFFF,1.0f,1.0f},
//左
{-1,0,0,0xFFFFFFFF,1.0f,1.0f},
{0,0,3,0xFFFFFFFF,0.5f,1.0f},
{0,1,3,0xFFFFFFFF,0.5f,0.0f},
{0,1,3,0xFFFFFFFF,0.5f,0.0f},
{-1,1,0,0xFFFFFFFF,1.0f,0.0f},
{-1,0,0,0xFFFFFFFF,1.0f,1.0f},
//右
{1,0,0,0xFFFFFFFF,1.0f,1.0f},
{0,0,3,0xFFFFFFFF,0.5f,1.0f},
{0,1,3,0xFFFFFFFF,0.5f,0.0f},
{0,1,3,0xFFFFFFFF,0.5f,0.0f},
{1,1,0,0xFFFFFFFF,1.0f,0.0f},
{1,0,0,0xFFFFFFFF,1.0f,1.0f},
//后
{1,0,0,0xFFFFFFFF,1.0f,1.0f},
{-1,0,0,0xFFFFFFFF,0.5f,1.0f},
{-1,1,0,0xFFFFFFFF,0.5f,0.0f},
{-1,1,0,0xFFFFFFFF,0.5f,0.0f},
{1,1,0,0xFFFFFFFF,1.0f,0.0f},
{1,0,0,0xFFFFFFFF,1.0f,1.0f},
//帆
{0,0.5,2.5,0xFFFFFFFF,0.0f,1.0f},
{0,5,1.5,0xFFFFFFFF,0.25f,0.0f},
{0,0.5,0.5,0xFFFFFFFF,0.5f,1.0f},
};
memcpy(Vertices,tempVertex,sizeof(VERTEX_COLOR_TEXTURE)*27);
CGDevice *pDev=CGDevice::GetInstance();
if(FAILED(pDev->GetDev()->CreateVertexBuffer(27*sizeof(VERTEX_COLOR_TEXTURE),0,D3DFVF_XYZ_COLOR_TEXTURE,D3DPOOL_DEFAULT,&pIB,NULL)))
{
return S_FALSE;
}
VERTEX_COLOR_TEXTURE *pVer;
if(FAILED(pIB->Lock(0,0,(void**)&pVer,0)))
return S_FALSE;
memcpy(pVer,Vertices,sizeof(VERTEX_COLOR_TEXTURE)*27);
pIB->Unlock();
if(FAILED(D3DXCreateTextureFromFile(pDev->GetDev(),TEXT("ship.jpg"),&tex)))
return S_FALSE;
return S_OK;
}
void CShip::SetTrans(float movex,float movey,float movez,float scalex,float scaley,float scalez)
{
D3DXMATRIX matTrans;
D3DXMatrixTranslation(&matTrans,0.0f,0.0f,-2.0f);
mat=matTrans;
D3DXMatrixScaling(&matTrans,scalex,scaley,scalez);
mat*=matTrans;
D3DXMatrixTranslation(&matTrans,movex,movey,movez);
mat*=matTrans;
}
HRESULT CShip::Render()
{
CGDevice *pDev=CGDevice::GetInstance();
LPDIRECT3DDEVICE9 dev=pDev->GetDev();
dev->SetTransform(D3DTS_WORLD,&totalMat);
dev->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
dev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
// dev->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
dev->SetTexture(0,tex);
dev->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESS);
dev->SetRenderState(D3DRS_ZENABLE,TRUE);
if(FAILED(dev->SetStreamSource(0,pIB,0,sizeof(VERTEX_COLOR_TEXTURE))))
return S_FALSE;
if(FAILED(dev->SetFVF(D3DFVF_XYZ_COLOR_TEXTURE)))
return S_FALSE;
if(FAILED(dev->DrawPrimitive(D3DPT_TRIANGLELIST,0,12)))
return S_FALSE;
dev->SetRenderState(D3DRS_ZENABLE,FALSE);
return S_OK;
}
void CShip::Move(float x,float z)
{
moveX=x;
moveZ=z;
}
void CShip::Rotate(float rot)
{
this->rot-=rot;
}
HRESULT CShip::Update()
{
CGDevice *dev=CGDevice::GetInstance();
LPDIRECT3DDEVICE9 pdev=dev->GetDev();
D3DXMATRIX matY,matTrans,moveMat;
D3DXMatrixIdentity(&moveMat);
//位置变换
//本次位移量
D3DXVECTOR3 cur_eye(moveX,0.0f,moveZ);
moveX=0.0f;
moveZ=0.0f;
//将位移量旋转到方向上,得到相应位移向量
D3DXMatrixRotationY(&matY,rot);
dev->VertexMulMatrix(&cur_eye,&matY);
//将位移向量加到当前的位置向量上得到新的位置向量
eye+=cur_eye;
if(eye.x>9000)
eye.x=9000;
else if(eye.x<-9000)
eye.x=-9000;
if(eye.z>9000)
eye.z=9000;
else if(eye.z<-9000)
eye.z=-9000;
D3DXMatrixTranslation(&matTrans,eye.x,0.0f,eye.z);
// D3DXMatrixIdentity(&moveMat);
moveMat*=matY;
moveMat*=matTrans;
totalMat=mat*moveMat;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -