⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tanksdlg.cpp

📁 分布式坦克游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    HideGameControl (m_ShieldStatus, FALSE);
    HideGameControl (m_AmmoStatus, FALSE);
    HideGameControl (m_BonusStatus, FALSE);

    m_GameState = GAME_ON;
}

void CTanksDlg::GameOver()
{
        // Can only be called from GAME_ON state
    ASSERT (GAME_ON == m_GameState);
        // Disable "stop game" menu item
    GetMenu()->EnableMenuItem(ID_STOP_GAME, MF_BYCOMMAND | MF_GRAYED);
    m_GameState = GAME_OVER;
        // Disable chat dialog. We can leave it open though, because our tank ID
        // is still occupied:
    GetMenu()->EnableMenuItem(ID_CHAT_OPEN, MF_BYCOMMAND | MF_GRAYED);

        // Add the GameOver animation object to the game:
    CMessage::MessageData DummyParams;
    TANKS_APP->m_gIncomingMsgQueue.Enqueue (CMessage::ADD_GAME_OVER, DummyParams);
}

void CTanksDlg::OnStopGame() 
// Called after the user pressed a key in the "Game-Over" animation sequence
{
        // Can only be called from GAME_OVER or GAME_ONstate
    ASSERT (GAME_OFF != m_GameState);
        // Warn host before we continue:
    if (TANKS_APP->m_gCommManager.IsHost()) {
        if (IDNO == AfxMessageBox(IDS_HOST_ON_STOP, MB_YESNO | MB_ICONQUESTION))
            return;
    }

        // Hide the controls
    HideGameControl (m_ShieldStatus, TRUE);
    HideGameControl (m_AmmoStatus, TRUE);
    HideGameControl (m_BonusStatus, TRUE);
    
        // Enable "new game" menu item
    GetMenu()->EnableMenuItem(ID_NEW_GAME, MF_BYCOMMAND | MF_ENABLED);
        // Disable "stop game" menu item
    GetMenu()->EnableMenuItem(ID_STOP_GAME, MF_BYCOMMAND | MF_GRAYED);
        // Disable "chat open" menu item
    m_ChatDlg.Close();
    GetMenu()->EnableMenuItem(ID_CHAT_OPEN, MF_BYCOMMAND | MF_GRAYED);

    m_GameState = GAME_OFF;

        // Stop player, and close session:
    TANKS_APP->m_gCommManager.OnStopGame();

    TANKS_APP->EndGameThreads();
        // Cause the logo screen to redraw
    m_Map.Invalidate (TRUE);
}



void CTanksDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
    CDC *pdc = CDC::FromHandle (lpDrawItemStruct->hDC);

    switch (nIDCtl) {
        case IDC_MAP:   // Draw map region 
            { 
                if (m_GameState != GAME_OFF)
                {   // Let the renderer do its job
                    m_GameManager.RefreshDisplay ();
                }
                else 
                {
                    // Now paste the splash screen to the DC please........

                    CDIB dib;
                    if (dib.ReadFromResource (IDB_SPLASH))
                        dib.Paint (pdc);
                }
            }
            break;

        case IDC_SHIELD_STATUS:
            m_ShieldStatus.GetImage () -> Paint (pdc);
            break;

        case IDC_AMMO_STATUS:
            m_AmmoStatus.GetImage () -> Paint (pdc);
            break;

        case IDC_BONUS_STATUS:
            m_BonusStatus.GetImage () -> Paint (pdc);
            break;

        default:
            CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
            break;
    }
}

void CTanksDlg::AlignControls()
{

    CRect ctlRect, dlgRect;

    GetWindowRect (dlgRect);
    GetClientRect (ctlRect);

    int iExtraRoom = dlgRect.Height() - ctlRect.Height() + 10;

    MoveWindow (dlgRect.left, dlgRect.top, 
                MAP_WIDTH + 20 + SHIELD_STATUS_WIDTH + AMMO_STATUS_WIDTH,
                MAP_HEIGHT + iExtraRoom);

    m_ShieldStatus.GetClientRect (ctlRect);
    m_ShieldStatus.MoveWindow ( ctlRect.left + 5,
                                ctlRect.top + 5, 
                                SHIELD_STATUS_WIDTH, 
                                MAP_HEIGHT,
                                FALSE);

    m_Map.GetClientRect (ctlRect);
    int iMapX = ctlRect.left + 10 + SHIELD_STATUS_WIDTH,
        iMapY = ctlRect.top + 5;

    m_Map.MoveWindow (iMapX, iMapY, MAP_WIDTH, MAP_HEIGHT, FALSE);

    m_AmmoStatus.GetClientRect (ctlRect);
    m_AmmoStatus.MoveWindow (   ctlRect.left + MAP_WIDTH + SHIELD_STATUS_WIDTH + 15, 
                                ctlRect.top + 5, 
                                AMMO_STATUS_WIDTH, 
                                AMMO_STATUS_HEIGHT,
                                FALSE);

    m_BonusStatus.GetClientRect (ctlRect);
    m_BonusStatus.MoveWindow (  ctlRect.left + MAP_WIDTH + SHIELD_STATUS_WIDTH + 15, 
                                ctlRect.top + AMMO_STATUS_HEIGHT + 5, 
                                AMMO_STATUS_WIDTH, 
                                MAP_HEIGHT - AMMO_STATUS_HEIGHT,
                                FALSE);
}

BOOL CTanksDlg::OnEraseBkgnd(CDC* pDC) 
{
    // Keep Windows from erasing the background of our map
    if (pDC == m_Map.GetDC())
        return TRUE;
    return CDialog::OnEraseBkgnd (pDC);
}

BOOL 
CTanksDlg::PreTranslateMessage(MSG* pMsg)
{
    if (GAME_OFF != m_GameState)
    {
        // Catch key strokes only if a game is active
        switch (pMsg->message) {
            case WM_KEYDOWN:
            case WM_SYSKEYDOWN:
                if (GAME_OVER == m_GameState)
                {
                    // Waiting for any key from the user, and one just arrived.
                    OnStopGame();
                    return TRUE;    // Don't let the dialog have this key
                }
                else 
                {
                    if (m_KbdManager.SetKey(pMsg->wParam) ||
                        (VK_ESCAPE == pMsg->wParam))
                            // Key was successfully mapped to game 
                            // or it was Esc
                        return TRUE;
                    else
                            // We don't know this key => dispatch it to the dialog
                        return FALSE;
                }
                break;
            case WM_KEYUP:
            case WM_SYSKEYUP:
                if (m_KbdManager.UnsetKey(pMsg->wParam) ||
                    (VK_ESCAPE == pMsg->wParam))
                        // Key was successfully mapped to game 
                        // or it was Esc
                    return TRUE;
                else
                        // We don't know this key => dispatch it to the dialog
                    return FALSE;
                break;
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}


void CTanksDlg::HideGameControl(CWnd &ctrl, BOOL bHide)
{
    ctrl.EnableWindow (bHide ? FALSE : TRUE);
    ctrl.ShowWindow (bHide ? SW_HIDE : SW_SHOW);
}

void CTanksDlg::OnClose() 
{
    // Catch application before exiting:
    if (IsGameOn()) {
        UINT uStrInd = TANKS_APP->m_gCommManager.IsHost() 
            ? IDS_HOST_ON_EXIT 
            : IDS_PLAYER_ON_EXIT;
        if (IDNO == AfxMessageBox(uStrInd, MB_YESNO | MB_ICONQUESTION))
            return;
    }   
    CDialog::OnClose();
}

void CTanksDlg::CreateStatusPanes()
{
    m_AmmoStatus.Create ();
    m_BonusStatus.Create ();

    m_ShieldStatus.SetLevel (0);
    m_AmmoStatus.SetShellsCount (0);
    m_AmmoStatus.SetBulletsCount (0);
    m_AmmoStatus.SetMinesCount (0);
    m_BonusStatus.SetAerialSupport (FALSE);
    m_BonusStatus.SetFastFireRate (FALSE);
}

void CTanksDlg::StartDIBDrawingEngine()
{
    TANKS_APP->m_gDrawDIB.Open ();
}

BOOL CTanksDlg::OnQueryNewPalette() 
{
    return TRUE;
}


void CTanksDlg::OnPaletteChanged(CWnd* pFocusWnd) 
{
    if (pFocusWnd != this)
        OnQueryNewPalette ();
}



void CTanksDlg::CheckDPlayVersion()
{
/*  In this function we should check that we can create a DPlay2 interface.
    If not - we should display a detailed dialog to the user, telling him
    that he cannot connect or host a session and point the user to the URL
    where he can download the latest SP (for NT) or DirectX runtime.
*/
}

void CTanksDlg::OnOK()
{
    // This function is here to override the default CDialog::OnOK which
    // closes the dialog window  - we don't want that to happen
}

void CTanksDlg::OnServerMgmt() 
{
    if (!(TANKS_APP->GetStoredIsHostFlag()))
        return; // Player is not hosting a game
    m_SrvMgmtDlg.Open (this);
}

void
CTanksDlg::OnChatOpen()
{
    if (m_GameState != GAME_ON)   // We have to have a local tank ID to send chat msg:
        return;
    m_ChatDlg.Open(this);
}

void CTanksDlg::OnPlayersGuide() 
{
    CString cstrHTML = TANKS_APP->m_pszHelpFilePath;
    int i=cstrHTML.ReverseFind ('\\');
    cstrHTML = cstrHTML.Left (i);
    cstrHTML += "\\HTML\\players.htm";
    
    HINSTANCE hRes = ShellExecute ( m_hWnd, 
                                    "open", 
                                    cstrHTML,
                                    NULL,
                                    NULL,
                                    SW_MAXIMIZE);
    if (DWORD(hRes) <= 32)
        AfxMessageBox (IDS_CANT_SHOW_IE, MB_OK);
}            

void 
CTanksDlg::OnSoundMute() 
{
    UINT uFlag = GetMenu()->GetMenuState(ID_SOUND_MUTE, MF_BYCOMMAND);
    if (MF_CHECKED == uFlag)
    {   // The user wants to uncheck (return the game sound):
        GetMenu()->CheckMenuItem(ID_SOUND_MUTE, MF_UNCHECKED);
        TANKS_APP->m_gSoundManager.SetMuteMode(FALSE);
        TANKS_APP->SetStoredMuteMode(FALSE);
    } else if (MF_UNCHECKED == uFlag)
    {   // The user wants to check (mute the game sound):
        GetMenu()->CheckMenuItem(ID_SOUND_MUTE, MF_CHECKED);
        TANKS_APP->m_gSoundManager.SetMuteMode(TRUE);
        TANKS_APP->SetStoredMuteMode(TRUE);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -