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

📄 m_screen.cpp

📁 基于WindowCE上对于windows mobile开发的一个俄罗斯方块程序
💻 CPP
字号:
#include "StdAfx.h"
#include "m_Screen.h"
#include "OurBloke.h"
#include "OurBlokeView.h"
#include "MainFrm.h"

#define WM_CHANGEBLOKEVIEW (WM_USER + 2)
#define WM_LEVELUP (WM_USER + 3)

m_Screen::m_Screen(void)
:score(0)
{
	for (int i = 0;i<16;i++)
	{
		for (int j = 0;j<10;j++)
		{
			_map[i][j] = -1;
		}
	}
	MAP_BottomX = MAP_MAXX/2 - 1;//MAP_MAXX/2 - 1; 
	MAP_BottomY = 0;//Why??
	SetSharp();
	SetSharp2();

	_Queue.SetRandomColorIndex();

	_QueuePrp.SetRandomColorIndex();

	COurBlokeApp * pApp = (COurBlokeApp * )AfxGetApp();
	MaxNum = pApp->MaxNum;


}

m_Screen::~m_Screen(void)
{
}

void m_Screen::OnDraw(CDC * pDC,COurBlokeView * pView)
{
	_Queue.OnDraw(pDC,MAP_BottomX,MAP_BottomY);
	this->DrawMap(pDC,pView);
	_Queue.OnDraw(pDC,MAP_BottomX,MAP_BottomY);

	_QueuePrp.OnDraw(pDC,0,-1);

	
}

void m_Screen::SetSharp(void)
{
	_Queue.SetPosition(0,0,0);
	_Queue.SetPosition(1,1,0);
	_Queue.SetPosition(2,0,-1);
	_Queue.SetPosition(3,1,-1);
}



void m_Screen::RestartQueue(void)
{
	MAP_BottomX = MAP_MAXX/2 - 1;//MAP_MAXX/2 - 1;//MAP_MAXX/2 - 1; 
	MAP_BottomY = 0;//Why??

	//_Queue = _QueuePrp;
	for (int i  = 0;i<QUEUELENTH;i++)
	{
		_Queue.SetColorIndex(i,_QueuePrp.GetColorIndex(i));

	}
	

	_QueuePrp.SetRandomColorIndex();
}

bool m_Screen::HasTouch()
{

	if ((_map[MAP_BottomX][MAP_BottomY] == -1)&&(_map[MAP_BottomX+1][MAP_BottomY]==-1))
	{
		return false;
	} 
	else
	{
		return true;
	}

}
void m_Screen::SetTouch()
{

	int tmpY = MAP_BottomY;
	while ((_map[MAP_BottomX][tmpY] == -1)&&(tmpY< MAP_MAXY))
	{
		tmpY += 1;
	}
	_map[MAP_BottomX][tmpY-1] = _Queue.GetColorIndex(0);
	_map[MAP_BottomX][tmpY-2] = _Queue.GetColorIndex(2);

	int tmpY2 = MAP_BottomY;

	while ((_map[MAP_BottomX+1][tmpY2] == -1)&&(tmpY2< MAP_MAXY))
	{
		tmpY2 += 1;
	}
	_map[MAP_BottomX+1][tmpY2-1] = _Queue.GetColorIndex(1); 
	_map[MAP_BottomX+1][tmpY2-2] = _Queue.GetColorIndex(3);

	SetGray(MAP_BottomX,tmpY-1);
	SetGray(MAP_BottomX,tmpY-2);
	SetGray(MAP_BottomX+1,tmpY2-1);
	SetGray(MAP_BottomX+1,tmpY2-2);

}

void m_Screen::IncBottomY(void)
{
	MAP_BottomY++;
}

bool m_Screen::JudgeBottomY(void)
{
	if (MAP_BottomY >= (MAP_MAXY))
	{
		return true;
	}
	return false;
}

void m_Screen::Rightwards(void)
{
	if (MAP_BottomX<(MAP_MAXX-2))
	{
		if (MAP_BottomY== 1)
		{
			if ((_map[MAP_BottomX+2][MAP_BottomY-1]== -1))
			{
				MAP_BottomX++;
			}
		}
		else
		{
			if (MAP_BottomY == 0)
			{
				MAP_BottomX++;	
			}
			else
			{
				if ((_map[MAP_BottomX+2][MAP_BottomY-1]== -1)&&(_map[MAP_BottomX+2][MAP_BottomY-2]== -1))
				{
					MAP_BottomX++;
				}
			}
		}
		
	}
}

void m_Screen::Leftwards(void)
{
	if (MAP_BottomX>0)
	{
		if (MAP_BottomY== 1)
		{
			if ((_map[MAP_BottomX-1][MAP_BottomY-1]== -1))
			{
				MAP_BottomX--;
			}
		}
		else
		{
			if (MAP_BottomY == 0)
			{
				MAP_BottomX--;	
			}
			else
			{
				if ((_map[MAP_BottomX-1][MAP_BottomY-1]== -1)&&(_map[MAP_BottomX-1][MAP_BottomY-2]== -1))
				{
					MAP_BottomX--;
				}
			}
			
		}
		
	}
}

void m_Screen::Downwards(void)
{
	if (MAP_BottomY<(MAP_MAXY))
	{
		if (!HasTouch())
		{
			
				MAP_BottomY++;
				if (HasTouch()) 
				{
					if (HasFailed())
					{
						CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
						pMain->SendMessage(WM_CHANGEBLOKEVIEW,0,0);

					}
					else
					{
						SetTouch();
						RestartQueue();
					}
				}
			
		}
		else
		{
			if (HasFailed())
			{
				CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
				pMain->SendMessage(WM_CHANGEBLOKEVIEW,0,0);

			}
			else
			{
				SetTouch();
				RestartQueue();
			}
		}
		
	}
}

void m_Screen::TurnAround(void)
{
	_Queue.TurnAround();
}

void m_Screen::MappingQueue(void)
{
	_map[MAP_BottomX][MAP_MAXY-1] = _Queue.GetColorIndex(0);//MAP_BottomY-1
	_map[MAP_BottomX+1][MAP_MAXY-1] = _Queue.GetColorIndex(1);
	_map[MAP_BottomX][MAP_MAXY-2] = _Queue.GetColorIndex(2);
	_map[MAP_BottomX+1][MAP_MAXY-2] = _Queue.GetColorIndex(3);

	SetGray(MAP_BottomX,MAP_MAXY-1);
	SetGray(MAP_BottomX,MAP_MAXY-2);
	SetGray(MAP_BottomX+1,MAP_MAXY-1);
	SetGray(MAP_BottomX+1,MAP_MAXY-2);

}

void m_Screen::DrawMap(CDC *pDC, COurBlokeView * pView)
{
	for (int i = 0;i<MAP_MAXX;i++)
	{
		for (int j = 0;j<MAP_MAXY;j++)
		{
			if (_map[i][j] != -1)
			{

				COurBlokeApp * pApp = (COurBlokeApp *)::AfxGetApp();

				if (_map[i][j] >= 2)
				{
					
					_Blockbmp.LoadBitmap(pApp->ColorIndex[2]);
				}
				else
				{
					
					_Blockbmp.LoadBitmap(pApp->ColorIndex[_map[i][j]]);
				}

				
				CDC   mdc;
				HGDIOBJ hOldObject;
				mdc.CreateCompatibleDC(pDC);
				hOldObject = mdc.SelectObject(&_Blockbmp); 
				//_Blockbmp.CreateCompatibleBitmap(pDC,15,15);

				//Draw the screen 
				pDC->BitBlt( SCREENX_L + CELLSIZEX*(i),SCREENY_T + CELLSIZEY*(j ),SCREENX_L + CELLSIZEX*(i) + CELLSIZEX,SCREENY_T + CELLSIZEY*(j+1),&mdc,0,0,SRCCOPY);

				//relieve the resource of the objects which I have gotten.
				SelectObject(mdc,hOldObject);
				DeleteObject(hOldObject);
				DeleteObject(_Blockbmp);
				DeleteDC (mdc) ;
			
			//	mdc.release
				
			//	ReleaseDC(((HWND)pView),&mdc);
				/*CDC mdc;   
				mdc.CreateCompatibleDC(pDC); 
				CBitmap bitmap;
				mdc.SelectObject(_Blockbmp);//   
				pDC->BitBlt( x + CELLSIZEX*_positionX,y + CELLSIZEY*_positionY,x + CELLSIZEX*_positionX + CELLSIZEX,y + CELLSIZEY*_positionY+ CELLSIZEY,&mdc,0,0,SRCCOPY);
				DeleteDC(mdc);*/



			}
		}
	}
}

void m_Screen::Reduceblock(int _CursorX)
{
	
	
	/*int j = (_CursorX-SCREENX_L)/CELLSIZEX;

	if (j== 0)
	{
		int b = 0;
	}

	if(j<(MAP_MAXX-1))
	{

		for(int i = 0;i<(MAP_MAXY-1);i++)
		{
			if((_map[j][i]!=-1)&&(_map[j][i+1]!=-1)&&(_map[j+1][i]!=-1)&&(_map[j+1][i+1]!=-1))
			{
				if((_map[j][i]==_map[j][i+1])&&(_map[j][i+1]==_map[j+1][i])&&(_map[j+1][i]==_map[j+1][i+1]))
				{
					btmp[i][0]=true;
					btmp[i+1][0] = true;
					btmp[i][1] = true;
					btmp[i+1][1] = true;

				}

			}
		}
	}
	if ((j>=0)&&(j<=(MAP_MAXX-1)))
	{
		for (int i = 0;i<MAP_MAXY;i++)
		{
			if(btmp[i][0]==true)

			{
				for(int u = i;u>0;u--)
				{
					_map[j][u]=_map[j][u-1];
				}
				_map[j][0]=-1;
			}

		}

		for (int i = 0;i<MAP_MAXY;i++)
		{
			btmp[i][0] = btmp[i][1];
			btmp[i][1] = false;
 		}

	}*/
	int j = (_CursorX-SCREENX_L)/CELLSIZEX;
	if ((j>=0)&&(j<=(MAP_MAXX-1)))
	{
		for(int i = 0;i<MAP_MAXY;i++)
		{
			if(_map[j][i] >= 2)
			{
				for(int u = i;u>0;u--)
				{
					_map[j][u]=_map[j][u-1];
				}
				_map[j][0]=-1;
				score +=10;
				if (score >= MaxNum )
				{

					CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
//					pMain->LevelUp();
					pMain->SendMessage(WM_LEVELUP,0,0);
				}
			}

		}
		
	}
	if (j>0)
	{
		for (int i = 1;i<MAP_MAXY;i++)
		{
			SetGray(j-1,i);
		}

	} 

	
}

