Code:
enum Actions
{
ACTIONS_LEFTRIGHT,
ACTIONS_UPDOWN,
ACTIONS_LEFT,
ACTIONS_RIGHT,
ACTIONS_UP,
ACTIONS_DOWN,
ACTIONS_QUIT,
ACTIONS_HELP,
ACTIONS_CONFIGURE,
ACTIONS_MUSIC,
ACTIONS_PAUSE,
ACTIONS_NONE
};
bool g_bQuit, g_bShowHelp, g_bPaused, g_bDoConfig;
bool g_bLeft, g_bRight, g_bUp, g_bDown;
DIACTION g_rgActions[] =
{
// Genre-defined virtual axes
{ ACTIONS_LEFTRIGHT, DIAXIS_ARCADES_LATERAL, 0, "Left/Right" },
{ ACTIONS_UPDOWN, DIAXIS_ARCADES_MOVE, 0, "Up/Down" },
// Genre-defined virtual buttons
{ ACTIONS_LEFT, DIBUTTON_ARCADES_LEFT_LINK, 0, "Left" },
{ ACTIONS_RIGHT, DIBUTTON_ARCADES_RIGHT_LINK, 0, "Right" },
{ ACTIONS_UP, DIBUTTON_ARCADES_FORWARD_LINK, 0, "Up" },
{ ACTIONS_DOWN, DIBUTTON_ARCADES_BACK_LINK, 0, "Down" },
{ ACTIONS_PAUSE, DIBUTTON_ARCADES_PAUSE, 0, "Pause" },
// Keys
{ ACTIONS_LEFT, DIKEYBOARD_LEFT, 0, "Left" },
{ ACTIONS_LEFT, DIKEYBOARD_NUMPAD4, 0, "Left" },
{ ACTIONS_RIGHT, DIKEYBOARD_RIGHT, 0, "Right" },
{ ACTIONS_RIGHT, DIKEYBOARD_NUMPAD6, 0, "Right" },
{ ACTIONS_UP, DIKEYBOARD_UP, 0, "Up" },
{ ACTIONS_UP, DIKEYBOARD_NUMPAD8, 0, "Up" },
{ ACTIONS_DOWN, DIKEYBOARD_DOWN, 0, "Down" },
{ ACTIONS_DOWN, DIKEYBOARD_NUMPAD2, 0, "Down" },
{ ACTIONS_PAUSE, DIKEYBOARD_P, DIA_APPFIXED, "Pause" },
{ ACTIONS_MUSIC, DIKEYBOARD_M, DIA_APPFIXED, "Music on/off" },
{ ACTIONS_HELP, DIKEYBOARD_F1, DIA_APPFIXED, "Help" },
{ ACTIONS_CONFIGURE, DIKEYBOARD_F2, DIA_APPFIXED, "Configure" },
{ ACTIONS_QUIT, DIKEYBOARD_ESCAPE, DIA_APPFIXED, "Quit" },
};
//skip all this blah blah
void HandleAction(UINT nAction, DWORD dwData)
{
int nAxisPos = (int)dwData;
switch (nAction)
{
case ACTIONS_LEFTRIGHT:
if (nAxisPos < -AXIS_THRESHOLD)
{
g_bLeft = true;
g_bRight = false;
}
else if (nAxisPos > AXIS_THRESHOLD)
{
g_bRight = true;
g_bLeft = false;
}
else
{
g_bLeft = g_bRight = false;
}
break;
case ACTIONS_UPDOWN:
if (nAxisPos < -AXIS_THRESHOLD)
{
g_bUp = true;
g_bDown = false;
}
else if (nAxisPos > AXIS_THRESHOLD)
{
g_bDown = true;
g_bUp = false;
}
else
{
g_bUp = g_bDown = false;
}
break;
case ACTIONS_LEFT:
g_bLeft = (dwData != 0);
break;
case ACTIONS_RIGHT:
g_bRight = (dwData != 0);
break;
case ACTIONS_UP:
g_bUp = (dwData != 0);
break;
case ACTIONS_DOWN:
g_bDown = (dwData != 0);
break;
case ACTIONS_PAUSE:
if(dwData != 0)
g_bPaused = !g_bPaused;
break;
case ACTIONS_QUIT:
g_bQuit = true;
break;
default:
break;
}
}
////////////////////////////////////////////////////////////////////////////////
// Idle-time processing function.
void OnIdle(void)
{
if (g_lpPrimary == NULL)
return;
if (!g_bActive)
return;
CheckInput();
if (g_bQuit)
{
PostMessage(hWndMain, WM_CLOSE, 0, 0);
return;
}
RECT r;
// Draw the background to the screen.
r.left = 0;
r.top = 0;
r.right = 640;
r.bottom = 480;
BackBlt(0, 0, lpA, &r, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
// Move a sprite around with the input.
static int xSprite;
static int ySprite;
if(!g_bPaused)
{
if (g_bLeft)
xSprite--;
if (g_bRight)
xSprite++;
if (g_bUp)
ySprite--;
if(g_bDown)
ySprite++;
r.left = 64;
r.right = 128;
r.top = 0;
r.bottom = 64;
BackBlt(288 + xSprite, 150 + ySprite, lpSprites, &r, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
g_lpPrimary->Flip(NULL, DDFLIP_WAIT);
}
}