- // CDemoGameDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "CDemoGame.h"
- #include "CDemoGameDlg.h"
- #include
- //#include "time.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CCDemoGameDlg dialog
- CCDemoGameDlg::CCDemoGameDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CCDemoGameDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CCDemoGameDlg)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void CCDemoGameDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CCDemoGameDlg)
- // NOTE: the ClassWizard will add DDX and DDV calls here
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CCDemoGameDlg, CDialog)
- //{{AFX_MSG_MAP(CCDemoGameDlg)
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_WM_ERASEBKGND()
- ON_WM_TIMER()
- ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CCDemoGameDlg message handlers
- BOOL CCDemoGameDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
-
- // TODO: Add extra initialization here
- CBitmap bmBack,bmBackScrol,bmDesk,bmSprite,bmDraw,bmSpriteMask;
- bmDesk.LoadBitmap(IDB_BACK);
- bmBack.LoadBitmap(IDB_BACKSCROL);
- bmSprite.LoadBitmap(IDB_SPRITE);
- bmSpriteMask.LoadBitmap(IDB_SPRITEMASK);
- CClientDC dc(this);
- m_dcSpriteMask.CreateCompatibleDC(&dc);
- m_dcDraw.CreateCompatibleDC(&dc);
- m_dcBack.CreateCompatibleDC(&dc);
- m_dcDesk.CreateCompatibleDC(&dc);
- m_dcBackScrol.CreateCompatibleDC(&dc);
- m_dcSprite.CreateCompatibleDC(&dc);
- bmBackScrol.CreateCompatibleBitmap(&dc,512,384);
- bmDraw.CreateCompatibleBitmap(&dc,420,356);
- m_dcDesk.SelectObject(&bmDesk);
- m_dcBack.SelectObject(&bmBack);
- m_dcBackScrol.SelectObject(&bmBackScrol);
- m_dcSprite.SelectObject(&bmSprite);
- m_dcDraw.SelectObject(&bmDraw);
- m_dcSpriteMask.SelectObject(&bmSpriteMask);
- for(int j=0;j<3;j++)
- for(int i=0;i<4;i++)
- m_dcBackScrol.BitBlt(i*128,j*128,i*128+128,j*128+128,&m_dcBack,0,0,SRCCOPY);
- // m_dcBackScrol.TextOut(100,100,"kao");
- CRect rt1,rt2;
- GetWindowRect(&rt1);
- GetClientRect(&rt2);
- int cx=rt1.right-rt1.left-(rt2.right-rt2.left);
- int cy=rt1.bottom-rt1.top-(rt2.bottom-rt2.top);
- MoveWindow(0,0,468+cx,436+cy);
- CenterWindow();
-
- bmBack.DeleteObject();
- bmDesk.DeleteObject();
- bmBackScrol.DeleteObject();
- srand(time(NULL));
- ReStart();
- return TRUE; // return TRUE unless you set the focus to a control
- }
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
- void CCDemoGameDlg::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(22,62,440-22,416-62,&m_dcDraw,0,1,SRCCOPY);
- dc.BitBlt(22,30,96,16,&m_dcSprite,384,16*m_nLive,SRCCOPY);
- CString str;
- str.Format("%04d",m_nScor);
- for( int i=0;i<4;i++ )
- dc.BitBlt(380-(3-i)*32,15,32,32,&m_dcSprite,480,(str.GetAt(i)-'0')*32,SRCCOPY);
-
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR CCDemoGameDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- BOOL CCDemoGameDlg::OnEraseBkgnd(CDC* pDC)
- {
- // TODO: Add your message handler code here and/or call default
- pDC->BitBlt(0,0,634,436,&m_dcDesk,0,0,SRCCOPY);
- return TRUE;//CDialog::OnEraseBkgnd(pDC);
- }
- void CCDemoGameDlg::OnTimer(UINT nIDEvent)
- {
- // TODO: Add your message handler code here and/or call default
- if(nIDEvent==1)
- {
- UpdateFrame();
- }
- CDialog::OnTimer(nIDEvent);
- }
- BOOL CCDemoGameDlg::PreTranslateMessage(MSG* pMsg)
- {
- // TODO: Add your specialized code here and/or call the base class
- if(pMsg->message==WM_KEYDOWN)
- {
- int key=(int) pMsg->wParam;
- if(key==VK_LEFT)
- m_bKeyLeft=TRUE;
- if(key==VK_RIGHT)
- m_bKeyRight=TRUE;
- }
- if(pMsg->message==WM_KEYUP)
- {
- int key=(int) pMsg->wParam;
- if(key==VK_LEFT)
- m_bKeyLeft=FALSE;
- if(key==VK_RIGHT)
- m_bKeyRight=FALSE;
- }
- return CDialog::PreTranslateMessage(pMsg);
- }
- int CCDemoGameDlg::GetUINT(int num)
- {
- return num>0?num:-num;
- }
- void CCDemoGameDlg::ReStart()
- {
- m_scrolY=m_bianY=0;
- for(int k=0;k<8;k++)
- {
- m_ban[k].x=(rand()%74)*4+16;
- m_ban[k].y=k*50;
- m_ban[k].type=rand()%6;
- m_ban[k].step=0;
- // if(m_ban[k].type==4)
- // m_ban[k].step=4;
- m_ban[k].start=FALSE;
- }
- m_ban[3].x=35*4+16;
- m_ban[3].y=3*50;
- m_ban[3].type=0;
- m_bKeyLeft=m_bKeyRight=FALSE;
- m_Men.bTaban=FALSE;
- m_Men.x=35*4+16+48;
- m_Men.y=100;
- m_Men.step=0;
- m_Men.inNum=0;
- m_Men.bTanhang=FALSE;
- m_Men.inc=0;
- m_nLive=12;
- m_nScor=0;
- m_nScrollBan=0;
- m_nScorStep=0;
- Invalidate();
- SetTimer(1,1,NULL);
- }
- void CCDemoGameDlg::OnButton1()
- {
- ReStart();
- }
- void CCDemoGameDlg::PlayMySound(UINT srcID)
- {
- HRSRC hRsrc = FindResource( AfxGetResourceHandle(),
- MAKEINTRESOURCE( srcID ), "WAVE" );
- HGLOBAL hglb = LoadResource( AfxGetResourceHandle(), hRsrc );
- ::sndPlaySound( ( LPCTSTR )::LockResource( hglb ),SND_MEMORY|SND_ASYNC|SND_NODEFAULT);
- FreeResource( hglb);
- }
- void CCDemoGameDlg::UpdateFrame()
- {
- static long step=1;
- step++;
- if( step>1000000000 )step=1;
-
- CClientDC dc(this);
- if(step%4==0)
- m_scrolY+=1;
- m_dcDraw.BitBlt(0,0,420,356,&m_dcBackScrol,0,m_scrolY,SRCCOPY);
- if(m_scrolY>30)
- m_dcDraw.BitBlt(0,356-m_scrolY+30,420,m_scrolY-30,&m_dcBackScrol,0,0,SRCCOPY);
- int i;
- if(step%1==0)
- {
- m_bianY+=1;
- for(i=0;i<8;i++)
- {
- m_ban[i].y-=1;
- if(m_ban[i].y<-16)
- {
- m_ban[i].x=(rand()%74)*4+16;
- m_ban[i].y=8*50;
- m_ban[i].type=rand()%6;
- m_ban[i].step=0;
- m_ban[i].start=FALSE;
- m_nScrollBan++;
- if( m_nScrollBan>7 )
- {
- m_nScorStep=16;
- m_nScrollBan=0;
- m_nScor++;
- }
- }
- }
- }
- for(i=0;i<8;i++)
- {
- switch(m_ban[i].type)
- {
- case 0://muban
- m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y,96,16,&m_dcSprite,288,0,SRCCOPY);
- break;
- case 1://
- if(step%4==0)
- m_ban[i].step=m_ban[i].step>3?0:m_ban[i].step+1;
- m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y,96,16,&m_dcSprite,288,m_ban[i].step*16+16,SRCCOPY);
- break;
- case 2:
- if(step%4==0)
- m_ban[i].step=m_ban[i].step==3?0:m_ban[i].step+1;
- m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y,96,16,&m_dcSprite,288,m_ban[i].step*16+80,SRCCOPY);
- break;
- case 3:
- if(step%10==0 && m_ban[i].start)
- {
- if(m_ban[i].step<5)m_ban[i].step++;
- else
- {
- m_ban[i].step=0;
- m_ban[i].start=FALSE;
- }
- }
- m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-10,96,36,&m_dcSpriteMask,288,m_ban[i].step*36,SRCAND);
- m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-10,96,36,&m_dcSprite,288,144+m_ban[i].step*36,SRCPAINT);
- break;
- case 4:
- if(step%2==0 && m_ban[i].start)
- {
- if(m_ban[i].step<11)m_ban[i].step++;
- else
- {
- m_ban[i].step=0;
- m_ban[i].start=FALSE;
- }
- }
- 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);
- break;
- case 5:
- m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-16,96,32,&m_dcSpriteMask,0,160,SRCAND);
- m_dcDraw.BitBlt(m_ban[i].x,m_ban[i].y-16,96,32,&m_dcSprite,384,368,SRCPAINT);
- break;
- }
- }
- m_dcDraw.BitBlt(0,0,16,356,&m_dcSprite,512,m_bianY,SRCCOPY);
- m_dcDraw.BitBlt(420-16,0,16,356,&m_dcSprite,512,m_bianY,SRCCOPY);
- if(m_bianY>30)
- {
- m_dcDraw.BitBlt(0,356-m_bianY+30,16,m_bianY-30,&m_dcSprite,512,0,SRCCOPY);
- m_dcDraw.BitBlt(420-16,356-m_bianY+30,16,m_bianY-30,&m_dcSprite,512,0,SRCCOPY);
- }
- ////draw the spritemen
- if(m_Men.bTaban==0)
- {
- if(step%5==0)
- {
- m_Men.step++;
- if(m_Men.step==4)
- m_Men.step=0;
- }
- if(m_bKeyLeft)
- {
- if(m_Men.x>16)m_Men.x-=2;
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,64,SRCAND);
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,64,SRCPAINT);
- }
- else if(m_bKeyRight)
- {
- if(m_Men.x<420-16-32)m_Men.x+=2;
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,128,SRCAND);
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,128,SRCPAINT);
- }
- else
- {
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,96,SRCAND);
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,96,SRCPAINT);
- }
- if(m_Men.bTanhang)
- {
- m_Men.y-=3;
- if(m_Men.y<8)
- {
- m_nLive-=4;
- m_Men.y+=5;
- m_Men.bTaban=FALSE;
- PlayMySound(IDR_MUCHI);
- }
- m_Men.inc++;
- if(m_Men.inc>=23)
- {
- m_Men.inc=0;
- m_Men.bTanhang=FALSE;
- }
- }
- else
- m_Men.y+=2;
-
- if(m_Men.y>360) //Game Over
- {
- KillTimer(1);
- PlayMySound(IDR_OVER);
- AfxMessageBox("You Are Dead!!!");
- }
- for(i=0;i<8;i++)
- if(GetUINT(m_Men.y-m_ban[i].y+32)<2 &&
- (((m_Men.x>m_ban[i].x) && (m_Men.x
- ((m_Men.x+26>m_ban[i].x) && (m_Men.x+26
- {
- m_Men.bTaban=TRUE;
- m_Men.inNum=i;
- m_Men.y=m_ban[i].y-32;
- if(m_ban[m_Men.inNum].type==5)
- m_nLive-=4;
- else
- m_nLive=m_nLive<12?m_nLive+1:12;
- switch(m_ban[m_Men.inNum].type)
- {
- case 0:
- PlayMySound(IDR_MUBAN);
- break;
- case 1:
- case 2:
- PlayMySound(IDR_GUNTIAO);
- break;
- case 3:
- PlayMySound(IDR_FANBAN);
- break;
- case 4:
- PlayMySound(IDR_TANHUANG);
- break;
- case 5:
- PlayMySound(IDR_MUCHI);
- break;
- }
- break;
- }
-
- }
- else
- {
- if(step%5==0)
- {
- m_Men.step++;
- if(m_Men.step==4)
- m_Men.step=0;
- }
- if(m_ban[m_Men.inNum].type==2 && step%2==0 )
- {
- if(m_Men.x>16)m_Men.x--;
- if(m_Men.x+30
- }
- if(m_ban[m_Men.inNum].type==1 && step%2==0 )
- {
- if(m_Men.x<420-16-32)m_Men.x++;
- if(m_Men.x>m_ban[m_Men.inNum].x+90)m_Men.bTaban=FALSE;
- }
- if(m_ban[m_Men.inNum].type==3 && step%30==0 )
- {
- m_Men.y+=1;
- m_ban[m_Men.inNum].start=TRUE;
- m_Men.bTaban=FALSE;
-
- }
- if(m_ban[m_Men.inNum].type==4)
- {
- m_ban[m_Men.inNum].start=TRUE;
- m_Men.bTaban=FALSE;
- m_Men.bTanhang=TRUE;
- }
- if(m_bKeyLeft)
- {
- if(m_Men.x>16)m_Men.x-=2;
- if(m_Men.x+30
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,0,SRCAND);
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,0,SRCPAINT);
- }
- else if(m_bKeyRight)
- {
- if(m_Men.x<420-16-32)m_Men.x+=2;
- if(m_Men.x>m_ban[m_Men.inNum].x+90)m_Men.bTaban=FALSE;
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,m_Men.step*32,32,SRCAND);
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,m_Men.step*32,32,SRCPAINT);
- }
- else
- {
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSpriteMask,8*32,0,SRCAND);
- m_dcDraw.BitBlt(m_Men.x,m_Men.y,32,32,&m_dcSprite,8*32,0,SRCPAINT);
- }
- if(step%1==0)
- m_Men.y--;
- if(m_Men.y<8)
- {
- PlayMySound(IDR_MUCHI);
- m_nLive-=4;
- m_Men.y+=2;
- m_Men.bTaban=FALSE;
- }
- }
- m_dcDraw.BitBlt(18,0,420-36,16,&m_dcSpriteMask,0,216,SRCAND);
- m_dcDraw.BitBlt(18,0,420-36,16,&m_dcSprite,0,368,SRCPAINT);
- dc.BitBlt(22,62,440-22,416-62,&m_dcDraw,0,1,SRCCOPY);
- dc.BitBlt(22,30,96,16,&m_dcSprite,384,16*m_nLive,SRCCOPY);
- if(m_scrolY>384)m_scrolY=0;
- if(m_bianY>384)m_bianY=0;
- if(m_nLive<=0)
- {
- KillTimer(1);
- PlayMySound(IDR_OVER);
- AfxMessageBox("You Are Dead!!!");
- }
-
- //drawScor
- if( m_nScorStep && step%4==0 )
- {
- m_nScorStep--;
- DrawScor(0,m_nScor,&dc);
- }
- }
- void CCDemoGameDlg::DrawScor(int pos, int scor,CDC *pDC)
- {
- int k1,k2;
- k1=scor-int(scor/10)*10;
- k2=k1==0?9:k1-1;
- pDC->BitBlt(380-pos*32,15,32,m_nScorStep*2,&m_dcSprite,480,32*k2+(16-m_nScorStep)*2,SRCCOPY);
- pDC->BitBlt(380-pos*32,15+m_nScorStep*2,32,(16-m_nScorStep)*2,&m_dcSprite,480,32*k1,SRCCOPY);
- if( k1==0 )
- DrawScor(pos+1,scor/10,pDC);
- }
|