Download
  Python New code
  1. // CDemoGameDlg.cpp : implementation file
  2. //

  3. #include "stdafx.h"
  4. #include "CDemoGame.h"
  5. #include "CDemoGameDlg.h"
  6. #include
  7. //#include "time.h"

  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif



  13. /////////////////////////////////////////////////////////////////////////////
  14. // CCDemoGameDlg dialog

  15. CCDemoGameDlg::CCDemoGameDlg(CWnd* pParent /*=NULL*/)
  16.     : CDialog(CCDemoGameDlg::IDD, pParent)
  17. {
  18.     //{{AFX_DATA_INIT(CCDemoGameDlg)
  19.         // NOTE: the ClassWizard will add member initialization here
  20.     //}}AFX_DATA_INIT
  21.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  22.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  23. }

  24. void CCDemoGameDlg::DoDataExchange(CDataExchange* pDX)
  25. {
  26.     CDialog::DoDataExchange(pDX);
  27.     //{{AFX_DATA_MAP(CCDemoGameDlg)
  28.         // NOTE: the ClassWizard will add DDX and DDV calls here
  29.     //}}AFX_DATA_MAP
  30. }

  31. BEGIN_MESSAGE_MAP(CCDemoGameDlg, CDialog)
  32.     //{{AFX_MSG_MAP(CCDemoGameDlg)
  33.     ON_WM_PAINT()
  34.     ON_WM_QUERYDRAGICON()
  35.     ON_WM_ERASEBKGND()
  36.     ON_WM_TIMER()
  37.     ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  38.     //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()

  40. /////////////////////////////////////////////////////////////////////////////
  41. // CCDemoGameDlg message handlers

  42. BOOL CCDemoGameDlg::OnInitDialog()
  43. {
  44.     CDialog::OnInitDialog();

  45.     // Set the icon for this dialog. The framework does this automatically
  46.     // when the application's main window is not a dialog
  47.     SetIcon(m_hIcon, TRUE);            // Set big icon
  48.     SetIcon(m_hIcon, FALSE);        // Set small icon
  49.     
  50.     // TODO: Add extra initialization here
  51.     CBitmap bmBack,bmBackScrol,bmDesk,bmSprite,bmDraw,bmSpriteMask;
  52.     bmDesk.LoadBitmap(IDB_BACK);
  53.     bmBack.LoadBitmap(IDB_BACKSCROL);
  54.     bmSprite.LoadBitmap(IDB_SPRITE);
  55.     bmSpriteMask.LoadBitmap(IDB_SPRITEMASK);

  56.     CClientDC dc(this);
  57.     m_dcSpriteMask.CreateCompatibleDC(&dc);
  58.     m_dcDraw.CreateCompatibleDC(&dc);
  59.     m_dcBack.CreateCompatibleDC(&dc);
  60.     m_dcDesk.CreateCompatibleDC(&dc);
  61.     m_dcBackScrol.CreateCompatibleDC(&dc);
  62.     m_dcSprite.CreateCompatibleDC(&dc);
  63.     bmBackScrol.CreateCompatibleBitmap(&dc,512,384);
  64.     bmDraw.CreateCompatibleBitmap(&dc,420,356);
  65.     m_dcDesk.SelectObject(&bmDesk);
  66.     m_dcBack.SelectObject(&bmBack);
  67.     m_dcBackScrol.SelectObject(&bmBackScrol);
  68.     m_dcSprite.SelectObject(&bmSprite);
  69.     m_dcDraw.SelectObject(&bmDraw);
  70.     m_dcSpriteMask.SelectObject(&bmSpriteMask);


  71.     for(int j=0;j<3;j++)
  72.         for(int i=0;i<4;i++)
  73.             m_dcBackScrol.BitBlt(i*128,j*128,i*128+128,j*128+128,&m_dcBack,0,0,SRCCOPY);
  74.  // m_dcBackScrol.TextOut(100,100,"kao");
  75.     CRect rt1,rt2;
  76.     GetWindowRect(&rt1);
  77.     GetClientRect(&rt2);
  78.     int cx=rt1.right-rt1.left-(rt2.right-rt2.left);
  79.     int cy=rt1.bottom-rt1.top-(rt2.bottom-rt2.top);
  80.     MoveWindow(0,0,468+cx,436+cy);
  81.     CenterWindow();
  82.     
  83.     bmBack.DeleteObject();
  84.     bmDesk.DeleteObject();
  85.     bmBackScrol.DeleteObject();
  86.     srand(time(NULL));

  87.     ReStart();
  88.     return TRUE; // return TRUE unless you set the focus to a control
  89. }

  90. // If you add a minimize button to your dialog, you will need the code below
  91. // to draw the icon. For MFC applications using the document/view model,
  92. // this is automatically done for you by the framework.

  93. void CCDemoGameDlg::OnPaint()
  94. {
  95.     if (IsIconic())
  96.     {
  97.         CPaintDC dc(this); // device context for painting

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

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

  106.         // Draw the icon
  107.         dc.DrawIcon(x, y, m_hIcon);
  108.     }
  109.     else
  110.     {
  111.         CDialog::OnPaint();
  112.         CClientDC dc(this);
  113.         dc.BitBlt(22,62,440-22,416-62,&m_dcDraw,0,1,SRCCOPY);
  114.         dc.BitBlt(22,30,96,16,&m_dcSprite,384,16*m_nLive,SRCCOPY);
  115.         CString str;
  116.         str.Format("%04d",m_nScor);
  117.         for( int i=0;i<4;i++ )
  118.             dc.BitBlt(380-(3-i)*32,15,32,32,&m_dcSprite,480,(str.GetAt(i)-'0')*32,SRCCOPY);


  119.         
  120.     }
  121. }

  122. // The system calls this to obtain the cursor to display while the user drags
  123. // the minimized window.
  124. HCURSOR CCDemoGameDlg::OnQueryDragIcon()
  125. {
  126.     return (HCURSOR) m_hIcon;
  127. }

  128. BOOL CCDemoGameDlg::OnEraseBkgnd(CDC* pDC)
  129. {
  130.     // TODO: Add your message handler code here and/or call default
  131.     pDC->BitBlt(0,0,634,436,&m_dcDesk,0,0,SRCCOPY);
  132.     return TRUE;//CDialog::OnEraseBkgnd(pDC);
  133. }

  134. void CCDemoGameDlg::OnTimer(UINT nIDEvent)
  135. {
  136.     // TODO: Add your message handler code here and/or call default
  137.     if(nIDEvent==1)
  138.     {

  139.         UpdateFrame();
  140.     }

  141.     CDialog::OnTimer(nIDEvent);
  142. }









  143. BOOL CCDemoGameDlg::PreTranslateMessage(MSG* pMsg)
  144. {
  145.     // TODO: Add your specialized code here and/or call the base class
  146.     if(pMsg->message==WM_KEYDOWN)
  147.     {
  148.         int key=(int) pMsg->wParam;
  149.         if(key==VK_LEFT)
  150.             m_bKeyLeft=TRUE;
  151.         if(key==VK_RIGHT)
  152.             m_bKeyRight=TRUE;
  153.     }
  154.     if(pMsg->message==WM_KEYUP)
  155.     {
  156.         int key=(int) pMsg->wParam;
  157.         if(key==VK_LEFT)
  158.             m_bKeyLeft=FALSE;
  159.         if(key==VK_RIGHT)
  160.             m_bKeyRight=FALSE;
  161.     }
  162.     return CDialog::PreTranslateMessage(pMsg);
  163. }


  164. int CCDemoGameDlg::GetUINT(int num)
  165. {

  166.     return num>0?num:-num;
  167. }

  168. void CCDemoGameDlg::ReStart()
  169. {
  170.     m_scrolY=m_bianY=0;

  171.     for(int k=0;k<8;k++)
  172.     {
  173.         m_ban[k].x=(rand()%74)*4+16;
  174.         m_ban[k].y=k*50;
  175.         m_ban[k].type=rand()%6;
  176.         m_ban[k].step=0;
  177. //        if(m_ban[k].type==4)
  178. //            m_ban[k].step=4;
  179.         m_ban[k].start=FALSE;
  180.     }
  181.     m_ban[3].x=35*4+16;
  182.     m_ban[3].y=3*50;
  183.     m_ban[3].type=0;

  184.     m_bKeyLeft=m_bKeyRight=FALSE;

  185.     m_Men.bTaban=FALSE;
  186.     m_Men.x=35*4+16+48;
  187.     m_Men.y=100;
  188.     m_Men.step=0;
  189.     m_Men.inNum=0;
  190.     m_Men.bTanhang=FALSE;
  191.     m_Men.inc=0;

  192.     m_nLive=12;
  193.     m_nScor=0;
  194.     m_nScrollBan=0;
  195.     m_nScorStep=0;

  196.     Invalidate();
  197.     SetTimer(1,1,NULL);
  198. }

  199. void CCDemoGameDlg::OnButton1()
  200. {

  201.     ReStart();
  202. }


  203. void CCDemoGameDlg::PlayMySound(UINT srcID)
  204. {
  205.     HRSRC hRsrc = FindResource( AfxGetResourceHandle(),
  206.     MAKEINTRESOURCE( srcID ), "WAVE" );
  207.     HGLOBAL hglb = LoadResource( AfxGetResourceHandle(), hRsrc );
  208.     ::sndPlaySound( ( LPCTSTR )::LockResource( hglb ),SND_MEMORY|SND_ASYNC|SND_NODEFAULT);
  209.     FreeResource( hglb);


  210. }

  211. void CCDemoGameDlg::UpdateFrame()
  212. {
  213.         static long step=1;
  214.         step++;
  215.         if( step>1000000000 )step=1;
  216.         
  217.         CClientDC dc(this);
  218.         if(step%4==0)
  219.             m_scrolY+=1;
  220.         m_dcDraw.BitBlt(0,0,420,356,&m_dcBackScrol,0,m_scrolY,SRCCOPY);
  221.         if(m_scrolY>30)
  222.             m_dcDraw.BitBlt(0,356-m_scrolY+30,420,m_scrolY-30,&m_dcBackScrol,0,0,SRCCOPY);
  223.         int i;
  224.         if(step%1==0)
  225.         {
  226.             m_bianY+=1;
  227.             for(i=0;i<8;i++)
  228.             {
  229.                 m_ban[i].y-=1;
  230.                 if(m_ban[i].y<-16)
  231.                 {
  232.                     m_ban[i].x=(rand()%74)*4+16;
  233.                     m_ban[i].y=8*50;
  234.                     m_ban[i].type=rand()%6;
  235.                     m_ban[i].step=0;
  236.                     m_ban[i].start=FALSE;
  237.                     m_nScrollBan++;
  238.                     if( m_nScrollBan>7 )
  239.                     {
  240.                         m_nScorStep=16;
  241.                         m_nScrollBan=0;
  242.                         m_nScor++;
  243.                     }

  244.                 }

  245.             }

  246.         }
  247.         for(i=0;i<8;i++)
  248.         {
  249.             switch(m_ban[i].type)
  250.             {
  251.                 case 0://muban
  252.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y,96,16,&m_dcSprite,288,0,SRCCOPY);
  253.                     break;
  254.                 case 1://
  255.                     if(step%4==0)
  256.                         m_ban[i].step=m_ban[i].step>3?0:m_ban[i].step+1;
  257.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y,96,16,&m_dcSprite,288,m_ban[i].step*16+16,SRCCOPY);
  258.                     break;
  259.                 case 2:
  260.                     if(step%4==0)
  261.                         m_ban[i].step=m_ban[i].step==3?0:m_ban[i].step+1;
  262.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y,96,16,&m_dcSprite,288,m_ban[i].step*16+80,SRCCOPY);
  263.                     break;
  264.                 case 3:
  265.                     if(step%10==0 && m_ban[i].start)
  266.                     {
  267.                         if(m_ban[i].step<5)m_ban[i].step++;
  268.                         else
  269.                         {
  270.                             m_ban[i].step=0;
  271.                             m_ban[i].start=FALSE;
  272.                         }
  273.                     }
  274.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-10,96,36,&m_dcSpriteMask,288,m_ban[i].step*36,SRCAND);
  275.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-10,96,36,&m_dcSprite,288,144+m_ban[i].step*36,SRCPAINT);
  276.                     break;
  277.                 case 4:
  278.                     if(step%2==0 && m_ban[i].start)
  279.                     {
  280.                         if(m_ban[i].step<11)m_ban[i].step++;
  281.                         else
  282.                         {
  283.                             m_ban[i].step=0;
  284.                             m_ban[i].start=FALSE;
  285.                         }
  286.                     }
  287.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y+THPower[m_ban[i].step]*2-8,96,24-THPower[m_ban[i].step]*2,&m_dcSprite,384,208+THPower[m_ban[i].step]*24,SRCCOPY);
  288.                     break;
  289.                 case 5:
  290.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-16,96,32,&m_dcSpriteMask,0,160,SRCAND);
  291.                     m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-16,96,32,&m_dcSprite,384,368,SRCPAINT);
  292.                     break;
  293.             }
  294.         }
  295.         m_dcDraw.BitBlt(0,0,16,356,&m_dcSprite,512,m_bianY,SRCCOPY);
  296.         m_dcDraw.BitBlt(420-16,0,16,356,&m_dcSprite,512,m_bianY,SRCCOPY);
  297.         if(m_bianY>30)
  298.         {
  299.             m_dcDraw.BitBlt(0,356-m_bianY+30,16,m_bianY-30,&m_dcSprite,512,0,SRCCOPY);
  300.             m_dcDraw.BitBlt(420-16,356-m_bianY+30,16,m_bianY-30,&m_dcSprite,512,0,SRCCOPY);
  301.         }

  302.         ////draw the spritemen
  303.         if(m_Men.bTaban==0)
  304.         {
  305.             if(step%5==0)
  306.             {
  307.                 m_Men.step++;
  308.                 if(m_Men.step==4)
  309.                     m_Men.step=0;
  310.             }
  311.             if(m_bKeyLeft)
  312.             {
  313.                 if(m_Men.x>16)m_Men.x-=2;
  314.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,64,SRCAND);
  315.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,64,SRCPAINT);

  316.             }
  317.             else if(m_bKeyRight)
  318.             {
  319.                 if(m_Men.x<420-16-32)m_Men.x+=2;
  320.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,128,SRCAND);
  321.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,128,SRCPAINT);

  322.             }
  323.             else
  324.             {
  325.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,96,SRCAND);
  326.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,96,SRCPAINT);

  327.             }
  328.             if(m_Men.bTanhang)
  329.             {
  330.                 m_Men.y-=3;
  331.                 if(m_Men.y<8)
  332.                 {
  333.                     m_nLive-=4;
  334.                     m_Men.y+=5;
  335.                     m_Men.bTaban=FALSE;
  336.                     PlayMySound(IDR_MUCHI);
  337.                 }
  338.                 m_Men.inc++;
  339.                 if(m_Men.inc>=23)
  340.                 {
  341.                     m_Men.inc=0;
  342.                     m_Men.bTanhang=FALSE;
  343.                 }
  344.             }
  345.             else
  346.             m_Men.y+=2;
  347.             
  348.             if(m_Men.y>360) //Game Over
  349.             {
  350.                 KillTimer(1);
  351.                 PlayMySound(IDR_OVER);
  352.                 AfxMessageBox("You Are Dead!!!");
  353.             }
  354.             for(i=0;i<8;i++)
  355.                 if(GetUINT(m_Men.y-m_ban[i].y+32)<2 &&
  356.                     (((m_Men.x>m_ban[i].x) && (m_Men.x
  357.                      ((m_Men.x+26>m_ban[i].x) && (m_Men.x+26
  358.                 {
  359.                     m_Men.bTaban=TRUE;
  360.                     m_Men.inNum=i;
  361.                     m_Men.y=m_ban[i].y-32;
  362.                     if(m_ban[m_Men.inNum].type==5)
  363.                         m_nLive-=4;
  364.                     else
  365.                         m_nLive=m_nLive<12?m_nLive+1:12;

  366.                     switch(m_ban[m_Men.inNum].type)
  367.                     {
  368.                     case 0:
  369.                         PlayMySound(IDR_MUBAN);
  370.                         break;
  371.                     case 1:
  372.                     case 2:
  373.                         PlayMySound(IDR_GUNTIAO);
  374.                         break;
  375.                     case 3:
  376.                         PlayMySound(IDR_FANBAN);
  377.                         break;
  378.                     case 4:
  379.                         PlayMySound(IDR_TANHUANG);
  380.                         break;
  381.                     case 5:
  382.                         PlayMySound(IDR_MUCHI);
  383.                         break;
  384.                     }
  385.                     break;
  386.                 }
  387.             
  388.         }

  389.         else
  390.         {
  391.             if(step%5==0)
  392.             {
  393.                 m_Men.step++;
  394.                 if(m_Men.step==4)
  395.                     m_Men.step=0;
  396.             }
  397.             if(m_ban[m_Men.inNum].type==2 && step%2==0 )
  398.             {
  399.                 if(m_Men.x>16)m_Men.x--;
  400.                 if(m_Men.x+30
  401.             }
  402.             if(m_ban[m_Men.inNum].type==1 && step%2==0 )
  403.             {
  404.                 if(m_Men.x<420-16-32)m_Men.x++;
  405.                 if(m_Men.x>m_ban[m_Men.inNum].x+90)m_Men.bTaban=FALSE;
  406.             }
  407.             if(m_ban[m_Men.inNum].type==3 && step%30==0 )
  408.             {
  409.                 m_Men.y+=1;
  410.                 m_ban[m_Men.inNum].start=TRUE;
  411.                 m_Men.bTaban=FALSE;
  412.                     
  413.             }            
  414.             if(m_ban[m_Men.inNum].type==4)
  415.             {
  416.                 m_ban[m_Men.inNum].start=TRUE;
  417.                 m_Men.bTaban=FALSE;
  418.                 m_Men.bTanhang=TRUE;
  419.             }
  420.             if(m_bKeyLeft)
  421.             {
  422.                 if(m_Men.x>16)m_Men.x-=2;
  423.                 if(m_Men.x+30
  424.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,0,SRCAND);
  425.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,0,SRCPAINT);

  426.             }
  427.             else if(m_bKeyRight)
  428.             {
  429.                 if(m_Men.x<420-16-32)m_Men.x+=2;
  430.                 if(m_Men.x>m_ban[m_Men.inNum].x+90)m_Men.bTaban=FALSE;
  431.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,32,SRCAND);
  432.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,32,SRCPAINT);

  433.             }
  434.             else
  435.             {
  436.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,8*32,0,SRCAND);
  437.                 m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,8*32,0,SRCPAINT);

  438.             }
  439.             if(step%1==0)
  440.                 m_Men.y--;
  441.             if(m_Men.y<8)
  442.             {
  443.                 PlayMySound(IDR_MUCHI);
  444.                 m_nLive-=4;
  445.                 m_Men.y+=2;
  446.                 m_Men.bTaban=FALSE;
  447.             }

  448.         }

  449.         m_dcDraw.BitBlt(18,0,420-36,16,&m_dcSpriteMask,0,216,SRCAND);
  450.         m_dcDraw.BitBlt(18,0,420-36,16,&m_dcSprite,0,368,SRCPAINT);

  451.         dc.BitBlt(22,62,440-22,416-62,&m_dcDraw,0,1,SRCCOPY);
  452.         dc.BitBlt(22,30,96,16,&m_dcSprite,384,16*m_nLive,SRCCOPY);

  453.         if(m_scrolY>384)m_scrolY=0;
  454.         if(m_bianY>384)m_bianY=0;
  455.         if(m_nLive<=0)
  456.         {
  457.             KillTimer(1);
  458.             PlayMySound(IDR_OVER);
  459.             AfxMessageBox("You Are Dead!!!");
  460.         }
  461.         
  462.         //drawScor
  463.         if( m_nScorStep && step%4==0 )
  464.         {
  465.             m_nScorStep--;
  466.             DrawScor(0,m_nScor,&dc);

  467.         }
  468. }

  469. void CCDemoGameDlg::DrawScor(int pos, int scor,CDC *pDC)
  470. {

  471.     int k1,k2;
  472.     k1=scor-int(scor/10)*10;
  473.     k2=k1==0?9:k1-1;
  474.     pDC->BitBlt(380-pos*32,15,32,m_nScorStep*2,&m_dcSprite,480,32*k2+(16-m_nScorStep)*2,SRCCOPY);
  475.     pDC->BitBlt(380-pos*32,15+m_nScorStep*2,32,(16-m_nScorStep)*2,&m_dcSprite,480,32*k1,SRCCOPY);
  476.     if( k1==0 )
  477.         DrawScor(pos+1,scor/10,pDC);



  478. }