亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? winmain.cpp

?? 用DirectX編寫RPG游戲-Programming.Role.Playing.Games.with.DirectX
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/**************************************************
WinMain.cpp
Chapter 19 Multiplayer Server Demo

Programming Role-Playing Games with DirectX
by Jim Adams (01 Jan 2002)

Required libraries:
  D3D8.LIB, D3DX8.LIB, DINPUT8.LIB, D3DXOF.LIB,
  DXGUID.LIB, DPNET.LIB, DPLAY.LIB, and DPNADDR.LIB
**************************************************/

#include "Core_Global.h"
#include "Server.h"
#include "WinMain.h"
#include "resource.h"

cApp            *g_Application; // Global application pointer
cNetworkAdapter *g_Adapters;    // Global adapter list pointer

///////////////////////////////////////////////////////////
// cApp overidden virtual functions
///////////////////////////////////////////////////////////
cApp::cApp()
{ 
  // Setup main window information
  m_Width  = 320;
  m_Height = 212;
  m_Style  = WS_BORDER | WS_CAPTION |                         \
             WS_MINIMIZEBOX | WS_SYSMENU;
  m_wcex.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
  strcpy(m_Class, "ServerClass");
  strcpy(m_Caption, "Network Server Demo by Jim Adams");

  // Clear class data
  m_Messages    = NULL;
  m_Players     = NULL;
  m_guidAdapter = NULL;
  g_Application = this;
  g_Adapters    = &m_Adapters;

  // Initialize a critical section for messaging
  InitializeCriticalSection(&m_MessageCS);
}

BOOL cApp::Init()
{
  // Select a network adapter to use (or quit if selected)
  if(SelectAdapter() == FALSE)
    return FALSE;

  // Setup the main interface window
  SetupApplicationWindow();

  // Initialize the game, set video mode, load data, etc
  if(InitializeGame() == FALSE) {
    Error(FALSE, "Unable to initialize game.");
    return FALSE;
  }

  // Begin hosting the game session
  if(HostGame() == FALSE) {
    Error(FALSE, "Unable to host network server.");
    return FALSE;
  }

  return TRUE;
}

BOOL cApp::Shutdown()
{
  // Disconnect network and free interfaces
  m_Adapters.Shutdown();
  m_Server.Disconnect();
  m_Server.Shutdown();

  // Shutdown graphics
  m_LevelMesh.Free();
  m_Graphics.Shutdown();

  // Delete message array
  delete [] m_Messages;
  m_Messages = NULL;

  // Delete players
  delete [] m_Players;
  m_Players = NULL;

  // Free the critical section
  DeleteCriticalSection(&m_MessageCS);

  return TRUE;
}

BOOL cApp::Frame()
{
  static DWORD PlayerCounter = timeGetTime();
  static DWORD NetworkCounter = timeGetTime();
  static DWORD LatencyCounter = timeGetTime();

  // Process some queued network messages
  ProcessQueuedMessages();

  // Update players every 33ms (30 times a second)
  if(timeGetTime() > PlayerCounter + 33) {
    UpdatePlayers();
    PlayerCounter = timeGetTime(); // Reset counter
  }

  // Send out network updates every 100ms (10 times a second)
  if(timeGetTime() > NetworkCounter + 100) {
    UpdateNetwork();
    NetworkCounter = timeGetTime(); // Reset counter
  }

  // Update player latency values every 10 seconds
  if(timeGetTime() > LatencyCounter + 10000) {
    UpdateLatency();
    LatencyCounter = timeGetTime(); // Reset counter
  }

  return TRUE;
}

FAR PASCAL cApp::MsgProc(HWND hWnd, UINT uMsg,                \
                         WPARAM wParam, LPARAM lParam)
{
  switch(uMsg) {
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }

  return 0;
}    

int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev,          \
                   LPSTR szCmdLine, int nCmdShow)
{
  cApp App;
  return App.Run();  // Run the application instance
}

///////////////////////////////////////////////////////////
// Select adapter dialog and other functions
///////////////////////////////////////////////////////////
BOOL CALLBACK ConfigDialogProc(HWND hWnd, UINT uMsg,          \
                               WPARAM wParam, LPARAM lParam)
{
  long i;
  char Text[256];
  int Selection;
  static HWND hAdapters;

  switch(uMsg) {
    case WM_INITDIALOG:
      // Get adapter list window handle
      hAdapters = GetDlgItem(hWnd, IDC_ADAPTERS);

      // Add adapter names to list
      for(i=0;i<g_Adapters->GetNumAdapters();i++) {
        g_Adapters->GetName(i, Text);
        SendMessage(hAdapters, CB_INSERTSTRING,i,(LPARAM)Text);
      }

      // Select first adapter in list
      SendMessage(hAdapters, CB_SETCURSEL, 0, 0);

      return TRUE;

    case WM_COMMAND:
      switch(LOWORD(wParam)) {

        case IDC_OK:
          // Make sure an adapter was selected
          if((Selection = SendMessage(hAdapters,              \
                                      CB_GETCURSEL,           \
                                      0, 0)) == LB_ERR)
            break;

          // Assign adapter
          if(g_Application != NULL)
            g_Application->SetAdapter(                        \
                           g_Adapters->GetGUID(Selection));

          // Quit dialog
          EndDialog(hWnd, TRUE);
          return TRUE;

        case IDC_CANCEL:
          EndDialog(hWnd, FALSE);
          return TRUE;
      }

  }
  return FALSE;
}

void cApp::SetAdapter(GUID *Adapter)
{
  m_guidAdapter = Adapter;
}

///////////////////////////////////////////////////////////
// Misc. application functions
///////////////////////////////////////////////////////////
void cApp::ListPlayers()
{
  long i;
  char Text[256];

  // Error checking
  if(m_Players == NULL)
    return;

  // Clear player list
  SendMessage(m_Controls[2], LB_RESETCONTENT, 0, 0);

  // Count all players and add names to list
  for(i=0;i<MAX_PLAYERS;i++) {
    if(m_Players[i].Connected == TRUE)
      SendMessage(m_Controls[2], LB_ADDSTRING, 0,             \
                 (LPARAM)m_Players[i].Name);
  }

  // Display player count
  if(!m_NumPlayers)
    SetWindowText(m_Controls[1], "No Connected Players");
  else {
    sprintf(Text, "%lu Players Connected", m_NumPlayers);
    SetWindowText(m_Controls[1], Text);
  }
}

///////////////////////////////////////////////////////////
// Network send and receive functions
///////////////////////////////////////////////////////////
BOOL cApp::SendNetworkMessage(void *Msg, long SendFlags, int To)
{
  sMessageHeader *mh = (sMessageHeader*)Msg;
  unsigned long Size;

  // Get size of message to send
  if((Size = mh->Size) == 0)
    return FALSE;

  // Set destination to all players if To == -1
  if(To == -1)
    To = DPNID_ALL_PLAYERS_GROUP;

  // Send the message
  return m_Server.Send(To, Msg, Size, SendFlags);
}

BOOL cApp::CreatePlayer(DPNMSG_CREATE_PLAYER *Msg)
{
  sCreatePlayerMessage cpm;

  // Setup message data
  cpm.Header.Type     = MSG_CREATE_PLAYER;
  cpm.Header.Size     = sizeof(sCreatePlayerMessage);
  cpm.Header.PlayerID = Msg->dpnidPlayer;

  QueueMessage(&cpm); // Queue the message
  
  return TRUE;
}

BOOL cApp::DestroyPlayer(DPNMSG_DESTROY_PLAYER *Msg)
{
  sDestroyPlayerMessage dpm;

  // Setup message data
  dpm.Header.Type     = MSG_DESTROY_PLAYER;
  dpm.Header.Size     = sizeof(sDestroyPlayerMessage);
  dpm.Header.PlayerID = Msg->dpnidPlayer;
  
  QueueMessage(&dpm); // Queue the message

  return TRUE;
}

BOOL cApp::Receive(DPNMSG_RECEIVE *Msg)
{
  sMessageHeader *mh = (sMessageHeader*)Msg->pReceiveData;

  // Make sure it's a valid message type and queue it
  switch(mh->Type) {
    case MSG_ASSIGNID: 
      // Store player ID before continuing
      mh->PlayerID = Msg->dpnidSender;
    case MSG_PLAYER_INFO:
    case MSG_STATE_CHANGE:
      // Add message to queue
      QueueMessage((void*)Msg->pReceiveData);
      break;
  }

  return TRUE;
}

