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

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

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



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


スポンサーサイト

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






Chapter.116 [ ブロック崩しゲーム11:最終調整して完成へ ]

■こまかな調整

前回のボールの処理を実装できたら、あとはこまかい部分の調整をすればブロック崩しゲームがいよいよ完成します。

現在の状態では、まだボールを落としてしまったあとの処理や、ゲームオーバーの処理、ゲームクリア時の処理などが未実装となっています。ボールの処理だけを実装させても、それではまだブロック崩し全体の構造としては未完成なのですね。
今回は、これらの処理を行う小規模なプロシージャを作成し、ブロック崩しを完成させましょう。


■ブロックはあるのか

ブロック崩しのゲームクリア条件といえば、画面上のブロックが全て破壊されたかどうかというのがセオリーです。今回のブロック崩しも、これをクリアの条件として考えてみましょう。

画面上のブロックが全て消えているかどうか調べるには、ブロックひとつひとつを参照しながら、それぞれが表示されているかどうかを順番に調べていけばいいですね。これは繰り返し処理を行う For 文を使えば簡単そうですね。

Function Block_Check() As Boolean

    Dim L As Long
    Dim F As Boolean
    
    F = False '①
    
    For L = 1 To 25
        F = F Or Block(L).Vis '②
    Next
    
    Block_Check = F '③
    
End Function

この Block_Check というプロシージャは、ブロックが全て破壊されたかどうかを調べるためのプロシージャです。全部で25個あるブロックをひとつひとつ参照していき、それぞれが表示されているかどうかを調べています。

繰り返し処理の中では、「 F = F Or Block(L).Vis 」という具合に何かを行っていますね。変数 F は、Boolean 型の変数です。①で示すように、繰り返し処理の前にまず False を設定しておきます。そのあと、②の部分の繰り返し処理中に、Or 演算子をうまく使いながら各ブロックの表示状態を調べていきます。
Or 演算子を使って Boolean 型のデータを扱う場合には、比較対象となるどちらか一方だけでも True になっていれば、結果は True になります。最終的に③の部分で変数 F True だったとすると、少なくともひとつは表示されているブロックがあったことになります。

つまり、この Block_Check というプロシージャを呼び出したとき、結果が True だった場合には表示されているブロックが存在することになりますし、逆に結果が False だった場合には、ひとつも表示されているブロックが無かったということになります。

この仕組みを使えば、ブロックが現在画面上に存在しているのかどうかを調べることができますので、ゲームをクリアしているかどうか、それを明確に調べることができるのですね。


■メインループを完成させる

以前にメインループの雛形を載せたことがありましたね。その際には、まだまだパーツとなる各処理のプロシージャが完成していませんでした。
現状は全てのパーツが出揃っていますので、メインループを完成させましょう。

Sub main()

    Dim F As Boolean
    Dim Time_Count As Long
    
    Do Until F
    
        Time_Count = GetTickCount
        
        If Ball.Vis Then 'ボールが見えている場合の処理
            Bar_Move
            Ball_Move
            If Not Block_Check Then
                MsgBox "game_clear!!"
                F = True
            End If
        Else             'ボールが見えてない場合の処理
            MsgBox "out!"
            Spare = Spare - 1 'スペアをひとつ減らす
            If Spare >= 0 Then 'スペアの残数を調べる
                Init
                DoEvents
                Sleep 1000
            Else
                MsgBox "game over"
                F = True
            End If
        End If
        
        DoEvents
        
        Do
            Sleep 1
        Loop Until GetTickCount - Time_Count > 20
        
        If GetAsyncKeyState(90) Then F = True
        
    Loop
    
End Sub

ここで登場している変数 Spare は、初めて登場する変数です。
ただ、この変数はモジュールレベルで宣言しておく変数で、キーワード Public を使ってモジュールの宣言セクションで宣言する必要があります。

理由は簡単ですね。この変数 Spare は、ボールのスペアを管理する変数です。どのようなプロシージャからでも参照できるようにしておく必要がありますし、ゲームの開始から終了まで、常に値を保持しておく必要があります。
このような理由から、変数 Spare は宣言セクションで、グローバルな変数として宣言します。最後にコードの全文を掲載しますので、注意してみてくださいね。

また、スペアの数を画面上に表示するという部分を追加しますので、この時点でユーザーフォーム上にラベルコントロールを追加しています。ラベルコントロールの名前は Lab_spare とし、スタートボタンの役割を果たすコマンドボタンの隣に配置しています。

670.gif


■コード全文

以下に、今回のブロック崩しのコードを全文掲載します。
全体で見ると、そこそこ長いプログラムになっていますが、ボールの処理以外はそれほど大きなプロシージャはありません。

各処理ごとにこまかくプロシージャを作成しておくことで、わかりやすく、メンテナンスしやすい構造になります。超巨大なプロシージャを気合で作成するよりも、このようなかたちで目的別にプロシージャを細かく作成するほうが、様々な面で優れています。

プログラムの作成に不慣れなうちは、すべての処理をひとつのプロシージャ内でまとめてしまいがちです。しかし、これをやってしまうと何か不具合が発生した際に、その不具合がどこで発生しているものなのか特定しにくくなるだけでなく、修正を行ったら別の部分で不具合が発生してしまったりと、プロジェクト全体が連鎖的に駄目になることがあります。その点、細切れにプロシージャを作成しておくようにすれば、不具合はその都度、プロシージャ内のみで完結していることが多いので、メンテナンスも修正も非常に楽になります。

一見すると超巨大なプロジェクトに見えるかもしれませんが、実際は細かいパーツの組み合わせによって、最終的にひとつのゲームが完成しているかたちになっています。それぞれのプロシージャの役割や使い方をよく理解し、メンテナンス性の高いプロジェクトを作成するためのヒントにしてみてください。

'標準モジュールに記載
'API宣言
Declare Function GetTickCount Lib "kernel32" () As Long
Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Long
Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Long)


'構造体定義
Type Balls
    aX As Single
    aY As Single
    bX As Single
    bY As Single
    vX As Single
    vY As Single
    Sp As Single
    Vis As Boolean
End Type

Type Blocks
    X As Single
    Y As Single
    Vis As Boolean
End Type

Type Vector
    X As Single
    Y As Single
End Type


'変数宣言
Public Ball As Balls
Public Block(1 To 25) As Blocks
Public Bar As Vector
Public Spare As Long


'定数宣言
Const W_Field As Single = 250
Const H_Field As Single = 300
Const W_Ball As Single = 10
Const W_Block As Single = 50
Const H_Block As Single = 20
Const T_Block As Single = 20
Const W_Bar As Single = 48
Const H_Bar As Single = 12
Const T_Bar As Single = 280

Const PI As Single = 3.14159


'メインループ
Sub main()

    Dim F As Boolean
    Dim Time_Count As Long
    
    Do Until F
    
        Time_Count = GetTickCount
        
        If Ball.Vis Then
            Bar_Move
            Ball_Move
            If Not Block_Check Then
                MsgBox "game_clear!!"
                F = True
            End If
        Else
            MsgBox "out!"
            Spare = Spare - 1
            If Spare >= 0 Then
                Init
                DoEvents
                Sleep 1000
            Else
                MsgBox "game over"
                F = True
            End If
        End If
        
        DoEvents
        
        Do
            Sleep 1
        Loop Until GetTickCount - Time_Count > 20
        
        If GetAsyncKeyState(90) Then F = True
        
    Loop
    
End Sub


'初期化処理
Sub Init()

    Dim L As Long
    Dim S As Single
    
    Randomize
    
    With Ball
        L = Int(Rnd * 30) + 30
        S = L * PI / 180
        .aX = 0
        .aY = 0
        .bX = W_Field / 2
        .bY = T_Bar - W_Ball / 2
        .vX = Cos(S)
        .vY = Sin(S)
        .Sp = 3
        .Vis = True
        If Int(Rnd * 2) = 0 Then .vX = -.vX
    End With
    
    With Bar
        .X = W_Field / 2
        .Y = T_Bar + H_Bar / 2
    End With
    
    With UserForm1
        .Ima_bar.Left = (W_Field - W_Bar) / 2
        .Ima_bar.Top = T_Bar
        .Ima_ball.Left = (W_Field - W_Ball) / 2
        .Ima_ball.Top = T_Bar - W_Ball
        .Lab_spare.Caption = "Spare : " & Format(Spare, "00")
    End With
        
End Sub


'ブロックの初期化
Sub Init_Block(Stage As Long)

    Dim L As Long
    Dim LL As Long
    Dim Cell_Row As Long
    Dim Cell_Col As Long
    
    For L = 0 To 24
        With ThisWorkbook.Worksheets("map")
            Cell_Row = (Stage * 5 - 4) + (L \ 5)
            Cell_Col = (L Mod 5) + 1
            If .Cells(Cell_Row, Cell_Col).Value > 0 Then
                With Block(L + 1)
                    LL = L Mod 5
                    .X = (W_Block / 2) + (LL * W_Block)
                    LL = L \ 5
                    .Y = T_Block + (H_Block / 2) + (LL * H_Block)
                    .Vis = True
                    UserForm1.Controls("Label" & L + 1).Visible = True
                End With
            Else
                With Block(L + 1)
                    .Vis = False
                    UserForm1.Controls("Label" & L + 1).Visible = False
                End With
            End If
        End With
    Next

End Sub


'ボールの処理
Sub Ball_Move()

    Dim L As Long
    Dim S As Single
    Dim SS As Single
    Dim fX As Boolean
    Dim fY As Boolean
    Dim oX As Single
    Dim oY As Single
    Dim CP As Vector
    
    With Ball
        fX = False
        fY = False
        .aX = .bX + .vX * .Sp
        .aY = .bY + .vY * .Sp
        CP.X = .aX
        CP.Y = .aY
        If .aX < W_Ball / 2 Then
            fX = True
            CP = CrossPoint(.aX, .aY, _
                            .bX, .bY, _
                            W_Ball / 2, 0, _
                            W_Ball / 2, H_Field)
        End If
        If .aX > W_Field - W_Ball / 2 Then
            fX = True
            CP = CrossPoint(.aX, .aY, _
                            .bX, .bY, _
                            W_Field - W_Ball / 2, 0, _
                            W_Field - W_Ball / 2, H_Field)
        End If
        If .aY < W_Ball / 2 Then
            fY = True
            CP = CrossPoint(.aX, .aY, _
                            .bX, .bY, _
                            0, W_Ball / 2, _
                            W_Field, W_Ball / 2)
        End If
        If .aY > H_Field Then
            .Vis = False
        End If
        If .aY <= H_Field / 2 Then
            For L = 1 To 25
                If Block(L).Vis Then
                    If Not fX Then
                        SS = W_Ball / 2
                        fX = False
                        If .vX < 0 Then
                            S = Block(L).X + W_Block / 2
                            oX = S + SS
                        Else
                            S = Block(L).X - W_Block / 2
                            oX = S - SS
                        End If
                        fX = CrossLine(.aX, .aY, _
                                       .bX, .bY, _
                                       oX, Block(L).Y - H_Block / 2 - SS, _
                                       oX, Block(L).Y + H_Block / 2 + SS)
                        If fX Then
                            CP = CrossPoint(.aX, .aY, _
                                            .bX, .bY, _
                                            oX, Block(L).Y - H_Block / 2 - SS, _
                                            oX, Block(L).Y + H_Block / 2 + SS)
                            Block(L).Vis = False
                            If .Sp < 12.5 Then .Sp = .Sp + 0.5
                        End If
                    End If
                    If Not fY Then
                        SS = W_Ball / 2
                        fY = False
                        If .vY < 0 Then
                            S = Block(L).Y + H_Block / 2
                            oY = S + SS
                        Else
                            S = Block(L).Y - H_Block / 2
                            oY = S - SS
                        End If
                        fY = CrossLine(.aX, .aY, _
                                       .bX, .bY, _
                                       Block(L).X - W_Block / 2 - SS, oY, _
                                       Block(L).X + W_Block / 2 + SS, oY)
                        If fY Then
                            CP = CrossPoint(.aX, .aY, _
                                            .bX, .bY, _
                                            Block(L).X - W_Block / 2 - SS, oY, _
                                            Block(L).X + W_Block / 2 + SS, oY)
                            Block(L).Vis = False
                            If .Sp < 12.5 Then .Sp = .Sp + 0.5
                        End If
                    End If
                End If
                UserForm1.Controls("Label" & L).Visible = Block(L).Vis
            Next
            If fX Then
                .vX = -.vX
                .aX = CP.X
                .aY = CP.Y
            End If
            If fY Then
                .vY = -.vY
                .aX = CP.X
                .aY = CP.Y
            End If
        Else
            If .vY > 0 Then
                If Not fX And Not fY Then
                    SS = W_Ball / 2
                    fX = False
                    If .vX < 0 Then
                        S = Bar.X + W_Bar / 2
                        oX = S + SS
                    Else
                        S = Bar.X - W_Bar / 2
                        oX = S - SS
                    End If
                    fX = CrossLine(.aX, .aY, _
                                   .bX, .bY, _
                                   oX, Bar.Y - H_Bar / 2 - SS, _
                                   oX, Bar.Y + H_Bar / 2 + SS)
                    If fX Then
                        CP = CrossPoint(.aX, .aY, _
                                        .bX, .bY, _
                                        oX, Bar.Y - H_Bar / 2 - SS, _
                                        oX, Bar.Y + H_Bar / 2 + SS)
                    End If
                    fY = False
                    S = Bar.Y - H_Bar / 2
                    oY = S - SS
                    fY = CrossLine(.aX, .aY, _
                                   .bX, .bY, _
                                   Bar.X - W_Bar / 2 - SS, oY, _
                                   Bar.X + W_Bar / 2 + SS, oY)
                    If fY Then
                        CP = CrossPoint(.aX, .aY, _
                                        .bX, .bY, _
                                        Bar.X - W_Bar / 2 - SS, oY, _
                                        Bar.X + W_Bar / 2 + SS, oY)
                    End If
                End If
            End If
            If fX Then
                .vX = -.vX
                .aX = CP.X
                .aY = CP.Y
            End If
            If fY Then
                .vY = -.vY
                .aX = CP.X
                .aY = CP.Y
                S = Bar.X - W_Bar / 2
                SS = Bar.X + W_Bar / 2
                If .aX >= S Then
                    If .aX <= S + (W_Bar / 3) Then .vX = -Abs(.vX)
                End If
                If .aX <= SS Then
                    If .aX >= SS - (W_Bar / 3) Then .vX = Abs(.vX)
                End If
                If .aX > S + (W_Bar / 3) Then
                    If .aX < SS - (W_Bar / 3) Then .vY = -Abs(.vY) * 1.05
                End If
            End If
        End If
        If .aX < W_Ball / 2 Then .aX = W_Ball / 2
        If .aX > W_Field - W_Ball / 2 Then .aX = W_Field - W_Ball / 2
        If .aY < W_Ball / 2 Then .aY = W_Ball / 2
        .bX = .aX
        .bY = .aY
    End With
    
    With UserForm1
        .Ima_ball.Left = Ball.aX - W_Ball / 2
        .Ima_ball.Top = Ball.aY - W_Ball / 2
    End With
    
End Sub


'バーの処理
Sub Bar_Move()

    Dim S As Single
    
    With Bar
        If GetAsyncKeyState(37) Then .X = .X - 7.5
        S = W_Bar / 2
        If .X < S Then .X = S
        If GetAsyncKeyState(39) Then .X = .X + 7.5
        S = W_Field - W_Bar / 2
        If .X > S Then .X = S
    End With
    
    With UserForm1
        .Ima_bar.Left = Bar.X - W_Bar / 2
    End With
    
End Sub


'ブロックの可視チェック
Function Block_Check() As Boolean

    Dim L As Long
    Dim F As Boolean
    
    F = False
    
    For L = 1 To 25
        F = F Or Block(L).Vis
    Next
    
    Block_Check = F
    
End Function


'線分交差判定関数
Function CrossLine(x1 As Single, y1 As Single, _
                   x2 As Single, y2 As Single, _
                   x3 As Single, y3 As Single, _
                   x4 As Single, y4 As Single) As Boolean

    Dim Deno As Single
    Dim Nume1 As Single
    Dim Nume2 As Single
    Dim F1 As Boolean
    Dim F2 As Boolean
    Dim F3 As Boolean
    
    Deno = (x3 - x1) * (y4 - y1) - (y3 - y1) * (x4 - x1)
    
    If Deno = 0 Then
        F1 = (x3 - x1) * (x4 - x1) + (y3 - y1) * (y4 - y1) <= 0
        F2 = (x3 - x2) * (x4 - x2) + (y3 - y2) * (y4 - y2) <= 0
        F3 = (x1 - x3) * (x2 - x3) + (y1 - y3) * (y2 - y3) <= 0
        CrossLine = F1 Or F2 Or F3
    Else
        Nume1 = (y4 - y1) * (x2 - x1) - (x4 - x1) * (y2 - y1)
        Nume2 = (x3 - x1) * (y2 - y1) - (y3 - y1) * (x2 - x1)
        F1 = ((Nume1 + Nume2) / Deno >= 1)
        If Deno < 0 Then
            F2 = (Nume1 <= 0)
            F3 = (Nume2 <= 0)
        Else
            F2 = (Nume1 >= 0)
            F3 = (Nume2 >= 0)
        End If
        CrossLine = F1 And F2 And F3
    End If
    
End Function


'線分の交点座標計算関数
Function CrossPoint(x1 As Single, y1 As Single, _
                    x2 As Single, y2 As Single, _
                    x3 As Single, y3 As Single, _
                    x4 As Single, y4 As Single) As Vector
    
    Dim a1 As Single
    Dim a2 As Single
    Dim b1 As Single
    Dim b2 As Single
    Dim c1 As Single
    Dim c2 As Single
    
    a1 = y1 - y2
    a2 = y3 - y4
    b1 = x2 - x1
    b2 = x4 - x3
    c1 = x1 * y2 - x2 * y1
    c2 = x3 * y4 - x4 * y3
    
    CrossPoint.X = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1)
    CrossPoint.Y = (a1 * c2 - a2 * c1) / (a2 * b1 - a1 * b2)
                   
End Function


'以下はフォームモジュールに記載
'スタートボタンクリックイベント
Private Sub Com_start_Click()

    Com_start.Enabled = False
    
    Spare = 3
    
    Init
    
    Init_Block 1
    
    main
    
    Com_start.Enabled = True
    
End Sub


'ユーザーフォームイニシャライズイベント
Private Sub UserForm_Initialize()

    Init
    
    Init_Block 1
    
End Sub


'ユーザーフォームクエリクロースイベント
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    End
    
End Sub

さて、これにて長かったブロック崩しゲームの作成講座も終了です。
実際に動くサンプルを別館にてアップしてありますので、そちらも参考にしながらがんばってみてください。

今回のブロック崩しの大きなポイントとなるのは、ベクトルを用いた移動処理、線分を用いた交差判定と交点座標計算です。数学的な知識が必要となる部分ではありますが、要は使い方さえわかっていれば、様々なことに流用できますので便利です。

計算の中身がどのような理論になっているのかはともかく、プログラミングという意味ではまず動かしてみる、体感してみるということが大事です。難しい理論ばかりが先行してしまい、いつまでたってもプログラムが動かないというのは大変なストレスになります。意味はわからなくても、とりあえず思ったとおりに動かすことができた、という感覚が一番大事です。

わからないことが恥ずかしいのではなく、挑戦しないのがもったいないのです。たんなるコピープログラムであっても、それが自分なりに創意工夫した結果であれば、私はそれでいいのだと思っています。サンプルをいじりながら、自分なりに想像を膨らましてみてくださいね。

ちなみに、今回のブロック崩しゲームサンプルでは、バーのどこに当たったのかによってボールの跳ね返る方向が変わるようになっています。また、ボールが壁以外の場所に当たった際には少しだけボールの移動スピードがアップするようになっています。本来であれば、ボールが壁やブロックに当たった際に、ランダムでほんの少しだけ方向を変化させるほうがいいのですが、今回は簡易版のサンプルということで、そこまでは実装していません。まぁ、普通に遊べる形にはしっかりできていますので、ご安心ください。


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



■格言

難しいプログラムが偉いのではない
動かしてみて感動することが大切


やっとブロック崩しが完成しましたね。お疲れ様でした。

関連記事






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