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

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

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



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


スポンサーサイト

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






Chapter.63 [ ラジアンの活用:円運動 ]

■ラジアンでなにするの?

前回の講座でラジアンがなんであるかを、なんとなく解説しました。数学的な話なので、私の説明も必ずしも正しくはないかもしれません。しかし、ラジアンは意味よりも使い方が大事です。難しい数学の話は実はどうでもよくて、ラジアンをどのように使えばどんなことができるのか、大切なのはそっちです。

今回は、ラジアンの活用法のひとつとして、簡単な円運動のプログラムを作ってみましょう。今回のサンプルを通して、なんとなくラジアンというものの感触を掴んでいただけたらと思います。


それでは、円運動とは、具体的にはどんな運動でしょう。

辞書に載っている、正確な意味での円運動がどのように表されているかはわかりませんが、今回の講座で取り扱う円運動とは、次のような運動のことを指します。

ある地点を中心として、円を描くように動くこと

です。

円には必ず中心があります。皆さん小学生のときにコンパスで円を描きましたよね。そのときのことを思い出してくださいね。

今回のプログラムでは、まず初めに原点となる中心部分を決めてやり、そこを中心とした円を描くような感じで、イメージコントロールを動かしてみます。


■フォームの準備

それではユーザーフォームの準備をしましょう。
とはいっても、イメージコントロールひとつとコマンドボタンがあれば十分です。

ball.gif

このボールの画像をイメージコントロールにロードして、円運動をさせてみましょう。ちなみにこの画像のサイズは36×36ピクセルです。

ユーザーフォームを新規に作成し、イメージコントロールをひとつ配置します。そのイメージコントロールに先ほどの画像をロードしておきましょう。
あとはスタートボタンの役割を果たすコマンドボタンを配置して、ユーザーフォームの準備は完了です。簡単ですね。

360.gif

こんなかんじです。


■サイン・コサイン

まず、今回のサンプルをすんなり理解するために、サインとコサインについて簡単に書きます。もちろん、数学的な意味よりも、わかりやすさを重視した文面ですので、細かい突っ込みはご勘弁を。

サインとコサインは、『sin・cos』と表されることが多いです。これは三角関数の勉強をすると出てきます。三角関数の話とかになると、非常に眠たくなりそうなので、ここではサインとコサインについて、ズバリ言ってしまいます。

サインとコサインとは、ズバリ、角度から求められる、縦横の移動量です。
これには、直角三角形を使って考えます。簡単ですから、ちょっとだけつまらない図形を眺めてみてください。

361.gif

ふたつの三角形が並んでいます。そして、『θ(シータ)』と書かれている部分の角度が異なっています。左側の三角形のθよりも、右側の三角形のθのほうが角度が小さくなっています。

するとどうでしょう、左側の三角形では、辺Aのほうが辺Bよりも長いですね。しかし、右側の三角形では逆に、辺Aのほうが辺Bよりも短くなっています。

このことから、θの角度が変わると、直角三角形の縦の幅と横の幅の比率が変わってくるということがわかりますね。
θの角度が広くなるほど、縦の幅が長くなります。逆に、θの角度が狭くなるほど横の幅が長くなります。

つまり、要約すると次のようになります。

ある点から、任意の方向への移動量を計算するためには、縦の計算にはsinを、横の計算にはcosを使えばよい

これです。これこそがサインとコサインの正体です。

ある地点から、任意の角度の方向へ移動したいとき、サインとコサインを使うことによって移動する量を求めることができるのです。先ほどの三角形で表すなら、θの部分がどのように変化しても、サインとコサインを使えば辺Aの長さと辺Bの長さがわかるのです。これはつまり、縦に移動する量と横に移動する量がサインとコサインの力で即座にわかるということなのです。これはすごい! ……ですよね?

どうですか、なんとなく理解できましたでしょうか?


■コードの記述

それでは実際にコードを記述しましょう。
サインとコサインの性質を頭に思い描きながら、コードを見て考えてみてくださいね。

'標準モジュールに記述

'API宣言
Declare Function GetTickCount Lib "kernel32" () As Long
Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Long)


'円運動プロシージャ
Sub RollBall()
    
    Dim Radian As Single 'ラジアン
    Dim Angle As Long '度数
    Dim X As Single '原点座標 横位置
    Dim Y As Single '原点座標 縦位置
    
    Dim R As Single '円運動の半径
    Dim FLG As Boolean 'ループ管理フラグ
    Dim C As Long 'カウンターとして使う
    Dim STIME As Long '同期処理を行うために使う
    
    Const PI As Single = 3.14159 '円周率
    
    
    X = 100 '①
    Y = 100
    
    R = 30 '②
    FLG = False
    C = 0
    
    Do Until FLG
        STIME = GetTickCount
        C = C + 5 '③
        Angle = C Mod 360 + 1 '④
        Radian = Angle * PI / 180 '⑤
        With UserForm1.Image1
            .Left = X + R * Cos(Radian) '⑥
            .Top = Y + R * Sin(Radian)
            .Left = .Left - .Width / 2
            .Top = .Top - .Height / 2
        End With
        DoEvents
        Do
            Sleep 1
        Loop Until GetTickCount - STIME > 30
    Loop
    
End Sub


'ここから下はフォームモジュールに記述

Private Sub CommandButton1_Click()

    Call RollBall
    
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    End
    
End Sub

使われている変数がかなり多いですが、赤い字で書かれているコメントをよく見て、各変数の役割をイメージしてください。

まずは①の部分から。
ここでは、円の中心の位置を決めています。 X には中心の横の位置が入ります。そして同様に、 Y には中心の縦の位置が入ります。

次に②。ここでは、円の半径を決めています。今回は30に設定していますが、この数値を大きくすれば円運動の軌跡も大きくなります。逆にここで設定する数値を小さくすれば、小さな円を描くようにボールが移動するようになります。

③の部分は、一見すると何をやっているのかわかりにくいかもしれません。
ここでは、カウンターの役割を果たす、変数 C の値をループするごとに増やしています。そして次の④の行を見てください。ここで、Mod演算子を使って度数を決めていますね。

Angle = C Mod 360 + 1

Mod演算とは、割り算の余りを求める計算方法でしたね。つまり、変数 C の値は常にループするごとに増え続けますが、変数 Angle に入る値は『1~360』の間におさまり続けます。
変数 C が1回のループでプラスされる量を増やすと、結果的に角度が早く変化します。ということはつまり、円運動のスピードが速くなります。今回は、5度ずつ動かしていますが、10度ずつ動かしたほうがボールの移動が速くなりますね。

ここまでで求めた角度を使って、ラジアンを求めているのが⑤ですね。前回の講座で載せた、度数からラジアンへの変換公式が出てきています。

そして、実際の座標を計算しているのが⑥の部分です。

.Left = X + R * Cos(Radian)
.Top = Y + R * Sin(Radian)

Sinという関数と、Cosという関数が使われています。これらの関数には、ラジアンでの角度を指定しますので、先ほど計算したラジアンを引数に渡しています。

そして、 X Y は円の中心を表す座標でしたね。そこに、サインやコサインを掛け算した半径をプラスします。こうすることで、座標(X,Y)を中心とした、半径(R)の円を描かせることができます。

円運動の計算

横位置を求めるには……
    中心の横位置 + 円の半径 * Cos(ラジアンでの角度)

縦位置を求めるには……
    中心の縦位置 + 円の半径 * Sin(ラジアンでの角度)



■まとめ

今回のサンプルでは、変数に格納する初期値を変更することで、様々な大きさの円を描かせることができます。

例えば、中心の座標を変更したり、描かれる円の大きさを変更したりすることができます。いろいろ値を変更して実行してみると、結構面白いのではないでしょうか。

サインやコサインは、数学的な話になるので非常にとっつきにくく感じます。ですが、今回解説した計算方法さえわかっていれば、あまり突っ込んだ数学的知識はなくても、円運動を処理することができるはずです。

前回のラジアンに関する解説と、今回のサイン・コサインに関する解説を両方理解できれば、数学的なことはよくわからなくても、とりあえず何とかなります。これをどう活用していくのかは、皆さんのセンス次第ということになるでしょう。

別館よりサンプルがダウンロードできますので、実際にどう動くのか興味のある人はそちらを参考に。


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



■格言

サインとコサインは意味よりも
使い方を知ることが大切


ラジアンのときもそうですが、意味を理解するより、使い方をマスターするほうが得です。

関連記事






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