ExcelVBAゲームプログラミング?

初心者でもきっとできる!
Excelさえ持っていれば特別なソフトは不要!
すぐにでも始められる簡単ゲームプログラミング!
今すぐ始めよう!

サンプルやゲームのダウンロードができる別館も好評運営中です。
ご意見やご質問、ゲームの感想等は掲示板までお気軽に。是非、皆さんの声を聞かせてください。運営、開発の励みになります。



各種ダウンロードはコチラ ↓ 意見・感想・質問はコチラ ↓
影倉庫 Shadow warehouse サポート掲示板
ブログの全体像はコチラ ↓ リンクのページはコチラ ↓
サイトマップ 自分本位なリンク


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。






Chapter.67 [ APIによるサウンド再生:MCIコマンドとループ再生 ]

■様々なコマンド

前回のサンプルでは、一度再生したサウンドが、2回目以降うまく再生されない可能性がありました。しかしこれはなぜなのでしょうか。

実は、前回、前々回と解説した、サウンドを再生するコマンド『 play 』が関係しています。
今回の講座では、もはやお馴染みとなったMCIコマンドである play や、その他の命令文字列について、もう少し詳しく見ていくことにしましょう。命令文字列、つまりMCIコマンドをよく知ることで、様々な処理が可能になります。応用すれば、メディアプレーヤーを自前で作成することもできるのです。がんばって取り組んでいきましょう。

まずは、mciSendStringで使うことができるMCIコマンドのうち、代表的なものを一覧にしてみましたので、それを見てみましょう。

MCIコマンド解説
openファイルを開く
closeファイルを閉じる
playサウンドを再生する
stop再生中のサウンドを停止する
pause再生を一時停止する
resume一時停止している状態から再生を再開する
status現在の状態を調べる

本当に代表的なところだけなので、これはMCIコマンドのほんの一部です。しかし、これらのコマンドさえ使いこなせれば、大体のことはできます。


■ open ・ close ・ play ・ stop

ファイルのオープン、そしてクローズ。これは前回までに解説しましたね。
mciSendStringでサウンドを再生するためには、必ずあらかじめサウンドファイルを開いておく必要がありました。そして、ファイルを開くという命令を出す文字列が『 open 』でしたね。

開いたサウンドデータは、ソフトが終了する前に、必ず閉じなくてはいけません。それを行うのが『 close 』でしたね。このMCIコマンドを使ってファイルを閉じておかないと、あとあと問題が起きる可能性があるので、必ず開いたファイルは閉じるようにしましょう。

ファイルを開く場合
mciSendString("open ファイルのパス alias エイリアス", vbNullString, 0, 0)

ファイルを閉じる場合
mciSendString("close エイリアス", vbNullString, 0, 0)


エイリアスというのは、開いたファイルにつける仮の名前で、プログラムの中では、このエイリアスを使ってファイルを識別する仕組みでした。

そして、サウンドを再生するには、『 play 』を、再生されているサウンドを停止するには『 stop 』を使います。

サウンドの再生
mciSendString("play エイリアス", vbNullString, 0, 0)

再生中のサウンドの停止
mciSendString("stop エイリアス", vbNullString, 0, 0)

ここで登場したMCIコマンドの『 play 』ですが、先ほどの表では、単にサウンドを再生する、という解説になっていました。しかし、実はこれは正しい解説とは言えません。
playというMCIコマンドを正しく解説するならば、『現在の位置からサウンドを再生する』となります。ここで重要なのが、現在の位置から、という部分です。

じつは、playというMCIコマンドは、現在の位置という概念にのっとって再生を開始します。あらかじめ現在の位置が変化している場合には、必ずしも最初から再生されるわけではないのです。これが、前回のサンプルで音が鳴らなくなることがあった原因です。

一度サウンドが再生されると、当然、現在の位置は常に変化し続けます。ですからplayコマンドを呼び出しても、正しく再生が行われていないような気がしてしまったのですね。

これを回避するには、MCIコマンドにひと手間加えます。それが次のコードです。

mciSendString("play エイリアス from 0", vbNullString, 0, 0)

from というオプション命令を追加しました。from は、再生を開始する場所を指定することができるコマンドです。そこに半角スペースを空けて、開始するポイントを指定します。上の例では 0 が指定されているので、強制的にサウンドの一番最初が指定されます。
この状態でplayコマンドを呼び出すようにすれば、mciSendStringが呼び出されるたびに、必ず最初からサウンドが再生されるようになります。


■ pause ・ resume

さて、今度は少しだけ発展した形をやってみます。『一時停止』と、『再生の再開』です。これにはそれぞれ『 pause 』と『 resume 』を使います。

再生中サウンドの一時停止
mciSendString("pause エイリアス", vbNullString, 0, 0)

一時停止中のサウンドの再生再開
mciSendString("resume エイリアス", vbNullString, 0, 0)

pause というMCIコマンドを使うと、現在再生されているサウンドを一時停止することができます。そして、resume というMCIコマンドで、停止した場所から再生を再開することができます。

実は、一時停止したサウンドは、playでも再生させることはできます。ただし、この場合には再生が開始される位置は、先述した from による指定が優先されることになります。 from を使わずに再生させたとしても、うまくいきません。
停止した場所から再生を再開するには、きちんと resume を使って再開させる必要があるのです。

ゲームのサウンド処理においては、ゲームにポーズ機能をつける場合や、アイテムの取得時などに特殊なサウンドを再生する場合などに、この一時停止と再開の機能が利用できそうですね。

ただし、注意すべきことがひとつあります。
実は、MIDIの処理では、 resume コマンドを使うことができません。一時停止することはできますが、そこから resume による再生の再開はできないので注意してください。


■ status

このMCIコマンドを使いこなせるかどうかで、かなりレベルが変わってきます。
実は、この『 status 』を有効に利用すると、自前でサウンドをループ再生するなどの処理が可能になります。

このMCIコマンドは、現在の各エイリアスの状態を調べることができるコマンドです。ですから、再生中かどうかを調べながら処理すれば、再生が終わったときにそれを察知することもできるのですね。
もし再生が終了して、エイリアスが停止状態だったときには、もう一度再生させることであたかもループ再生しているかのように振舞うことができるわけです。

このMCIコマンドを使うためには、今までとは違い、あらかじめ準備が必要です。その準備とは、『現在の状態を格納するために必要な、String型変数の準備』です。

そして、このString型の変数は、『固定長文字列変数』である必要があります。う~ん、わかりにくくなってきました。

まず、文字列型変数について簡単に解説しますね。
皆さんご存知の通り、文字列を扱う変数の型は、String型という変数の型でしたね。通常、String型で宣言された文字列は『可変長文字列型』となります。
可変長、つまり、長さを変えることができる文字列ということですね。1文字だけ文字を格納しておいてもいいし、逆に1億文字を入れておいてもいいのです。

これに対して、『固定長文字列型』というものが存在します。こちらは、固定長ですから、あらかじめ文字列の長さが決まっています。そして、固定長文字列を宣言する場合には、次のように変数を宣言します。

Dim mystr As String * 255

上記のように変数を宣言すると、255文字を格納できる、固定長文字列型の変数が宣言されます。この変数には、255よりも大きな文字数を格納することはできません。格納できるデータの量を制限することができるのですね。


さて、話を戻します。
status というMCIコマンドを使うために必要な文字列変数は、固定長文字列変数である必要があります。そして、固定長で宣言した文字列型の変数を、mciSendStringに引数として渡すことによって、現在の状態を取得することができます。

簡単な例を挙げると、次のようになります。

Sub GetStatus()

    Dim myStr As String * 255
    
    myStr = ""
    
    Call mciSendString("status エイリアス mode", myStr, 255, 0)
    
    MsgBox myStr
    
End Sub

固定長文字列の変数が宣言されていますね。これが変数 myStr です。
そして、mciSendStringの第二引数に、この変数 myStr が与えられています。第三引数には、変数 myStr の大きさを指定することになっているので、255となっています。

