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

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

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



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


スポンサーサイト

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






Chapter.56 [ シューティングゲーム16:スコアの表示 ]

■いまさら基本的な部分

シューティングゲームの講座も、そろそろ終わりが見えてきました。

基本的な部分がだいぶ完成して、あとはスコアとタイトルの実装、そして、ボスの登場にてフィニッシュです。あと少し、根気を出してがんばってほしいと思います。

さて、今回のテーマは『スコア』です。
『スコア』の実装は非常に簡単です。さっくり実装させてしまいましょう。
スコアの表示には、変数をひとつ加える必要があります。この変数にスコアの状態を保持しておき、ループするごとに画面を更新すればいいのです。

Public Score As Long 'ゲームのスコア

この変数Scoreに、現在のスコアの状態を保持します。そして、当然のことながら敵キャラクターを破壊したときに、この変数に得点をプラスしていきます。ということは、どのプロシージャを修正すればいいのかわかりますね?

敵キャラクターが破壊されるかどうか、それを判定しているのは『プレイヤーのショット移動管理プロシージャ』です。プレイヤーキャラクターが放ったショットが、敵キャラクターにヒットしていた場合には、その時点で敵キャラクターが破壊されます。このとき、同時にスコアをプラスすれば、それだけでスコアの実装はほとんど完成したといってもいいでしょう。

'ショット移動管理プロシージャ

Sub P_Shot_Action()

    Dim L As Long
    Dim LL As Long

    For L = 0 To 4
        With P_Shot_Data(L)
            If .Vis Then
                .Y = .Y - 6
                If .Y < -5 Then .Vis = False
                For LL = 0 To 9
                    If Enemy_Data(LL).Lif > 0 Then
                        If .X - 2 < Enemy_Data(LL).X + Enemy_Data(LL).W Then
                            If .X + 2 > Enemy_Data(LL).X - Enemy_Data(LL).W Then
                                If .Y - 2 < Enemy_Data(LL).Y + Enemy_Data(LL).H Then
                                    If .Y + 2 > Enemy_Data(LL).Y - Enemy_Data(LL).H Then
                                        .Vis = False
                                        With Enemy_Data(LL)
                                            Call Burst_Begin(.X, .Y)
                                            .Lif = 0
                                        End With
                                        Score = Score + 100
                                        Exit For
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
                With UserForm1.Controls("P_Shot" & L + 1)
                    If P_Shot_Data(L).Vis Then
                        .Left = P_Shot_Data(L).X - Shot_Size
                        .Top = P_Shot_Data(L).Y - Shot_Size
                    Else
                        .Visible = False
                    End If
                End With
            End If
        End With
    Next

End Sub

はい、こんだけ。簡単ですね。
今回は敵キャラクターを1体破壊するごとに、100点入るようにしました。これは自由に変更すればいいでしょう。

ショット移動管理プロシージャに関しては、本当にこれだけです。敵キャラクターとの衝突判定を行い、衝突していた場合には敵キャラクターを破壊しますが、それと同時に変数Scoreを加算しているだけです。

さて、まさかこれで完了ではありません。
油断せずに次に行きましょう。


■初期化処理を修正

スコアは、ゲームが開始されるときにはリセットされていないとおかしいですね。前回のプレイ時に稼いだスコアが、そのまま次に残ってしまっていては変です。
そこで、初期化処理はしっかりやっておきましょう。

初期化処理を担当するプロシージャ、『Init』を変更します。

'初期化を担当するプロシージャ

Sub Init()
    With Player_Data
        .X = 100
        .Y = 210
        .W = 3
        .H = 3
        .Lif = 1
        .Typ = 0
        .Par = 1
    End With
    Erase P_Shot_Data
    Erase E_Shot_Data
    Erase Enemy_Data
    Erase Burst_Data
    Shot_Interval = 0
    Total_Count = 0
    Player_Stock = 2
    Score = 0
    With UserForm1.Player
        .Visible = True
        .Top = 200
    End With
    UserForm1.Lab_Score.Caption = "00000000"
End Sub

変数Scoreには0を設定しておきます。これは説明不要ですね。

そして、注目すべきはその下です。
ユーザーフォームの上段に配置している、スコア表示のためのラベルが『Lab_Score』です。一番最初の頃に配置したものなので、忘れてしまった方もいるかもしれませんね。

このラベルは、ゲーム中にスコアを表示するために使います。そして、ラベルに表示される文字列を管理するプロパティが『Captionプロパティ』です。このプロパティは既に何度か出てきていますね。ここにも初期値となる値を設定しておきます。
ポイントは、Captionプロパティには文字列を設定する、ということです。
上のコードを見てもらえればわかると思いますが、ダブルクォーテーション( コレ ⇒ " )で囲んでいますよね。つまり、数値のデータとしての0ではなく、文字列の『 00000000 』を設定しているわけですね。

補足コラム:Captionプロパティ

Captionプロパティは、ラベルなどのコントロールに文字列を表示するプロパティです。このプロパティに何かしらの文字列を設定していると、その内容がコントロール上に文字として表示されます。
ちなみに、ラベル、及びコマンドボタンなどでは、Captionプロパティに設定された文字列がコントロール上にそのまま表示されますが、コントロールの種類によっては、文字列が表示される位置がそれぞれに異なります。

ラベルなど
フレーム
マルチページなど
320.gif
321.gif
322.gif

これらの違いをよく理解しておきましょう。


■ゲーム中の更新処理

ゲームが実際に始まったら、スコアはリアルタイムに更新する必要があります。そこで、ここではメインプロセスを管理しているプロシージャを修正することになります。

ここも、実際のコードを載せますのでまずは見てみてください。

'メインプロセスを担当するプロシージャ

Sub Main()

    Dim Flg As Boolean
    Dim Stm As Long
    
    Call Init
    
    Flg = False
    
    Do Until Flg
        Stm = GetTickCount
        Total_Count = Total_Count + 1
        Call Stage_Count
        Call Player_Action
        Call P_Shot_Action
        Call Enemy_Action
        Call E_Shot_Action
        Call Burst_Action
        UserForm1.Lab_Score.Caption = Format(Score, "00000000")
        DoEvents
        Do
            Call Sleep(1)
        Loop Until GetTickCount - Stm > 30
        If GetAsyncKeyState(Esc_Key) < 0 Then Flg = True
    Loop
    
End Sub

さて、ここでポイントとなるのがFormat関数です。

この関数は、文字列を整形してくれる関数で、主に日付や時刻の表示に関する機能が充実しています。同じ日付でも『2008/03/16』と表記したい場合と『Mar 16 2008』と表記したい場合などがあると思います。このような表示形式の違いなどを自由に整形することができるわけです。
さらに、この関数では日付や時刻以外にも、文字列を様々な形式に整形することができます。
細かい使い方を全部説明してしまうと、それだけでひとつの講座ができてしまうぐらいのボリュームになってしまうので、興味のある方は自力でヘルプを見てみるなり、ネットで検索するなりして調べてください。

今回は、スコアの数値を整形するためにFormat関数を利用しています。ここを少し詳しく解説しましょう。

まず、先ほどのコードから、Format関数を使っている部分を抜き出してもう一度見てみましょう。

UserForm1.Lab_Score.Caption = Format(Score, "00000000")

スコア表示用のラベルに、整形した文字列を設定している部分ですね。
Format関数は、第一引数として与えられたデータを、第二引数の書式で整形して、結果を返してくれます。

今回は、第一引数に、スコアの値を保持している変数Scoreを指定しています。そして、第二引数には、『 "00000000" 』と指定されています。
仮に、変数Scoreの値が『 1000 』だった場合には、Format関数は『 00001000 』という文字列を返してきます。変数Scoreが『 543210 』だったら『 00543210 』を返してきます。

もうおわかりですね?
Format関数の第二引数で8桁の数値という書式を指定しているので、変数Scoreの値が何桁の数値であっても、必ず8桁の文字列に整形されているわけです。

シューティングゲームなどのスコア表示では、どんなにスコアが少ないときでも、足りない桁数の部分は0で埋まっていることが多いですよね。
Format関数をうまく使うことによって、簡単にこれが実現できるというわけです。この関数は、戻り値として内部的な文字列型を返してくるので、Captionプロパティとの相性もいいのです。


先ほども書きましたが、Format関数は実に奥が深くて、そんな使い方があるのか! とつい言いたくなるようなことができたりします。一度調べてみることをオススメします。わからないことはとりあえず調べてみる、これはプログラマーには欠かせない習性のひとつと言っていいでしょう。
この講座では解説しませんが、調べるといろんなことがわかると思いますので、興味のあるかたはがんばって調べてみましょうね。

スコアについては簡単ですがこれで完了です。全体のコードは載せませんが、色つきの部分を追加してやれば、それだけでうまくいくようになっているはずです。
次回はタイトル画面を作ります。お楽しみに。


■格言

Captionには文字列を指定する
Format関数を有効に利用


スコアだけでなく、タイムを表示したい場合などにも応用できます。
関連記事






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