This commit is contained in:
Charles 2001-04-01 21:40:52 +00:00
parent f67b64565d
commit 12567cce7a
4 changed files with 49 additions and 17 deletions

View file

@ -300,8 +300,6 @@ char posBuf[100];
void CPlayer::think(int _frames) void CPlayer::think(int _frames)
{ {
int i; int i;
CPlayerThing::think(_frames);
if(PadGetHeld(0)&PAD_L1&&PadGetHeld(0)&PAD_L2) if(PadGetHeld(0)&PAD_L1&&PadGetHeld(0)&PAD_L2)
@ -413,6 +411,8 @@ else if(Pos.vy>m_mapEdge.vy-64)Pos.vy=m_mapEdge.vy-64;
m_cameraPos.vy=m_mapCameraEdges.vy; m_cameraPos.vy=m_mapCameraEdges.vy;
m_cameraScrollDir=0; m_cameraScrollDir=0;
} }
CPlayerThing::think(_frames);
} }

View file

@ -323,6 +323,31 @@ void CPlayerModeBase::thinkVerticalMovement()
{ {
pos.vy += colHeight; pos.vy += colHeight;
m_moveVelocity.vy=0; m_moveVelocity.vy=0;
m_fallFrames=0;
if(m_currentState==STATE_BUTTFALL)
{
// Landed from a butt bounce
setState(STATE_BUTTLAND);
}
else if(m_currentState==STATE_FALLFAR)
{
// Landed from a painfully long fall
setState(STATE_IDLE);
m_player->takeDamage(DAMAGE__FALL);
m_moveVelocity.vx=0;
CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_LAND_AFTER_FALL);
}
else if(m_moveVelocity.vx)
{
// Landed from a jump with x movement
setState(STATE_RUN);
}
else
{
// Landed from a jump with no x movement
setState(STATE_IDLE);
setAnimNo(ANIM_SPONGEBOB_JUMPEND);
}
} }
} }

View file