このようにmciSendStringを呼び出すと、変数 myStr に、現在の状態が格納される仕組みになっています。上記のような呼び出しを行った後で変数 myStr に入っている文字列を調べれば、エイリアスの現在の状態が取得できます。

もし、現在エイリアスが再生中の場合には、『 Playing 』が格納されています。停止中の場合には『 stopped 』が、一時停止中ならば『 paused 』が格納されているはずです。

これで、現在のエイリアスの状態を、好きなときに知ることができるようになります。ゲームの処理の最中に、適宜情報を取得する処理をはさむようにしておけば、BGMをループ再生することも可能です。情報を取得しながら適切に処理することで、かなり柔軟な処理を実現することができるのです。


■まとめ

さて、mciSendStringについて、3回にわたって解説してきました。かなり難しい内容だったのではないでしょうか。

MCIは非常に奥が深く、極めればほとんどのマルチメディアに関する処理を行うことができます。しかしその反面、扱いが難しく、難解な部分が多いです。
私が講座で解説した内容は、MCIの本当に簡単な使い方だけです。しかし、ゲームのサウンド処理を行ううえで、最低限必要なことは全て解説できたと思っています。

さらなる高みを目指すなら、APIに関する深い知識も必要になってきます。とりあえず、講座で解説してきた簡単な使い方を完全にマスターしてください。そこから先を目指すかどうかは、皆さん次第ということになるでしょう。



■格言

MCIコマンドを駆使して多彩な処理を行う
一時停止や再生の再開も可能
エイリアスの状況を取得することもできる


意外と status コマンドの使い方を知らない人も多いのではないでしょうか。有用な技術ですので、是非マスターしてください。

関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)

メールフォーム

影斬に物申すという方はこちら

名前 :
メール:
件名 :
本文 :

可能な限り要望には応えますが、必ず返信や回答ができることを、保障するものではありません。
ご了承ください。

Chapters

コンテンツ一覧


■Chapter 一覧■
    全てのChapterの一覧です。
    直接アクセスしたい方はこちらをご利用下さい。

    Chapter.1 [ 知っておくべき心得 ]
    Chapter.2 [ Excelってなんだろう ]
    Chapter.3 [ Excelの基本画面 ]
    Chapter.4 [ VBAとは? ]
    Chapter.5 [ モジュールについて ]
    Chapter.6 [ 変数 ]
    Chapter.7 [ 変数の型と宣言 ]
    Chapter.8 [ プロシージャとスコープ ]
    Chapter.9 [ ゲームつくる様々な手法 ]
    Chapter.10 [ ユーザーフォーム ]
    Chapter.11 [ プロパティウィンドウ ]
    Chapter.12 [ 乱数 ]
    Chapter.13 [ 条件分岐 ]
    Chapter.14 [ ゲーム画面のデザイン ]
    Chapter.15 [ コード記述の基本作法 ]
    Chapter.16 [ じゃんけんゲーム:1 名前をつける ]
    Chapter.17 [ じゃんけんゲーム:2 フォームの起動 ]
    Chapter.18 [ じゃんけんゲーム:3 乱数の種 ]
    Chapter.19 [ じゃんけんゲーム:4 イベント ]
    Chapter.20 [ じゃんけんゲーム:5 引数 ]
    Chapter.21 [ じゃんけんゲーム:6 役判定 ]
    Chapter.22 [ じゃんけんゲーム:7 予測と制限 ]
    Chapter.23 [ Withステートメント ]
    Chapter.24 [ 画像を表示させる ]
    Chapter.25 [ 画像表示の発展形 ]
    Chapter.26 [ 繰り返し処理 For文 ]
    Chapter.27 [ 繰り返し処理 Do~Loop文 ]
    Chapter.28 [ Exitステートメント ]
    Chapter.29 [ フォーム上の位置情報 ]
    Chapter.30 [ API基礎知識 ]
    Chapter.31 [ API補足知識 ]
    Chapter.32 [ メインループを考える ]
    Chapter.33 [ 同期処理の概念 ]
    Chapter.34 [ 移動処理その1:画面設定と考え方 ]
    Chapter.35 [ 移動処理その2:DoEvents ]
    Chapter.36 [ 移動処理その3:キー入力判定API ]
    Chapter.37 [ 条件分岐のさらなる探求 Select Case ]
    Chapter.38 [ アニメーション ]
    Chapter.39 [ 配列変数 ]
    Chapter.40 [ ゲームの初期化 ]
    Chapter.41 [ シューティングゲーム1:ゲーム設計 ]
    Chapter.42 [ シューティングゲーム2:メインプロセス ]
    Chapter.43 [ シューティングゲーム3:構造体 ]
    Chapter.44 [ シューティングゲーム4:定数 ]
    Chapter.45 [ シューティングゲーム5:プレイヤーキャラクター ]
    Chapter.46 [ シューティングゲーム6:ショットを撃つ① ]
    Chapter.47 [ シューティングゲーム7:ショットを撃つ② ]
    Chapter.48 [ シューティングゲーム8:Mod演算子の活用 ]
    Chapter.49 [ シューティングゲーム9:敵キャラクター登場 ]
    Chapter.50 [ シューティングゲーム10:衝突判定 ]
    Chapter.51 [ シューティングゲーム11:衝突の実体 ]
    Chapter.52 [ シューティングゲーム12:敵の攻撃 ]
    Chapter.53 [ シューティングゲーム13:爆発エフェクト ]
    Chapter.54 [ シューティングゲーム14:残機数表示① ]
    Chapter.55 [ シューティングゲーム15:残機数表示② ]
    Chapter.56 [ シューティングゲーム16:スコアの表示 ]
    Chapter.57 [ シューティングゲーム17:タイトル画面 ]
    Chapter.58 [ シューティングゲーム18:ボスキャラクター ]
    Chapter.59 [ シューティングゲーム19:最後の仕上げへ ]
    Chapter.60 [ シューティングゲーム20:いよいよ完成STG ]
    Chapter.61 [ カードゲームで使えるめくり効果 ]
    Chapter.62 [ ラジアンと角度 ]
    Chapter.63 [ ラジアンの活用:円運動 ]
    Chapter.64 [ ラジアンの活用:任意の角度へ移動する ]
    Chapter.65 [ APIによるサウンド再生:基礎 ]
    Chapter.66 [ APIによるサウンド再生:MIDIと多重再生 ]
    Chapter.67 [ APIによるサウンド再生:MCIコマンドとループ再生 ]
    Chapter.68 [ Function プロシージャ ]
    Chapter.69 [ 値渡しと参照渡し ]
    Chapter.70 [ デバッグ1:イミディエイトウィンドウ ]
    Chapter.71 [ デバッグ2:ローカルウィンドウ ]
    Chapter.72 [ デバッグ3:コード実行の中断 ]
    Chapter.73 [ オブジェクトってなんだ ]
    Chapter.74 [ プロパティ・メソッド・イベント ]
    Chapter.75 [ オブジェクト変数 ]
    Chapter.76 [ オブジェクトとコレクション ]
    Chapter.77 [ 特殊な繰り返し:For Each ]
    Chapter.78 [ エラー処理 ]
    Chapter.79 [ On Error と GoTo文 ]
    Chapter.80 [ Resumeステートメント ]
    Chapter.81 [ バイトとビット ]
    Chapter.82 [ ウィンドウメッセージとイベント ]
    Chapter.83 [ 文字列の基礎 ]
    Chapter.84 [ 文字列操作① ]
    Chapter.85 [ 文字列操作② ]
    Chapter.86 [ タイピングゲーム1:仕様を決める ]
    Chapter.87 [ タイピングゲーム2:キー入力検知 ]
    Chapter.88 [ タイピングゲーム3:文字列照合 ]
    Chapter.89 [ タイピングゲーム4:判定関数 ]
    Chapter.90 [ タイピングゲーム5:ゲーム画面設計 ]
    Chapter.91 [ タイピングゲーム6:問題文のソート ]
    Chapter.92 [ タイピングゲーム7:動的配列 ]
    Chapter.93 [ タイピングゲーム8:キーダウンイベント ]
    Chapter.94 [ タイピングゲーム9:正打数の表示 ]
    Chapter.95 [ タイピングゲーム10:タイムの表示 ]
    Chapter.96 [ クリックゲーム1:イベントの種類 ]
    Chapter.97 [ クリックゲーム2:画面設計 ]
    Chapter.98 [ クリックゲーム3:クリック座標検知 ]
    Chapter.99 [ クリックゲーム4:キャラクター準備 ]
    Chapter.100 [ クリックゲーム5:キャラクターの配置 ]
    Chapter.101 [ クリックゲーム6:キャラクター移動とNot演算子 ]
    Chapter.102 [ クリックゲーム7:クリックのヒット判定 ]
    Chapter.103 [ クリックゲーム8:ヒットマークエフェクト ]
    Chapter.104 [ クリックゲーム9:サウンド処理の実装 ]
    Chapter.105 [ クリックゲーム10:マウスカーソルの変更 ]
    Chapter.106 [ ブロック崩しゲーム1:仕様と概要を決める ]
    Chapter.107 [ ブロック崩しゲーム2:基本概念の確認 ]
    Chapter.108 [ ブロック崩しゲーム3:ベクトルとは ]
    Chapter.109 [ ブロック崩しゲーム4:変数や定数の宣言 ]
    Chapter.110 [ ブロック崩しゲーム5:初期化処理の実装 ]
    Chapter.111 [ ブロック崩しゲーム6:ブロックの配置 ]
    Chapter.112 [ ブロック崩しゲーム7:根幹処理とバーの処理 ]
    Chapter.113 [ ブロック崩しゲーム8:線分と線分の交差を判定 ]
    Chapter.114 [ ブロック崩しゲーム9:線分同士の交点 ]
    Chapter.115 [ ブロック崩しゲーム10:ボールの処理 ]
    Chapter.116 [ ブロック崩しゲーム11:最終調整して完成へ ]
    Chapter.117 [ テキストファイル操作基礎 ]
    Chapter.118 [ テキストファイル操作:読み込み編 ]
    Chapter.119 [ テキストファイル操作:CSV読み込み編 ]
    Chapter.120 [ テキストファイル操作:様々な読込編 ]
    Chapter.121 [ テキストファイル操作:バイナリ編 ]
    Chapter.122 [ テキストファイル操作:暗号化編 ]
    Chapter.123 [ テキストファイル操作:復号化編 ]
    Chapter.124 [ クラスモジュールとは ]
    Chapter.125 [ クラスモジュール:メソッド編 ]
    Chapter.126 [ クラスモジュール:プロパティ編 ]
    Chapter.127 [ クラスモジュール:イベント拡張編 ]
    Chapter.128 [ クラスモジュール:イベント自作編 ]
    Chapter.129 [ APIによる描画処理1:ハンドル ]
    Chapter.130 [ APIによる描画処理2:デバイスコンテキスト ]
    Chapter.131 [ APIによる描画処理3:ペン オブジェクト ]
    Chapter.132 [ APIによる描画処理4:ブラシ オブジェクト ]
    Chapter.133 [ APIによる描画処理5:図形描画準備編 ]
    Chapter.134 [ APIによる描画処理6:図形描画実践編 ]
    Chapter.135 [ APIによる描画処理7:画像描画の仕組み編 ]
    Chapter.136 [ APIによる描画処理8:ビットブロック転送編 ]
    Chapter.137 [ APIによる描画処理9:ラスタオペレーション ]
    Chapter.138 [ APIによる描画処理10:マスク描画 概念編 ]
    Chapter.139 [ APIによる描画処理11:マスク描画 実践編 ]


    コードやVBAに関する質問などはサポート掲示板(別館)までお気軽にどうぞ。




fc2 seotool Excel VBA ゲーム プログラミング 講座

Counter

twitter


Shadow BBS - 影掲示板

VBA 関連書籍



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。