学了一段时间的VC了,虽然自己的五子棋还没有做完,但是把我遇到的问题记下来,以后再遇到可以来博客里翻一翻自己的记录。

五子棋加背景音乐用的是CDirectSound类:

//DirectSound.h

/

// Copyright (C) 1998 by J鰎g K鰊ig

// All rights reserved

//

// This file is part of the completely free tetris clone

"CGTetris".

//

// This is free software.

// You may redistribute it by any means providing it is not sold

for profit

// without the authors written consent.

//

// No warrantee of any kind, expressed or implied, is included with

this

// software; use at your own risk, responsibility for damages (if

any) to

// anyone resulting from the use of this software rests entirely

with the

// user.

//

// Send bug reports, bug fixes, enhancements, requests, flames,

etc., and

// I'll try to keep a version up to date. I can

be reached as follows:

// J.Koenig@adg.de (company site)

// Joerg.Koenig@rhein-neckar.de (private site)

/

// DirectSound.h: interface for the CDirectSound class.

//

//

#if

!defined(AFX_DIRECTSOUND_H__A20FE86F_118F_11D2_9AB3_0060B0CDC13E__INCLUDED_)

#define

AFX_DIRECTSOUND_H__A20FE86F_118F_11D2_9AB3_0060B0CDC13E__INCLUDED_

#if _MSC_VER >= 1000

#pragma once

#endif // _MSC_VER >= 1000

#include

#include

#pragma message("linking with Microsoft's DirectSound library

...")

#pragma comment(lib, "dsound.lib")

class CDirectSound {

public: //

construction/destruction

CDirectSound();

virtual ~CDirectSound();

//If the "pWnd" paramter is NULL, then

AfxGetApp()->GetMainWnd() will be used.

BOOL Create(LPCTSTR pszResource,

CWnd * pWnd = 0);

BOOL Create(UINT uResourceID,

CWnd * pWnd = 0) {

return

Create(MAKEINTRESOURCE(uResourceID), pWnd);

}

// Alternativly you can specify the sound by

yourself

// Note that the class does not copy the entire

data ! Instead

// a pointer to the given data will be stored

!

// You can load an entire WAV file into memory

and then call this

// Create() method.

BOOL Create(LPVOID pSoundData,

CWnd * pWnd = 0);

public: // operations

BOOL IsValid()

const;

void Play(DWORD

dwStartPosition = 0, BOOL bLoop = FALSE);

void Stop();

void Pause();

void Continue();

CDirectSound

& EnableSound(BOOL bEnable = TRUE)

{

m_bEnabled

= bEnable;

if(

! bEnable )

Stop();

return

* this;

}

BOOL IsEnabled()

const { return m_bEnabled; }

protected: // implementation

BOOL SetSoundData(LPVOID pSoundData, DWORD

dwSoundSize);

BOOL CreateSoundBuffer(WAVEFORMATEX *

pcmwf);

BOOL GetWaveData(void * pRes, WAVEFORMATEX *

& pWaveHeader, void * & pbWaveData,

DWORD & cbWaveSize);

private: // data member

LPVOID m_pTheSound;

DWORD m_dwTheSound;

LPDIRECTSOUNDBUFFER m_pDsb;

BOOL m_bEnabled;

static LPDIRECTSOUND m_lpDirectSound;

static DWORD m_dwInstances;

};

#endif //

!defined(AFX_DIRECTSOUND_H__A20FE86F_118F_11D2_9AB3_0060B0CDC13E__INCLUDED_)

//DirectSound.cpp

/

// Copyright (C) 1998 by J鰎g K鰊ig

// All rights reserved

//

// This file is part of the completely free tetris clone

"CGTetris".

//

// This is free software.

// You may redistribute it by any means providing it is not sold

for profit

// without the authors written consent.

//

// No warrantee of any kind, expressed or implied, is included with

this

// software; use at your own risk, responsibility for damages (if

any) to

// anyone resulting from the use of this software rests entirely

with the

// user.

//

// Send bug reports, bug fixes, enhancements, requests, flames,

etc., and

// I'll try to keep a version up to date. I can

be reached as follows:

// J.Koenig@adg.de (company site)

// Joerg.Koenig@rhein-neckar.de (private site)

/

// DirectSound.cpp: implementation of the CDirectSound class.

//

//

#include "stdafx.h"

#include "DirectSound.h"

// The following macro is defined since DirectX 5, but will work

with

// older versions too.

#ifndef DSBLOCK_ENTIREBUFFER

#define

DSBLOCK_ENTIREBUFFER 0x00000002

#endif

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

static void DSError( HRESULT hRes ) {

switch(hRes) {

case DS_OK: TRACE0("NO

ERROR\n"); break;

case DSERR_ALLOCATED:

TRACE0("ALLOCATED\n"); break;

case DSERR_INVALIDPARAM:

TRACE0("INVALIDPARAM\n"); break;

case DSERR_OUTOFMEMORY:

TRACE0("OUTOFMEMORY\n"); break;

case DSERR_UNSUPPORTED:

TRACE0("UNSUPPORTED\n"); break;

case DSERR_NOAGGREGATION:

TRACE0("NOAGGREGATION\n"); break;

case DSERR_UNINITIALIZED:

TRACE0("UNINITIALIZED\n"); break;

case DSERR_BADFORMAT:

TRACE0("BADFORMAT\n"); break;

case DSERR_ALREADYINITIALIZED:

TRACE0("ALREADYINITIALIZED\n"); break;

case DSERR_BUFFERLOST:

TRACE0("BUFFERLOST\n"); break;

case DSERR_CONTROLUNAVAIL:

TRACE0("CONTROLUNAVAIL\n"); break;

case DSERR_GENERIC:

TRACE0("GENERIC\n"); break;

case DSERR_INVALIDCALL:

TRACE0("INVALIDCALL\n"); break;

case DSERR_OTHERAPPHASPRIO:

TRACE0("OTHERAPPHASPRIO\n"); break;

case DSERR_PRIOLEVELNEEDED:

TRACE0("PRIOLEVELNEEDED\n"); break;

default:

TRACE1("%lu\n",hRes);break;

}

}

//

// Construction/Destruction

//

LPDIRECTSOUND CDirectSound::m_lpDirectSound;

DWORD CDirectSound::m_dwInstances;

CDirectSound::CDirectSound()

{

m_lpDirectSound = 0;

m_pDsb = 0;

m_pTheSound = 0;

m_dwTheSound = 0;

m_bEnabled = TRUE;

++m_dwInstances;

}

CDirectSound::~CDirectSound()

{

if( m_pDsb )

m_pDsb->Release();

if( !--m_dwInstances

&& m_lpDirectSound ) {

m_lpDirectSound->Release();

m_lpDirectSound = 0;

}

}

BOOL CDirectSound::Create(LPCTSTR pszResource, CWnd *

pWnd)

{

//

// load resource

HINSTANCE hApp = ::GetModuleHandle(0);

ASSERT(hApp);

HRSRC hResInfo = ::FindResource(hApp,

pszResource, TEXT("WAVE"));

if(hResInfo == 0)

return FALSE;

HGLOBAL hRes = ::LoadResource(hApp,

hResInfo);

if(hRes == 0)

return FALSE;

LPVOID pTheSound = ::LockResource(hRes);

if(pTheSound == 0)

return FALSE;

return Create(pTheSound, pWnd);

}

BOOL CDirectSound :: Create(LPVOID pSoundData, CWnd * pWnd) {

if(pWnd == 0)

pWnd =

AfxGetApp()->GetMainWnd();

ASSERT(pWnd != 0);

ASSERT(::IsWindow(pWnd->GetSafeHwnd()));

ASSERT(pSoundData != 0);

//

// create direct sound object

if( m_lpDirectSound == 0 ) {

// Someone might use sounds for

starting apps. This may cause

// DirectSoundCreate() to fail

because the driver is used by

// anyone else. So wait a

little before starting with the work ...

HRESULT hRes = DS_OK;

short nRes = 0;

do {

if( nRes

)

::Sleep(500);

hRes =

::DirectSoundCreate(0, &m_lpDirectSound, 0);

++nRes;

} while( nRes <

10 && (hRes == DSERR_ALLOCATED ||

hRes == DSERR_NODRIVER) );

if( hRes != DS_OK )

return

FALSE;

m_lpDirectSound->SetCooperativeLevel(pWnd->GetSafeHwnd(),

DSSCL_NORMAL);

}

ASSERT(m_lpDirectSound != 0);

WAVEFORMATEX * pcmwf;

if( ! GetWaveData(pSoundData, pcmwf, m_pTheSound,

m_dwTheSound) ||

! CreateSoundBuffer(pcmwf)

||

! SetSoundData(m_pTheSound,

m_dwTheSound) )

return FALSE;

return TRUE;

}

BOOL CDirectSound :: GetWaveData(void * pRes, WAVEFORMATEX *

& pWaveHeader, void * & pbWaveData,

DWORD & cbWaveSize) {

pWaveHeader = 0;

pbWaveData = 0;

cbWaveSize = 0;

DWORD * pdw = (DWORD *)pRes;

DWORD dwRiff = *pdw++;

DWORD dwLength = *pdw++;

DWORD dwType = *pdw++;

if( dwRiff != mmioFOURCC('R', 'I', 'F', 'F')

)

return

FALSE; // not even RIFF

if( dwType != mmioFOURCC('W', 'A', 'V', 'E')

)

return

FALSE; // not a WAV

DWORD * pdwEnd = (DWORD *)((BYTE *)pdw +

dwLength-4);

while( pdw < pdwEnd ) {

dwType = *pdw++;

dwLength = *pdw++;

switch( dwType ) {

case

mmioFOURCC('f', 'm', 't', ' '):

if(

!pWaveHeader ) {

if(

dwLength < sizeof(WAVEFORMAT) )

return

FALSE; // not a WAV

pWaveHeader

= (WAVEFORMATEX *)pdw;

if(

pbWaveData && cbWaveSize )

return

TRUE;

}

break;

case

mmioFOURCC('d', 'a', 't', 'a'):

pbWaveData

= LPVOID(pdw);

cbWaveSize

= dwLength;

if(

pWaveHeader )

return

TRUE;

break;

}

pdw = (DWORD *)((BYTE *)pdw +

((dwLength+1)&~1));

}

return FALSE;

}

BOOL CDirectSound::CreateSoundBuffer(WAVEFORMATEX * pcmwf)

{

DSBUFFERDESC dsbdesc;

// Set up DSBUFFERDESC structure.

memset(&dsbdesc, 0,

sizeof(DSBUFFERDESC)); // Zero it out.

dsbdesc.dwSize = sizeof(DSBUFFERDESC);

// Need no controls (pan, volume,

frequency).

dsbdesc.dwFlags =

DSBCAPS_STATIC; // assumes that

the sound is played often

dsbdesc.dwBufferBytes = m_dwTheSound;

dsbdesc.lpwfxFormat =

pcmwf; //

Create buffer.

HRESULT hRes;

if( DS_OK != (hRes =

m_lpDirectSound->CreateSoundBuffer(&dsbdesc,

&m_pDsb, 0)) ) {

// Failed.

DSError(hRes);

m_pDsb = 0;

return FALSE;

}

return TRUE;

}

BOOL CDirectSound::SetSoundData(void * pSoundData, DWORD

dwSoundSize) {

LPVOID lpvPtr1;

DWORD dwBytes1;

// Obtain write pointer.

HRESULT hr = m_pDsb->Lock(0, 0,

&lpvPtr1, &dwBytes1, 0, 0,

DSBLOCK_ENTIREBUFFER); // If

DSERR_BUFFERLOST is returned, restore and retry lock.

if(DSERR_BUFFERLOST == hr) {

m_pDsb->Restore();

hr =

m_pDsb->Lock(0, 0, &lpvPtr1,

&dwBytes1, 0, 0, DSBLOCK_ENTIREBUFFER);

}

if(DS_OK == hr) {

// Write to pointers.

::CopyMemory(lpvPtr1,

pSoundData, dwBytes1);

// Release the data back to

DirectSound.

hr =

m_pDsb->Unlock(lpvPtr1, dwBytes1, 0, 0);

if(DS_OK == hr)

return TRUE;

}

// Lock, Unlock, or Restore failed.

return FALSE;

}

void CDirectSound::Play(DWORD dwStartPosition, BOOL bLoop)

{

if( ! IsValid() || ! IsEnabled() )

return; //

no chance to play the sound ...

if( dwStartPosition >

m_dwTheSound )

dwStartPosition =

m_dwTheSound;

m_pDsb->SetCurrentPosition(dwStartPosition);

if( DSERR_BUFFERLOST ==

m_pDsb->Play(0, 0, bLoop ? DSBPLAY_LOOPING : 0) )

{

// another application had

stolen our buffer

// Note that a "Restore()" is

not enough, because

// the sound data is invalid

after Restore().

SetSoundData(m_pTheSound,

m_dwTheSound);

// Try playing again

m_pDsb->Play(0,

0, bLoop ? DSBPLAY_LOOPING : 0);

}

}

void CDirectSound::Stop()

{

if( IsValid() )

m_pDsb->Stop();

}

void CDirectSound::Pause()

{

Stop();

}

void CDirectSound::Continue()

{

if( IsValid() ) {

DWORD dwPlayCursor,

dwWriteCursor;

m_pDsb->GetCurrentPosition(&dwPlayCursor,

&dwWriteCursor);

Play(dwPlayCursor);

}

}

BOOL CDirectSound::IsValid() const

{

return (m_lpDirectSound

&& m_pDsb

&& m_pTheSound

&& m_dwTheSound) ? TRUE :

FALSE;

}

在工程view类中包含CDirectSound的头文件,以全局变量的方式生成DirectSound的对象:

CDirectSound m_SoundDwn;

对m_SoundDwn对象进行初始化:

VERIFY(m_SoundDwn.Create(IDR_WAVE_END));

IDR_WAVE_END是加入项目的音频资源

调用m_SoundDwn对象的.Play()方法

m_SoundDwn.Play();

背景音乐就能正常播放了,但是音乐只能播放一次,不能循环播放。

第一次写博客,希望大家能提供自己的建议。

java五子棋音乐_五子棋加背景音乐相关推荐

  1. 如何在python里加音乐_python中加背景音乐如何操作

    在python中加背景音乐的方法: 1.导入pygame资源包: 2.修改音乐的file路径: 3.使用init()方法进行初始化: 4.使用load()方法添加音乐文件: 5.使用play()方法播 ...

  2. 用java编写博弈树_五子棋的博弈树实现

    五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性.这里设计和实现了一个人机对下的五子棋程序,采用了博弈树的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置.介绍 ...

  3. java人脸识别_自从加了PC人脸识别登录功能,网站立马显得高大上

    之前不是做了个开源项目嘛,在做完GitHub登录后,想着再显得有逼格一点,说要再加个人脸识别登录,就我这佛系的开发进度,过了一周总算是抽时间安排上了. 源码在文末 其实最近对写文章有点小抵触,写的东西 ...

  4. java手机音乐_[JavaME]手机同时播放两个音乐 探讨一

    [JavaME]手机同时播放两个音乐 探讨一 摘要: 本文档以及后续文档试图一步一步地探讨如何在手机上同时播放两个声音文件,譬如一个是背景音乐,一个是按键触发的游戏音效.请慢慢看下去,我们尽量糅合进各 ...

  5. java 剪切音乐_怎么剪切一段音乐其中的片段

    剪切音乐想必大家都不陌生,在各种手机铃声中我们都需要用到它来制作个性有趣的来电铃声,那么大家知道有什么简便的方法使用吗?小编有一个办法就是利用剪切工具的功能就可以完成了,我们就不用不用一点一点的设置音 ...

  6. Java程序验证五子棋先手必胜,五子棋怎样下最厉害_五子棋先手必胜开局图

    五子棋是很好的益智游戏,那么五子棋怎样下才是最厉害的呢?小编整理了五子棋的先手必胜开局图,希望可以帮助大家! 五子棋先手必胜开局图 五子棋阵法(一)八卦阵1 五子棋玩儿家们经常提到"八卦阵& ...

  7. 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈

    五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...

  8. 面向对象程序设计(Java)课程设计——五子棋小游戏

    目录 一.团队成员及任务 二.项目简介 三.功能设计图 四.运行结果截图 五.核心源码 六.课程设计感想与展望 一.团队成员及任务 队长:管俊杰  计科(智能)22-1 202203200037 负责 ...

  9. Java小程序——简单五子棋(人机对战)

    有关五子棋人人对战的代码,以及其他一些我想说的话请参考 Java小程序 -- 简单五子棋_如切如磋,如琢如磨-CSDN博客_java小程序 由于某些原因,这里我给出的AI算法算是比较简单的,所以导致了 ...

  10. 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)

    使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置 jdk-15.0.1-免配置路径版 提取码:earu 免 ...

最新文章

  1. [小梅的体验课堂]Microsoft edge canary mac版本体验
  2. 简单web服务器学习总结
  3. Genymotion模拟器
  4. Oracle归档目录 和 DB_RECOVERY_FILE_DEST
  5. 张宇高等数学强化阶段笔记并标记重点
  6. 小米游戏本0909bios_小米笔记本电脑全家族介绍
  7. 转正述职报告怎么写?五年经验PM告诉你……
  8. linux里case命令,Linux系统中的case命令怎么用
  9. 申请美国密歇根州立大学需要具备哪些条件?
  10. 麦克风阵列概述与波束形成—(1) 麦克风阵列概述
  11. 用python 控制台打印图片示例
  12. 物联网驱动数字化转型
  13. matlab 检测键盘,matlab检测键盘
  14. linux 命令 xxd linux下查看二进制文件
  15. JS DOM获取标签/元素style样式
  16. 怎么知道创元网配资平台靠不靠谱?
  17. python字符串能不能加减乘除_Python运算符可不只有加减乘除
  18. 无线攻击之Aircrack-ng破解无线密码(无线密码破解套件)
  19. 快高考了,写点东西给你们
  20. JAVA修改AD账号密码

热门文章

  1. windows 10 删除壁纸历史记录
  2. SpringBoot之如何自定义一个starter模块
  3. 毕业就去当网红?先听听8位95后网红的口述
  4. Javascript中Math常用操作,向上取整、向下取整、四舍五入
  5. 渗透测试常见问题以及方法
  6. Mac 开发工具汇总
  7. 霍金实在论中的实践论
  8. Linux终端收听mms流媒体电台
  9. 百度地图api使用时标注图标显示不出来
  10. Draftsharks回顾周末梦幻足球