void m_Screen::SetSharp2(void)
{
	_QueuePrp.SetPosition(0,0,0);
	_QueuePrp.SetPosition(1,1,0);
	_QueuePrp.SetPosition(2,0,-1);
	_QueuePrp.SetPosition(3,1,-1);
}

bool m_Screen::HasFailed(void)
{
	if ((MAP_BottomY == 0)||(MAP_BottomY == 1))//MAP_BottomY-1)
	{
		return true;
	}
	return false;
}

void m_Screen::SetGray(int inMap_BottomX, int inMap_BottomY)
{
	if (_map[inMap_BottomX][inMap_BottomY] == -1)
	{
		return;
	}
	if (((inMap_BottomY-1)>= 0)&&((inMap_BottomX -1)>= 0))
	{
		int a,b,c,d;
		a = _map[inMap_BottomX][inMap_BottomY]%2;
		b = _map[inMap_BottomX-1][inMap_BottomY]%2;
		c = _map[inMap_BottomX-1][inMap_BottomY-1]%2;
		d = _map[inMap_BottomX][inMap_BottomY-1]%2;
		if((a== b)&&(b==c)&&(c==d))
		{
			_map[inMap_BottomX][inMap_BottomY]+=2;
			_map[inMap_BottomX-1][inMap_BottomY]+=2;
			_map[inMap_BottomX-1][inMap_BottomY-1]+=2;
			_map[inMap_BottomX][inMap_BottomY-1] +=2;
		}
	}
	if (((inMap_BottomY)<= (MAP_MAXY-2))&&((inMap_BottomX -1)>= 0))
	{
		int a,b,c,d;
		a = _map[inMap_BottomX][inMap_BottomY]%2;
		b = _map[inMap_BottomX-1][inMap_BottomY]%2;
		c = _map[inMap_BottomX-1][inMap_BottomY+1]%2;
		d = _map[inMap_BottomX][inMap_BottomY+1]%2;
		if((a== b)&&(b==c)&&(c==d))
		{
			_map[inMap_BottomX][inMap_BottomY]+=2;
			_map[inMap_BottomX-1][inMap_BottomY]+=2;
			_map[inMap_BottomX][inMap_BottomY+1]+=2;
			_map[inMap_BottomX-1][inMap_BottomY+1] +=2;
		}
	}
	if (((inMap_BottomY)<= (MAP_MAXY-2))&&((inMap_BottomX)<= (MAP_MAXX-2)))
	{
		int a,b,c,d;
		a = _map[inMap_BottomX][inMap_BottomY]%2;
		b = _map[inMap_BottomX+1][inMap_BottomY]%2;
		c = _map[inMap_BottomX+1][inMap_BottomY+1]%2;
		d = _map[inMap_BottomX][inMap_BottomY+1]%2;
		if((a== b)&&(b==c)&&(c==d))
		{
			_map[inMap_BottomX][inMap_BottomY]+=2;
			_map[inMap_BottomX+1][inMap_BottomY]+=2;
			_map[inMap_BottomX+1][inMap_BottomY+1]+=2;
			_map[inMap_BottomX][inMap_BottomY+1] +=2;
		}
	}
	if (((inMap_BottomY-1)>= 0)&&((inMap_BottomX)<= (MAP_MAXX-2)))
	{
		int a,b,c,d;
		a = _map[inMap_BottomX][inMap_BottomY]%2;
		b = _map[inMap_BottomX+1][inMap_BottomY]%2;
		c = _map[inMap_BottomX+1][inMap_BottomY-1]%2;
		d = _map[inMap_BottomX][inMap_BottomY-1]%2;
		if((a== b)&&(b==c)&&(c==d))
		{
			_map[inMap_BottomX][inMap_BottomY]+=2;
			_map[inMap_BottomX+1][inMap_BottomY]+=2;
			_map[inMap_BottomX+1][inMap_BottomY-1]+=2;
			_map[inMap_BottomX][inMap_BottomY-1] +=2;
		}
	}
}

⌨️ 快捷键说明

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