Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 2 của 2
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Mô phỏng luồng trong lập trình MFC cho trò chơi hứng trứng?

    Mình đang làm 1 bài về game hứng trứng bằng MFC.Mình muốn tạo 2 luồng:1 luồng cho cái giỏ di chuyển ở dưới.1 luồng là các quả trứng rơi tự do từ trên xuống.Nhưng mình có lỗi ở chỗ sau khi cho gọi luồng các quả trứng thì cái ảnh bitmap(cái giỏ) ở luồng còn lại biến mất.Mình đã thử nhiều cách nhưng vẫn không được.Mong các bạn giúp mình
    Code của mình đây:
    Mã:
    #include "resource.h"
    #include <AFXWIN.H>
    #include <afxmt.h>
    #define IDM_THEARD	174
    #define IDM_EXIT	142
    UINT MyTheard(LPVOID pMain);
    UINT MyTheard1(LPVOID pMain);
    int MyID1=0;
    int MyID=0;
    int ttOntheard=0;
    class CMyApp:public CWinApp
    
    {
    public:
    	BOOL InitInstance();
    };
    int x=700;
    int y=530;
    class CMyWin:public CFrameWnd
    {
    public:
    	CSemaphore sema;
    	afx_msg void OnPaint();
    	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    	CMyWin();
    	void OnTheard();
    	void OnExit();
    	DECLARE_MESSAGE_MAP()
    };
    CMyApp theApp;
    BEGIN_MESSAGE_MAP(CMyWin,CFrameWnd)
    ON_COMMAND(IDM_THEARD,OnTheard)
    ON_WM_KEYDOWN()
    ON_WM_PAINT()
    ON_COMMAND(IDM_EXIT,OnExit)
    END_MESSAGE_MAP()
    BOOL CMyApp::InitInstance()
    {
    	m_pMainWnd=new CMyWin;
    	m_pMainWnd->ShowWindow(3);
    	m_pMainWnd->UpdateWindow();
    	return TRUE;
    }
    CMyWin::CMyWin()
    {
    	Create(NULL,"Game Hung Trung_Ho Hoang Minh Lop 08B1");
    	CMenu m;
    	m.CreateMenu();
    	m.AppendMenu(MF_STRING|MF_BYCOMMAND,IDM_THEARD,"Start");
    	m.AppendMenu(MF_STRING|MF_BYCOMMAND,IDM_EXIT,"Exit");
    	SetMenu(&m);
    }
    void CMyWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	int k=nChar;
    	CDC d,*dc=GetDC();
    	CBitmap bm;
    	bm.LoadBitmap(IDB_BITMAP1);
    	d.CreateCompatibleDC(dc);
    	d.SelectObject(&bm);
    	dc->BitBlt(x,y,250,250,&d,0,0,SRCCOPY);
    	
    	
    	
    	
    	switch(k)
    	{
    	case 39:
    		
    		
    		Invalidate(true);
    		
    		UpdateWindow();
    		x=x+20;		
    		dc->BitBlt(x,y,250,250,&d,0,0,SRCCOPY);
    		
    		
    		break;
    		
    	case 37:
    		
    		
    		Invalidate(true);
    		UpdateWindow();
    		x=x-20;
    		dc->BitBlt(x,y,250,250,&d,0,0,SRCCOPY);
    		
    		break;
    		
    	case 40:
    		
    		
    		Invalidate(true);
    		UpdateWindow();
    		y=y+20;
    		dc->BitBlt(x,y,250,250,&d,0,0,SRCCOPY);
    		
    		break;
    	case 38:
    		
    		
    		Invalidate(true);
    		UpdateWindow();
    		y=y-20;
    		dc->BitBlt(x,y,250,250,&d,0,0,SRCCOPY);
    		
    			break;
    	}
    
    }
    
    void CMyWin::OnTheard()
    {
    	if(ttOntheard)
    		return;
    	ttOntheard=1;
    	AfxBeginThread(MyTheard,this);
    	AfxBeginThread(MyTheard1,this);
    	
    }
    void CMyWin::OnExit()
    {
    	DestroyWindow();
    }
    UINT MyTheard(LPVOID pMain)
    {
    	
    
    	//int x=700;
    	//int y=200;
    	CMyWin *p=(CMyWin*)pMain;
    	CDC *d=p->GetDC();
    	CSingleLock syncOb(&p->sema);
    	syncOb.Lock();
    	CBitmap b;
    	b.LoadBitmap(IDB_BITMAP1);
    	CDC da;
    	da.CreateCompatibleDC(d);
    	//dc->DeleteDC();
    	da.SelectObject(&b);
    	d->BitBlt(x,y,250,250,&da,0,0,SRCCOPY);
    	syncOb.Unlock();
    	return 1;
    	afx_msg void OnKeyDown();
    }
    void CMyWin::OnPaint()
    {
    	afx_msg void OnKeyDown();
    	AfxBeginThread(MyTheard,this);
    	CPaintDC dc(this);
    	char s[100];
    	sprintf(s,"dieu khien cai ro hung cac qua trung voi  cac phim mui ten");
    	dc.TextOut(300,20,s,(int)strlen(s));;
    }
    UINT MyTheard1(LPVOID pMain)
    {
    	int maxx=GetSystemMetrics(SM_CXSCREEN);
    	int maxy=GetSystemMetrics(SM_CYSCREEN);
    	CMyWin *p=(CMyWin*)pMain;
    	CDC *dc=p->GetDC();
    	CDC m_dc;
    	CBitmap m_bmp;
    	CBitmap bitmap;
    	CBrush m_br;
    	CSingleLock synCob(&(p->sema));
    	synCob.Lock();
    	m_dc.CreateCompatibleDC(dc);
    	m_bmp.CreateCompatibleBitmap(dc,maxx,maxy);
    	m_br.CreateStockObject(WHITE_BRUSH);
    	m_dc.SelectObject(&m_bmp);
    	m_dc.SelectObject(&m_br);
    	m_dc.PatBlt(0,0,maxx,maxy,PATCOPY);
    	bitmap.LoadBitmap(IDB_BITMAP2 );
    	m_dc.SelectObject(&bitmap);
    	RECT rt;
    	p->GetClientRect(&rt);
    	int m_x=rt.right-rt.left;
    	int m_y=rt.bottom-rt.top;
    	int x=0,y=rt.bottom/2,dx=1,rd=5;
    	while(1)
    	{
    		dc->BitBlt(x,y,maxx,maxy,&m_dc,0,0,SRCCOPY);
    		Sleep(5);
    		dc->BitBlt(x,y,maxx,maxy,NULL,0,0,WHITENESS);
    		x+=dx;
    		if((x>=m_x)||(x<=0))
    		{
    			dx=-dx;
    			x+=dx;
    		}
    	}
    	m_dc.DeleteDC();
    	m_bmp.DeleteObject();
    	m_br.DeleteObject();
    	synCob.Unlock();
    	return 0;
    	
    
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    bạn ơ !i bạn đã làm game này được chưa ?

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •