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

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

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



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


スポンサーサイト

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






Chapter.31 [ API補足知識 ]

■前回からの続き

前回は、APIについて簡単に解説しました。
その中でSleep関数という、APIを紹介しましたね。

APIについて、できる限り簡単にわかりやすくしようとした結果、前回は最低限のことだけの解説になってしまっています。もう少しだけ、今回の講座を使って補足の解説をします。
とりあえず知らなくてもいいことではありますが、知っておいたほうが有利です。もし、今回の講座を読んでみて、一度で理解できなくても心配要りません。講座がもっと進んでから、あとで読み直してみてもいいと思います。とにかく、気負いすぎて、プログラミングが嫌いにならないでくださいね。


さて、APIは、使うために事前に準備が必要だということは、前回解説しましたね。
具体的には、モジュールの先頭部分に、APIを使うということを、宣言するコードを記述する必要がありました。それが以下のコードでしたね。

Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Long)


まずは、これについて詳しく見ていきましょう。

コードの最初の部分を見てください。
Declare』という記述があります。
これをVBAのヘルプで調べてみると、次のように書かれていました。

ダイナミック リンク ライブラリ (DLL) の外部プロシージャへの参照を宣言します。モジュール レベルで使います。

う~ん、よくわかりませんね。
これはどういうことなのでしょう。

APIは、ウィンドウズに始めから含まれています。具体的にはウィンドウズがインストールされているドライブ(普通はCドライブです)内にある、『WINDOWS\system32』という階層に、拡張子『.DLL』のファイルとして入っています。(WindowsNT以降の場合)

このDLLファイルというのは、C言語などで記述されたプログラムを、コンパイルして出来上がるバイナリファイルです。
わかりやすく言うと、関数(機能)の集合体です。
考え方としては、コードの書かれたモジュールを、そのままファイルとして保存してあるような形です。

じゃんけんゲームを作成したときを思い出してみてください。
フォームのコマンドボタンがクリックされたときに、標準モジュール内にあるサブプロシージャを呼び出すようにコーディングしましたよね。『Call』を使って、別のモジュールにあるサブプロシージャを呼び出していました。

APIを使うということは、このプロシージャを呼び出す、ということと全く同じです。
DLLファイルの中に入っているプロシージャを呼び出して、プログラミングに使ってしまおうというわけです。
ただし、さすがのVBAでも、得体の知れないDLLファイルから、関数を呼び出すことはできません。そこで『Declare』の出番です。

Declareステートメントは、○○というDLLの中にある○○という関数を使うよ! とVBAに教えてあげる役割を担っているのです。
これがわかると、なんとなくあの意味不明なコードも、少しだけ意味がわかってきませんか?

Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Long)

さて、問題のSleep関数のDeclare宣言部分をもう一度見てみましょう。

Declareに続いて、『Sub Sleep Lib "kernel32.dll"』と記述されています。
Sleep関数は、先ほどの『WINDOWS\system32』に入っている『kernel32.dll』に含まれている関数です。それをここでVBAに教えているのですね。
日本語訳してみると『kernel32.dllというDLLファイルに含まれている、Sleepという関数を使うよ!』っていう感じですね。

そして次には、括弧で囲まれた『ByVal dwMillsecounds As Long』という記述があります。ここで重要なのは最後の部分、『As Long』のところです。
引数として、Long型のデータを渡す必要があることがわかります。文字の『1』とか、小数点を含んだ『0.1』とか、整数ではないデータをSleep関数に使うことはできないのですね。

APIの種類によって、宣言文の形はいろいろあるのですが、基本的にはこれと同様なルールで全て記述されます。
原則として、使いたいAPIの宣言文を調べて、それをそのままコピーするだけでいいので、宣言文のコードを書き換えたりする必要はありません。というか、書き換えてしまうと、正しく動作しません。大文字と小文字などの違いも、基本的に許されません。一字一句間違えずに記述する必要があります。
ですから、大抵はコピーしてしまうのが一番確実で、簡単です。

自分が使いたいAPIの宣言文さえ見つかれば、それをコピーして貼り付けるだけでAPIを使うことができるのですね。簡単、簡単。

ただし、引数の型の問題など、宣言文の意味を知っていることでわかることもあるので、参考までに解説しました。APIは、引数のデータ型を間違えてエラーや問題が発生する場合が多いですのでね。


■そこでSleep関数登場

さぁ、少し難しい内容ですが、ついてこれているでしょうか。

APIは、ウィンドウズにとって非常に重要な役割を果たしています。普段は意識せずとも、常に皆さんがパソコンを操作するときに、影で活躍しているのです。
そんな縁の下の力持ちであるAPIのひとつ、Sleep関数について、もう少し詳しく解説しましょう。

Sleep:

構文
    Sleep 処理を止めたい時間
説明
    処理を止めたい時間をミリ秒で指定する
    引数はLong型、つまり整数で指定する

先ほども書いたように、Sleep関数は、引数として整数型のデータを必要とします。これが実は結構重要。

厳密に言うと、Sleep関数は小数点以下の数値が含まれたデータや、文字列の数字など、本来整数ではないデータを渡しても、場合によってはエラーを起こしません。
しかし、この引数の型の問題は、しっかりプログラマーのほうで意識しておかなくてはいけません。

全てのAPIが、Sleep関数のように、データ型の違いを吸収して正しく動くとは限りません。あらかじめ、引数の型をしっかりと把握しておき、正しく指定するようにしましょう。
今後、様々なAPIを扱うことになると思いますが、これは非常に大事なことなので忘れないようにしてくださいね。

次に、具体的なSleep関数の機能について考えてみます。
これに関しては、少しだけ難しい話なので、わからない人は、無理に理解する必要はありません。興味がある人は、ちょっと我慢して次の項を読んでみてください。


■マルチスレッドとSleep関数

ウィンドウズは、マルチスレッドという仕組みを持っています。これは、一度に複数のプログラムが動くことができる仕組み、というのが一番わかりやすいのではないかと思います。
この仕組みがあるおかげで、例えばWord(ワード)とExcelを同時に起動したとしても、問題が発生することはありません。
また、ウィンドウズメディアプレーヤーなどで音楽を再生しながら、テキストエディタで文章を編集することも、全く問題なくできますね。これも、このマルチスレッドという仕組みのおかげです。

その他にも、コンピューターウィルスの侵入がないかを監視するセキュリティソフトなどは、このマルチスレッドがないと、あまり役に立たなくなります。
なぜなら、インターネットを閲覧するために、そのためのソフトが起動している必要があるからですね。複数のプログラムが同時に動けないとなると、インターネットを見ながら、同時にウィルスをチェックすることはできなくなってしまうわけです。

このように、ウィンドウズがマルチスレッドという仕組みで管理されていることにより、ユーザーは快適に、わかりやすく、安全なパソコンライフを満喫できるわけですね。

この仕組みをもう少し理解するために、ひとつソフトを紹介したいと思います。

ウィンドウズには、『タスクマネージャ』というソフトが標準で入っています。おそらく、ウィンドウズをお使いの皆さんのパソコンにも、入っているはずです。
タスクバー上で、右クリックすると表示される、コンテキストメニューから起動することができます。

160.gif

このタスクマネージャ、ウィンドウズが今どんなソフトを起動しているのかや、メモリの状態など、様々な情報を教えてくれる便利なソフトです。
タスクマネージャを起動して、『パフォーマンス』の項目を選択すると、CPUがどのような状態なのかグラフで表示され、視覚的にCPUの現在の状態や履歴を確認することができます。

161.gif

ゲームなどの重たい処理を行っているときには、CPUの使用率が高くなるのが目に見えてわかります。一生懸命パソコンが考えているのが見ていてわかるので、なんだかちょっと面白いです。

VBAがコードを実行している間は、CPUが可能な限りフルパワーで使われています。その証拠に、繰り返し処理などの最中に、タスクマネージャーを起動していると、こんな感じになります。

162.gif

CPU使用率が100%になってますね。
パソコンが、できる限りの力を出して、処理を行っているのがわかります。
実はSleep関数は、こんなときに活躍してくれるのです。

人間も、全速力で走り続けたら、いつかは限界が来ます。パソコンだって同じです。
パワー全開で処理を続けることは、あまりパソコンにとって優しくありません。何時間もほったらかしにしておいたら、きっといつか壊れてしまうでしょう。
Sleep関数は、呼び出されると同時に、引数で指定された時間だけ、現在の処理を中断します。その間、CPUは、他の処理を行ったり、休憩(ちょっと語弊がありますが)を行うことができます。難しい言葉で表すと、スレッドを中断させるわけです。

ですから、繰り返し処理の最中などに、Sleep関数を呼び出すことにより、パソコンに『これだけの時間、他のことをやったり、休んだりしててもいいよ』と命令することができるのです。
ウィンドウズはマルチスレッドです。できるだけ、ひとつのプログラムが処理をひとりじめしないようにしたほうが、パソコンには優しいのです。Sleep関数が、現在のスレッドを中断するということは、VBAの処理の最中に、そのスレッドを中断して他のスレッドに処理を分け与えるということなのですね。

処理を停止する時間をミリ秒単位で指定する、というのは、実はこういうことだったのです。
Sleepは『眠る』という意味ですから、なんとなくわかりやすいですね。

内容的にかなり難しい話でしたが、なんだか自分の説明が不足しているような気がするので、理解できなかったらすいません。


■まとめ

いやぁ、かなり長いテキストになってしまいました。しかも難しい話ばかりで、ちょっと疲れてしまったかもしれません。

今回の講座で大事なことは、APIの宣言文の意味、特に引数についての理解です。
APIは便利ですが、その分、扱いが難しく、予期せぬ結果を招きやすいです。引数の型の問題は、結構よく起こる問題のひとつだと思いますので、しっかり理解しておいて下さい。

途中、マルチスレッドの話など、ちょっと難解な内容が出てきましたね。この辺のことは、私も実際よくわかっていないので、専門的な知識を持った方から見ると、語弊や間違いがあるかもしれません。
そういったときには、ご連絡をいただけると助かります。私自身、まだまだ勉強中の身です。皆さんも、諦めずに、プログラミングに取り組んでくださいね。


■格言

Sleep関数の引数には整数型
パソコンに負荷をかけすぎないためにSleep関数を活用


ゲームは一般に処理が重いですからSleepは重要です。
関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)
このコメントは管理人のみ閲覧できます
  • #
  • 2009.12.12(Sat)
  • Edit

メールフォーム

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

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

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

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。