📄 aerocraft.cpp
字号:
// Aerocraft.cpp: implementation of the CAerocraft class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "EludeObstacle.h"
#include "Aerocraft.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int g_WindowsWidth;
extern int g_WindowsHeight;
extern double PI;
extern double g_GRAVITY;
extern double g_TimeElapsed;
extern double g_SCALING_FACTOR;
extern double g_JetAcceleration;
extern double g_AerocraftSize;
extern int ifShowDirection;
CAerocraft::CAerocraft(int cxClient,int cyClient,double rot)
{
}
CAerocraft::CAerocraft()
{
}
CAerocraft::~CAerocraft()
{
}
void CAerocraft::init(int x,int y,double dRotation,double dScale)
{
m_iJetDirection = 1;
m_dRotation = 0;
m_dScale = 1;
for(int i = 0;i < 30;i++)
{
m_tempSPAerocraft[i] = SPAerocraft[i];
}
m_vVelocity = 0;
m_vPos.x = x;
m_vPos.y = y;
rotation(dRotation);
Scale(dScale);
//重新计算飞行器的新位置
updateThePosition();
}
void CAerocraft::rotation(double dRotation)
{
m_dRotation += dRotation;
if (m_dRotation > 2*PI)
{
m_dRotation -= 2*PI;
}
C2DMatrix matTransform;
matTransform.Rotate(-dRotation);
//把m_tempSPAerocraft里面所储存的外形改变。
matTransform.TransformSPoints(m_tempSPAerocraft,m_tempSPAerocraft);
}
void CAerocraft::Scale(double dScale)
{
m_dScale *= dScale;
C2DMatrix matTransform;
matTransform.Scale(dScale,dScale);
//把m_tempSPAerocraft里面所储存的外形改变。
matTransform.TransformSPoints(m_tempSPAerocraft,m_tempSPAerocraft);
}
void CAerocraft::WorldTransform()
{
//create a transformation matrix
C2DMatrix matTransform;
//scale
matTransform.Scale(m_dScale, m_dScale);
//rotate - remember, because the mapping mode is set so that the y
//axis is pointing up, the rotation is reversed.
matTransform.Rotate(-m_dRotation);
//and translate
matTransform.Translate(m_vPos.x, m_vPos.y);
//now transform the ships vertices
matTransform.TransformSPoints(m_tempSPAerocraft,m_tempSPAerocraft);
}
//使飞船按照m_vPos向量到达指定的地方。
void CAerocraft::updateThePosition()
{
updateTheVector();
C2DMatrix matTransform;
matTransform.Translate(m_vPos.x, m_vPos.y);
//matTransform.TransformSPoints(m_tempSPAerocraft,m_SP);
}
//用速度更新飞船的位置向量
void CAerocraft::updateTheVector()
{
//update the lander's position
m_vPos += m_vVelocity * g_TimeElapsed * g_SCALING_FACTOR;
}
//因重力而改变的速度
void CAerocraft::updateTheVelocity1()
{
//now add in the gravity vector
m_vVelocity.y += g_GRAVITY * g_TimeElapsed;
}
//因推进力而改变的速度
void CAerocraft::updateTheVelocity2()
{
m_vVelocity.y -= g_JetAcceleration * g_TimeElapsed;
/*
m_vVelocity.x += -g_JetAcceleration * g_TimeElapsed * sin(m_dRotation);
m_vVelocity.y += -g_JetAcceleration * g_TimeElapsed * cos(m_dRotation);
*/
}
void CAerocraft::updateTheVelocity3()
{
m_vVelocity.y += g_JetAcceleration * g_TimeElapsed;
/*
m_vVelocity.x += g_JetAcceleration * g_TimeElapsed * sin(m_dRotation);
m_vVelocity.y += g_JetAcceleration * g_TimeElapsed * cos(m_dRotation);
*/
}
void CAerocraft::updateTheVelocity4()
{
m_vVelocity.x -= g_JetAcceleration * g_TimeElapsed;
/*
m_vVelocity.x += -g_JetAcceleration * g_TimeElapsed * cos(m_dRotation);
m_vVelocity.y += -g_JetAcceleration * g_TimeElapsed * sin(m_dRotation);
*/
}
void CAerocraft::updateTheVelocity5()
{
m_vVelocity.x += g_JetAcceleration * g_TimeElapsed;
/*
m_vVelocity.x += g_JetAcceleration * g_TimeElapsed * cos(m_dRotation);
m_vVelocity.y += g_JetAcceleration * g_TimeElapsed * sin(m_dRotation);
*/
}
void CAerocraft::showTheAerocraft(CDC *pDC)
{
/*
CPen pen,pen2,*p_pen;
pen.CreatePen(PS_SOLID,2,RGB(220,220,220));
p_pen = pDC->SelectObject(&pen);
pDC->MoveTo(m_SP[0].x,m_SP[0].y);
for(int i = 1;i < 25;i++)
{
pDC->LineTo(m_SP[i].x,m_SP[i].y);
}
pen2.CreatePen(PS_SOLID,2,RGB(241,219,141));
pDC->SelectObject(&pen2);
showTheJet(pDC);
pDC->SelectObject(p_pen);
pen.DeleteObject();
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(241,219,141));
pDC->SelectObject(&pen);
showTheJet(pDC);
CDC ImageDC;
CBitmap ForeBMP;
BITMAP bm;
ForeBMP.LoadBitmap(IDB_BITMAP3);
ForeBMP.GetBitmap(&bm);
ImageDC.CreateCompatibleDC(pDC);
ImageDC.SelectObject(&ForeBMP);
double size = g_AerocraftSize * 6;
TransparentBlt(pDC->GetSafeHdc(),m_vPos.x - size,m_vPos.y - size,size*2,size*2,ImageDC.GetSafeHdc(),0,0,bm.bmWidth-2,bm.bmHeight,RGB(0xff,0xff,0xff));
ImageDC.DeleteDC();
*/
}
void CAerocraft::showTheJet(CDC *pDC,int drawX)
{
int i;
if(m_iJetDirection == 2)
{
pDC->MoveTo(jet[0].x * m_dScale + drawX,jet[0].y * m_dScale + m_vPos.y);
for(i = 1;i < 5;i++)
{
pDC->LineTo(jet[i].x * m_dScale + drawX,jet[i].y * m_dScale + m_vPos.y);
}
}
if(m_iJetDirection == 3)
{
pDC->MoveTo(-jet[0].x * m_dScale + drawX,-jet[0].y * m_dScale + m_vPos.y);
for(i = 1;i < 5;i++)
{
pDC->LineTo(-jet[i].x * m_dScale + drawX,-jet[i].y * m_dScale + m_vPos.y);
}
}
if(m_iJetDirection == 4)
{
pDC->MoveTo(jet[0].y * m_dScale + drawX , jet[0].x * m_dScale + m_vPos.y);
for(i = 1;i < 5;i++)
{
pDC->LineTo(jet[i].y * m_dScale + drawX , jet[i].x * m_dScale + m_vPos.y);
}
}
if(m_iJetDirection == 5)
{
pDC->MoveTo(-jet[0].y * m_dScale + drawX , -jet[0].x * m_dScale + m_vPos.y);
for(i = 1;i < 5;i++)
{
pDC->LineTo(-jet[i].y * m_dScale + drawX , -jet[i].x * m_dScale + m_vPos.y);
}
}
if(ifShowDirection == 0)
{
int centerX = g_WindowsWidth * 3/4;
int centerY = g_WindowsHeight / 2;
CPen pen,pen2,*p_pen;
pen.CreatePen(PS_SOLID,2,RGB(255,255,128));
p_pen = pDC->SelectObject(&pen);
if(m_iJetDirection == 2)
{
pDC->MoveTo(0 + centerX,-40 + centerY);
pDC->LineTo(10 + centerX,-30 + centerY);
pDC->LineTo(5 + centerX,-30 + centerY);
pDC->LineTo(5 + centerX,-10 + centerY);
pDC->LineTo(-5 + centerX,-10 + centerY);
pDC->LineTo(-5 + centerX,-30 + centerY);
pDC->LineTo(-10 + centerX,-30 + centerY);
pDC->LineTo(0 + centerX,-40 + centerY);
}
else if(m_iJetDirection == 3)
{
pDC->MoveTo(0 + centerX,40 + centerY);
pDC->LineTo(10 + centerX,30 + centerY);
pDC->LineTo(5 + centerX,30 + centerY);
pDC->LineTo(5 + centerX,10 + centerY);
pDC->LineTo(-5 + centerX,10 + centerY);
pDC->LineTo(-5 + centerX,30 + centerY);
pDC->LineTo(-10 + centerX,30 + centerY);
pDC->LineTo(0 + centerX,40 + centerY);
}
else if(m_iJetDirection == 4)
{
pDC->MoveTo(-40 + centerX,0 + centerY);
pDC->LineTo(-30 + centerX,10 + centerY);
pDC->LineTo(-30 + centerX,5 + centerY);
pDC->LineTo(-10 + centerX,5 + centerY);
pDC->LineTo(-10 + centerX,-5 + centerY);
pDC->LineTo(-30 + centerX,-5 + centerY);
pDC->LineTo(-30 + centerX,-10 + centerY);
pDC->LineTo(-40 + centerX,0 + centerY);
}
else if(m_iJetDirection == 5)
{
pDC->MoveTo(40 + centerX,0 + centerY);
pDC->LineTo(30 + centerX,10 + centerY);
pDC->LineTo(30 + centerX,5 + centerY);
pDC->LineTo(10 + centerX,5 + centerY);
pDC->LineTo(10 + centerX,-5 + centerY);
pDC->LineTo(30 + centerX,-5 + centerY);
pDC->LineTo(30 + centerX,-10 + centerY);
pDC->LineTo(40 + centerX,0 + centerY);
}
//用虚线画出箭头
pen2.CreatePen(PS_DOT,1,RGB(255,255,0));
p_pen = pDC->SelectObject(&pen2);
if(m_iJetDirection != 2)
{
pDC->MoveTo(0 + centerX,-40 + centerY);
pDC->LineTo(10 + centerX,-30 + centerY);
pDC->LineTo(5 + centerX,-30 + centerY);
pDC->LineTo(5 + centerX,-10 + centerY);
pDC->LineTo(-5 + centerX,-10 + centerY);
pDC->LineTo(-5 + centerX,-30 + centerY);
pDC->LineTo(-10 + centerX,-30 + centerY);
pDC->LineTo(0 + centerX,-40 + centerY);
}
if(m_iJetDirection != 3)
{
pDC->MoveTo(0 + centerX,40 + centerY);
pDC->LineTo(10 + centerX,30 + centerY);
pDC->LineTo(5 + centerX,30 + centerY);
pDC->LineTo(5 + centerX,10 + centerY);
pDC->LineTo(-5 + centerX,10 + centerY);
pDC->LineTo(-5 + centerX,30 + centerY);
pDC->LineTo(-10 + centerX,30 + centerY);
pDC->LineTo(0 + centerX,40 + centerY);
}
if(m_iJetDirection != 4)
{
pDC->MoveTo(-40 + centerX,0 + centerY);
pDC->LineTo(-30 + centerX,10 + centerY);
pDC->LineTo(-30 + centerX,5 + centerY);
pDC->LineTo(-10 + centerX,5 + centerY);
pDC->LineTo(-10 + centerX,-5 + centerY);
pDC->LineTo(-30 + centerX,-5 + centerY);
pDC->LineTo(-30 + centerX,-10 + centerY);
pDC->LineTo(-40 + centerX,0 + centerY);
}
if(m_iJetDirection != 5)
{
pDC->MoveTo(40 + centerX,0 + centerY);
pDC->LineTo(30 + centerX,10 + centerY);
pDC->LineTo(30 + centerX,5 + centerY);
pDC->LineTo(10 + centerX,5 + centerY);
pDC->LineTo(10 + centerX,-5 + centerY);
pDC->LineTo(30 + centerX,-5 + centerY);
pDC->LineTo(30 + centerX,-10 + centerY);
pDC->LineTo(40 + centerX,0 + centerY);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -