#include "stdhdr.h"
#include "ddutil.h"
#include "Debug.h"
#include "Sound.h"
#include "Input.h"
#include "Draw.h"
#include "Window.h"
IDirectMusicSegment8 *g_pBackgroundMusic;
bool g_bMusicPlaying, g_bFinishedInit;
bool g_bMusicEnabled;
GUID g_guidApp =
{ 0xbd0e8406, 0xfb56, 0x4322, { 0x8b, 0xc6, 0xbd, 0x6e, 0x48, 0x1f, 0x55, 0x64 } };
DWORD g_dwGenre = DIVIRTUAL_ARCADE_SIDE2SIDE;
LPCTSTR g_tszActionMapName = _T("Sample");
enum Actions
{
ACTIONS_LEFTRIGHT,
ACTIONS_LEFT,
ACTIONS_RIGHT,
ACTIONS_QUIT,
ACTIONS_HELP,
ACTIONS_PAUSE,
ACTIONS_NONE
};
bool g_bQuit;
bool g_bLeft, g_bRight, g_bShowHelp, g_bPaused;
DIACTION g_rgActions[] =
{
{ ACTIONS_LEFTRIGHT, DIAXIS_ARCADES_LATERAL, 0, "Left/Right" },
{ 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_PAUSE, DIKEYBOARD_P, 0, "Pause" },
{ ACTIONS_HELP, DIKEYBOARD_F1, 0, "Help" },
{ ACTIONS_QUIT, DIKEYBOARD_ESCAPE, DIA_APPFIXED, "Quit" },
};
DWORD g_nActions = sizeof(g_rgActions) / sizeof(DIACTION);
IDirectDrawSurface7 *lpA;
IDirectDrawSurface7 *lpSprites;
void ReloadAllSurfaces()
{
DDReLoadBitmap(lpA, "a.bmp");
DDReLoadBitmap(lpSprites, "sprites.bmp");
}
void PlayBackgroundMusic()
{
if ((g_pBackgroundMusic != NULL) && !g_bMusicPlaying && g_bFinishedInit && g_bMusicEnabled)
{
TRACE0("Playing background music...\n");
g_bMusicPlaying = true;
PlaySound(g_pBackgroundMusic);
}
}
void StopBackgroundMusic()
{
StopAllSound();
g_bMusicPlaying = false;
}
#define AXIS_THRESHOLD 20
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_LEFT:
g_bLeft = (dwData != 0);
break;
case ACTIONS_RIGHT:
g_bRight = (dwData != 0);
break;
case ACTIONS_QUIT:
g_bQuit = true;
break;
case ACTIONS_HELP:
if (dwData != 0)
g_bShowHelp = true;
break;
case ACTIONS_PAUSE:
if (dwData != 0)
g_bPaused = !g_bPaused;
break;
default:
break;
}
}
int xAutomaticSprite;
int xPlayer;
void DrawFrame()
{
DEBUG_TIMING_START();
RECT r;
r.left = 0;
r.top = 0;
r.right = 640;
r.bottom = 480;
BackBlt(0, 0, lpA, &r, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
r.left = 128;
r.top = 0;
r.right = 192;
r.bottom = 64;
BackBlt(288, 208, lpSprites, &r, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
r.left = 0;
r.right = 64;
BackBlt(288 + xAutomaticSprite, 100, lpSprites, &r, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
r.left = 64;
r.right = 128;
BackBlt(288 + xPlayer, 150, lpSprites, &r, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
DEBUG_TIMING_END("Scene draw");
g_lpPrimary->Flip(NULL, DDFLIP_WAIT);
}
void OnIdle(void)
{
if (g_lpPrimary == NULL)
return;
if (!g_bActive)
return;
CheckInput();
if (g_bQuit)
{
PostMessage(hWndMain, WM_CLOSE, 0, 0);
return;
}
if (g_bShowHelp)
{
StopAllSound();
g_bMusicPlaying = false;
g_bShowHelp = false;
DisplayInput();
}
if (!g_bPaused)
{
xAutomaticSprite++;
if (xAutomaticSprite > 100)
xAutomaticSprite = -100;
if (g_bLeft)
xPlayer--;
if (g_bRight)
xPlayer++;
}
DrawFrame();
}
BOOL InitApplication(HINSTANCE hInstance)
{
if (!InitWindow("DirectX Sample Application with configuration"))
return FALSE;
if (!InitDirectMusic())
return FALSE;
g_pBackgroundMusic = LoadSound(L"passport.mid");
if (g_pBackgroundMusic == NULL)
{
ExitDirectMusic();
DISPLAYERROR("Could not load background music.");
return FALSE;
}
g_pBackgroundMusic->SetParam(GUID_StandardMIDIFile,
0xFFFFFFFF, DMUS_SEG_ALLTRACKS, 0, NULL);
g_pBackgroundMusic->SetRepeats(DMUS_SEG_REPEAT_INFINITE);
DownloadSound(g_pBackgroundMusic);
g_bMusicEnabled = true;
if (!InitDirectInput())
{
DISPLAYERROR("Failed to initialise DirectInput.");
ExitDirectMusic();
return FALSE;
}
if (!InitDirectDraw())
{
ExitDirectInput();
ExitDirectMusic();
return FALSE;
}
lpA = LoadSurface(_T("a.bmp"));
if (lpA == NULL)
{
ExitDirectDraw();
DISPLAYERROR("Could not load background image.");
return FALSE;
}
lpSprites = LoadSurface(_T("sprites.bmp"));
if (lpSprites == NULL)
{
ExitDirectDraw();
DISPLAYERROR("Could not load sprites.");
return FALSE;
}
DDSetColorKey(lpSprites, RGB(255, 0, 255));
AcquireDevices();
ConfigureInput();
g_bFinishedInit = true;
return TRUE;
}
void OnClose()
{
StopBackgroundMusic();
lpSprites->Release();
lpSprites = NULL;
lpA->Release();
lpA = NULL;
ExitDirectDraw();
UnloadSound(g_pBackgroundMusic);
g_pBackgroundMusic->Release();
g_pBackgroundMusic = NULL;
ExitDirectMusic();
UnacquireDevices();
ExitDirectInput();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
if (!InitApplication(hInstance))
return 1;
PlayBackgroundMusic();
Run();
return 0;
}