計算機圖形學——雙緩衝
阿新 • • 發佈:2018-12-13
客戶區中間繪製20個巢狀正方形,以步長dx,dy移動,進行碰撞檢測,如果最大的正方形觸到某個邊界,就反方向運動,直接繪製和用雙緩衝區實現,並觀察不同
全域性變數:
int x0=200,x1=500;
int y0=200,y1=500;
int x2=200,x3=500;
int y2=800,y3=800;
int xMax=0; //最大矩形x座標
int flag=1; //0:左,1:右
void CHomeWork3View::OnDraw(CDC* pDC) { CHomeWork3Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPoint ptCenter; CRect rect; GetClientRect(&rect); //獲得視窗客戶區的大小 ptCenter = rect.CenterPoint(); //獲得矩形的中心點,目的是為了確定後面同心圓影象的圓心 CDC menDC; // 宣告記憶體DC CBitmap NewBitmapmp; // 建立記憶體中存放臨時影象的點陣圖物件bmp menDC.CreateCompatibleDC(pDC); // 依附視窗DC(視窗物件為pDC),建立相容記憶體DC(就是建立一個記憶體DC,所有圖形先畫在這上面) NewBitmapmp.CreateCompatibleBitmap(&menDC, rect.Width(), rect.Height());// 在相容記憶體DC上,建立相容點陣圖 menDC.SelectObject(&NewBitmapmp); // 將點陣圖選入記憶體DC menDC.FillSolidRect(rect, RGB(255,255,255));// 按照原有背景色填充客戶區,否則會成為黑色,同時也使記憶體DC的背景色保持一致 // 繪圖操作 int i;//正方形的數量 int speed=7;//移動速度 for(i=0;i<20;i++) { CRect rect(x0+i*speed,y0+i*speed,x1-i*speed,y1-i*speed); menDC.Rectangle(&rect); CRect rect1(x2+i*speed,y2+i*speed,x3-i*speed,y3-i*speed); menDC.Rectangle(&rect1); if(i==19) { xMax=x1-i*speed; } } pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &menDC, 0, 0, SRCCOPY); // 將記憶體DC上的影象複製到前臺pDC,即實際螢幕物件pDC menDC.DeleteDC(); // 刪除記憶體DC NewBitmapmp.DeleteObject(); // 刪除記憶體點陣圖 SetTimer(1, 10, NULL); }
新增OnTime()函式 void CHomeWork3View::OnTimer(UINT nIDEvent) { //獲取客戶區視窗大小 CRect rt; GetClientRect(&rt); //判斷移動方向 if(flag) //flag=1 向右移動 { x0+=5; x1+=5; x2+=5; x3+=5; } else //flag=0 向左移動 { x0-=5; x1-=5; x2-=5; x3-=5; } if(x0<=0) { flag=1; } if(xMax>=rt.Width()-200) { flag=0; } //重新整理客戶區 Invalidate(); CView::OnTimer(nIDEvent); }