⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canvasframe.cpp

📁 游戏人物控制范例
💻 CPP
字号:
//canvasFrame.cpp : implementation file
//

#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// canvasFrame

IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)

LPDIRECTSOUND pDS;          //声明DirectSound 对象指针
LPDIRECTSOUNDBUFFER pPBuf;  //声明主缓冲区指标
LPDIRECTSOUNDBUFFER pSBuf;  //声明次缓冲区
LPDIRECTSOUND3DBUFFER   Buffer3D;
LPDIRECTSOUND3DLISTENER Listener;
WAVEFORMATEX pwfmt;         //声明声音结构
WAVEFORMATEX swfmt;         //声明声音结构
DSBUFFERDESC dsdesc;          //声明描述结构
MMCKINFO      ckRiff;       //RIFF 区块的信息  
MMCKINFO      ckInfo;       //子区块的信息
MMRESULT	  mmresult;     //返回结果
HMMIO hmmio;                //打开的多媒体文件
DWORD size;                 //实际数据大小
HRESULT result;             //声明HRESULT类型变量
LPVOID pAudio;
DWORD bytesAudio;

double xvector,yvector;
int xnow,ynow,xlast,ylast,i,c,xp;

canvasFrame::canvasFrame()
{
	Create(NULL,"绘图窗口");
	CClientDC dc(this);
	int width = dc.GetDeviceCaps(HORZRES);
	int height = dc.GetDeviceCaps(VERTRES);
	GetWindowRect( &rect );
	width = ( width - ( rect.right - rect.left ))/2 ;
	height = (height - (rect.bottom - rect.top ))/2 ;
	MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
	mdc = new CDC;
	mdc->CreateCompatibleDC(&dc);
	char str[7];
	for(i=0;i<4;i++)              
	{
		sprintf(str,"m%d.bmp",i);
		m[i] = new CBitmap;
		m[i]->m_hObject = (HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,440,74,LR_LOADFROMFILE);
		sprintf(str,"p%d.bmp",i);
		p[i] = new CBitmap;
		p[i]->m_hObject = (HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,440,74,LR_LOADFROMFILE);
	}
	CPoint *p = new CPoint(250,150); //设定起始坐标
	ClientToScreen(p);               //转换坐标
	::SetCursorPos(p->x,p->y);       //设定鼠标所在位置
	ShowCursor(false);
	pSBuf->Play(0,0,1);
	delete p;
}

canvasFrame::~canvasFrame()
{
	if(mdc) delete mdc;                 //释放资源
	for(i=0;i<=3;i++)
	{
		if(p[i]) delete p[i]; //释放资源
		if(m[i]) delete m[i]; //释放资源
	}
	Listener->Release();
	pSBuf->Release();
	pDS->Release();
}

BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
	//{{AFX_MSG_MAP(canvasFrame)
	ON_WM_MOUSEMOVE()
	ON_WM_CHAR()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers

void canvasFrame::OnMouseMove(UINT nFlags, CPoint point) 
{
	CClientDC dc(this);
	xlast = xnow;      //上一次的 X 坐标
	ylast = ynow;      //上一次的 Y 坐标
	xnow = point.x;    //此次的 X 坐标
	ynow = point.y;    //此次的 Y 坐标
	c++;
		if(c==8)
			c=0;
	xp=55*c;
	mdc->SelectObject(m[1]);
	dc.BitBlt(xlast,ylast,55,74,mdc,0,0,WHITENESS); //覆盖上一次的贴图
	if(fabs(xnow-xlast) >= fabs(ynow-ylast))
	{

		if(xnow-xlast>=0)              //往右
		{
  			mdc->SelectObject(m[1]);  //贴上人物
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
			mdc->SelectObject(p[1]);
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
		}
		else                           //往左
		{
			mdc->SelectObject(m[2]);
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
			mdc->SelectObject(p[2]);
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
		}
	}
	else
	{
		if(ynow-ylast >= 0)            //往下
		{
            mdc->SelectObject(m[3]);
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
			mdc->SelectObject(p[3]);
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
		}
		else                          //往上
		{
			mdc->SelectObject(m[0]);			
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
			mdc->SelectObject(p[0]);
			dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
		}
	}
	xvector = (xnow-250)/50*0.5;
	yvector = (ynow-150)/50*0.5;
	Listener->SetPosition(xvector,yvector,0,DS3D_IMMEDIATE);
	char str[40];
	sprintf(str,"目前倾听者的位置:(%.1f,%.1f,0) ",xvector,yvector);
	dc.TextOut(0,0,str);
	CFrameWnd::OnMouseMove(nFlags, point);
}

void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: Add your message handler code here and/or call default
	if( nChar== VK_ESCAPE)     
		PostMessage(WM_CLOSE );  //传送WM_CLOSE信息
	CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
}

int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
    result = DirectSoundCreate( NULL, &pDS, NULL ); //建立 DirectSound 对象
	if(result != DS_OK)
		MessageBox("建立 DirectSound 对象失败!");
    result = pDS->SetCooperativeLevel( m_hWnd, DSSCL_PRIORITY );
	if(result != DS_OK)
		MessageBox("设定协调层级失败!");
    memset( &dsdesc,0, sizeof(dsdesc) );          //清空结构内容
    dsdesc.dwSize        = sizeof(dsdesc);        //配置描述结构大小
    dsdesc.dwFlags       = DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;
    dsdesc.dwBufferBytes = 0;
    dsdesc.lpwfxFormat   = NULL;
    result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );
	if(result != DS_OK)
		MessageBox("建立主缓冲区失败!");
    memset( &pwfmt,0, sizeof(pwfmt) );
    pwfmt.wFormatTag      = WAVE_FORMAT_PCM;
    pwfmt.nChannels       = 2;               //播放声道
    pwfmt.nSamplesPerSec  = 44100;           //播放频率
    pwfmt.wBitsPerSample  = 16;              //位
    pwfmt.nBlockAlign     = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels;
    pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;
    result = pPBuf->SetFormat(&pwfmt);       //设定播放格式
	if(result != DS_OK)
		MessageBox("设定播放格式失败!");
    result = pPBuf->QueryInterface( IID_IDirectSound3DListener,                                                   (VOID**)&Listener );
	if(result != DS_OK)
		MessageBox("建立倾听者失败!");
	pPBuf->Release();
	hmmio = mmioOpen("s0.wav", NULL, MMIO_ALLOCBUF|MMIO_READ );
	//打开文件
	if(hmmio == NULL)                           //判断是否为空
		MessageBox("文件不存在!");
	ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
	//设定文件类型
	mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
	//搜寻类型
	if(mmresult != MMSYSERR_NOERROR)
		MessageBox("文件格式错误!");
	ckInfo.ckid = mmioFOURCC('f','m','t',' ');  //设定区块类型
	mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
	//搜寻区块
	if(mmresult != MMSYSERR_NOERROR)
		MessageBox("文件格式错误!");
	if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) //读取文件格式
		MessageBox("读取格式失败!");
	mmresult = mmioAscend(hmmio,&ckInfo,0);     //跳出子区块
	ckInfo.ckid = mmioFOURCC('d','a','t','a');  //设定区块类型
	mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
	//搜寻区块
	if(mmresult != MMSYSERR_NOERROR)
		MessageBox("文件格式错误!");
	size = ckInfo.cksize;                       //取得实际资料大小
	memset( &dsdesc,0,sizeof(dsdesc));        //清空结构内容
    dsdesc.dwSize  = sizeof(dsdesc);          //配置结构大小
    dsdesc.dwFlags = 	 DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS|DSBCAPS_CTRL3D;
    dsdesc.dwBufferBytes = size;            //设定缓冲区大小
    dsdesc.lpwfxFormat   = &swfmt;          //设定缓冲区格式
    result = pDS->CreateSoundBuffer( &dsdesc, &pSBuf, NULL );
	if(result != DS_OK)
		MessageBox("建立次缓冲区失败!");
	result = pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
	//锁定缓冲区
	if(result != DS_OK)
		MessageBox("锁定缓冲区失败!");
	mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
	//读取音文件数据
	if(mmresult == -1)
		MessageBox("读取音文件数据失败!");
	result = pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);
	//解除锁定缓冲区
	if(result != DS_OK)
		MessageBox("解除锁定缓冲区失败!");
	mmioClose(hmmio,0);
    result = pSBuf->QueryInterface( IID_IDirectSound3DBuffer,                                                   (VOID**)&Buffer3D );
    if(result != DS_OK)
		MessageBox("建立 3D 缓冲区失败!");	
	// TODO: Add your specialized creation code here
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -