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

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

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



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


スポンサーサイト

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






Chapter.136 [ APIによる描画処理8:ビットブロック転送編 ]

■画像を転送せよ

前回の講座では、API によって画像を描画する仕組みについて、ざっくりとですが解説しました。今回は、実際にコードを掲載しつつ、描画が行なわれるところまでをきっちりと解説します。

前回、ビットブロック転送という言葉についても解説しましたね。デバイスコンテキストから、別のデバイスコンテキストに対してビットマップを転送すること、それこそがビットブロック転送に他なりません。そして、ビットブロック転送を実現するための API が BitBlt 関数だということも解説しました。

今回は実際に BitBlt 関数を使ってビットブロック転送を行なうところまでやりますが、そのためには様々な事前準備が必要になります。毎度のことながら、API を用いる際にはこの事前の準備が非常に面倒なのですが、こればっかりはどうしようもないことですので、焦らずじっくり、取り組んでいきましょう。

さて、前回の講座でも解説しましたが、ビットマップオブジェクトは、デバイスコンテキストに含まれるオブジェクトの一種です。ペンやブラシと同じように、デバイスコンテキストに選択させることで利用できます。
ペンやブラシがそうであったように、ビットマップもまた、SelectObject 関数によって選択させて利用するわけですね。

また、何度も書いているように、ビットブロック転送はデバイスコンテキストからデバイスコンテキストへの転送を行なう処理になりますので、ユーザーフォームのデバイスコンテキストのほかに、別のデバイスコンテキストを自前で用意しなければなりません。
というわけで、まずは自前のデバイスコンテキストを用意するところから、解説していくことにしましょう。


■メモリデバイスコンテキストを生成する

デバイスコンテキストを自前で用意するには、それ専用の API である CreateCompatibleDC 関数を使います。
この関数は、引数に、元となるデバイスコンテキストのハンドルを必要とします。これはどういうことかと言うと、デバイスコンテキストと一口に言っても、その実行環境によって様々な性能の差が起こる可能性が考えられます。そこで、元となるデバイスコンテキストを引数として渡すことによって、それと互換性のある同等のデバイスコンテキストを生成させるようにするわけです。

ユーザーフォームのデバイスコンテキストを取得しておき、それを引数として渡すことによって、それと同等の(それと互換性のある)デバイスコンテキストを生成することができるので、結果としてその後の処理で不具合が起こらないようにすることができるわけです。

また、この CreateCompatibleDC 関数によって生成されるデバイスコンテキストは、一般に『 メモリデバイスコンテキスト 』と呼ばれます。これは、メモリ上にのみ存在するデバイスコンテキストだから、というそのまんまの理由です。

さておき、実際に CreateCompatibleDC 関数の宣言文を見てみましょう。

Declare Function CreateCompatibleDC Lib "gdi32" _
(ByVal hdc As Long) As Long

上記の hdc という引数の部分に、ユーザーフォームのデバイスコンテキストのハンドルを渡します。戻り値として返されてくるのが、新しく生成されたメモリデバイスコンテキストのハンドルになります。

ここで生成されたメモリデバイスコンテキストは、ビットマップを選択させた状態にしないと描画処理には利用できませんので注意しましょう。また、メモリデバイスコンテキストが必要なくなったときには、DeleteDC 関数を使って解放しなければなりません。

Declare Function DeleteDC Lib "gdi32" _
(ByVal hdc As Long) As Long

DeleteDC 関数の引数には、解放したいメモリデバイスコンテキストのハンドルを渡します。

ここで注意してほしい点が一点あります。
前回までの講座で、ReleaseDC 関数を使っていたのを憶えているでしょうか。ReleaseDC 関数と DeleteDC 関数は非常に似ていますが、全く別の関数です。
既存のデバイスコンテキスト、つまり、ユーザーフォームのデバイスコンテキストを解放するのが ReleaseDC 関数。自前で生成したメモリデバイスコンテキストを解放するのが DeleteDC 関数です。非常にややこしいですが、どちらも必ずプログラムの終了前に正しく実行する必要がありますので、注意しましょう。


■ビットマップの生成

ビットマップを生成するには、いくつかの方法があります。
それらの複数の方法のうち、比較的利用する頻度が高い方法として、ふたつの方法があります。
具体的には、先ほどのメモリデバイスコンテキストと同じように、ビットマップオブジェクトをメモリ上に単体で生成する方法と、画像ファイルからデータを読み込むと同時にビットマップオブジェクトとして生成してしまう方法のふたつです。

まず、メモリデバイスコンテキストのときと同じように、メモリ上にビットマップだけを生成する方法から見てみましょう。これには、 CreateCompatibleBitmap 関数を使います。

Declare Function CreateCompatibleBitmap Lib "gdi32" _
(ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long

引数をよく見てみればわかりますが、この関数もまたデバイスコンテキストのハンドルを引数として受け取ります。メモリデバイスコンテキストのときと同じように、互換性をとるためにこのような仕様になっているわけですね。

ですから、この CreateCompatibleBitmap 関数を利用する際には、必ず元となるユーザーフォームのデバイスコンテキストのハンドルを渡すようにしましょう。
また、第二引数と第三引数には、それぞれ生成するビットマップの幅と高さを指定します。単位はピクセルです。どの程度のサイズの画像を扱いたいのかによって、これらの幅や高さなどは適宜調節する必要があります。


さて、次に画像ファイルから直接ビットマップオブジェクトを生成する方法を見てみましょう。この場合には、LoadImage 関数という API を利用します。

Declare Function LoadImage Lib "user32" Alias "LoadImageA" _
(ByVal hinst As Long, _
ByVal lpsz As String, _
ByVal un1 As Long, _
ByVal n1 As Long, _
ByVal n2 As Long, _
ByVal un2 As Long) As Long

この関数も非常に引数が多くて、なんじゃこりゃとなってしまいがちですが、ここはもう決め打ちで使い方を覚えてしまったほうが簡単です。

ハッキリと言います。
第二引数は、引数の型が String 型になっていますね。ここに、読み込みたい画像ファイルのパスを渡します。
また、第六引数には、数値の 16 を指定します。
そして、それ以外の引数には、全て数値の 0 を指定します。

この LoadImage という関数は非常に多機能な関数で、いろいろな機能が搭載されています。その分、引数の数も、それらが持つ意味も、非常に多岐に渡っており、とても難解な内容となっています。
実際に API の描画処理で、画像ファイルを読み込んで利用する用途であれば、上で書いたように特定の引数にだけ気をつければ、あとはまったく同じように指定してしまって問題ありません。

例えば、次のようにすればいいわけですね。

Dim BMP As Long
BMP = LoadImage(0, ファイルのパス, 0, 0, 0, 16)

はい、簡単ですね。
この関数の使い方に関しては、細かいことはさておき、使い方を覚えてしまったほうが得です。もし、どうしても気になるという人は、MSDN などで調べてみるといいでしょう。調べなければよかったとゲンナリすること請け合いです。

とまぁ冗談はさておき、ビットマップオブジェクトを生成することについては、まずはこの二種類の方法さえ知っていれば、現段階ではまったく問題ありません。今後、講座を進めていくうちに、別のビットマップ生成関連 API を紹介することもあるでしょうが、まずはこの二種類の方法をしっかり理解しておいてください。

生成したビットマップは、その生成方法がどのような方法であったにせよ、必要なくなった時点で必ず解放しなければなりません。これには、ペンやブラシのときに使ったのと同じ DeleteObject 関数を使います。
この API については以前にも詳しく解説していますので、ここでは割愛しますが、必ず最後に解放しなければならない点だけは、漏れのないように注意しましょう。



■ビットブロック転送のラスタオペレーション

さて、前回の講座でも登場した BitBlt 関数についても、さらに補足します。まずは、こちらも宣言文から見ていきます。

Declare Function BitBlt Lib "gdi32" _
(ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long) As Long

それぞれの引数の詳細については、前回の記事で載せましたのでそちらを見ていただくとして、今回解説するのは最後の引数に指定するラスタオペレーションについてです。

ラスタオペレーションとは、簡単に言ってしまうと、ビットブロック転送をどのようなルールで行なうかを定義するための要素です。
単純にコピーして転送するのか、それとも特殊な効果を与えて転送するのか、ラスタオペレーションを使えば様々な転送方法が指定できます。

そして、このラスタオペレーションには、たくさんの種類があります。それらのひとつひとつについてこの場で解説してしまうと、ものすごく膨大な文章量になってしまいますので、今回だけは、我慢してひとつだけ覚えてください。

Public Const SRCCOPY = &HCC0020

はい、これです。

これは、Const が登場していることからもわかるとおり、定数を宣言しているコードですね。そしてこの SRCCOPY という定数は、全てをそのままコピーして転送するためのラスタオペレーションを定義するものです。

BitBlt 関数を実際に利用する際には、最後の引数にこの SRCCOPY を指定して実行します。そうすることで、ビットマップがそのままなんの加工もされることなく、単純にコピーされて転送されることになるわけです。

まずは、普通にそのまま転送する処理をマスターしてください。そのあと、順を追ってその他のラスタオペレーションについても解説していきますので、楽しみにしていてください。


■実際にコードを記述していく

さて、ここから実際にコードを記述していきますが、API 関連の処理ではお馴染みの大量の宣言文なども含まれるため、これから掲載するコードはすごく膨大に見えてしまうかもしれません。気後れすることなく、じっくり見ていってください。

それではまず、標準モジュールに記述するコードからです。

'■各種宣言文
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function GetDC Lib "user32.dll" _
(ByVal hwnd As Long) As Long

Declare Function DeleteDC Lib "gdi32" _
(ByVal hdc As Long) As Long

Declare Function ReleaseDC Lib "user32.dll" _
(ByVal hwnd As Long, ByVal hdc As Long) As Long

Declare Function SelectObject Lib "gdi32.dll" _
(ByVal hdc As Long, ByVal hgdiobj As Long) As Long

Declare Function DeleteObject Lib "gdi32.dll" _
(ByVal hObject As Long) As Long

Declare Function CreateCompatibleDC Lib "gdi32" _
(ByVal hdc As Long) As Long

Declare Function LoadImage Lib "user32" Alias "LoadImageA" _
(ByVal hinst As Long, _
ByVal lpsz As String, _
ByVal un1 As Long, _
ByVal n1 As Long, _
ByVal n2 As Long, _
ByVal un2 As Long) As Long

Declare Function BitBlt Lib "gdi32" _
(ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long) As Long

Public Const SRCCOPY = &HCC0020

Public hwnd As Long
Public hdc As Long
Public cDCObj As New Collection
Public cBMPObj As New Collection
Public hbufDC As Long
Public hbufBMP As Long

事前に宣言するものだけでもかなりの量がありますね。
各種 API に関しては、今回の講座も含めて既に解説したものしか登場していませんので、もしわからない部分がある場合には、過去の講座などを読み返してみてください。

今回の宣言文では、定数はひとつだけ宣言していますね。BitBlt 関数のラスタオペレーションである SRCCOPY がそれにあたります。

public で宣言している変数は、お馴染みのウィンドウハンドル格納用変数である hwnd や、ユーザーフォームのデバイスコンテキストハンドル格納用の hdc を始め、プログラムの終了処理の際にオブジェクトをまとめて解放するためのコレクションなどが宣言されています。

ペンやブラシのときにも同様のことをやりましたが、オブジェクトを大量に生成する可能性のあるプログラムの場合、コレクションをうまく活用することで解放処理が確実に、且つ、スムーズに行なえる場合があります。
今回は、メモリデバイスコンテキストと、ビットマップオブジェクトの、二種類のオブジェクト用にふたつのコレクションが宣言されています。cDCObj cBMPObj のふたつがそれですね。

さらに、今回はメモリデバイスコンテキストのハンドルを保持するための hbufDC と、そのデバイスコンテキストに割り当てるビットマップオブジェクトのハンドルを保持するための hbufBMP を宣言しています。

さて、続いては各種プロシージャを見ていきます。

'■各種プロシージャ

'ウィンドウハンドル取得用

Sub get_handle(w_caption As String)

    hwnd = FindWindow(vbNullString, w_caption)
    hdc = GetDC(hwnd)
    
End Sub

'各種オブジェクトの生成
Sub create_obj()

    hbufDC = CreateCompatibleDC(hdc) '①
    hbufBMP = LoadImage(0, ThisWorkbook.Path & "\test.bmp", 0, 0, 0, 16) '②
    cDCObj.Add hbufDC '③
    cBMPObj.Add hbufBMP '④
    SelectObject hbufDC, hbufBMP '⑤
    
End Sub

'ビットブロック転送
Sub blt_image()

    BitBlt hdc, 10, 10, 80, 80, hbufDC, 0, 0, SRCCOPY '⑥

End Sub

'終了処理
Sub release_obj()

    Dim v As Variant
    
    For Each v In cDCObj
        DeleteDC v
    Next
    For Each v In cBMPObj
        DeleteObject v
    Next
    
    ReleaseDC hwnd, hdc
    
End Sub

ウィンドウハンドルの取得と、終了処理に関しては、ここまで順番に講座を進めてきていればそれほど難しくないはずです。終了処理でもペンやブラシのときにやっていたことを、そのままメモリデバイスコンテキストとビットマップで行なっているだけですね。

わかりにくいのは、オブジェクトの生成と、ビットブロック転送の処理になると思いますので、そこは詳しく解説します。

①では、メモリデバイスコンテキストを新しく生成しています。変数 hbufDC にハンドルが格納されるようになっていますね。
②では、LoadImage 関数を使って、ファイルから画像データを読み込んでビットマップオブジェクトを生成しています。先ほども書いたように、この API は非常に引数が多いですが、第二引数にファイルのパス、そして最後の引数に数値の 16 を指定する以外は、全て数値の 0 を指定すれば OK です。
今回のケースでは、このコードが実行される Excel ブックと同じディレクトリに存在する test.bmp というファイルを読み込むように指定しています。

③と④では、生成したオブジェクトをコレクションに追加しています。
そして⑤の部分で、メモリデバイスコンテキストにビットマップを選択させています。ここではペンやブラシのときと同じように、SelectObject 関数を使っていますね。

さて、最後に⑥ですが、ここが今回最大の肝となる、ビットブロック転送を行なっているところですね。ここは若干ややこしいので、コードを再度掲載して、細かく見ていきましょう。

Sub blt_image()

    BitBlt hdc, 10, 10, 80, 80, hbufDC, 0, 0, SRCCOPY
           ①   ②  ③  ④  ⑤  ⑥      ⑦ ⑧ ⑨
End Sub

BitBlt 関数は非常に引数が多いのでわかりにくいですが、慣れてしまえばどうということはありません。
①が転送先のデバイスコンテキストのハンドルです。今回はユーザーフォーム上に画像を転送するわけですから、ここは hdc ですね。
②と③が、転送先の座標を指定する引数です。クライアント領域内の、どこに画像を転送するのか、ふたつの引数を使って指定します。②は左端からの距離、③は上端からの距離ですね。

④と⑤はどうでしょうか。
ここは、転送する幅と高さを指定します。今回のコードでは、幅と高さがそれぞれ 80 ピクセルの画像ファイルを読み込んで、そのデータをそのまま転送します。ですから、ここでは画像ファイルの大きさと全く同じ 80 という指定になっているわけですね。
仮に、大きな画像ファイルを読み込んで、一部分だけ転送したいという場合には、この幅と高さをうまく調節することで特定の部分だけを転送することも可能です。④が横幅で、⑤が高さになります。

続いて⑥には、転送する元データを保持しているデバイスコンテキストのハンドルが入ります。

⑦と⑧はどうでしょうか。ここでは、転送元となるデバイスコンテキストの転送座標を指定しています。これもやはり、⑦が横位置、⑧が縦位置です。

⑨には、ラスタオペレーションを指定しますが、今回はそのままコピーするという一番単純な処理を行ないますので、あらかじめ定数として宣言していた SRCCOPY が入っています。

今回のサンプルでは、以下の画像をビットマップオブジェクトに読み込んで、転送してみます。先ほども書いたように、この画像は幅と高さが 80 ピクセルです。(bmp形式のファイルがアップロードできないので、以下の画像はpng形式になっています)

802.png

そして、ユーザーフォームには、画像がちゃんと転送されているのかわかりやすいように、あらかじめ背景色を設定しておきます。

800.png

随分と長くなってしまいますが、最後にユーザーフォームのフォームモジュールに記述するコードを掲載します。これでコードは最後なので、もう少し踏ん張ってください。

Private Sub UserForm_Activate()

    get_handle Me.Caption
    create_obj
    
End Sub

Private Sub UserForm_Terminate()

    release_obj
    
End Sub

Private Sub UserForm_Click()

    blt_image
    
End Sub

はい、ここではさほど難しいことはやっていませんね。
理解しておいてほしいのは、今回も、前回までと同様に、ユーザーフォームのクリックイベントをトリガーとして、描画処理が行なわれるようになっているという部分くらいです。

それ以外の部分では、ハンドルを取得するプロシージャや、オブジェクトを生成するプロシージャ、あるいは終了処理のプロシージャを適宜呼び出しているだけですので、焦らず見ていけば理解できるはずです。



■まとめ

いやー、しかし随分と長文になりましたね。内容もてんこ盛りでしたが、理解できたでしょうか。

一度にかなりたくさんのことを書いたので、一発で理解することは難しいかもしれませんが、講座の最後にサンプルファイルへのリンクも張っておきますので、それらを活用しながらじっくり理解していっていただければと思います。

ちなみに、今回のサンプルを実行すると次のような感じになります。

・ユーザーフォームを表示
800.png



・クライアント領域のクリックで画像が転送される
801.png


たったこれだけのことをやるために、随分と膨大な準備が必要になるんですね。
しかし、何度も書いているように、API を使った処理というのはこういうものです。こればっかりは慣れるしかありませんし、基本となる部分が出来上がってしまえば、あとは継ぎ足しながらいろいろと拡張できます。

そして、この BitBlt 関数を使った描画処理の最大の利点として忘れてはならないのが、その高速な描画速度です。この素晴らしい恩恵を受けるためには、それなりに準備が必要だということで、割り切ってがんばりましょう。

ちなみにこれは余談ですが、DirectX はさらに速いです。恐いですね……。



サンプルダウンロード ⇒ コチラよりダウンロードできます。(別館)



■格言

メモリデバイスコンテキストやビットマップオブジェクトについて理解する
BitBlt関数の多数ある引数の意味を落ち着いて理解する


ついに高速描画の世界への入り口に立ちました。次回からは、ラスタオペレーションについてさらに詳細に見ていきます。
関連記事






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