This commit is contained in:
parent
dbd7d3cf31
commit
0a80b2b09c
3 changed files with 98 additions and 7 deletions
|
@ -155,6 +155,56 @@ CRECT const &collisionArea=getCollisionArea();
|
||||||
|
|
||||||
m_contact = true;
|
m_contact = true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DVECTOR shove;
|
||||||
|
int leftDist = playerCollisionArea.x2 - collisionArea.x1;
|
||||||
|
int rightDist = collisionArea.x2 - playerCollisionArea.x1;
|
||||||
|
|
||||||
|
if ( leftDist < rightDist )
|
||||||
|
{
|
||||||
|
shove.vx = -leftDist;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
shove.vx = rightDist;
|
||||||
|
}
|
||||||
|
shove.vy = 0;
|
||||||
|
|
||||||
|
player->shove( shove );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int testPosY;
|
||||||
|
|
||||||
|
testPosY = playerPos.vy - CPlayer::HEIGHT_FOR_HEAD_COLLISION;
|
||||||
|
|
||||||
|
if ( testPosY >= collisionArea.y1 && testPosY <= collisionArea.y2 )
|
||||||
|
{
|
||||||
|
// player's head is colliding with platform, but feet aren't
|
||||||
|
|
||||||
|
player->forceFall();
|
||||||
|
|
||||||
|
if ( collisionArea.y2 - testPosY > 8 )
|
||||||
|
{
|
||||||
|
DVECTOR shove;
|
||||||
|
int leftDist = playerCollisionArea.x2 - collisionArea.x1;
|
||||||
|
int rightDist = collisionArea.x2 - playerCollisionArea.x1;
|
||||||
|
|
||||||
|
if ( leftDist < rightDist )
|
||||||
|
{
|
||||||
|
shove.vx = -leftDist;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
shove.vx = rightDist;
|
||||||
|
}
|
||||||
|
shove.vy = 0;
|
||||||
|
|
||||||
|
player->shove( shove );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2722,6 +2722,29 @@ void CPlayer::setLockoutPlatform(CThing *_newPlatform)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------
|
||||||
|
Function:
|
||||||
|
Purpose:
|
||||||
|
Params:
|
||||||
|
Returns:
|
||||||
|
---------------------------------------------------------------------- */
|
||||||
|
void CPlayer::forceFall()
|
||||||
|
{
|
||||||
|
if(m_currentMode!=PLAYER_MODE_DEAD)
|
||||||
|
{
|
||||||
|
if ( m_currentPlayerModeClass->getState() != STATE_FALL )
|
||||||
|
{
|
||||||
|
m_currentPlayerModeClass->setState(STATE_FALL);
|
||||||
|
DVECTOR moveVel;
|
||||||
|
|
||||||
|
moveVel=*getMoveVelocity();
|
||||||
|
moveVel.vy=0;
|
||||||
|
m_fallFrames=0;
|
||||||
|
setMoveVelocity(&moveVel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------
|
/*----------------------------------------------------------------------
|
||||||
Function:
|
Function:
|
||||||
Purpose:
|
Purpose:
|
||||||
|
@ -2853,19 +2876,40 @@ int CPlayer::moveVertical(int _moveDistance)
|
||||||
blockAfter[i+1]=CGameScene::getCollision()->getCollisionBlock(x,y+_moveDistance);
|
blockAfter[i+1]=CGameScene::getCollision()->getCollisionBlock(x,y+_moveDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isGoingToFall = false;
|
||||||
|
|
||||||
// See if either side is about to go through the ground
|
// See if either side is about to go through the ground
|
||||||
for(i=0;i<3;i++)
|
for(i=0;i<3;i++)
|
||||||
{
|
{
|
||||||
if(colHeightBefore[i]>=0&&colHeightAfter[i]<=0&&((blockAfter[i]&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL))
|
if(colHeightBefore[i]>=0&&colHeightAfter[i]<=0&&((blockAfter[i]&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL))
|
||||||
{
|
{
|
||||||
//moveRequired[i]=16+colHeightAfter[i];
|
moveRequired[i]=16+colHeightAfter[i];
|
||||||
moveRequired[i]=colHeightAfter[i];
|
//moveRequired[i]=colHeightAfter[i];
|
||||||
// hitGround=true;
|
// hitGround=true;
|
||||||
|
|
||||||
// do not call hitground code, because this will set it to STATE_IDLE for a frame
|
// do not call hitground code, because this will set it to STATE_IDLE for a frame
|
||||||
// instead, do the appropriate stuff for a fall
|
// instead, do the appropriate stuff for a fall
|
||||||
|
|
||||||
if(!hitThisSuspectBlock)hitThisSuspectBlock=blockAfter[i];
|
if(!hitThisSuspectBlock)hitThisSuspectBlock=blockAfter[i];
|
||||||
|
|
||||||
|
isGoingToFall = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
moveRequired[i]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isGoingToFall )
|
||||||
|
{
|
||||||
|
// check where feet are
|
||||||
|
|
||||||
|
if ( getHeightFromGround(pos.vx, pos.vy, 16 ) == 0 )
|
||||||
|
{
|
||||||
|
// standing on ground, hence do not fall
|
||||||
|
hitGround = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
m_currentPlayerModeClass->setState(STATE_FALL);
|
m_currentPlayerModeClass->setState(STATE_FALL);
|
||||||
DVECTOR moveVel;
|
DVECTOR moveVel;
|
||||||
|
|
||||||
|
@ -2874,10 +2918,6 @@ int CPlayer::moveVertical(int _moveDistance)
|
||||||
m_fallFrames=0;
|
m_fallFrames=0;
|
||||||
setMoveVelocity(&moveVel);
|
setMoveVelocity(&moveVel);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
moveRequired[i]=0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the smallest move required to hit ground
|
// Find the smallest move required to hit ground
|
||||||
|
|
|
@ -233,6 +233,7 @@ public:
|
||||||
void buttFall(); // " " " " "
|
void buttFall(); // " " " " "
|
||||||
virtual int moveVertical(int _moveDistance);
|
virtual int moveVertical(int _moveDistance);
|
||||||
virtual int moveHorizontal(int _moveDistance);
|
virtual int moveHorizontal(int _moveDistance);
|
||||||
|
void forceFall();
|
||||||
|
|
||||||
int isTryingToConversateWithFriend() {return m_allowConversation;}
|
int isTryingToConversateWithFriend() {return m_allowConversation;}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue