woaidaima2016 发表于 2017-6-13 11:03:04

森林舞会(机器人)【源码】

http://img.woaidaima.com//upload/image/20170526/1495760449631048397.jpghttp://img.woaidaima.com//upload/image/20170526/1495760451899025097.jpg#include "StdAfx.h"
#include "Math.h"
#include "Resource.h"
#include "GameClientView.h"
#include "GameClientDlg.h"
#include "RenderCanvas.h"
#include "UIManager.h"

#define FOCUS_TIMER100

//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CGameClientView, CGameFrameViewGDI)
BEGIN_MESSAGE_MAP(CGameClientView, CGameFrameViewGDI)
    ON_WM_TIMER()
    ON_WM_CREATE()
    ON_WM_SETCURSOR()
    ON_WM_LBUTTONDOWN()
    ON_WM_SIZE()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONUP()
    ON_WM_MOUSEWHEEL()
    ON_WM_PAINT()
    ON_WM_KEYDOWN()
    ON_WM_KEYUP()
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////

//构造函数
CGameClientView::CGameClientView()
{
    return;
}

//析构函数
CGameClientView::~CGameClientView(void)
{
    if( RenderCanvas::Instance() )
      RenderCanvas::Destroy();
}

//建立消息
int CGameClientView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (__super::OnCreate(lpCreateStruct)==-1) return -1;


    RenderCanvas::Create();

    SetTimer(FOCUS_TIMER, 4000, NULL);


    return 0;
}

void CGameClientView::OnDestroy()
{
    if( RenderCanvas::Instance() )
      RenderCanvas::Destroy();
}

//重置界面
void CGameClientView::ResetGameView()
{
   
    return;
}

//调整控件
void CGameClientView::RectifyGameView(int nWidth, int nHeight)
{
   

    return;
}

//构造旋转路径上各小区域的中心点
void CGameClientView::CreateTurnPathAreaBasePoint(int nWidth, int nHeight)
{

}
void CGameClientView::CreateApplayBankerListRect(int nBaseX, int nBaseY)
{

}
//构造历史记录显示框
void CGameClientView::CreateHistoryRecordRect(int nWidth, int nHeight)
{

}

//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
    return;
}

void CGameClientView::OnIdle()
{
    if(RenderCanvas::Instance() && RenderCanvas::Instance()->IsValid())
    {
      RenderCanvas::Instance()->OnIdle();
      if(GetFocus()!=this)
      {
            RenderCanvas::Instance()->GetUIManager()->SetJettonPressfalse();
      }
    }
}

//鼠标消息
void CGameClientView::OnMouseMove(UINT nFlags, CPoint point)
{
    if(RenderCanvas::Instance() && RenderCanvas::Instance()->IsValid())
      RenderCanvas::Instance()->OnMouseMove(nFlags, point);

    CGameFrameView::OnMouseMove(nFlags, point);
}

void CGameClientView::OnLButtonDown(UINT nFlags, CPoint Point)
{
    if(RenderCanvas::Instance() && RenderCanvas::Instance()->IsValid())
      RenderCanvas::Instance()->OnLButtonDown(nFlags, Point);

    __super::OnLButtonDown(nFlags,Point);
}

void CGameClientView::OnLButtonUp(UINT nFlags, CPoint point)
{
    if(RenderCanvas::Instance() && RenderCanvas::Instance()->IsValid())
      RenderCanvas::Instance()->OnLButtonUp(nFlags, point);

    CGameFrameView::OnLButtonUp(nFlags, point);
}

BOOL CGameClientView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
    if(RenderCanvas::Instance() && RenderCanvas::Instance()->IsValid())
      RenderCanvas::Instance()->OnMouseWheel(nFlags, zDelta, pt);

    return CGameFrameView::OnMouseWheel(nFlags, zDelta, pt);
}

void CGameClientView::OnSize(UINT nType, int cx, int cy)
{
    CGameFrameView::OnSize(nType, cx, cy);

    if( cx != 0 && cy != 0 )
    {
      if(RenderCanvas::Instance())
      {
            if( !RenderCanvas::Instance()->IsValid() )
            {
                // 创建渲染画布
                if( !RenderCanvas::Instance()->Init(m_hWnd) )
                  return ;
               
            }
            //else
            {
                RenderCanvas::Instance()->OnSize(m_hWnd, cx, cy);
                SetFocus();
            }
      }
    }
}

BOOL CGameClientView::OnSetCursor( CWnd * pWnd, UINT nHitTest, UINT uMessage )
{
    return __super::OnSetCursor(pWnd, nHitTest, uMessage);
}

void CGameClientView::OnTimer( UINT nIDEvent )
{
    if(nIDEvent == FOCUS_TIMER)
    {
      SetFocus();
      KillTimer(FOCUS_TIMER);
    }
}

LRESULT CGameClientView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    irr::SEvent event;

    static irr::s32 ClickCount=0;
    if (GetCapture() != this && ClickCount > 0)
      ClickCount = 0;


    struct messageMap
    {
      irr::s32 group;
      UINT winMessage;
      irr::s32 irrMessage;
    };

    static messageMap mouseMap[] =
    {
      {0, WM_LBUTTONDOWN, irr::EMIE_LMOUSE_PRESSED_DOWN},
      {1, WM_LBUTTONUP,   irr::EMIE_LMOUSE_LEFT_UP},
      {0, WM_RBUTTONDOWN, irr::EMIE_RMOUSE_PRESSED_DOWN},
      {1, WM_RBUTTONUP,   irr::EMIE_RMOUSE_LEFT_UP},
      {0, WM_MBUTTONDOWN, irr::EMIE_MMOUSE_PRESSED_DOWN},
      {1, WM_MBUTTONUP,   irr::EMIE_MMOUSE_LEFT_UP},
      {2, WM_MOUSEMOVE,   irr::EMIE_MOUSE_MOVED},
      {3, WM_MOUSEWHEEL,irr::EMIE_MOUSE_WHEEL},
      {-1, 0, 0}
    };

    // handle grouped events
    messageMap * m = mouseMap;
    while ( m->group >=0 && m->winMessage != message )
      m += 1;

    irr::IrrlichtDevice* dev = NULL;
    if(RenderCanvas::Instance())
      dev = RenderCanvas::Instance()->GetDevice();

    if ( m->group >= 0 )
    {
      if ( m->group == 0 )    // down
      {
            ClickCount++;
            SetCapture();
      }
      else if ( m->group == 1 )    // up
      {
            ClickCount--;
            if (ClickCount<1)
            {
                ClickCount=0;
                ReleaseCapture();
            }
      }

      event.EventType = irr::EET_MOUSE_INPUT_EVENT;
      event.MouseInput.Event = (irr::EMOUSE_INPUT_EVENT) m->irrMessage;
      event.MouseInput.X = (short)LOWORD(lParam);
      event.MouseInput.Y = (short)HIWORD(lParam);
      event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
      event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
      // left and right mouse buttons
      event.MouseInput.ButtonStates = (unsigned int)(wParam & ( MK_LBUTTON | MK_RBUTTON));
      // middle and extra buttons
      if (wParam & MK_MBUTTON)
            event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
#if(_WIN32_WINNT >= 0x0500)
      if (wParam & MK_XBUTTON1)
            event.MouseInput.ButtonStates |= irr::EMBSM_EXTRA1;
      if (wParam & MK_XBUTTON2)
            event.MouseInput.ButtonStates |= irr::EMBSM_EXTRA2;
#endif
      event.MouseInput.Wheel = 0.f;

      // wheel
      if ( m->group == 3 )
      {
            POINT p; // fixed by jox
            p.x = 0; p.y = 0;
            ::ClientToScreen(m_hWnd, &p);
            event.MouseInput.X -= p.x;
            event.MouseInput.Y -= p.y;
            event.MouseInput.Wheel = ((irr::f32)((short)HIWORD(wParam))) / (irr::f32)WHEEL_DELTA;
      }


      
      if (dev)
      {
            dev->postEventFromUser(event);

            if ( event.MouseInput.Event >= irr::EMIE_LMOUSE_PRESSED_DOWN && event.MouseInput.Event <= irr::EMIE_MMOUSE_PRESSED_DOWN )
            {
                irr::u32 clicks = dev->checkSuccessiveClicks(event.MouseInput.X, event.MouseInput.Y, event.MouseInput.Event);
                if ( clicks == 2 )
                {
                  event.MouseInput.Event = (irr::EMOUSE_INPUT_EVENT)(irr::EMIE_LMOUSE_DOUBLE_CLICK + event.MouseInput.Event-irr::EMIE_LMOUSE_PRESSED_DOWN);
                  dev->postEventFromUser(event);
                }
                else if ( clicks == 3 )
                {
                  event.MouseInput.Event = (irr::EMOUSE_INPUT_EVENT)(irr::EMIE_LMOUSE_TRIPLE_CLICK + event.MouseInput.Event-irr::EMIE_LMOUSE_PRESSED_DOWN);
                  dev->postEventFromUser(event);
                }
            }
      }
      return 0;
    }

    switch (message)
    {
    case WM_ERASEBKGND:
      return 0;
    case WM_SYSKEYDOWN:
    case WM_SYSKEYUP:
    case WM_KEYDOWN:
    case WM_KEYUP:
      {
            BYTE allKeys;

            event.EventType = irr::EET_KEY_INPUT_EVENT;
            event.KeyInput.Key = (irr::EKEY_CODE)wParam;
            event.KeyInput.PressedDown = (message==WM_KEYDOWN || message == WM_SYSKEYDOWN);

            const UINT MY_MAPVK_VSC_TO_VK_EX = 3; // MAPVK_VSC_TO_VK_EX should be in SDK according to MSDN, but isn't in mine.
            if ( event.KeyInput.Key == irr::KEY_SHIFT )
            {
                // this will fail on systems before windows NT/2000/XP, not sure _what_ will return there instead.
                event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((UINT)(lParam>>16) & 255), MY_MAPVK_VSC_TO_VK_EX );
            }
            if ( event.KeyInput.Key == irr::KEY_CONTROL )
            {
                event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((UINT)(lParam>>16) & 255), MY_MAPVK_VSC_TO_VK_EX );
                // some keyboards will just return LEFT for both - left and right keys. So also check extend bit.
                if (lParam & 0x1000000)
                  event.KeyInput.Key = irr::KEY_RCONTROL;
            }
            if ( event.KeyInput.Key == irr::KEY_MENU )
            {
                event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((UINT)(lParam>>16) & 255), MY_MAPVK_VSC_TO_VK_EX );
                if (lParam & 0x1000000)
                  event.KeyInput.Key = irr::KEY_RMENU;
            }

            GetKeyboardState(allKeys);

            event.KeyInput.Shift = ((allKeys & 0x80)!=0);
            event.KeyInput.Control = ((allKeys & 0x80)!=0);

            // Handle unicode and deadkeys in a way that works since Windows 95 and nt4.0
            // Using ToUnicode instead would be shorter, but would to my knowledge not run on 95 and 98.
            WORD keyChars;
            UINT scanCode = HIWORD(lParam);
            HKL KEYBOARD_INPUT_HKL=0;
            unsigned int KEYBOARD_INPUT_CODEPAGE = 1252;
            int conversionResult = ToAsciiEx((UINT)wParam,scanCode,allKeys,keyChars,0,KEYBOARD_INPUT_HKL);
            if (conversionResult == 1)
            {
                WORD unicodeChar;
                MultiByteToWideChar(
                  KEYBOARD_INPUT_CODEPAGE,
                  MB_PRECOMPOSED, // default
                  (LPCSTR)keyChars,
                  sizeof(keyChars),
                  (WCHAR*)&unicodeChar,
                  1 );
                event.KeyInput.Char = unicodeChar;
            }
            else
                event.KeyInput.Char = 0;

            // allow composing characters like '@' with Alt Gr on non-US keyboards
            if ((allKeys & 0x80) != 0)
                event.KeyInput.Control = 0;

            if (dev)
                dev->postEventFromUser(event);

            if (message == WM_SYSKEYDOWN || message == WM_SYSKEYUP)
                return CGameFrameView::DefWindowProc(message, wParam, lParam);
            else
                return 0;
      }
    }

    return CGameFrameView::DefWindowProc(message, wParam, lParam);
}

void CGameClientView::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CGameFrameView::OnPaint()
}

void CGameClientView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if(RenderCanvas::Instance())
      RenderCanvas::Instance()->OnKeyDown(nChar, nRepCnt, nFlags);

    CGameFrameView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CGameClientView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if(RenderCanvas::Instance())
      RenderCanvas::Instance()->OnKeyUp(nChar, nRepCnt, nFlags);

    CGameFrameView::OnKeyUp(nChar, nRepCnt, nFlags);
}
//bool CGameClientView::UpdateMatchSort(tagUserData * pUserData, WORD wPlayerCount)
//{
//
//    return true;
//
//}
////设置用户列表
//void CGameClientView::SetUserDataList(tagUserData * pUserData, BYTE cbType)
//{
//    return ;
//
//}

页: [1]
查看完整版本: 森林舞会(机器人)【源码】