一般的な質問(というか相談)です。
私、仕事でVB6を使って年数回、数百行のアプリを作っています。
趣味でもたまにアプリを使って100行前後のプログラム(静的なグラフィック
処理もの)を1年に1回程度作っています。
VB6は5、6年いじっているので基本的な動作については判っていますが、
クラスとかタイプとかインタフェースはコーディングした事がありません。
VB2005は齧ってみて、「ちょっと(かなり)面倒かな?」という感想を持っています。
さて、今度、趣味で簡単なゲームを作ろうと思うのですが、手馴れたVB6で
行くべきか、VB2005(もしくは2008)で行くべきか迷っています。
どっちもやればできる、という事は判っていますが、どちらの方がより作りやす
そうか、などというサジェスチョンを頂ければ助かります。
具体的な事を以下に書きます。
①内容は戦争シミュレーションで、数台の戦車同士が戦うものです。
昔なつかしボードシミュレーションゲームです。
②基本は人対人の対戦です。私に思考ルーチンを作る力が無いので多分
コンピュータがメインの戦略は立てない。つもりです。
ではなんで紙上でやらずにコンピュータ上でやるのか、PC上でやる意味は、
と言うと、ボード上のコマを動かすとか戦闘結果のサイコロを
ころがすのがドン臭いなーと思ったからですね。
あとは、紙上のものだと、片付けたりセットしたりに時間を取るので
その辺を簡略化するためにPC上でやろうと思い立った訳です。
よって、すごいプログラムにはしないつもりです(そんなにやる頭が無い)
③VB6でやりにくいと思った訳。(また現在までの経緯)
上記で書いたように、人間の指示で個々の戦車を動かしたり、
戦闘させたりしたい訳です。戦車の表示はピクチャボックス等で行う
にしても、概念としては戦車オブジェクト(みたいな物)として扱いたい
訳です。 例えば、戦車A、B、Cおのおのは自分の座標と最高時速を
知っていて、各戦車に対して人間が、Pという目標と「進め」指示を
あたえれば、自分の現在状況を戦車自体が判断して進んでいく、
というようにしたい訳です。
そうした事をする場合は、戦車がプロパティやメソッドやイベントを
もっていて、しかもピクチャボックスという表示も可能にしてやらなくて
はいけない訳です。
最初に考えたのは戦車をOCX化する事です。
しかし、VB6でプロトタイプを作ってみて、「親フォーム内のOCXの
現在座標はOCXから見れないし、制御もできない」(注1)という事で、
親のプログラムからOCX内のプロパティにセットしてやる、などと言う
本末転倒な事をさせる必要があると思い、VB6路線は一旦あきらめました。
次にVB2005にトライしてみました。入門書も買って勉強も始めました。
戦車のピクチャボックスにカスタムでイベントとかを実装すれば良いのかな?
と思って、まず、ピクチャボックスの配列を作るところから始めましたが、
なれていないので、それを作るのだけでも一苦労しています。
オブジェクト指向言語なので、多分上記の事はできるとは思うのですが・・・
まあ、勉強だと思ってやればいいんですが、やはり40台後半になると
なかなか頭に入ってきません。 そんなに凄いプログラムを書くつもりは
無いんで、VB6で書ければ楽でいいかなー、などと弱気になり・・
という事で、つらつらと書きましたが、注1に書いたような事とかはVB6の
テクニック(クラスとかインタフェースとか)を使い倒せば、なんとか
フツーに書けるのか、もしくはそれは逆に面倒臭いからVB2005(もしくは
2008)で素直にオブジェクト化した方がいいのか、ご意見を伺いたいと
思って書きました。
絶対的な回答は無いかと思いますが、皆さんのご意見お待ちしております。
(テクニック的な事も含めて)
オブジェクト指向な部分もご理解されているようですし
VB6でそこそこ組めるようなら、さほど.NETにしたから
といって問題ないと思われます。
VB2005でいいでしょう。がんばりましょうよ。
オブジェクト指向な部分もご理解されているようですし
VB6でそこそこ組めるようなら、さほど.NETにしたから
といって問題ないと思われます。
VB2005でいいでしょう。がんばりましょうよ。
> 概念としては戦車オブジェクト(みたいな物)として扱いたい訳です。
私であれば、このケースであれば VB2008 をお勧めしたいところです。
まず、PictureBoxから派生させた戦車クラスを作ります。
これだけで Left、Topという座標プロパティは持っていることになります。
最高時速も保持したいのであれば、Speed プロパティも足しておいてやります。
目標 P の座標も与えるのであれば、Point 型の LocationToTargetプロパティも
用意しておいてもいいかもしれません。
次に、戦車クラスの中に、目標 P に向かって自分の座標を再計算するGotoTarget
メソッドも作り込みます。
クラス内のメソッドは自分自身のプロパティを取得 / 設定できますので、
Me.Left += (Me.LocationToTarget.Left - Me.Left) / 10
(式はいいかげんです)
のように計算結果を格納してやると、戦車クラスの表示位置を変えてやることが
できます。
作成した戦車クラスを配列にするのであれば、親のFormの中で
Private 戦車インスタンス(10) As New 戦車クラス
とまとめて宣言し、
各インスタンスを Form.Controls に追加( Add )してやり、
Form側から Location (Left、Top)を初期設定し、
Visible = True にしてやれば、
10個の戦車インスタンス(クラスを実体化したもの)が Form 上に表示されます。
後は各戦車インスタンスの GotoTarget メソッドを Form 側から呼び出してやれば、
順番に戦車インスタンスが移動をするようになります。
GotoTarget メソッドの引数に目標 P の座標を設定するようにしておくと、
目標 P が移動しても、常に最新の目標座標に向かって自分の動作を計算できますよね。
「既存のコントロールから派生させて独自のクラスを作る」という感覚が
最初のうちはピンと来にくいかもしれませんが、
慣れれば、ocxを作って組み込むよりよっぽど簡単だと思いますよ。
戦車をコントロール化する,ってのはない発想だなぁ……。
戦車をクラス化して,イメージデータ持たすくらいが限界かな……。
個人的には,VB6でもVB2005/2008でもどっちでもいいのでは,と思います。
仮想空間中でのゲーム情報を処理出来て,それを操作出来ればよいのですから。
# 操作が必要だからといって,対象をコントロール化する必要はない。
まぁ,クラスライブラリの充実具合からVB2005/2008っていう判断はありだと思います。
どちらかといえば、VB2005のほうがやりやすくはあるかな、とは思います。
でも、VB6は経験あるけど、VB2005は勉強中ということであれば、VB2005をマスターしたいという副次的な目的がない限りはVB6でやれることをやればいいと思いますけど。
シューティングゲーム等ある程度リアルタイム性や描画性能を求められるゲームををどちらかということであればVB2005のほうが手軽に作れるかもしれませんが。
まぁVB6の通常サポートは終了していますし、次のWindowsで動くかどうか分からないし、あと何年使えるんだ、と言う観点からいけばVB2005は身に着けるのも無駄ではないと思いますけど、今、手軽に作りたいということであればVB6でいいんでね?と思います。
少なくとも今やりたい事はVB6でできると思いますよ。
戦車オブジェクトを作るにしても自分自身で描画しないといけないかというとそうでもなく、戦車オブジェクトでは位置や能力のデータのみ管理して、描画は全戦車を一括して表示すれば事足ります。
だた、1:1のガチンコ勝負でもなく、N:Nの不特定数のデータを管理するなら、最終的にはクラスを利用することを強くお勧めします。
クラスは良く分からないということでも、ユーザー定義型ならよく使います、よね?
クラスなんてユーザー定義型に毛が生えた・・・もとい手が生えたものです。
http://homepage1.nifty.com/rucio/main/shokyu/jugyou27.htm
http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html
いろんな場所で噛み砕いてくれる人々がいるので、VB2005をかじるより、まずはクラスを飲み込みましょう。
あ、Type=ユーザー定義型もわかんないって書いてありますね。
http://homepage1.nifty.com/CavalierLab/lab/vb/structure.html
実際には戦車クラスを作るべきですが、とりあえず今は戦車タイプを作ってみると、
Type 戦車データ
位置X As Long
位置Y As Long
目的位置X As Long
目的位置Y As Long
移動速度 As Long
ステータス As Long '移動中とか待機中とか建造中とか廃車(消滅)とか
国籍 As Long '敵味方の区分
耐久度 As Long '体力とか
攻撃力 As Long
燃料 As Long '移動したら燃料が減るとか、市街で補給するとか
車幅 As Long 'マップによっては通れない道とか
乗員数 As Long '乗員がいないと動けないとか攻撃できないとか
乗員上限数 As Long
画像番号 As Long 'もしくは 画像ファイル名 As String とか
End Type
Dim A軍戦車(50) As 戦車データ
Dim B軍戦車(50) As 戦車データ
例えば戦車の上限が50台とかであれば、このようにして、マップ表示サブルーチンにおいて、移動中か待機中の戦車のみ戦場ピクチャボックスに表示するとか。
ある大きなピクチャーボックスのなかに小さなピクチャーを任意の位置に表示(合成)するのは比較的簡単です。
http://www005.upp.so-net.ne.jp/h-masuda/vb6/vb6first/pict032.html
例えばターン性のシミュレーションゲームであれば、
戦車の絵をクリックして指令を与えたいとかいう場面が出てくるかと思います。
確かに個別にピクチャーボックスを持っていたら戦車オブジェクトにクリックイベントを発生させることもできるでしょう。
でも、ただのユーザー定義型であっても、戦場ピクチャーボックスのクリックイベントからマウス座標(クリック位置)を取得して、その位置に戦車がいるかどうかを検索する方法もあります。
そしてクラスを理解できたら、戦車データタイプをそのまま戦車データクラスにしてしまえば、配列変数による管理からコレクションによる管理に移行することもできます。
クラスもオブジェクトなので、この方法でもオブジェクトを含む簡単なゲームといえます。
戦車ゲームというと将棋感覚のものから生産も可能な戦略シミュレーションまで幅が広くてゲームデザインを考えるとなかなかどきどきしますね。
工場や市街があって・・・
占領して戦車製造や改造、補給が行えるとか・・・
軍人数が決まっていて乗員がいないと戦車が移動できないとか・・・
残り耐久度と相手攻撃力で乗員が脱出できるかどうかとか・・・
市街を占領すると軍人が増えるとか・・・
燃料が切れると移動できなくなるけど砲台にはなるとか・・・
うぅむ・・・燃えてきた!
というのはさておき。
とりあえず将棋ルールで作ってみるとか。
もうルールは決まっているのならいいですが。
ゲームの中身に関しては板違いなので、わたしのサイトに適当に書き込んでもらえば相談に乗りますよ?
早速沢山のレスポンスありがとうございます。
やはり皆さんツボを押さえたサジェスチョンをして下さいますね。
非常に参考になりました。
しかし、具体的な内容についてはまだ良く理解できていないので、
レス頂いたサンプルを1個ずつ噛み砕いてお試しコーディングを
して行き、その感触にて、VB6で行くか、VB2005で行くか
決めたいと思います。(もしくはVB2008の方がいいのかな?)
昨日はVB2005をいじってました。
VB6の時にはボタンクリックルーチンを呼ぶときただ
COMMAND1_CLICK
とコーディングすればいいのに、VB2005だとしっかりパラメータ
も要求されて、それに何をかけばいいのかわからず、放ってあります。
・・・と、まあ、遅々とした歩みなんで、ゆっくりやります。
ちなみに、私の仕様イメージは戦車10対10位でターン毎に戦う、
という物なんで、ご想像された壮大なゲーム(大戦略とか)
とは別世界のもんです。目標が貧困でお恥ずかしい限りです。
まずはお礼まで。
ありがとうございました。
>ボタンクリックルーチンを呼ぶとき
Button1.PerformClick
http://dobon.net/vb/dotnet/control/performclick.html
根本的な問題として,
・クリックしたこと自体が重要なのか
・イベントハンドラのコードが呼び出されればよいのか
ということがあります。
前者ならPerformClickですが,後者であるならばイベントハンドラのコードを別のメソッドに分離して,イベントハンドラもそれを呼び出すようにするのがよいです。
# dobonさんのサイトにも書いてありますが。
>(もしくはVB2008の方がいいのかな?)
ああ、申し訳ありません。
私が「VB2008」と申し上げたのは、単に最新バージョンであることと、
エディタなどの使い勝手がVB2005より便利になっているからです。
(Expess Editionであれば無料で入手できますし。)
文法的には(少なくとも今回考えていらっしゃるアイデアに関しては)
VB2005/2008のどちらでもあまり変わりはないと思います。
ボタンクリックできました。
Yuoさんの書かれた方法はまだ良く理解はできませんが、
方法が2つある、という事はわかりました。
あと、さるべーじさんのレスを参考に取りあえず
VB2008は選択肢から外しておきます。
(インストールして環境を準備するのも面倒なんで)
結果的にはどちらの環境を使うかはまだ未定ですが、
TYPEを作るとかクラスを作るとかベースの所は
共通にできるのではないかと思うんで、勉強がてら
やってみます。
私はハード屋で、概念がわかっても使いこなすところまで
行っていないんで、大変参考になりました。
たぶん今度もし質問するにしても、別の板にてもっと具体的な
内容になると思います。
取りあえずこの板は解決、という事にさせていただきます。
やじゅさん Yuoさん さるべーじさん 紅閃光さん
ありがとうございました。