@ -139,7 +139,7 @@ void CThingManager::thinkAllThings(int _frames)
thing1->removeAllChild(); thing1->removeAllChild();
if(thing1->canCollide()&& if(thing1->canCollide()&&
thing1->checkCollisionAgainst(thing2)) thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->addChild( thing2 ); thing1->addChild( thing2 );
@ -164,7 +164,7 @@ void CThingManager::thinkAllThings(int _frames)
while(thing1&&thing2) while(thing1&&thing2)
{ {
if(thing1->canCollide()&& if(thing1->canCollide()&&
thing1->checkCollisionAgainst(thing2)) thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->collidedWith(thing2); thing1->collidedWith(thing2);
} }
@ -177,7 +177,7 @@ void CThingManager::thinkAllThings(int _frames)
while(thing1&&thing2) while(thing1&&thing2)
{ {
if(thing1->canCollide()&& if(thing1->canCollide()&&
thing1->checkCollisionAgainst(thing2)) thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->collidedWith(thing2); thing1->collidedWith(thing2);
} }
@ -190,7 +190,7 @@ void CThingManager::thinkAllThings(int _frames)
while(thing1&&thing2) while(thing1&&thing2)
{ {
if(thing1->canCollide()&& if(thing1->canCollide()&&
thing1->checkCollisionAgainst(thing2)) thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->collidedWith(thing2); thing1->collidedWith(thing2);
} }
@ -203,7 +203,7 @@ void CThingManager::thinkAllThings(int _frames)
while(thing1&&thing2) while(thing1&&thing2)
{ {
if(thing1->canCollide()&& if(thing1->canCollide()&&
thing1->checkCollisionAgainst(thing2)) thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->collidedWith(thing2); thing1->collidedWith(thing2);
} }
@ -347,9 +347,9 @@ void CThing::shutdown()
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CThing::think(int _frames) void CThing::think(int _frames)
{ {
DVECTOR PosLast=Pos;
PosDelta.vx=Pos.vx-PosLast.vx; PosDelta.vx=Pos.vx-PosLast.vx;
PosDelta.vy=Pos.vy-PosLast.vy; PosDelta.vy=Pos.vy-PosLast.vy;
PosLast=Pos;
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -705,7 +705,7 @@ s32 CThing::getNewYPos(CThing *_thisThing)
Params: Params:
Returns: Returns:
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
int CThing::checkCollisionAgainst(CThing *_thisThing) int CThing::checkCollisionAgainst(CThing *_thisThing, int _frames)
{ {
DVECTOR pos,thisThingPos; DVECTOR pos,thisThingPos;
int radius; int radius;
@ -783,12 +783,10 @@ int CThing::checkCollisionAgainst(CThing *_thisThing)
{ {
thatPos.vy = getNewYPos( _thisThing ); thatPos.vy = getNewYPos( _thisThing );
if ( thatPos.vy - _thisThing->getPos().vy >= -10 ) s32 verticalDelta = abs( _thisThing->getPosDelta().vy );
if ( thatPos.vy - _thisThing->getPos().vy >= -verticalDelta )
{ {
_thisThing->setHasPlatformCollided( true );
_thisThing->setCentreCollision( true );
if ( _thisThing->getHasPlatformCollided() ) if ( _thisThing->getHasPlatformCollided() )
{ {
// if this has already collided with a platform, check the current platform is // if this has already collided with a platform, check the current platform is
@ -797,13 +795,21 @@ int CThing::checkCollisionAgainst(CThing *_thisThing)
DVECTOR oldCollidedPos = _thisThing->getNewCollidedPos(); DVECTOR oldCollidedPos = _thisThing->getNewCollidedPos();
if ( thatPos.vy < oldCollidedPos.vy ) s32 oldY = abs( oldCollidedPos.vy - ( _thisThing->getPos().vy - verticalDelta ) );
s32 currentY = abs( thatPos.vy - ( _thisThing->getPos().vy - verticalDelta ) );
//if ( thatPos.vy < oldCollidedPos.vy )
if ( currentY < oldY )
{ {
_thisThing->setNewCollidedPos( thatPos ); _thisThing->setNewCollidedPos( thatPos );
} }
} }
else else
{ {
_thisThing->setHasPlatformCollided( true );
_thisThing->setCentreCollision( true );
_thisThing->setNewCollidedPos( thatPos ); _thisThing->setNewCollidedPos( thatPos );
} }
} }

View file

@ -100,6 +100,7 @@ public:
DVECTOR getPos() {return Pos;} DVECTOR getPos() {return Pos;}
void setPos(DVECTOR newPos) {Pos=newPos;} void setPos(DVECTOR newPos) {Pos=newPos;}
DVECTOR getPosDelta() {return PosDelta;}
virtual void shove(DVECTOR move); virtual void shove(DVECTOR move);
CThing *getNext() {return Next;} CThing *getNext() {return Next;}
@ -114,7 +115,7 @@ protected:
CThing *Parent,*Next; CThing *Parent,*Next;
// Pos // Pos
DVECTOR Pos, PosDelta; DVECTOR Pos, PosLast, PosDelta;
public: public:
class CThing *m_nextThing; class CThing *m_nextThing;
@ -126,7 +127,7 @@ public:
// -- Collision -- // -- Collision --
public: public:
virtual int canCollide() {return true;} virtual int canCollide() {return true;}
virtual int checkCollisionAgainst(CThing *_thisThing); virtual int checkCollisionAgainst(CThing *_thisThing, int _frames);
void updateCollisionArea(); void updateCollisionArea();
virtual void collidedWith(CThing *_thisThing) {;} virtual void collidedWith(CThing *_thisThing) {;}
virtual void setHasPlatformCollided( bool newVal ) {;} virtual void setHasPlatformCollided( bool newVal ) {;}