正文

火焰效果(1)2006-09-19 20:49:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/18588.html

分享到:

昨天晚上,三本书,翻过来翻过去,写下了下面的程序(部分):

int CMyFlashDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CDialog::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 // TODO: Add your specialized creation code here
 CClientDC dc(this);
 CRect rect;
 GetClientRect(&rect);
 m_nWidth=rect.Width();
 m_nHeight=rect.Height();
 m_mbm1.CreateCompatibleBitmap(&dc,m_nWidth/3,m_nHeight/3);
 m_mbm2.CreateCompatibleBitmap(&dc,m_nWidth/3,m_nHeight/3);
 m_mdc1.CreateCompatibleDC(&dc);
 m_mdc2.CreateCompatibleDC(&dc);
 m_mdc1.SelectObject(m_mbm1);
 m_mdc2.SelectObject(m_mbm2);

 SetTimer(IDT_MAIN_TIMER,30,NULL);
 
 return 0;
}

void CMyFlashDlg::myfire()
{
 CClientDC dc(this);
 int sw=m_nWidth/3,sh=m_nHeight/3;
 for(int y=1;y<sh;++y)
  for(int x=1;x<sw;++x)
  {
   COLORREF p=0;
   p=(m_mdc1.GetPixel(x,y)+m_mdc1.GetPixel(x-1,y)+m_mdc1.GetPixel(x+1,y)
      +m_mdc1.GetPixel(x,y-1)+m_mdc1.GetPixel(x,y+1))/5;
   p-=3;
   if(p<0)
    p=0;
   m_mdc2.SetPixel(x,y-1,p);
  }
 m_mdc1.BitBlt(0,0,m_nWidth,m_nHeight,&m_mdc2,0,0,SRCCOPY);
}

void CMyFlashDlg::myrand()
{
 int sw=m_nWidth/3,sh=m_nHeight/3;
 int t=0;
 for(int x=1;x<sw;++x)
 {
  COLORREF rcolor;
  if(!t)
  {
   //rcolor=RGB(255,0,0);
   rcolor=RGB(128+(rand() & 0x7F),0,0);
   t=4;
  }
  m_mdc1.SetPixel(x,sh-1,rcolor);
  --t;
 }
}

void CMyFlashDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
  CClientDC dc(this);
  //dc.BitBlt(0,0,m_nWidth,m_nHeight,&m_mdc1,0,0,SRCCOPY);
  dc.StretchBlt(0,0,m_nWidth,m_nHeight,&m_mdc1,0,0,m_nWidth/3,m_nHeight/3,SRCCOPY);
 }
}

void CMyFlashDlg::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 if(nIDEvent==IDT_MAIN_TIMER)
 {
  myrand();
  myfire();
  Invalidate(FALSE);
 }
 
 CDialog::OnTimer(nIDEvent);
}

发现效果不好,这是图:

一开始,生成热源的时候,全是设成RGB(255,0,0),结果出来不像是火,顶多就像液化气灶的火(- -!),后来随机化了一下,myrand()用于随机化热源,从底部看还有那么点意思,火焰上部分不太像,匀速往上飘,真实的火焰应该是在上面有气流的对撞,应该有更大的随机化,而且从底往上气流上升速度也不是匀速,应该是开始快然后慢。

其实最大的问题不在这里,而是显示得太慢了,我用了两个内存DC缓冲,很慢,只能开一个很小的窗口,不知怎么解决:(

阅读(6488) | 评论(5)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册