📄
字号:
// 俄罗斯方块View.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "俄罗斯方块.h"
#include <Mmsystem.h>
#include "joyspeed.h"
#include "俄罗斯方块Doc.h"
#include "俄罗斯方块View.h"
#include "conset.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyView
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
ON_WM_CREATE()
ON_COMMAND(IDM_START, OnStart)
ON_WM_KEYUP()
ON_WM_KEYDOWN()
ON_WM_TIMER()
ON_COMMAND(IDM_END, OnEnd)
ON_COMMAND(IDM_INITSET, OnInitset)
ON_COMMAND(IDC_NOMID, OnNomid)
ON_COMMAND(IDC_MID1, OnMid1)
ON_COMMAND(IDC_MID2, OnMid2)
ON_COMMAND(IDC_MID3, OnMid3)
ON_COMMAND(IDM_WORD, OnWord)
ON_COMMAND(IDM_STANDARD, OnStandard)
ON_COMMAND(IDM_CHANGE, OnChange)
ON_COMMAND(IDM_LOAD, OnLoad)
ON_COMMAND(IDM_SAVE, OnSave)
ON_COMMAND(ID_APP_HELP, OnAppHelp)
ON_WM_DESTROY()
ON_COMMAND(IDM_SETJOY, OnSetjoy)
ON_COMMAND(IDM_CONSET, OnConset)
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction
CMyView::CMyView()
{
// TODO: add construction code here
TempLevel=1;
TempFloor=0;
QuickDrop=FALSE;
CON_TURN=VK_UP;
CON_DOWN=VK_DOWN;
CON_LEFT=VK_LEFT;
CON_RIGHT=VK_RIGHT;
CON_PAUSE=VK_RETURN;
CMyView::SetTimer(IDT_RECYCLE,10000,NULL);
}
CMyView::~CMyView()
{
CMyView::KillTimer(IDT_DROP);
CMyView::KillTimer(IDT_RECYCLE);
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
//初始化背景
CBrush brush;
brush.CreateSolidBrush(RGB(192,192,192));
pDC->SelectObject(brush);
pDC->Rectangle(242,0,349,434);
brush.DeleteObject();
brush.CreateSolidBrush(game.BackColor);
pDC->SelectObject(brush);
pDC->Rectangle(0,0,241,434);
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(192,192,192));
pDC->TextOut(245,100,"分数:");
pDC->TextOut(245,130,"层数:");
pDC->TextOut(245,160,"等级:");
pDC->TextOut(245,230,"左:Left");
pDC->TextOut(245,250,"右:Right");
pDC->TextOut(245,270,"翻转:UP");
pDC->TextOut(245,290,"加速:Down");
pDC->TextOut(245,310,"暂停:Enter");
pDC->TextOut(245,330,"2001-8-27");
CClientDC dc(this);
game.DrawDAt();
//刷新
brush.DeleteObject();
for(int i=0;i<16;i++)
for(int j=0;j<25;j++)
{
if (game.BoxStyle[i][j]==TRUE)
game.DrawBox(i,j);
else game.DelBox(i,j);
}
if (game.GamePause)
{
pDC->SetTextColor(RGB(0,0,255));
pDC->TextOut(250,190,"游戏暂停");
}
//刷下一个方块
if (game.StartGame)
{
COLORREF TempColor2=game.BackColor;
game.BackColor=RGB(0,0,0);
for(i=17;i<=20;i++)
for(int j=1;j<=4;j++)
{
if (game.MoveBox[game.NextBoxNum][game.BoxPosition].box[i-17][j-1])
{
game.BoxRgb[i][j]=game.MoveBox[game.NextBoxNum][game.NextBoxPosition].color;
game.DrawBox(i,j);
}
else game.DelBox(i,j);
}
game.BackColor=TempColor2;
}
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics
#ifdef _DEBUG
void CMyView::AssertValid() const
{
CView::AssertValid();
}
void CMyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CMyView::SetTimer(IDT_RECYCLE,10000,NULL);
return 0;
}
void CMyView::OnStart()
{
// TODO: Add your command handler code here
CClientDC dc(this);
if (game.GameHasOver)
{
game.PlayMidi.Close();
game.IsPlayMid=FALSE;
game.GameHasOver=FALSE;
}
if(strcmp(game.MidName,"")!=0 && game.PlayMidi.IsPlaying()==FALSE)
{
game.PlayMidi.Close();
game.PlayMidi.Open(game.MidName);
game.PlayMidi.Play();
game.IsPlayMid=TRUE;
}
if (game.StartGame==FALSE)
{
CMenu *menu=AfxGetMainWnd()->GetMenu();
menu->ModifyMenu(IDM_START,MF_BYCOMMAND,IDM_START,"重置游戏");
menu->EnableMenuItem(IDM_SAVE,MF_ENABLED);
menu->EnableMenuItem(IDM_STANDARD,MF_GRAYED);
menu->EnableMenuItem(IDM_CHANGE,MF_GRAYED);
}
game.Level=TempLevel;
game.Floor=TempFloor;
game.m_hDC=GetDC()->m_hDC;
game.InitGame();
game.DrawNextMoveBox();
CMyView::SetTimer(IDT_DROP,game.Speed,NULL);
CMyView::Invalidate(FALSE);
}
void CMyView::OnEnd()
{
// TODO: Add your command handler code here
CMyView::KillTimer(IDT_DROP);
game.Floor=0;
game.GameHasOver=FALSE;
game.InitGame();
game.StartGame=FALSE;
CMyView::Invalidate(FALSE);
if(strcmp(game.MidName,"")!=0 && game.PlayMidi.IsPlaying()==FALSE)
{
game.PlayMidi.Close();
game.PlayMidi.Open(game.MidName);
game.PlayMidi.Play();
game.IsPlayMid=TRUE;
}
CMyView::SendMessage(WM_COMMAND,IDM_STANDARD,0);
CMenu *menu=AfxGetMainWnd()->GetMenu();
menu->CheckMenuItem(IDM_BOX_DEFCOLOR,MF_CHECKED);
menu->CheckMenuItem(IDM_BOX_RANDCOLOR,MF_UNCHECKED);
menu->EnableMenuItem(IDM_STANDARD,MF_ENABLED);
menu->EnableMenuItem(IDM_CHANGE,MF_ENABLED);
}
void CMyView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
game.KEYUP=TRUE;
CView::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if (game.PassStage && nChar==CON_PAUSE)
{
game.PlayMidi.Close();
game.PlayMidi.Open(game.MidName);
game.PlayMidi.Play();
CMyView::Invalidate(FALSE);
game.GamePause=1-game.GamePause;
game.PassStage=FALSE;
return;
}
if (game.StartGame)
{
DeleteObject(game.m_hDC);
game.m_hDC=GetDC()->m_hDC;
if(nChar==CON_TURN)
{
if (SafeFlags && game.GamePause==FALSE && game.KEYUP==TRUE && game.CanChange()==TRUE)
{
game.DelMoveBox();
game.BoxPosition++;
if (game.BoxPosition>3) game.BoxPosition=0;
game.DrawMoveBox();
}
}
else
if(SafeFlags && nChar==CON_DOWN)
{
if (game.GamePause==FALSE && game.IsDroping==TRUE)
{
if(game.MoveDown())
{
if(QuickDrop)
while (game.MoveDown())
{
game.DelMoveBox();
game.Movexy.y++;
game.DrawMoveBox();
Sleep(8);
}
else
{
game.DelMoveBox();
game.Movexy.y++;
game.DrawMoveBox();
}
}
else
{
game.BeginRow=game.Movexy.y;
game.EndRow=game.Movexy.y+game.MoveBox[game.BoxNum][game.BoxPosition].heigh-1;
game.IsDroping=FALSE;
game.Movexy.x=7;
game.Movexy.y=0;
game.DelRowBox();
if (game.MoveWave)
{
game.PlayWave.Close();
game.PlayWave.Load("drop.wav");
game.PlayWave.Play();
}
}
}
}
else
if(SafeFlags && nChar==CON_LEFT)
{
if (game.GamePause==FALSE && game.IsDroping==TRUE && game.MoveLeft()==TRUE)
{
game.DelMoveBox();
game.Movexy.x--;
game.DrawMoveBox();
}
}
else
if(nChar==CON_RIGHT)
{
if (SafeFlags && game.GamePause==FALSE && game.IsDroping==TRUE && game.MoveRight()==TRUE)
{
game.DelMoveBox();
game.Movexy.x++;
game.DrawMoveBox();
}
}
else
if(nChar==CON_PAUSE)
{
if (game.PassStage==FALSE)
{
game.GamePause=1-game.GamePause;
SetTextColor(game.m_hDC,RGB(0,0,255));
SetBkColor(game.m_hDC,RGB(192,192,192));
if (game.GamePause==FALSE)
TextOut(game.m_hDC,250,190," ",strlen(" "));
else
TextOut(game.m_hDC,250,190,"游戏暂停",strlen("游戏暂停"));
}
}
game.KEYUP=FALSE;
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
}
void CMyView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (TwoWindow || CMyView::GetActiveWindow()==AfxGetApp()->GetMainWnd())
switch(nIDEvent)
{
case IDT_DROP:
SafeFlags=FALSE;
if (game.StartGame==TRUE && game.GamePause==FALSE)
{
game.Count++;
if (game.Count>10000) game.Count=100;
game.m_hDC=GetDC()->m_hDC;
if (game.IsDroping==TRUE)
{
if (game.MoveDown())
{
game.DelMoveBox();
game.Movexy.y++;
game.DrawMoveBox();
}
else
{
game.BeginRow=game.Movexy.y;
game.EndRow=game.Movexy.y+game.MoveBox[game.BoxNum][game.BoxPosition].heigh-1;
CMyView::SetTimer(IDT_DROP,game.Speed,NULL);
game.IsDroping=FALSE;
game.DelRowBox();
game.Movexy.x=7;
game.Movexy.y=0;
if (game.MoveWave)
{
game.PlayWave.Close();
game.PlayWave.Load("drop.wav");
game.PlayWave.Play();
}
}
}
if (game.IsDroping==FALSE)
{
game.DrawNextMoveBox();
//
if (game.GameOver())
{
CMyView::KillTimer(IDT_DROP);
game.SaveDat();
game.InitGame();
game.StartGame=FALSE;
SetTextColor(game.m_hDC,RGB(255,0,0));
SetBkColor(game.m_hDC,RGB(0,0,0));
TextOut(game.m_hDC,70,150,"GAME OVER",strlen("GAME OVER"));
TextOut(game.m_hDC,65,180,"小子,你好差哦!",strlen("小子,你好差哦!"));
game.GameHasOver=TRUE;
game.PlayMidi.Close();
game.PlayMidi.Open("lost.mid");
game.PlayMidi.Play();
return;
}
else
{
game.DrawMoveBox();
game.IsDroping=TRUE;
}
}
}
SafeFlags=TRUE;
break;
case IDT_RECYCLE:
if(game.IsPlayMid==TRUE && game.PlayMidi.IsPlaying()==FALSE)
{
game.PlayMidi.SeekTo(0,0);
game.PlayMidi.Play();
}
break;
default:
break;
}
CView::OnTimer(nIDEvent);
}
void CMyView::OnInitset()
{
// TODO: Add your command handler code here
game.IninSet.floor=TempFloor;
game.IninSet.level=TempLevel;
game.IninSet.Wav=game.MoveWave;
game.IninSet.QuickDrop=QuickDrop;
if (game.IninSet.DoModal()==IDOK)
{
game.MoveWave=game.IninSet.Wav;
QuickDrop=game.IninSet.QuickDrop;
}
TempFloor=game.IninSet.floor;
TempLevel=game.IninSet.level;
}
void CMyView::OnNomid()
{
// TODO: Add your command handler code here
CMenu *menu=AfxGetMainWnd()->GetMenu();
menu->CheckMenuItem(IDC_NOMID,MF_CHECKED);
menu->CheckMenuItem(IDC_MID1,MF_UNCHECKED);
menu->CheckMenuItem(IDC_MID2,MF_UNCHECKED);
menu->CheckMenuItem(IDC_MID3,MF_UNCHECKED);
game.BackMid=FALSE;
game.IsPlayMid=FALSE;
strcpy(game.MidName,"");
game.PlayMidi.Close();
}
void CMyView::OnMid1()
{
// TODO: Add your command handler code here
CMenu *menu=AfxGetMainWnd()->GetMenu();
menu->CheckMenuItem(IDC_NOMID,MF_UNCHECKED);
menu->CheckMenuItem(IDC_MID1,MF_CHECKED);
menu->CheckMenuItem(IDC_MID2,MF_UNCHECKED);
menu->CheckMenuItem(IDC_MID3,MF_UNCHECKED);
game.BackMid=TRUE;
game.IsPlayMid=TRUE;
strcpy(game.MidName,"mid1.mid");
game.PlayMidi.Close();
game.PlayMidi.Open("mid1.mid");
game.PlayMidi.Play();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -