?? winmain.cpp
字號:
//---------------------------------------------------------------------------
/*
Book: AI for Game Developers
Authors: David M. Bourg & Glenn Seemann
Example: Pattern movement in continuous environments, Chapter 3
*/
//---------------------------------------------------------------------------
// Windows Header Files:
#include <windows.h>
#include <windef.h>
#include <commctrl.h>
#include <commdlg.h>
#include <wingdi.h>
// C RunTime Header Files:
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <stdio.h>
#include <math.h>
// Local Header Files:
#include "resource.h"
#include "winmain.h"
// Defines:
#define APPNAME "AI Ch2 Demo"
// Forward declarations for non-window related functions
void DrawLineToDC(HDC hdc, int h1, int v1, int h2, int v2, int thk, COLORREF clr);
void DrawRectangleToDC(HDC hdc, RECT *r, int thk, COLORREF borderCLR, COLORREF fillCLR);
void DrawEllipseToDC(HDC hdc, RECT *r, int thk, COLORREF clr);
void DrawStringToDC(HDC hdc, int x, int y, LPCSTR lpszString, int size, int ptsz);
void CreateBackBuffer(void);
void DeleteBackBuffer(void);
// Forward declarations for window related functions
LRESULT CALLBACK DemoDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DefaultWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// Window related global variables
HINSTANCE hinst;
HWND hMainWindow;
RECT MainWindowRect;
HDC BackBufferDC;
HBITMAP hBackBuffer;
LPBITMAPINFO lpBackBufferBitmapInfo;
bool Initialized = false;
int nShowCmd;
/*HINSTANCE hInst; // current instance
int nShowCmd; // current show command
char szAppName[] = APPNAME; // The name of this application
char szTitle[] = APPNAME; // The title bar text
HWND hTheMainWindow;
*/
// globals
bool ShowTrails;
bool ShowVectors;
bool BasicChase;
bool BasicEvade;
bool InterceptChase;
bool PotentialChase;
bool Patrol;
bool ZigZag;
// Forward declarations for non-window related functions
void InitializeVariables(void);
void DrawTopView(HDC hdc, RECT *r);
void DrawLine(HDC hdc, int h1, int v1, int h2, int v2, int thk, COLORREF clr);
void DrawRectangle(HDC hdc, RECT *r, int thk, COLORREF clr);
void DrawString(HDC hdc, int x, int y, LPCSTR lpszString, int size, int ptsz);
extern void UpdateSimulation(void);
extern bool Initialize(void);
//----------------------------------------------------------------------------------------------------//
// This is the applications "main" function. Note that I'm not using a message loop here
// since there is no main window. All I do is display a dialog box immediately upon startup
// and let the dialog handler take care of the messages.
//----------------------------------------------------------------------------------------------------//
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
//----------------------------------------------------------------------------------------------------//
{
MSG msg;
HANDLE hAccelTable;
if (!hPrevInstance) {
// Perform instance initialization:
if (!InitApplication(hInstance)) {
return (FALSE);
}
}
// Perform application initialization:
if (!InitInstance(hInstance, nCmdShow)) {
return (FALSE);
}
hAccelTable = LoadAccelerators (hInstance, APPNAME);
// Main message loop:
while (1) {
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT) {
return msg.wParam;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(Initialized)
UpdateSimulation();
}
return (msg.wParam);
lpCmdLine; // This will prevent 'unused formal parameter' warnings
}
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
HWND hwnd;
hwnd = FindWindow (APPNAME, NULL);
if (hwnd) {
if (IsIconic(hwnd)) {
ShowWindow(hwnd, SW_RESTORE);
}
SetForegroundWindow (hwnd);
return FALSE;
}
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;//LoadIcon (hInstance, MAKEINTRESOURCE(IDI_MAINICON));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);//NULL
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);
wc.lpszClassName = APPNAME;
return RegisterClass(&wc);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hinst = hInstance;
nShowCmd = nCmdShow;
MainWindowRect.left = 0;
MainWindowRect.top = 0;
MainWindowRect.right = _WINWIDTH;
MainWindowRect.bottom = _WINHEIGHT;
hMainWindow = CreateWindow( APPNAME,
APPNAME,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0, _WINWIDTH, _WINHEIGHT,
NULL, NULL, hinst, NULL);
// create back buffer
CreateBackBuffer();
ShowWindow(hMainWindow, nCmdShow);
UpdateWindow(hMainWindow);
Initialized = Initialize();
return (TRUE);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
BOOL validmenu = FALSE;
int selection =0;
PAINTSTRUCT ps;
HDC pDC;
WPARAM key;
int w, h;
UINT state;
switch (message) {
case WM_CREATE:
ShowTrails = true;
ShowVectors = false;
BasicChase = false;
BasicEvade = false;
InterceptChase = false;
PotentialChase = false;
Patrol = false;
ZigZag = true;
break;
case WM_ACTIVATE:
state = ShowTrails ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_SHOWTRAILS, state);
state = ShowVectors ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_SHOWVECTORS, state);
state = BasicChase ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_BASICCHASE, state);
state = BasicEvade ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_BASICEVADE, state);
state = InterceptChase ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_INTERCEPT, state);
state = PotentialChase ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_POTENTIALCHASE, state);
state = Patrol ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_SQUAREPATROL, state);
state = ZigZag ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_ZIGZAG, state);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch(wmId) {
case ID_CLOSEMENU:
DeleteBackBuffer();
PostQuitMessage(0);
break;
case ID_OPTIONS_SHOWTRAILS:
ShowTrails = !ShowTrails;
state = ShowTrails ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_SHOWTRAILS, state);
break;
case ID_OPTIONS_SHOWVECTORS:
ShowVectors = !ShowVectors;
state = ShowVectors ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_SHOWVECTORS, state);
break;
case ID_OPTIONS_BASICCHASE:
BasicChase = !BasicChase;
state = BasicChase ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_BASICCHASE, state);
if(BasicEvade)
{
BasicEvade = false;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_BASICEVADE, MF_UNCHECKED);
}
if(InterceptChase)
{
InterceptChase = false;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_INTERCEPT, MF_UNCHECKED);
}
break;
case ID_OPTIONS_BASICEVADE:
BasicEvade = !BasicEvade;
state = BasicEvade ? MF_CHECKED:MF_UNCHECKED;
CheckMenuItem(GetMenu(hMainWindow), ID_OPTIONS_BASICEVADE, state);
if(BasicChase)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -