poll for InputDeviceState changes
This commit is contained in:
@@ -14,15 +14,6 @@ class Style;
|
|||||||
#include "ScreenPrompt.h"
|
#include "ScreenPrompt.h"
|
||||||
#include "ScreenManager.h"
|
#include "ScreenManager.h"
|
||||||
|
|
||||||
enum MultiPlayerStatus
|
|
||||||
{
|
|
||||||
MultiPlayerStatus_Joined,
|
|
||||||
MultiPlayerStatus_NotJoined,
|
|
||||||
MultiPlayerStatus_Unplugged,
|
|
||||||
MultiPlayerStatus_MissingMultitap,
|
|
||||||
NUM_MultiPlayerStatus,
|
|
||||||
MultiPlayerStatus_Invalid
|
|
||||||
};
|
|
||||||
|
|
||||||
static const CString MultiPlayerStatusNames[] = {
|
static const CString MultiPlayerStatusNames[] = {
|
||||||
"Joined",
|
"Joined",
|
||||||
@@ -32,19 +23,15 @@ static const CString MultiPlayerStatusNames[] = {
|
|||||||
};
|
};
|
||||||
XToString( MultiPlayerStatus, NUM_MultiPlayerStatus );
|
XToString( MultiPlayerStatus, NUM_MultiPlayerStatus );
|
||||||
|
|
||||||
static bool IsConnected( MultiPlayerStatus s )
|
|
||||||
{
|
|
||||||
return s == MultiPlayerStatus_Joined || s == MultiPlayerStatus_NotJoined;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static MultiPlayerStatus g_MultiPlayerStatus[NUM_MultiPlayer];
|
|
||||||
|
|
||||||
REGISTER_SCREEN_CLASS( ScreenJoinMultiplayer );
|
REGISTER_SCREEN_CLASS( ScreenJoinMultiplayer );
|
||||||
ScreenJoinMultiplayer::ScreenJoinMultiplayer( CString sClassName ) : ScreenWithMenuElements( sClassName )
|
ScreenJoinMultiplayer::ScreenJoinMultiplayer( CString sClassName ) : ScreenWithMenuElements( sClassName )
|
||||||
{
|
{
|
||||||
FOREACH_MultiPlayer( p )
|
FOREACH_MultiPlayer( p )
|
||||||
g_MultiPlayerStatus[p] = MultiPlayerStatus_Invalid;
|
{
|
||||||
|
m_InputDeviceState[p] = InputDeviceState_INVALID;
|
||||||
|
m_MultiPlayerStatus[p] = MultiPlayerStatus_INVALID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenJoinMultiplayer::Init()
|
void ScreenJoinMultiplayer::Init()
|
||||||
@@ -90,7 +77,7 @@ void ScreenJoinMultiplayer::Init()
|
|||||||
m_soundJoin.Load( THEME->GetPathS(m_sName,"Join") );
|
m_soundJoin.Load( THEME->GetPathS(m_sName,"Join") );
|
||||||
m_soundUnjoin.Load( THEME->GetPathS(m_sName,"Unjoin") );
|
m_soundUnjoin.Load( THEME->GetPathS(m_sName,"Unjoin") );
|
||||||
|
|
||||||
UpdatePlayerStatus();
|
UpdatePlayerStatus( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenJoinMultiplayer::PositionItem( Actor *pActor, int iItemIndex, int iNumItems )
|
void ScreenJoinMultiplayer::PositionItem( Actor *pActor, int iItemIndex, int iNumItems )
|
||||||
@@ -143,7 +130,7 @@ void ScreenJoinMultiplayer::Input( const DeviceInput& DeviceI, const InputEventT
|
|||||||
|
|
||||||
ASSERT( p>=0 && p<NUM_MultiPlayer );
|
ASSERT( p>=0 && p<NUM_MultiPlayer );
|
||||||
|
|
||||||
MultiPlayerStatus old = g_MultiPlayerStatus[p];
|
MultiPlayerStatus old = m_MultiPlayerStatus[p];
|
||||||
|
|
||||||
switch( mi.button )
|
switch( mi.button )
|
||||||
{
|
{
|
||||||
@@ -151,16 +138,16 @@ void ScreenJoinMultiplayer::Input( const DeviceInput& DeviceI, const InputEventT
|
|||||||
if( old == MultiPlayerStatus_NotJoined )
|
if( old == MultiPlayerStatus_NotJoined )
|
||||||
{
|
{
|
||||||
m_soundJoin.Play();
|
m_soundJoin.Play();
|
||||||
g_MultiPlayerStatus[p] = MultiPlayerStatus_Joined;
|
m_MultiPlayerStatus[p] = MultiPlayerStatus_Joined;
|
||||||
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(g_MultiPlayerStatus[p]) );
|
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(m_MultiPlayerStatus[p]) );
|
||||||
}
|
}
|
||||||
return; // input handled
|
return; // input handled
|
||||||
case MENU_BUTTON_DOWN:
|
case MENU_BUTTON_DOWN:
|
||||||
if( old == MultiPlayerStatus_Joined )
|
if( old == MultiPlayerStatus_Joined )
|
||||||
{
|
{
|
||||||
m_soundUnjoin.Play();
|
m_soundUnjoin.Play();
|
||||||
g_MultiPlayerStatus[p] = MultiPlayerStatus_NotJoined;
|
m_MultiPlayerStatus[p] = MultiPlayerStatus_NotJoined;
|
||||||
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(g_MultiPlayerStatus[p]) );
|
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(m_MultiPlayerStatus[p]) );
|
||||||
}
|
}
|
||||||
return; // input handled
|
return; // input handled
|
||||||
case MENU_BUTTON_BACK:
|
case MENU_BUTTON_BACK:
|
||||||
@@ -179,6 +166,8 @@ void ScreenJoinMultiplayer::Input( const DeviceInput& DeviceI, const InputEventT
|
|||||||
void ScreenJoinMultiplayer::Update( float fDeltaTime )
|
void ScreenJoinMultiplayer::Update( float fDeltaTime )
|
||||||
{
|
{
|
||||||
ScreenWithMenuElements::Update(fDeltaTime);
|
ScreenWithMenuElements::Update(fDeltaTime);
|
||||||
|
|
||||||
|
UpdatePlayerStatus( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenJoinMultiplayer::DrawPrimitives()
|
void ScreenJoinMultiplayer::DrawPrimitives()
|
||||||
@@ -186,45 +175,57 @@ void ScreenJoinMultiplayer::DrawPrimitives()
|
|||||||
ScreenWithMenuElements::DrawPrimitives();
|
ScreenWithMenuElements::DrawPrimitives();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenJoinMultiplayer::UpdatePlayerStatus()
|
void ScreenJoinMultiplayer::UpdatePlayerStatus( bool bFirstUpdate )
|
||||||
{
|
{
|
||||||
FOREACH_MultiPlayer( p )
|
FOREACH_MultiPlayer( p )
|
||||||
{
|
{
|
||||||
InputDevice id = (InputDevice)p;
|
InputDevice id = (InputDevice)p;
|
||||||
|
|
||||||
MultiPlayerStatus old = g_MultiPlayerStatus[p];
|
InputDeviceState idsOld = m_InputDeviceState[p];
|
||||||
bool bWasConnected = IsConnected( old );
|
bool bWasConnected = idsOld == InputDeviceState_Connected;
|
||||||
|
|
||||||
MultiPlayerStatus s = MultiPlayerStatus_Invalid;
|
InputDeviceState idsNew = INPUTMAN->GetInputDeviceState(id);
|
||||||
switch( INPUTMAN->GetInputDeviceState(id) )
|
if( INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD,KEY_LSHIFT)) )
|
||||||
|
idsNew = InputDeviceState_Disconnected;
|
||||||
|
bool bIsConnected = idsNew == InputDeviceState_Connected;
|
||||||
|
|
||||||
|
MultiPlayerStatus &mps = m_MultiPlayerStatus[p];
|
||||||
|
|
||||||
|
if( bFirstUpdate || idsOld != idsNew )
|
||||||
|
{
|
||||||
|
switch( idsNew )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
case InputDeviceState_Connected:
|
case InputDeviceState_Connected:
|
||||||
s = MultiPlayerStatus_NotJoined;
|
mps = MultiPlayerStatus_NotJoined;
|
||||||
break;
|
break;
|
||||||
case InputDeviceState_INVALID:
|
case InputDeviceState_INVALID:
|
||||||
case InputDeviceState_Disconnected:
|
case InputDeviceState_Disconnected:
|
||||||
s = MultiPlayerStatus_Unplugged;
|
mps = MultiPlayerStatus_Unplugged;
|
||||||
break;
|
break;
|
||||||
case InputDeviceState_MissingMultitap:
|
case InputDeviceState_MissingMultitap:
|
||||||
s = MultiPlayerStatus_MissingMultitap;
|
mps = MultiPlayerStatus_MissingMultitap;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( old != s )
|
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(mps) );
|
||||||
|
|
||||||
|
if( idsOld == InputDeviceState_INVALID )
|
||||||
|
{
|
||||||
|
m_sprPlayer[p]->FinishTweening();
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(s) );
|
|
||||||
g_MultiPlayerStatus[p] = s;
|
|
||||||
|
|
||||||
bool bIsConnected = IsConnected( s );
|
|
||||||
|
|
||||||
if( !bWasConnected && bIsConnected )
|
if( !bWasConnected && bIsConnected )
|
||||||
m_soundPlugIn.Play();
|
m_soundPlugIn.Play();
|
||||||
else if( bWasConnected && !bIsConnected )
|
else if( bWasConnected && !bIsConnected )
|
||||||
m_soundUnplug.Play();
|
m_soundUnplug.Play();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_InputDeviceState[p] = idsNew;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenJoinMultiplayer::MenuBack( PlayerNumber pn )
|
void ScreenJoinMultiplayer::MenuBack( PlayerNumber pn )
|
||||||
@@ -238,7 +239,7 @@ void ScreenJoinMultiplayer::MenuStart( PlayerNumber pn )
|
|||||||
int iNumJoinedPlayers = 0;
|
int iNumJoinedPlayers = 0;
|
||||||
FOREACH_MultiPlayer( p )
|
FOREACH_MultiPlayer( p )
|
||||||
{
|
{
|
||||||
bool bJoined = g_MultiPlayerStatus[p] == MultiPlayerStatus_Joined;
|
bool bJoined = m_MultiPlayerStatus[p] == MultiPlayerStatus_Joined;
|
||||||
GAMESTATE->m_bIsMultiPlayerJoined[p] = bJoined;
|
GAMESTATE->m_bIsMultiPlayerJoined[p] = bJoined;
|
||||||
if( bJoined )
|
if( bJoined )
|
||||||
iNumJoinedPlayers++;
|
iNumJoinedPlayers++;
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
|
|
||||||
#include "ScreenWithMenuElements.h"
|
#include "ScreenWithMenuElements.h"
|
||||||
|
|
||||||
|
enum MultiPlayerStatus
|
||||||
|
{
|
||||||
|
MultiPlayerStatus_Joined,
|
||||||
|
MultiPlayerStatus_NotJoined,
|
||||||
|
MultiPlayerStatus_Unplugged,
|
||||||
|
MultiPlayerStatus_MissingMultitap,
|
||||||
|
NUM_MultiPlayerStatus,
|
||||||
|
MultiPlayerStatus_INVALID
|
||||||
|
};
|
||||||
|
const CString& MultiPlayerStatusToString( MultiPlayerStatus i );
|
||||||
|
|
||||||
|
|
||||||
class ScreenJoinMultiplayer : public ScreenWithMenuElements
|
class ScreenJoinMultiplayer : public ScreenWithMenuElements
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -15,12 +27,15 @@ public:
|
|||||||
virtual void DrawPrimitives();
|
virtual void DrawPrimitives();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void UpdatePlayerStatus();
|
void UpdatePlayerStatus( bool bFirstUpdate );
|
||||||
void PositionItem( Actor *pActor, int iItemIndex, int iNumItems );
|
void PositionItem( Actor *pActor, int iItemIndex, int iNumItems );
|
||||||
|
|
||||||
virtual void MenuBack( PlayerNumber pn );
|
virtual void MenuBack( PlayerNumber pn );
|
||||||
virtual void MenuStart( PlayerNumber pn );
|
virtual void MenuStart( PlayerNumber pn );
|
||||||
|
|
||||||
|
InputDeviceState m_InputDeviceState[NUM_MultiPlayer];
|
||||||
|
MultiPlayerStatus m_MultiPlayerStatus[NUM_MultiPlayer];
|
||||||
|
|
||||||
AutoActor m_sprPlayer[NUM_MultiPlayer];
|
AutoActor m_sprPlayer[NUM_MultiPlayer];
|
||||||
|
|
||||||
LuaExpression m_exprOnCommandFunction; // params: self,itemIndex,numItems
|
LuaExpression m_exprOnCommandFunction; // params: self,itemIndex,numItems
|
||||||
|
|||||||
Reference in New Issue
Block a user