///////////////////////////////////////////////////////////
// Message queue functions
///////////////////////////////////////////////////////////
BOOL cApp::QueueMessage(void *Msg)
{
  sMessageHeader *mh = (sMessageHeader*)Msg;

  // Error checking - make sure there's a message array
  if(m_Messages == NULL)
    return FALSE;

  // Return if no room left in queue
  if(((m_MsgHead+1) % NUM_MESSAGES) == m_MsgTail)
    return FALSE;

  // Stuff message into queue
  if(mh->Size <= sizeof(sMessage)) {
    // Start the critical section
    EnterCriticalSection(&m_MessageCS);

    memcpy(&m_Messages[m_MsgHead], Msg, mh->Size);

    // Go to next empty message (flip around if at end)
    m_MsgHead++;
    if(m_MsgHead >= NUM_MESSAGES)
      m_MsgHead = 0;

    // Leave the critical section
    LeaveCriticalSection(&m_MessageCS);
  }

  return TRUE;
}

BOOL cApp::PlayerID(sMessage *Msg, DPNID To)
{
  sAssignPlayerIDMessage apidm;

  apidm.Header.Type     = MSG_ASSIGNID;
  apidm.Header.Size     = sizeof(sAssignPlayerIDMessage);
  apidm.Header.PlayerID = To;
  SendNetworkMessage(&apidm, DPNSEND_NOLOOPBACK, To);

  return TRUE;
}

BOOL cApp::PlayerInfo(sMessage *Msg, DPNID To)
{
  sRequestPlayerInfoMessage *rpim;
  sCreatePlayerMessage cpm;
  long i;

  // Error checking
  if(m_Players == NULL)
    return FALSE;

  // Get pointer to request info
  rpim = (sRequestPlayerInfoMessage*)Msg;

  for(i=0;i<MAX_PLAYERS;i++) {
    // Only send if found in list
    if(m_Players[i].dpnidPlayer == rpim->PlayerID &&          \
       m_Players[i].Connected == TRUE) {
 
      // Send player info to requesting player
      cpm.Header.Type     = MSG_PLAYER_INFO;
      cpm.Header.Size     = sizeof(sCreatePlayerMessage);
      cpm.Header.PlayerID = rpim->PlayerID;

      cpm.XPos            = m_Players[i].XPos;
      cpm.YPos            = m_Players[i].YPos;
      cpm.ZPos            = m_Players[i].ZPos;
      cpm.Direction       = m_Players[i].Direction;

      SendNetworkMessage(&cpm, DPNSEND_NOLOOPBACK, To);

      break;
    }
  }

  return TRUE;
}

BOOL cApp::AddPlayer(sMessage *Msg)
{
  long i;
  DWORD Size = 0;
  DPN_PLAYER_INFO *dpi = NULL;
  HRESULT hr;
  DPNID PlayerID;

  // Error checking
  if(m_Players == NULL)
    return FALSE;

  // Get the player ID #
  PlayerID = Msg->Header.PlayerID;

  // Get the player information 
  hr = m_Server.GetServerCOM()->GetClientInfo(PlayerID, dpi,  \
                                              &Size, 0);

  // Return on error or if adding server
  if(FAILED(hr) && hr != DPNERR_BUFFERTOOSMALL)
    return FALSE;

  // Allocate player data buffer and try again
  if((dpi = (DPN_PLAYER_INFO*)new BYTE[Size]) == NULL)
    return FALSE;
  ZeroMemory(dpi, Size);
  dpi->dwSize = sizeof(DPN_PLAYER_INFO);
  if(FAILED(m_Server.GetServerCOM()->GetClientInfo(           \
                                PlayerID, dpi, &Size, 0))) {
    delete [] dpi;
    return FALSE;
  }

  // Make sure not already in list
  for(i=0;i<MAX_PLAYERS;i++) {
    if(m_Players[i].dpnidPlayer == PlayerID &&                \
       m_Players[i].Connected == TRUE) {
      delete [] dpi;
      m_Server.DisconnectPlayer(PlayerID);
      return FALSE;
    }
  }

  // Search for an empty slot to put player
  for(i=0;i<MAX_PLAYERS;i++) {
    if(m_Players[i].Connected == FALSE) {

      m_Players[i].Connected = TRUE; // Flag as connected

      // Save DirectPlay DPNID # and name of player
      m_Players[i].dpnidPlayer = PlayerID;
      wcstombs(m_Players[i].Name, dpi->pwszName, 256);

      // Setup player data
      m_Players[i].XPos      = 0.0f;
      m_Players[i].YPos      = 0.0f;
      m_Players[i].ZPos      = 0.0f;
      m_Players[i].Direction = 0.0f;
      m_Players[i].Speed     = 512.0f;
      m_Players[i].State     = STATE_IDLE;
      m_Players[i].Latency   = 0;

      // Send add player info to all players in area
      sCreatePlayerMessage cpm;
      cpm.Header.Type     = MSG_CREATE_PLAYER;
      cpm.Header.Size     = sizeof(sCreatePlayerMessage);
      cpm.Header.PlayerID = PlayerID;
      cpm.XPos            = m_Players[i].XPos;
      cpm.YPos            = m_Players[i].YPos;
      cpm.ZPos            = m_Players[i].ZPos;
      cpm.Direction       = m_Players[i].Direction;
      SendNetworkMessage(&cpm, DPNSEND_NOLOOPBACK, -1);

      ListPlayers();        // List all players

      delete [] dpi;        // Free player data

      return TRUE;          // Return success
    }
  }

  delete[] dpi;  // Free player data

  // Disconnect player - not allowed to connect
  m_Server.DisconnectPlayer(PlayerID);

  return FALSE;  // Return failure
}

BOOL cApp::RemovePlayer(sMessage *Msg)
{
  long i;

  // Error checking
  if(m_Players == NULL)
    return FALSE;

  // Search for player in list
  for(i=0;i<MAX_PLAYERS;i++) {
    if(m_Players[i].dpnidPlayer == Msg->Header.PlayerID &&    \
       m_Players[i].Connected == TRUE) {

      m_Players[i].Connected = FALSE;  // Disconnect player

      // Send remove player message to all players in area
      sDestroyPlayerMessage dpm;
      dpm.Header.Type     = MSG_DESTROY_PLAYER;
      dpm.Header.Size     = sizeof(sDestroyPlayerMessage);
      dpm.Header.PlayerID = Msg->Header.PlayerID;
      SendNetworkMessage(&dpm, DPNSEND_NOLOOPBACK, -1);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男人的天堂亚洲一区| 91色.com| 99久久婷婷国产精品综合| 91精品国产综合久久小美女| 国产午夜精品理论片a级大结局| 亚洲一区二区三区四区在线免费观看 | 日韩视频一区二区在线观看| 中文字幕字幕中文在线中不卡视频| 久久99在线观看| 欧美肥妇bbw| 日本色综合中文字幕| 色狠狠色噜噜噜综合网| 国产清纯白嫩初高生在线观看91| 五月天精品一区二区三区| 色婷婷综合久久久久中文一区二区 | 91麻豆精品国产综合久久久久久| 亚洲精品国产品国语在线app| 国产一区在线观看视频| 日韩亚洲欧美一区| 亚洲第一成人在线| 91精品福利在线| 亚洲免费看黄网站| 97久久精品人人爽人人爽蜜臀| 久久精品一二三| 国产高清亚洲一区| 久久综合九色欧美综合狠狠| 久久99这里只有精品| 欧美大片国产精品| 美女看a上一区| 日韩美女一区二区三区| 蜜桃久久av一区| 欧美一区二区三区免费在线看| 一区二区三区欧美视频| 91传媒视频在线播放| 一区二区三区在线观看网站| 91在线国产福利| 一区二区视频免费在线观看| 欧洲精品在线观看| 亚洲国产综合91精品麻豆| 欧美性感一区二区三区| 亚欧色一区w666天堂| 国产精品网友自拍| 成人av在线影院| 亚洲人成7777| 5566中文字幕一区二区电影| 免费人成黄页网站在线一区二区| 欧美一区二区在线视频| 黄色精品一二区| 中文无字幕一区二区三区| 99热精品国产| 婷婷开心久久网| 精品欧美一区二区在线观看| 国产不卡视频一区| 亚洲视频香蕉人妖| 在线播放亚洲一区| 国产一区二区三区不卡在线观看 | 精品成人一区二区三区| 国产精品18久久久久久vr| 中文字幕一区免费在线观看| 欧美午夜宅男影院| 国产呦萝稀缺另类资源| 国产精品入口麻豆原神| 精品视频999| 国产在线一区观看| 亚洲乱码中文字幕综合| 日韩欧美在线不卡| kk眼镜猥琐国模调教系列一区二区 | 一区二区三区中文字幕精品精品| 欧美午夜免费电影| 国产精品一二二区| 亚洲亚洲人成综合网络| 久久久久国产精品免费免费搜索| 在线一区二区视频| 国产精品69久久久久水密桃| 亚洲综合激情小说| 国产网红主播福利一区二区| 欧美女孩性生活视频| 成人av网站在线观看免费| 免费成人在线影院| 亚洲精品日日夜夜| 国产亚洲精品aa午夜观看| 欧美肥大bbwbbw高潮| 91色.com| 丁香婷婷深情五月亚洲| 免费欧美高清视频| 亚洲福中文字幕伊人影院| 国产精品美日韩| 精品久久久久久最新网址| 欧美视频精品在线| jiyouzz国产精品久久| 奇米一区二区三区| 亚洲成人免费视频| 一区二区在线免费| 国产精品久久久久久久第一福利 | 欧美日韩免费一区二区三区| 不卡在线视频中文字幕| 黄色精品一二区| 美洲天堂一区二卡三卡四卡视频| 亚洲综合免费观看高清完整版 | 精品一区二区三区在线观看| 亚洲国产精品久久久久秋霞影院| 国产精品私人自拍| 国产日产欧产精品推荐色| 欧美xxxxxxxx| 欧美一区二区视频在线观看2020| 欧美三级日韩三级国产三级| 色综合色综合色综合| 国产999精品久久久久久| 国产一区二区三区在线观看精品| 青青青爽久久午夜综合久久午夜 | 一区二区欧美国产| 玉米视频成人免费看| 最新热久久免费视频| 国产精品免费观看视频| 中文字幕亚洲不卡| 自拍偷拍欧美激情| 亚洲美腿欧美偷拍| 亚洲成人一区二区在线观看| 亚洲电影在线播放| 亚洲成年人网站在线观看| 午夜免费久久看| 日韩黄色免费网站| 久久成人综合网| 狠狠色综合播放一区二区| 国产乱码一区二区三区| 成人自拍视频在线| 91麻豆免费观看| 色婷婷久久综合| 91精品国产综合久久精品app| 制服丝袜亚洲色图| 精品88久久久久88久久久| 久久亚洲欧美国产精品乐播| 中文字幕高清不卡| 久久国产精品99久久久久久老狼| 久久精品国产一区二区三 | 26uuu国产电影一区二区| 精品动漫一区二区三区在线观看| 国产调教视频一区| 亚洲欧美另类在线| 蜜臀va亚洲va欧美va天堂| 国产精品一区在线观看你懂的| 成人av网在线| 欧美高清www午色夜在线视频| 日韩限制级电影在线观看| 久久久久国产精品麻豆| 一区二区三区中文字幕精品精品| 免费观看成人鲁鲁鲁鲁鲁视频| 国产一区二区91| 色综合久久久久久久久久久| 91精品国产综合久久婷婷香蕉| 久久婷婷综合激情| 亚洲综合图片区| 国产成人亚洲综合色影视| 欧美午夜不卡视频| 国产欧美日韩精品在线| 一区二区高清在线| 国产成人午夜精品5599| 欧美日韩aaaaa| 国产精品区一区二区三| 丝袜诱惑制服诱惑色一区在线观看 | 国产精品久久久久久亚洲毛片 | 欧美电影一区二区| 国产精品久久影院| 麻豆免费精品视频| 日本精品裸体写真集在线观看| wwwwww.欧美系列| 亚洲电影中文字幕在线观看| 成人h动漫精品一区二区| 日韩欧美二区三区| 一个色妞综合视频在线观看| 国产精品白丝av| 日韩精品一区二区在线| 亚洲免费观看高清| 东方欧美亚洲色图在线| 日韩美女一区二区三区| 午夜激情久久久| 91麻豆精东视频| 亚洲国产精品二十页| 国产在线麻豆精品观看| 欧美一级在线视频| 亚洲综合免费观看高清在线观看| caoporn国产精品| 久久精品一区二区三区不卡| 成人av电影免费观看| 久久奇米777| 国产一区视频导航| 欧美精品一区二区在线观看| 美女视频网站久久| 69久久99精品久久久久婷婷| 亚洲妇熟xx妇色黄| 欧美日韩视频在线第一区| 亚洲卡通欧美制服中文| 99精品欧美一区二区三区小说 | 成人av免费在线| 中文字幕av一区二区三区高| 国产精品1024| 国产精品私人自拍| 91麻豆免费在线观看| 亚洲美女视频一区| 欧美又粗又大又爽|