?? gameview.cpp
字號:
// GameView.cpp : implementation of the CGameView class
//
#include "stdafx.h"
#include "Game.h"
#include "GameDoc.h"
#include "GameView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGameView
IMPLEMENT_DYNCREATE(CGameView, CView)
BEGIN_MESSAGE_MAP(CGameView, CView)
//{{AFX_MSG_MAP(CGameView)
ON_COMMAND(ID_EASY, OnEasy)
ON_COMMAND(ID_NORMAL, OnNormal)
ON_COMMAND(ID_HARD, OnHard)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_PROMPT, OnPrompt)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_TEST, OnTest)
ON_COMMAND(ID_GAME, OnGame)
ON_COMMAND(ID_MODE, OnMode)
ON_COMMAND(ID_NO, OnNo)
ON_COMMAND(ID_UPDOWN, OnUpdown)
ON_COMMAND(ID_UPDOWN1, OnUpdown1)
ON_COMMAND(ID_UPDOWN2, OnUpdown2)
ON_COMMAND(ID_LEFT, OnLeft)
ON_COMMAND(ID_LEFTRIGHT, OnLeftright)
ON_COMMAND(ID_LEFTRIGHT1, OnLeftright1)
ON_COMMAND(ID_LEFTRIGHT2, OnLeftright2)
ON_COMMAND(ID_DOWN, OnDown)
ON_COMMAND(ID_PREV_LAYER, OnPrevLayer)
ON_COMMAND(ID_NEXT_LAYER, OnNextLayer)
ON_COMMAND(ID_RESTART, OnRestart)
ON_COMMAND(ID_PAUSE, OnPause)
ON_COMMAND(ID_QUIT, OnQuit)
ON_UPDATE_COMMAND_UI(ID_QUIT, OnUpdateQuit)
ON_UPDATE_COMMAND_UI(ID_PROMPT, OnUpdatePrompt)
ON_UPDATE_COMMAND_UI(ID_RESTART, OnUpdateRestart)
ON_UPDATE_COMMAND_UI(ID_PAUSE, OnUpdatePause)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_TIMER()
ON_UPDATE_COMMAND_UI(ID_NO, OnUpdateNo)
ON_UPDATE_COMMAND_UI(ID_LEFTRIGHT, OnUpdateLeftright)
ON_UPDATE_COMMAND_UI(ID_LEFTRIGHT1, OnUpdateLeftright1)
ON_UPDATE_COMMAND_UI(ID_LEFTRIGHT2, OnUpdateLeftright2)
ON_UPDATE_COMMAND_UI(ID_MODE, OnUpdateMode)
ON_UPDATE_COMMAND_UI(ID_NEXT_LAYER, OnUpdateNextLayer)
ON_UPDATE_COMMAND_UI(ID_PREV_LAYER, OnUpdatePrevLayer)
ON_UPDATE_COMMAND_UI(ID_TEST, OnUpdateTest)
ON_UPDATE_COMMAND_UI(ID_UPDOWN, OnUpdateUpdown)
ON_UPDATE_COMMAND_UI(ID_UPDOWN1, OnUpdateUpdown1)
ON_UPDATE_COMMAND_UI(ID_UPDOWN2, OnUpdateUpdown2)
ON_UPDATE_COMMAND_UI(ID_LEFT, OnUpdateLeft)
ON_UPDATE_COMMAND_UI(ID_GAME, OnUpdateGame)
ON_UPDATE_COMMAND_UI(ID_DOWN, OnUpdateDown)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGameView construction/destruction
CGameView::CGameView()
{
// TODO: add construction code here
MyGame = new CMyGame;
GameMode = DRAW ;
TestGame = GAME ;
GameColor[DRAW] = RGB(255,255,255) ;
GameColor[EDIT] = RGB(255,0,0) ;
GameColor[BACK] = RGB(0,0,0) ;
GameColor[LINE] = RGB(0,255,0) ;
for(int i = 0 ; i < 36 ; i++)
{
GameBmp[i].LoadBitmap(IDB_BITMAP1+i) ;
}
}
CGameView::~CGameView()
{
}
BOOL CGameView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGameView drawing
void CGameView::OnDraw(CDC* pDC)
{
CGameDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if ( MyGame->m_Class != EMPTY )
{ InitScreen(pDC) ;
DispPrompt() ;
DrawGameBlock(pDC, MyGame); }
else
DrawBackground(pDC, IDB_BACKGROUND) ;
}
/////////////////////////////////////////////////////////////////////////////
// CGameView printing
BOOL CGameView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CGameView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CGameView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CGameView diagnostics
#ifdef _DEBUG
void CGameView::AssertValid() const
{
CView::AssertValid();
}
void CGameView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CGameDoc* CGameView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGameDoc)));
return (CGameDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGameView message handlers
void CGameView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ((!MyGame->m_Pause)&&(MyGame->m_Class!=EMPTY))
{
if (MyGame->GetPoint(point.x, point.y))
{
if (GameMode == AUTO )
{
DrawFrame(DRAW, MyGame->m_xw[0], MyGame->m_yw[0]) ;
DrawFrame(DRAW, MyGame->m_xw[1], MyGame->m_yw[1]) ;
GameMode = DRAW ;
}
DrawFrame(EDIT, MyGame->m_xw[MyGame->m_num], MyGame->m_yw[MyGame->m_num]) ;
if (MyGame->m_num==1)
{
if ((MyGame->m_xw[0]!=MyGame->m_xw[1])||(MyGame->m_yw[0]!=MyGame->m_yw[1]))
//判斷是否與前一點是一樣的
{
if (!MyGame->CheckLine(false, 0,1))
{
GameMode = DRAW ;
DrawFrame(GameMode, MyGame->m_xw[0], MyGame->m_yw[0]) ;
DrawFrame(GameMode, MyGame->m_xw[1], MyGame->m_yw[1]) ;}
else//成功消去
{ GameLine(GameColor[LINE]) ;
_sleep(100) ;
GameLine(GameColor[BACK]) ;
GameMode = BACK ;
MyGame->m_Score += (MyGame->m_Layer+1)*10 ;
MyGame->m_Count-- ;
MyGame->m_Time+=2 ;
GameMode = AUTO ;
MyGame->MoveGraph() ;
DrawGraph() ;
if (MyGame->m_Count!=0)//判斷是否已過關
if (!MyGame->TestAll())
{
if ( MyGame->m_Look != 0 )
{ MyGame->m_Look-- ;
MyGame->ReInitData() ;
}
else
{
AfxMessageBox("無牌可消!游戲結束!") ;
MyGame->m_GameOver = true ;
MyGame->m_Class = EMPTY ;
}
Invalidate() ;
}
DispPrompt() ;
}
}
else
DrawFrame(DRAW, MyGame->m_xw[0], MyGame->m_yw[0]) ;
MyGame->m_num = -1 ;
if (MyGame->m_Count==0)//判斷是否過關
{
MyGame->ProcessNext() ;
Invalidate() ; }
}
}
}
CView::OnLButtonDown(nFlags, point);
}
void CGameView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ((!MyGame->m_Pause)&&(MyGame->m_Class!=EMPTY))
{
while(MyGame->m_num>-1)
{
DrawFrame(DRAW, MyGame->m_xw[MyGame->m_num], MyGame->m_yw[MyGame->m_num]) ;
MyGame->m_num-- ;
}
}
CView::OnRButtonDown(nFlags, point);
}
/***************圖像輸出設計***************/
void CGameView::DrawGameBlock(CDC *pDC, CMyGame *MyGame)
{
int x,y ;
for(x=0;x<MyGame->m_Xsize;x++)
for(y=0;y<MyGame->m_Ysize;y++)
if ( TestGame )
DrawFrame(DRAW, x, y) ;
else
DrawBmp(pDC, x, y) ;
}
void CGameView::InitScreen(CDC *pDC)
{
char *Class[3]={"Easy","Normal","Hard"} ;
if (MyGame->m_Class==EMPTY) return ;
CBrush BackBrush(RGB(0,0,0)), *OldBrush ;
OldBrush = pDC->SelectObject(&BackBrush) ;
CRect WinRect(0,0,MyGame->m_ScreenWidth,MyGame->m_ScreenHeight) ;
pDC->Rectangle(&WinRect) ;
pDC->SelectObject(OldBrush) ;
DispProgress(pDC) ;
pDC->SetBkColor(RGB(0,0,0)) ;
pDC->SetTextColor(RGB(255,255,0)) ;
pDC->TextOut(18,30,"洗") ;
pDC->TextOut(18,45,"牌") ;
pDC->TextOut(160,5,"關卡") ;
pDC->TextOut(160,35,"提示") ;
CFont GameFont, *OldFont ;
LOGFONT Font={30,10,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑體"} ;
GameFont.CreateFontIndirect(&Font);
OldFont = pDC->SelectObject(&GameFont) ;
pDC->SetTextColor(RGB(200,200,255)) ;
pDC->TextOut(0,0,"Class") ;
pDC->SelectObject(&OldFont) ;
LOGFONT Font1={30,10,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"Blackadder ITC"} ;
CFont GameFont1 ;
GameFont1.CreateFontIndirect(&Font1);
OldFont = pDC->SelectObject(&GameFont1) ;
pDC->TextOut(60,0,Class[MyGame->m_Class-1]) ;
pDC->SelectObject(&OldFont) ;
}
void CGameView::DispPrompt()
{
CClientDC dc(this) ;
char *Title[13]={"不變化 ","向下 ","向左 ","上下分離","左右分離","上下集中",
"左右集中","上左下右","左下右上","向外擴散","向內集中","向上 ","向右 "} ;
CString str ;
if (MyGame->m_Class==EMPTY) return ;
CFont GameFont, *OldFont ;
LOGFONT Font={30,10,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑體"} ;
GameFont.CreateFontIndirect(&Font);
OldFont = dc.SelectObject(&GameFont) ;
dc.SetBkColor(RGB(0,0,0)) ;
dc.SetTextColor(RGB(200,200,255)) ;
str.Format("%#2d",MyGame->m_Look) ;
dc.TextOut(38,30,str) ;
str.Format("%#2d",MyGame->m_Layer) ;
dc.TextOut(210,0,str) ;
Font.lfWidth = 20 ;
dc.SelectObject(&GameFont) ;
dc.TextOut(260,0,Title[MyGame->m_Layer]) ;
str.Format("%#2d",MyGame->m_Prompt) ;
dc.TextOut(210,30,str) ;
str.Format("%#5d",MyGame->m_Score) ;
dc.TextOut(680,25,str) ;
dc.SelectObject(&OldFont) ;
}
void CGameView::DrawFrame(int Mode, int xw, int yw)
{
CClientDC dc(this) ;
if ( TestGame )
{
switch( Mode )
{
case DRAW :
if ( MyGame->m_Data[xw][yw] != 0 )
{
DrawBack(&dc, DRAW, xw, yw) ;
DrawBlock(&dc, BACK, xw, yw) ;
DrawData(&dc, xw, yw) ;
}
else
DrawBack(&dc, BACK, xw, yw) ;
break ;
case EDIT :
DrawBlock(&dc, EDIT, xw, yw) ;
break ;
case BACK :
DrawBack(&dc, BACK, xw, yw) ;
break ;
}
}
else
{
switch( Mode )
{
case DRAW :
DrawBmp(&dc, xw, yw) ;
break ;
case EDIT :
DrawBlock(&dc, EDIT, xw, yw) ;
break ;
case BACK :
DrawBack(&dc, BACK, xw, yw) ;
break ;
}
}
}
void CGameView::GameLine(COLORREF color)
{
CClientDC dc(this) ;
int x, y, x0, y0 ;
CPen LinePen(0,2,color), *OldPen ;
MyGame->TranToXYCenter(&x0, &y0, 0) ;
OldPen = dc.SelectObject(&LinePen) ;
dc.MoveTo(x0, y0) ;
for(int i=2; i<=MyGame->m_num; i++)
{
MyGame->TranToXYCenter(&x, &y, i) ;
dc.LineTo(x,y) ;
}
MyGame->TranToXYCenter(&x, &y, 1) ;
dc.LineTo(x,y) ;
dc.SelectObject(&OldPen) ;
}
void CGameView::DispProgress(CDC *pDC)
{
CRect Rect(258,30,560,50);
CBrush MyBrush(RGB(255,0,0)), *OldBrush ; ;
pDC->Rectangle(&Rect) ;
OldBrush = pDC->SelectObject(&MyBrush) ;
pDC->Rectangle(Rect.left+2,Rect.top+2,Rect.left+MyGame->m_Time,Rect.bottom-2) ;
pDC->SelectObject(&OldBrush) ;
}
void CGameView::DrawBmp(CDC *pDC, int xw, int yw)
{
if ( MyGame->m_Data[xw][yw]==0 )
{
DrawBack(pDC, BACK, xw, yw) ;
return ;
}
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMemory.SelectObject(&GameBmp[MyGame->m_Data[xw][yw]-1]);
int x, y ;
MyGame->TranToXY(&x, &y, xw, yw) ;
pDC->BitBlt(x, y, MyGame->m_dx, MyGame->m_dy, &dcMemory,
0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBitmap);
}
void CGameView::DrawBack(CDC *pDC, int Mode, int xw, int yw)
{
int x, y ;
MyGame->TranToXY(&x, &y, xw, yw) ;
DrawBack0(pDC, Mode, x, y, x+MyGame->m_dx, y+MyGame->m_dy) ;
}
void CGameView::DrawBack0(CDC *pDC, int Mode, int x, int y, int x1, int y1)
{
CPen MyPen(0,1,GameColor[Mode]), *OldPen ;
CBrush MyBrush(GameColor[Mode]), *OldBrush ;
OldPen = pDC->SelectObject(&MyPen) ;
OldBrush = pDC->SelectObject(&MyBrush) ;
pDC->Rectangle(x,y,x1, y1) ;
pDC->SelectObject(&OldBrush) ;
pDC->SelectObject(&OldPen) ;
}
void CGameView::DrawBlock(CDC *pDC, int Mode, int xw, int yw)
{
int x, y ;
CPen MyPen(0,2,GameColor[Mode]), *OldPen ;
OldPen = pDC->SelectObject(&MyPen) ;
MyGame->TranToXY(&x, &y, xw, yw) ;
pDC->MoveTo(x+1,y+1) ;
pDC->LineTo(x+1, y+MyGame->m_dy-1) ;
pDC->LineTo(x+MyGame->m_dx-1, y+MyGame->m_dy-1) ;
pDC->LineTo(x+MyGame->m_dx-1, y) ;
pDC->LineTo(x+1,y+1) ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -