我编写的
原教程图
原图是视频的例子没有图像重在一起,2图是我按照视频里写的代码,为什么我的就会出现这样的图情况,上次画的图像和第二次画的重在一起没有擦除.下面是代码
void CTetrisView::OnFileNew()
{
// TODO: 在此添加命令处理程序代码
SetTimer(1,500,0);
PreBlock();
}
void CTetrisView::PreBlock(void)//创建方块
{
int i;
i=rand()%7;
PreStyle=i+2;
switch(i)
{
case 0:
PrePosi[0].x=5;//□
PrePosi[1].x=5;//□
PrePosi[2].x=5;//□
PrePosi[3].x=5;//□
PrePosi[0].y=0;
PrePosi[1].y=1;
PrePosi[2].y=2;
PrePosi[3].y=3;
break;
case 1:
PrePosi[0].x=5;//□□
PrePosi[1].x=5;//□
PrePosi[2].x=6;//□
PrePosi[3].x=5;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=0;
PrePosi[3].y=2;
break;
case 2:
PrePosi[0].x=6;//□□
PrePosi[1].x=5;// □
PrePosi[2].x=6;// □
PrePosi[3].x=6;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=0;
PrePosi[3].y=2;
break;
case 3:
PrePosi[0].x=5;//□
PrePosi[1].x=5;//□□
PrePosi[2].x=6;//□
PrePosi[3].x=5;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=1;
PrePosi[3].y=2;
break;
case 4:
PrePosi[0].x=5;// □
PrePosi[1].x=5;//□□
PrePosi[2].x=6;//□
PrePosi[3].x=6;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=1;
PrePosi[3].y=2;
break;
case 5:
PrePosi[0].x=5;//□
PrePosi[1].x=6;//□□
PrePosi[2].x=4;// □
PrePosi[3].x=5;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=1;
PrePosi[3].y=2;
break;
case 6:
PrePosi[0].x=5;//□□
PrePosi[1].x=5;//□□
PrePosi[2].x=6;
PrePosi[3].x=6;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=0;
PrePosi[3].y=1;
break;
}
DrawPreBlock();
}
void CTetrisView::DrawPreBlock(void)
{
if(PreStyle)
{
CDC *pDC;
pDC=GetDC();
CDC memDC;
CRect rcBlock;//构造一个矩形区域
rcBlock.SetRect(250,40,2*32+250,4*32+40);
pDC->FillSolidRect(&rcBlock,RGB(255,255,255));//使用白色来填充区域
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(bitmap[PreStyle-1]);
for(int i=0;i<4;i++)
{
pDC->BitBlt((PrePosi[i].x-2)*32+400,PrePosi[i].y*32+50,32,32,&memDC,0,0,SRCCOPY);
}
memDC.DeleteDC();
pDC->DeleteDC();
}
}
void CTetrisView::NewBlock(void)
{
for(int i=0;i<4;i++)
posi[i]=PrePosi[i];//把提示的方块坐标赋值给显示
style=PreStyle;//同样把类型也赋值过显示
PreBlock();//重新产生新的方块
}
void CTetrisView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
NewBlock();
CView::OnTimer(nIDEvent);
}