📄 role.cpp
字号:
else
g_objGameMap.World2Cell(m_Info.posActionBegin.x, m_Info.posActionBegin.y, posPreStep.x, posPreStep.y);
m_Info.posMap = posPreStep;
if (g_objGameMap.IsPosVisible(m_Info.posMap, 2))
g_objGameMap.ApplyObjShow(this);
m_Info.posMap = posCurrent;
}
else
{
if (g_objGameMap.IsPosVisible(m_Info.posMap, 2))
g_objGameMap.ApplyObjShow(this);
}
m_objFStr.Process();
}
//--------------------------------------------------------------
void CRole::Show()
{
if(m_dwDisappear != 0 && (::TimeGet() - m_dwDisappear) < m_dwDisappearLast && m_dwDisappearLast != 0)
{
int nOffsetY = 0;
nOffsetY += m_Info.nFlyOffset;
int nBgX, nBgY;
g_objGameMap.World2Bg(m_Info.posWorld.x, m_Info.posWorld.y, nBgX, nBgY);
CMyPos posWorld;
posWorld.x = nBgX;
posWorld.y = nBgY-nOffsetY;
m_objEffect.Show(posWorld);
return;
}
if ((m_dwStatus & USERSTATUS_INVISIBLE) == USERSTATUS_INVISIBLE)
return;
if (!m_pIRoleView)
return;
{
int nBgX, nBgY;
g_objGameMap.World2Bg(m_Info.posWorld.x, m_Info.posWorld.y, nBgX, nBgY);
int nOffsetY = 0;
int nShadowY = 0;
switch(this->GetActionType())
{
case _ACTION_JUMP:
{
// if(!this->TestStatus(USERSTATUS_FLY))
{
nOffsetY = this->GetJumpHeight();
nShadowY = this->GetJumpShadowHeight();
}
//nOffsetY -= g_objGameMap.GetBaseAltitude(m_Info.posMap);
}
break;
case _ACTION_WALKL:
case _ACTION_WALKR:
case _ACTION_RUNL:
case _ACTION_RUNR:
{
// nOffsetY = this->GetWalkHeight();
}
break;
default:
//nOffsetY = g_objGameMap.GetAltitude(m_Info.posMap)- g_objGameMap.GetBaseAltitude(m_Info.posMap);
break;
}
//m_Info.nFlyOffset = 100;
nOffsetY += m_Info.nFlyOffset;
nShadowY -= m_Info.nFlyOffset;
int nRotate = -45*m_Info.iDirection-45;
if(m_Info.bAdjustDir && (_ACTION_RUNL == m_Info.iActType || _ACTION_RUNR == m_Info.iActType))
{
int nDeltaX = (m_Info.posActionEnd.x - m_Info.posDir.x);
int nDeltaY = (m_Info.posActionEnd.y - m_Info.posDir.y);
double dAtan = atan2((double)nDeltaX, (double)nDeltaY);
nRotate = (180.0 * dAtan)/3.1415926 + 90;
}
if (m_Info.bAdjustDir &&(m_Info.posActionBegin.x != m_Info.posDir.x
|| m_Info.posActionBegin.y != m_Info.posDir.y))
{
if (_ACTION_RUNL != m_Info.iActType
&& _ACTION_RUNR != m_Info.iActType &&
_ACTION_WALKL != m_Info.iActType
&& _ACTION_WALKR != m_Info.iActType)
{
int nDeltaX = -(m_Info.posActionEnd.x - m_Info.posDir.x);
int nDeltaY = m_Info.posActionEnd.y - m_Info.posDir.y;
double dAtan = atan2((double)nDeltaY, (double)nDeltaX);
nRotate = (180.0 * dAtan)/3.1415926 + 90;
}
if(_ACTION_RUNL == m_Info.iActType
|| _ACTION_RUNR == m_Info.iActType)
{
int nDeltaX = -(m_Info.posActionBegin.x - m_Info.posDir.x);
int nDeltaY = m_Info.posActionBegin.y - m_Info.posDir.y;
double dAtan = atan2((double)nDeltaY, (double)nDeltaX);
nRotate = (180.0 * dAtan)/3.1415926 + 90;
}
}
float fScale = s_fBaseScale*this->GetZoomPercent()/100.0f;
// fScale = 0.75f*this->GetZoomPercent()/100.0f;
static float rscale = s_fBaseScale;
if(this->GetLook() == 1 && this->TestStatus(USERSTATUS_ATTACK))
{
if ( rscale < 0.85)
rscale += 0.01f;
else
rscale = 0.85f;
fScale = rscale*this->GetZoomPercent()/100.0f;
}
if (this->GetLook() == 1&& rscale > s_fBaseScale && !this->TestStatus(USERSTATUS_ATTACK))
{
if (rscale > s_fBaseScale)
rscale -= 0.01f;
else
rscale = s_fBaseScale;
fScale = rscale*this->GetZoomPercent()/100.0f;
}
if(this->GetCommandType() == _COMMAND_INTONE)
nShadowY = -m_Info.nZ;
else
m_Info.nZ = 0;
m_pIRoleView->SetPos(nBgX, nBgY-nOffsetY, nShadowY, nRotate, fScale);
// shadow...
// s_nShadowType = SHADOW_REAL;
if (s_nShadowType == SHADOW_SIMPLE &&
!this->TestStatus(USERSTATUS_GHOST) &&
this->GetViewType() != _ROLE_VIEW_TERRAIN)
{
CAni* pAni = g_objGameDataSet.GetDataAni("ani/common.ani", "SimpleShadow");
if (pAni)
{
int nShowX = 0, nShowY =0;
g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, nShowX, nShowY);
CMyBitmap* pBmp = pAni->GetFrame(0);
if (pBmp)
{
int nAlpha = 255;
if (m_tmDisappear != 0)
{
DWORD dwTimeGoesBy = ::TimeGet()-m_tmDisappear;
nAlpha = 256-50*dwTimeGoesBy/1000;
if (nAlpha < 0)
nAlpha = 0;
}
CMyPos posShadow = {nShowX-32, nShowY-16-nShadowY-nOffsetY};
g_objGameMap.MapScaleShowPos(posShadow.x, posShadow.y);
CMySize sizeShadow;
pBmp->GetSize(sizeShadow.iWidth, sizeShadow.iHeight);
sizeShadow.iWidth = sizeShadow.iWidth*g_objGameMap.GetScale()/_NORMAL_SCALE;
sizeShadow.iHeight = sizeShadow.iHeight*g_objGameMap.GetScale()/_NORMAL_SCALE;
pBmp->ShowEx(posShadow.x, posShadow.y, NULL, sizeShadow.iWidth, sizeShadow.iHeight, nAlpha);
}
}
}
CMyPos posView;
g_objGameMap.GetViewPos(posView);
int nViewportBgX, nViewportBgY;
g_objGameMap.World2Bg(posView.x, posView.y, nViewportBgX, nViewportBgY);
m_pIRoleView->SetAction(this->GetActionType(), false);
m_pIRoleView->SetVariable(_VAR_STATUS, this->GetStatus());
m_pIRoleView->SetVariable(_VAR_FRAME, m_Info.iActFrameIndex);
float alpha = 1.0f;
float alphaShadow = 0.8f;
if (m_tmDisappear != 0)
{
DWORD dwTimeGoesBy = ::TimeGet()-m_tmDisappear;
alpha = 1.0-0.2*dwTimeGoesBy/1000;
if (alpha < 0.0)
alpha = 0.0;
alphaShadow = 0.8-0.15*dwTimeGoesBy/1000;
if (alphaShadow < 0.0)
alphaShadow = 0.0;
}
union
{
DWORD dwColor;
struct
{
unsigned char ucAlpha;
unsigned char ucRed;
unsigned char ucGreen;
unsigned char ucBlue;
}InfoColor;
};
dwColor = g_objGameMap.GetARGB();
float fColor = 0.1 * (InfoColor.ucRed + InfoColor.ucGreen + InfoColor.ucBlue)/(255*3);
if (this->TestStatus(USERSTATUS_GHOST) && !this->IsPet())
m_pIRoleView->SetLightOffset(SHADOW_NONE, 300, -300, -1000, 0.8f, fColor, fColor, fColor);
else
m_pIRoleView->SetLightOffset(CRole::s_nShadowType, 300, -300, -1000, alphaShadow, fColor, fColor, fColor);
unsigned char ucA, ucR, ucG, ucB;
ucA = m_dwARGB >> 24;
ucR = (m_dwARGB & 0x00ff0000) >> 16;
ucG = (m_dwARGB & 0x0000ff00) >> 8;
ucB = m_dwARGB & 0x000000ff;
if ((this->TestStatus(USERSTATUS_GHOST) || this->TestStatus(USERSTATUS_LURKER)) && !this->IsPet())
m_pIRoleView->SetRGBA(1.0*ucA/(255*alpha*2), 1.0*ucR/255, 1.0*ucG/255, 1.0*ucB/255);
else
m_pIRoleView->SetRGBA(1.0*ucA/255*alpha, 1.0*ucR/255, 1.0*ucG/255, 1.0*ucB/255);
m_pIRoleView->Draw(nViewportBgX, nViewportBgY);
// show effect
this->ShowAniEffect(m_Info.posScr.x, m_Info.posScr.y-nOffsetY);
// show dialog ...
int nDialogDir = this->GetDir();
if(m_Info.posScr.x < 100)
nDialogDir = 1;
if(m_Info.posScr.x > _SCR_WIDTH - 100)
nDialogDir = 5;
g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posScr.x, m_Info.posScr.y);
m_objSayHello.ShowWords(m_Info.posScr.x, m_Info.posScr.y-nOffsetY, nDialogDir);
CMyPos posFStr;
posFStr.x = m_Info.posScr.x;
posFStr.y = m_Info.posScr.y-nOffsetY-100;
m_objFStr.Show(posFStr);
CMyPos posWorld;
posWorld.x = nBgX;
posWorld.y = nBgY-nOffsetY;
// Test code
int test = 0;
if (test == 1)
if ( this->GetID() == g_objHero.GetID() )
{
posWorld.y -= 100;
static BOOL s_bOK = true;
static CMyPos s_posEnd = posWorld;
static CMyPos s_posBegin;
static float s_fRadii;
static DWORD s_dwBeginTime;
static float s_fTime;
static BOOL s_bDir;
// Get a random position
if ( s_bOK )
{
s_posBegin = s_posEnd;
int nRandX = ::RandGet( 60 );
int nRandY = ::RandGet( 60 );
switch ( ::RandGet( 4 ) )
{
case 0:
s_posEnd.x = posWorld.x + nRandX;
s_posEnd.y = posWorld.y + nRandY;
break;
case 1:
s_posEnd.x = posWorld.x - nRandX;
s_posEnd.y = posWorld.y - nRandY;
break;
case 2:
s_posEnd.x = posWorld.x + nRandX;
s_posEnd.y = posWorld.y - nRandY;
break;
case 3:
s_posEnd.x = posWorld.x - nRandX;
s_posEnd.y = posWorld.y + nRandY;
break;
default:
break;
}
s_fRadii = ( 60 + ::RandGet( 60 ) ) / 100;
s_dwBeginTime = ::TimeGet();
s_bDir = ::TimeGet() % 2;
s_bOK = false;
posWorld = s_posBegin;
}
s_fTime = ( ::TimeGet() - s_dwBeginTime ) * 3.0f / 100;
if ( s_fTime != 0 )
s_bOK = CPhysics::S2DCMGetPos( 30, 0, s_fTime, s_fRadii, s_posBegin, s_posEnd, posWorld, s_bDir );
}
if(this->GetViewType() != _ROLE_VIEW_ROLE)
m_objEffect.Show(posWorld);
}
//CMyBitmap::ClearBuffer(true, false, 0);
}
//--------------------------------------------------------------
int CRole::GetWalkHeight()
{
CMyPos posBegin, posEnd;
g_objGameMap.World2Cell(m_Info.posActionBegin.x, m_Info.posActionBegin.y,
posBegin.x, posBegin.y);
g_objGameMap.World2Cell(m_Info.posActionEnd.x, m_Info.posActionEnd.y,
posEnd.x, posEnd.y);
CellInfo* pCellBegin = g_objGameMap.GetCell(posBegin.x, posBegin.y);
CellInfo* pCellEnd = g_objGameMap.GetCell(posEnd.x, posEnd.y);
int nOffsetY = 0;
if(pCellBegin && pCellEnd)
{
int nHeightDef = g_objGameMap.GetGroundAltitude(pCellBegin) -
g_objGameMap.GetBaseAltitude(posBegin) -
g_objGameMap.GetGroundAltitude(pCellEnd) +
g_objGameMap.GetBaseAltitude(posEnd);
double dbDicAll = sqrt(
(m_Info.posActionBegin.x- m_Info.posActionEnd.x) *
(m_Info.posActionBegin.x - m_Info.posActionEnd.x) +
(m_Info.posActionBegin.y - m_Info.posActionEnd.y) *
(m_Info.posActionBegin.y - m_Info.posActionEnd.y)
);
CMyPos posWorld;
this->GetWorldPos(posWorld);
double dbDicNow = sqrt(
(m_Info.posActionBegin.x- posWorld.x) *
(m_Info.posActionBegin.x - posWorld.x) +
(m_Info.posActionBegin.y - posWorld.y) *
(m_Info.posActionBegin.y - posWorld.y)
);
double dbOffsetY;
dbOffsetY = nHeightDef * dbDicNow / dbDicAll;
nOffsetY = (int)dbOffsetY;
}
int nAltitude = g_objGameMap.GetGroundAltitude(pCellBegin)-g_objGameMap.GetBaseAltitude(posBegin) - nOffsetY;
return nAltitude;
}
//--------------------------------------------------------------
int CRole::GetJumpHeight()
{
DEQUE_CELL setCell;
CMyPos posHighest;
CMyPos posBegin, posEnd;
g_objGameMap.World2Cell(m_Info.posActionBegin.x, m_Info.posActionBegin.y,
posBegin.x, posBegin.y);
g_objGameMap.World2Cell(m_Info.posActionEnd.x, m_Info.posActionEnd.y,
posEnd.x, posEnd.y);
g_objGameMap.Sampling(setCell, posHighest, posBegin, posEnd, 32);
// Get the highest altitude
CellInfo* pBeginCell = g_objGameMap.GetCell(posBegin.x, posBegin.y);
if(!pBeginCell)
return 0;
CellInfo* pEndCell = g_objGameMap.GetCell(posEnd.x, posEnd.y);
if(!pEndCell)
return 0;
CellInfo* pHighestCell = g_objGameMap.GetCell(posHighest.x, posHighest.y);
if(!pHighestCell)
return 0;
// 取三个点
int nHightestAltitude = g_objGameMap.GetGroundAltitude(pHighestCell) - g_objGameMap.GetBaseAltitude(posHighest);
int nBeginAltitude = g_objGameMap.GetGroundAltitude(pBeginCell) - g_objGameMap.GetBaseAltitude(posBegin);
int nEndAltitude = g_objGameMap.GetGroundAltitude(pEndCell) - g_objGameMap.GetBaseAltitude(posEnd);
// 判断有没有最高点或者最高点小于缺省高度, 取中间点为最高点,
BOOL bHaveHighestPoint = false;
if(nHightestAltitude > nBeginAltitude)
bHaveHighestPoint = true;
// 计算最高点的世界坐标
CMyPos posHighestWorldPos, posBeginWorldPos, posEndWorldPos;
posBeginWorldPos = m_Info.posActionBegin;
posEndWorldPos = m_Info.posActionEnd;
if(bHaveHighestPoint)
{
g_objGameMap.Cell2World(posHighest.x, posHighest.y, posHighestWorldPos.x, posHighestWorldPos.y);
}
nHightestAltitude = nHightestAltitude + sqrt((posBeginWorldPos.x - posEndWorldPos.x) * (posBeginWorldPos.x - posEndWorldPos.x) +
(posBeginWorldPos.y - posEndWorldPos.y) * (posBeginWorldPos.y - posEndWorldPos.y))/3;
posHighestWorldPos.x = (posBeginWorldPos.x + posEndWorldPos.x)/2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -