This commit is contained in:
Charles 2001-03-06 20:13:16 +00:00
parent ff8ebd213b
commit f93f6f0643
6 changed files with 187 additions and 12 deletions

View File

@ -222,7 +222,7 @@ void CNpcEnemy::processGenericFixedPathMove( int _frames, s32 *moveX, s32 *moveY
*moveVel = ( _frames * m_data[m_type].speed ) << 8;
processGroundCollisionReverse( moveX, moveY );
//processGroundCollisionReverse( moveX, moveY );
}
}

View File

@ -209,7 +209,7 @@ void CNpcEnemy::init()
{
CEnemyThing::init();
m_type = NPC_CLAM_STATIC;
m_type = NPC_LINEAR_PLATFORM;
// sActorHdr *Hdr = m_skel.Load( m_data[m_type].skelType );
// m_skel.Init( Hdr );
@ -256,25 +256,25 @@ void CNpcEnemy::init()
newPos.vx = 100;
//newPos.vy = 10;
newPos.vy = 400;
newPos.vy = 100;
m_npcPath.addWaypoint( newPos );
newPos.vx = 500;
//newPos.vy = 10;
newPos.vy = 400;
newPos.vy = 100;
m_npcPath.addWaypoint( newPos );
newPos.vx = 500;
//newPos.vy = 100;
newPos.vy = 350;
newPos.vy = 300;
m_npcPath.addWaypoint( newPos );
newPos.vx = 100;
//newPos.vy = 100;
newPos.vy = 350;
newPos.vy = 300;
m_npcPath.addWaypoint( newPos );
@ -527,8 +527,19 @@ void CNpcEnemy::collidedWith( CThing *_thisThing )
{
if ( m_data[m_type].detectCollision )
{
m_oldControlFunc = m_controlFunc;
m_controlFunc = NPC_CONTROL_COLLISION;
if ( m_data[m_type].damageToUserType == DAMAGE__NONE )
{
// if we can detect a collision, but the collision does no damage, this must be a platform
CPlayer *player = (CPlayer *) _thisThing;
player->setPlatform( this );
}
else
{
m_oldControlFunc = m_controlFunc;
m_controlFunc = NPC_CONTROL_COLLISION;
}
}
break;

View File

@ -174,8 +174,9 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
NPC_TIMER_NONE,
false,
3,
128,
false,
//512,
2048,
true,
DAMAGE__NONE,
0,
},

View File

@ -204,6 +204,9 @@ void CPlayer::init()
CPlayerThing::init();
m_layerCollision=NULL;
m_onPlatform = false;
m_prevOnPlatform = false;
m_skel.Init(ACTORS_SPONGEBOB_A3D);
TPLoadTex(ACTORS_ACTOR_SPONGEBOB_TEX);
@ -416,7 +419,9 @@ if(PadGetDown(0)&PAD_CIRCLE)
void CPlayer::thinkVerticalMovement()
{
int colHeight;
colHeight=m_layerCollision->getHeightFromGround(Pos.vx,Pos.vy,1);
if(colHeight>=0)
{
// Above or on the ground
@ -425,6 +430,7 @@ void CPlayer::thinkVerticalMovement()
{
// Yes.. Check to see if we're about to hit/go through the ground
colHeight=m_layerCollision->getHeightFromGround(Pos.vx,Pos.vy+(m_moveVel.vy>>VELOCITY_SHIFT),PLAYER_TERMINAL_VELOCITY+1);
if(colHeight<=0)
{
// Just hit the ground
@ -468,7 +474,11 @@ void CPlayer::thinkVerticalMovement()
m_currentState!=STATE_JUMP)
{
// Was floating in the air.. fall!
setState(STATE_FALL);
if ( !m_onPlatform )
{
setState(STATE_FALL);
}
}
}
}
@ -1307,5 +1317,134 @@ PLAYERINPUT CPlayer::readPadInput()
return input;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CPlayer::clearPlatform()
{
m_prevOnPlatform = m_onPlatform;
m_onPlatform = false;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CPlayer::setPlatform( CThing *newPlatform )
{
int colHeight;
int platformHeight;
m_platform = newPlatform;
m_onPlatform = true;
if ( m_onPlatform )
{
colHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, 16 );
platformHeight = m_platform->getPos().vy - Pos.vy;
if ( platformHeight > colHeight )
{
m_onPlatform = false;
}
else
{
colHeight = platformHeight;
}
}
if ( m_onPlatform )
{
// have collided with a platform
m_moveVel.vy=0;
Pos.vy += colHeight;
if ( !m_prevOnPlatform )
{
if( m_currentMode != PLAYER_MODE_BALLOON )
{
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);
takeDamage(DAMAGE__FALL);
m_moveVel.vx=0;
CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_LAND_AFTER_FALL);
}
else if(m_moveVel.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);
}
}
}
else
{
Pos.vx += m_platform->getPos().vx - m_prevPlatformPos.vx;
}
// Move the camera offset
m_playerScreenGeomPos.vx=SCREEN_GEOM_PLAYER_OFS_X+((MAP2D_BLOCKSTEPSIZE*m_cameraScrollPos.vx)>>8);
m_playerScreenGeomPos.vy=SCREEN_GEOM_PLAYER_OFS_Y+((MAP2D_BLOCKSTEPSIZE*m_cameraScrollPos.vy)>>8);
m_cameraOffset.vx=MAP2D_CENTRE_X+((MAP2D_BLOCKSTEPSIZE*(-m_cameraScrollPos.vx))>>8);
m_cameraOffset.vy=MAP2D_CENTRE_Y+((MAP2D_BLOCKSTEPSIZE*(-m_cameraScrollPos.vy))>>8);
m_cameraPos.vx=Pos.vx+m_cameraOffset.vx;
m_cameraPos.vy=Pos.vy+m_cameraOffset.vy;
// Limit camera scroll to the edges of the map
if(m_cameraPos.vx<0)
{
m_playerScreenGeomPos.vx+=m_cameraPos.vx;
m_cameraPos.vx=0;
m_cameraScrollDir=0;
}
else if(m_cameraPos.vx>m_mapCameraEdges.vx)
{
m_playerScreenGeomPos.vx-=m_mapCameraEdges.vx-m_cameraPos.vx;
m_cameraPos.vx=m_mapCameraEdges.vx;
m_cameraScrollDir=0;
}
if(m_cameraPos.vy<0)
{
m_playerScreenGeomPos.vy+=m_cameraPos.vy;
m_cameraPos.vy=0;
m_cameraScrollDir=0;
}
else if(m_cameraPos.vy>m_mapCameraEdges.vy)
{
m_playerScreenGeomPos.vy-=m_mapCameraEdges.vy-m_cameraPos.vy;
m_cameraPos.vy=m_mapCameraEdges.vy;
m_cameraScrollDir=0;
}
this->updateCollisionArea();
m_prevPlatformPos = m_platform->getPos();
}
}
/*===========================================================================
end */

View File

@ -320,6 +320,16 @@ private:
int m_glassesFlag;
int m_squeakyBootsTimer;
int m_invinvibilityRingTimer;
// Platforms
public:
void setPlatform( CThing *newPlatform );
void clearPlatform();
private:
CThing *m_platform;
bool m_onPlatform;
bool m_prevOnPlatform;
DVECTOR m_prevPlatformPos;
};

View File

@ -17,6 +17,13 @@
#include "thing\thing.h"
#ifndef __PLAYER_PLAYER_H__
#include "player\player.h"
#endif
#ifndef __GAME_GAME_H__
#include "game\game.h"
#endif
/* Std Lib
------- */
@ -109,6 +116,13 @@ void CThingManager::thinkAllThings(int _frames)
}
}
CPlayer *player = GameScene.getPlayer();
if ( player )
{
player->clearPlatform();
}
// Player -> Pickup collision
thing1=s_thingLists[CThing::TYPE_PICKUP];
thing2=s_thingLists[CThing::TYPE_PLAYER];
@ -307,7 +321,7 @@ void CThing::think(int _frames)
Params:
Returns:
---------------------------------------------------------------------- */
#ifdef __USER_paul__
#if defined (__USER_paul__) || defined (__USER_charles__)
int showthings=true;
#include "gfx\prim.h"
#include "level\level.h"