goo blog サービス終了のお知らせ 

日々のDraft

回答原案集

修飾子

2006-12-14 12:31:12 | プログラム
http://homepage1.nifty.com/rucio/main/kiso/Scope.htm

ずっと思っているんですが。
何故「同一プロジェクトの、自分と派生クラスのみ」って選択が無く、
他のプロジェクトから参照できたり、自分のところのほかのクラスから参照できたりと物凄く中途半端なんでしょうか

Identifier Should Be Spelled

2006-12-14 12:26:29 | プログラム
先日の名前空間の分類名はさんざんFxCopに叩かれて凹んでいます。
Type names should not match namespaceって10回も。

それはさておき。上記のエラーが出ます。
まぁ言っていることは簡単で、

「そんな省略した形じゃなくてもっと明確な変数名をつけなさい」

ってことなんだけどね。

その指摘されている箇所が「x」とか「y」なんだよね・・・・・
これをこれ以上具体的にしろってのは無茶な話では・・・・

「w」や「h」はまだ「width」とか「height」って手があるけど。

「facename」の何が悪い!(苦笑

==========================
Validate arguments of Public methodとかSpecify IFormatProviderなんてきらいだー

面倒くさい!
============================
Assembly should Declare minimum security

Assembly should have valid strong names
がよく解らん。
============================

すごく長い名前空間

2006-12-14 06:10:40 | プログラム
やっぱり何か階層構造が変だと思って修正して今終了。二時間くらいかけているような。

名前空間を省略するのがいくら「何となく」嫌いだったからって

Dim hoge As BattleSystem.NSMultimedia.Graphics.Manager _
.Components.DirectGraphicsManager.Components _
.MessageManager.Components.MessageBuilder.Main _
.MessageBuilder

ってのはさすがに嫌だ。
XHTML等の宣言の名前空間(もちろん名前空間接頭辞ではない)が可愛く見えてくるくらい。
(宣言でこういう区切り方が出来るかは不明ですが
gooBlogは右カラムに隠れてしまうので複数行に分割しています)

・・・がいざ分類してみるとこんなのがわんさか(汗。

書いている途中混乱して折角前に作った
クラスを間違えて削除しちゃったし・・・・


少しImports文を使い出してもいいかなぁと思った。

Namespace

2006-12-14 03:08:28 | プログラム
いつまでもわからないからって、やらないのもアレだなぁと思っていたので
SandCastleをきちんと学ぶ。

意外とここを参考にしたら簡単だったorz
http://hrgs.xrea.jp/2006/12/03/sandcastle_batch

http://blogs.wankuma.com/naka/archive/2006/12/01/48061.aspx
も参考になるかと。

で非常に醜いものが出来上がったので
サボっていた名前空間の分類を行った。

うん、まぁとりあえず何とかなるレベルかな。
ただ、Importsが「何となく」嫌いな自分は全部名前空間広げて書こうとするから
置換できない部分はひたすらコピペしていくが、100回くらいやったような気がする。
手が攣って、癖になっているはずのコピペの手の動きをしなくなってきた。
あー本当にコピペってどうやるんだっけかなって状態。






初期化

2006-12-13 21:55:48 | プログラム
Unitクラスの気絶フラグと昏睡フラグを設定。

「パーティのメンバ全員が気絶または昏睡状態にあるかどうか調べる」メンバ関数をパーティに持たせることで、勝利・敗北判定を行うようにした。

これにより、無限ループによるOutofMemoryExceptionを防げるようになったはず・・・

========================================
以前述べたとおり各キャラ(Unitクラス)はBaseParametersとRevisedParametersとCurrentParametersという3つのUnitParameters型メンバ変数を所持する。(以前UnitParameter型といったかもしれないが、不適切なので修正した。)

このUnitParametersの

UnitParameterHPの値が正の時、
HPプロパティに代入される値が0以下なら
UnitParameterHPに0を代入し、
LPを減らして気絶フラグのみにリセットする
LPが減ったと表示
気絶したと表示

UnitParameterHPの値が0以下で、
HPプロパティに代入される値が0以下の時
LPを減らす
LPが減ったと表示
気絶したと表示

UnitParameterHPの値が0以下で、
HPプロパティに代入される値が正の時
気絶フラグを下ろす

それ以外の場合、プロパティに代入された値をそのままUnitParameterHPに代入

代入されるLPプロパティの値が0以下ならば昏睡フラグのみにリセットする
LPが減ったと表示
昏睡したと表示
代入されるUnitParameterLPが0以下でLPプロパティの値が正ならば昏睡フラグを外す

※表示するのはSystem.Console.Writelineね、ちなみに。

忘れてたけど
もう一つ、使っている場所がある。
コンソール見てたらさ

のLPが1減って4になりました。

って表示がたくさんでてて、何でこんなところで表示されているんだろうとか思って呼び出し履歴見たりステップインして実行してみたら

Item.diffParamter(装備したときのステータスの変化値を保存する)で使っていた
という

フォントの問題・解決

2006-12-12 21:50:33 | プログラム
http://www.microsoft.com/japan/msdn/windows/windowsxp/fixedpitchfont.aspx

を読んで

フォント名を"MS UI Gothic"から"MS Gothic"に変更。
ただし、これは後に.NET のクラスでシステムの等幅フォントのクラスで置き換える予定。

ReturnRectangle = New System.Drawing.Rectangle(x, y, CInt(Maxlength * Font.Description.Width * 4 / 3 * 2), CInt(Font.Description.Height * i * 4 / 3))

と変更。多分成功。
多分2倍しなければならないのは
Font.Description.charsetがAnsi{0}だから
まぁ、何とかなるでしょう。

・・・あれ?MS Gothic以外のフォントでは4/3じゃなかったりする?
<ins>勘違いしていた。解像度の違いの問題だから、他の等幅フォントでも全く同じはずだ</ins>

では、この4/3という数字を.NET Framework のクラスライブラリから取得できないだろうか?

※そもそも「Managed DirectX 1.1」 はWindowsでしか動かないだろ!と
いうことは一応理解してます

メモ:

http://dobon.net/vb/dotnet/graphics/pageunit.html
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.autoscalemode(VS.80).aspx

フォント

2006-12-12 15:15:05 | プログラム
Sub FontCreate(ByVal parameterDirect3DDevice As Microsoft.DirectX.Direct3D.Device)


FontCreate(CInt(System.Windows.Forms.Control.DefaultFont.SizeInPoints), parameterDirect3DDevice)

End Sub

Sub FontCreate(ByVal FaceName As String, ByVal parameterDirect3DDevice As Microsoft.DirectX.Direct3D.Device)

FontCreate(FaceName, CInt(System.Windows.Forms.SystemInformation.MenuFont.SizeInPoints), parameterDirect3DDevice)

End Sub

Sub FontCreate(ByVal Size As Integer, ByVal parameterDirect3DDevice As Microsoft.DirectX.Direct3D.Device)
FontCreate(System.Windows.Forms.SystemInformation.MenuFont.Name, Size, parameterDirect3DDevice)
End Sub

Sub FontCreate(ByVal FaceName As String, ByVal Size As Integer, ByVal parameterDirect3DDevice As Microsoft.DirectX.Direct3D.Device)

fd.Height = Size

fd.FaceName = FaceName

MessageManagerStringFont = New Microsoft.DirectX.Direct3D.Font(parameterDirect3DDevice, fd)

End Sub


フォント作って~♪


Function MessageWindowAutoSize(ByVal paramterMessage As String, ByVal x As Integer, ByVal y As Integer, ByVal Font As Microsoft.DirectX.Direct3D.Font) As System.Drawing.Rectangle

Dim separators As New System.Collections.Generic.List(Of String)
Dim Maxlength As Integer
Dim ReturnRectangle As System.Drawing.Rectangle
separators.Add(System.Environment.NewLine)
Maxlength = 0

Dim i As Integer
i = 0

For Each oneline As String In paramterMessage.Split(separators.ToArray, System.StringSplitOptions.None)
If oneline.Length > Maxlength Then
Maxlength = oneline.Length
End If

i = i + 1

Next

ReturnRectangle = New System.Drawing.Rectangle(x, y, 12 * Maxlength, Font.Description.Height * i)



Return ReturnRectangle
End Function

行数と最も多い文字数~もとめて♪
というわけで。強調された部分。

フォントの横幅を求めたいんですよ、横幅。
これ、暫定的に12をおいているが
fd.Width = Size
ってやって
System.Drawing.Rectangle(x, y, Font.Description.Width * Maxlength, Font.Description.Height * i)

とかやると文字がはみ出ます。何でだー

Stringクラス

2006-12-11 18:38:06 | プログラム
メッセージウィンドウのサイズ等を自動生成させた方が効率があがるし、可読性も向上すると思ってはいるんだが・・・・

「String型を改行で区切って各行の文字数をカウントし、最大長を求める」をやりたいわけなんだが・・・
http://msdn2.microsoft.com/ja-jp/library/system.string(VS.80).aspx
うーん、標準では用意されてなさそう・・・・
気がきかねぇなぁ面倒だなぁ(何

メモ

2006-12-11 10:06:49 | プログラム
コマンドに「通常、敵に対するものか味方に対するものか」を設定することで、
混乱・魅了状態でコマンドが自動で決定されてしまう仲間が対象を正しく選べるようになる・・・・土台を作ったはず。

本当はSystem.ICloneable.Cloneを作ってReceiverType自体を変更してあげたほうがBetterだと思うんだけど。

問題点:
★途中で混乱した場合や、途中で直ってしまった場合でもコマンドの実行対象は変更されない

★途中でコマンド対象者に死なれた場合、選ばれる対象が多分混乱していないときの選択になってしまうと思う。でも解決の兆しは見えてる。

★回復コマンドを作ったこともあり、この辺から「プレイヤーの負け」が出てくる可能性があるが、勝利時の分岐しか作ってない。敵はたいていLP1しかないから、死んだ段階でパーティのメンバリストから外されてくれる(ように組んだ)けど、味方パーティはそうはいかない。

★いままでの分岐だとHP 0となっているメンバへの回復系コマンドが実行できないので、何か考える(おぃ

★長いソースを防ぐ & DirectInputへの依存を防ぐ意味で・・・・

DirectInputKeyboardManager及び他の「入力取得系クラス」からの値を解釈するInputManagerクラスを作成し、解釈されて返ってきた値を用いるでDirectInput以外への対処も行えるようにする(InputManagerクラスのコンストラクタでDirectXを使うのか、はたまた違うものなのか指定する。)

★コマンドがキャンセルされたように見えてキャンセルされない。(未実装なだけ)

★パーティ全体へのコマンド実行は単体コマンドを複数回行えばいいのだろう。
ただパーティを複数のグループに分けるのはしんどそうなので水鳥剣のようなルーチンは後回し。

★コマンドを武器種ごとに分ける(無駄が多くなりそうで書いてません)

★コマンドに乱数要素なし(実装してないだけ)

★現在はコマンド実行者とコマンド対象者のパラメータを直接コマンドから扱っているが、避けるべき。UnitクラスにDamageメソッドのようなものを実装するとかしておくべきだと思った。

・・・・など

#これがDIコンテナ・・・って理解でいいんだよね?

全部IF文になっている分岐を場所によってselectに変更する。

DirectXと切り離したい・・・・

2006-12-10 12:43:13 | プログラム
Public Class Unit

Implements System.IDisposable
Implements System.ICloneable

Friend UnitName As String
Friend UnitEquipmentsList As New System.Collections.Generic.List(Of Item)
Friend UnitBattleCommandsList As New System.Collections.Generic.List(Of BattleCommand)
Friend UnitBaseParameters As New UnitParameter
Friend UnitRevisedParameters As New UnitParameter
Friend UnitCurrentParameters As New UnitParameter

Friend FileName As String = ""
Private UnitSpriteTexture As Microsoft.DirectX.Direct3D.Texture
Public SelectedCommandNumber As Integer = 0 '暫定的にPublic

とか

'Module1.vb
'コマンド入力を登録()


If System.Environment.TickCount() - KeyboardTimer > KeyboardInterval Then

KeyboardTimer = System.Environment.TickCount()

'キーボード検出は拒否・やり直し系優先


If Key.Item(Microsoft.DirectX.DirectInput.Key.Delete) Then

PP.SelectPreviousMember()


OS依存なDirectXと切り離せてないなぁ・・・・

0になった時

2006-12-10 12:38:33 | プログラム
思考の断片。

Unitクラスは
BaseParameters(何も装備していない素のステータス)

RevisedParameters(武器とか装備した状態の素のステータス。戦闘開始時や終了時に書き戻す予定。)

CurrentParameters(ダメージを受けたりして戦闘中に刻々と変化するステータス。
ある意味戦闘中どうにでも使っていい。)

の3つを保持するようにしている。

構造体が嫌いなので、全部UnitParameterクラスにしてnewでインスタンスを生成している。(継承してクラスを作ってたりはしない)
UnitParameterクラスはHPやLPやWPやJP等のpublicなプロパティを持ち、
それら用のprivateな変数は別途宣言されている。

====================================
★各種のコマンドはPuntch,DoubleHitなど独自のクラスであるが、
BattleCommandクラスを継承するようにしてある。BattleCommandクラスはRuncommandメソッドを持ち、

★各キャラのターン中に一度決定されたコマンドは即座に実行してはならない。
全員の入力が終了するまではキャンセルが可能なはずだから。ターンの途中でモンスターが死んだりはせず、
プレイヤーによってキーボード等によって入力されたコマンドはSystem.Collections.Generic.Listに蓄積され、
最後のキャラを入力完了した地点で溜めてきたものを一気に吐き出して実行していく

コマンドに指定する対象も別途2個ずつまで保管している[あくまで現状]。(Arg1 As Unit,Arg2 As Unit)

Arg1にコマンド実行者、Arg2にコマンドの実行対象を指定している。

コレクション系は自動であいたところを埋めてくれるので、

Dim hoge As New System.Collections.Generic.List(Of BattleCommand)
Dim hoge As New System.Collections.Generic.List(Of Unit)
Dim hoge As New System.Collections.Generic.List(Of Unit)

Dim fuga As New Puntch
RegisterTask(Unit1.fuga,Unit1,Unit2)

とかやって

Sub RegisterTask(A As BattleCommand,B As Unit,C As Unit)

hoge.Add(A)
Arg1.Add(B)
Arg2.Add(C)

End Sub

みたいなことやって
コレクション系は削除したところ埋めてくれるので

Do

hoge.item(0).RunCommand(Arg1,Arg2)

hoge.RemoveAt(0)
Arg1.RemoveAt(0)
Arg2.RemoveAt(0)

Loop Until hoge.count = 0

のような形で対応している。

☆現段階ではパーティ全員などを引数にすることを考えられていない。

引数をObject型にして
スタックマシンみたいな設計にすればいいのかなぁ・・・・よく理解してないけど。

★コマンドを実行した時にモンスターのHPが0になっていたら自動的に別なモンスターに切り替えるのが普通だが、
最後に実行してみるまでモンスターのHPが0を下回って死ぬかはわからない。
なったときに別なモンスターを支給してもらう必要がある。
できないことはない、というか、HPが0になったモンスターがいる地点で特定の値を自分(BattleCommandクラス)を変数として持つ
管理側のクラスに返すようにして、管理側が返ってきた値から新たに支給が必要だと知ると、
乱数によって決定されたモンスター(モンスターの立場ではプレイヤー側のキャラだが)をBattleCommandクラスの補給用メソッドを実行して
補う、という形をとっている。
味方側はLPが0になるまで支給は必要にならないけど。(厳密には多分生きている奴中心に攻撃してきていると思う)

設計がエレガントじゃないなぁ・・・・

かといって、全部管理するクラスをMeとして引数に渡すのもおおげさなんだよなぁ・・・

★今は直接UnitクラスにUnitStatusというプロパティを用意しちゃっているけど
UnitParameter型に含めてHPプロパティのSetで、0以下になったらHPを0にセットして
同時にUnitStatusに死亡フラグ立てようかな・・・・(以下のソースではここまで完了)

★厳密には毒・麻痺・混乱という分類ではなく
ターンのコマンド入力が出来るか、というシステム的な分類で列挙型を用意していて



'ターン後に起こること
If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.BeforeCommand) = Process.BeforeCommand Then
'ターン前に起こること。沈黙・暗闇・硝子の盾等などのコマンドを実行

End If

If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.SkipTurn) = Process.SkipTurn Then
'麻痺・睡眠・気絶・昏睡など、動けないとき
PP.SelectedMemberNumber = PP.SelectedMemberNumber + 1

Else

If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.NotCommandable) = Process.NotCommandable Then
'魅了・混乱・バーサーカー等、行動を制御できないとき

'魅了・混乱LV3



Dim Random As New System.Random


BTM.RegisterTask(PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Item(Random.Next(0, PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Count)), PP.MemberList.Item(PP.SelectedMemberNumber), PP.MemberList.Item(Random.Next(0, PP.MemberList.Count - 1)))
If PP.SelectedMemberNumber = PP.MemberList.Count - 1 Then


RunAllTheTask() '新たに作り直した

Else

PP.SelectNextMember()


End If




Else
'コマンド入力を登録()

・・・・

って感じでやってる

自動割り当て

2006-12-08 14:18:33 | プログラム
RunAllTaskは撤廃。一つ一つ検証していくことに。
今のところ攻撃対象死亡のみ(攻撃者死亡・麻痺は考えていない)

・・・・・
Enum TaskProcedure

Task_Success = 0
Attacker_NOT_MOVABLE = 1
Receiver_NOT_MOVABLE = 2

End Enum

・・・・・

Function RunTask() As TaskProcedure 'Status Code

If Arg1.Item(0).CurrentParameters.HP <0 Then ' BattleTaskList.RemoveAt(0)
' Return TaskProcedure.Attacker_NOT_MOVABLE

ElseIf Arg2.Item(0).CurrentParameters.HP <0 Then Return TaskProcedure.Receiver_NOT_MOVABLE

End If

BattleTaskList.Item(0).RunCommand(Arg1.Item(0), Arg2.Item(0))
BattleTaskList.RemoveAt(0)
Arg1.RemoveAt(0)
Arg2.RemoveAt(0)

Return TaskProcedure.Task_Success

End Function


・・・・
ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Return) Then

BTM.RegisterTask(PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Item(PP.MemberList.Item(PP.SelectedMemberNumber).SelectedCommandNumber), PP.MemberList.Item(PP.SelectedMemberNumber), MP.MemberList.Item(CommandReceiverNumber))
If PP.SelectedMemberNumber = PP.MemberList.Count - 1 Then
For i As Integer = 0 To BTM.TaskCount - 1



For Each Member As Unit In MP.MemberList
If BTM.RunTask = TaskProcedure.Task_Success Then
Exit For
End If

BTM.SupplyParameter(Member)
System.Windows.Forms.Application.DoEvents()

Next


Next i


PP.SelectedMemberNumber = 0

Else

・・・・

ふぅ

2006-12-08 04:30:11 | プログラム
Module Module1

'PlayerPartyとMonsterPartyはPartyクラスを継承する。
Dim PP As PlayerParty
Dim MP As MonsterParty


'スプライトテクスチャや表示したいテキストの内容と位置をSystem.Collections.Generic.Listに一つ一つ登録し、
'Showメソッドで一気に吐き出してMicrosoft.DirectX.Direct3D.Device.Presentする
Dim DG As DirectGraphicsManager

以下単なるラッパと言ってもいいか


'DirectInputの初期化、Acquireを行う。キー入力を返す機能も提供。
Dim DI As DirectInputKeyboardManager
'DirectSoundの初期化。playsoundで再生開始、stopSoundで停止する。
Dim DS As DirectSoundManager

'決定された攻撃コマンドと引数をSystem.Collections.Generic.Listに貯蓄しておく。
Dim BTM As New BattleTaskManager

'使いまわすフォーム
Dim GameForm As System.Windows.Forms.Form

'System.Environment.Tickcountを格納する変数
Dim KeyboardTimer As Integer

'キー入力を検知する時間間隔。
Dim KeyboardInterval As Integer = 90

'DIから帰ってきたキーの状態
Dim Key As Microsoft.DirectX.DirectInput.KeyboardState

'攻撃コマンドの対象がMonsterParty.MemberListのどれにあたるか
Dim CommandReceiverNumber As Integer

'勝利したかどうか?
Dim WinFlag As Boolean

Sub Main()

GameForm = New System.Windows.Forms.Form
GameForm.ClientSize = New System.Drawing.Size(800, 600)

DG = New DirectGraphicsManager(GameForm)
DG.FontCreate()

DI = New DirectInputKeyboardManager(GameForm)

DS = New DirectSoundManager(GameForm)

PP = New PlayerParty
MP = New MonsterParty

DS.playSound()

SelectedCommand = 0

GameForm.Show()


Try



'Party.AddMember(ByVal paramterUnit As Unit)
'画像を認識させたい場合、Unitクラスを継承したクラスでファイル名を指定して
'DG.Direct3DDeviceをコンストラクタに渡す。
'モンスター側はまだこの仕組みを実装していない。

'攻撃コマンドはMustInheritなBattleCommandクラス継承したクラスを
'Unitが持つSystem.Collections.Generic.List(Of BattleCommand).Add
'で追加

'↑今回のこの処理はキャラのコンストラクタ内に直接記述してしまったから見えない

PP.AddMember(New himajinClass(DG.D3DDevice)) '俺
PP.AddMember(New JamesClass(DG.D3DDevice)) 'ジェームズ
PP.AddMember(New HectorClass(DG.D3DDevice)) 'へクター
PP.AddMember(New HarryClass(DG.D3DDevice)) 'ハリー
PP.AddMember(New LeonClass(DG.D3DDevice)) 'レオン

'パーティが持つ陣形(Formation)に追加。
'FormationはSystem.Collections.Generic.List(Of Point型だかRectangle型)を持つ。

'Party.AddFormation(ByVal paramterFormation As Formation)

PP.AddFormation(New FreeFight) 'フリーファイト
PP.AddFormation(New King) '鳳天舞の陣
PP.AddFormation(New Dragon) '龍陣

'陣形の初期値はフリーファイト

PP.CurrentFormation = 0

'モンスターについても同様のことをやるが、まだSpriteTexture関係を書いてない。
'画像ファイルが必要なので

MP.AddMember(New GoblinClass)
MP.AddMember(New DancerClass)
MP.AddMember(New DancerClass)
MP.AddMember(New GoblinClass)

MP.CurrentFormation = 0


'現在の時刻を32bitで取得

KeyboardTimer = System.Environment.TickCount()

Do

If System.Environment.TickCount() - KeyboardTimer > KeyboardInterval Then

Key = DI.GetKeys()

'キーボード検出は拒否・やり直し系優先
'Escape押したら終了
'↑↓押したらコマンド切り替え

'Delete押したらコマンドやり直し・・・・※未実装

'Return押したらコマンドを追加した後、次の人に回す。全員分入力し終えたら一気に実行。

'X押したら攻撃対象変更・・・・・※コマンド選択後の対象選択が未実装


If Key.Item(Microsoft.DirectX.DirectInput.Key.Escape) Then


Exit Do

ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Delete) Then

PP.SelectPreviousMember()

ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Up) Then

PP.MemberList.Item(PP.SelectedMemberNumber).SelectBefore()

ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Down) Then


PP.MemberList.Item(PP.SelectedMemberNumber).SelectNext()


ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Left) Then



ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Right) Then



ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Return) Then

'攻撃する人と受ける人、BattleCommandクラスのインスタンスを引数に与えて登録。デレゲートは使いどころがよくわからないので放置。 BTM.RegisterTask(PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Item(PP.MemberList.Item(PP.SelectedMemberNumber).SelectedCommandNumber), PP.MemberList.Item(PP.SelectedMemberNumber), MP.MemberList.Item(CommandReceiverNumber))
If PP.SelectedMemberNumber = PP.MemberList.Count - 1 Then

BTM.RunAllTask()
PP.SelectedMemberNumber = 0

Else

PP.SelectNextMember()

End If


ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.X) Then

CommandReceiverNumber = (CommandReceiverNumber + 1 + MP.MemberList.Count) Mod MP.MemberList.Count

ElseIf Key.Item(Microsoft.DirectX.DirectInput.Key.Tab) Then

'デバッグ用の隠しコマンド。陣形を変更できます。

PP.CurrentFormation = (PP.CurrentFormation + 1 + PP.Formations.Count) Mod PP.Formations.Count

End If

KeyboardTimer = System.Environment.TickCount()


End If

'現在攻撃コマンド入力中のキャラの名前

DG.DrawMessage(PP.MemberList.Item(PP.SelectedMemberNumber).Name, 0, 0, System.Drawing.Color.White)

'現在攻撃コマンド入力中のキャラの攻撃コマンド一覧

For i As Integer = 0 To PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Count - 1

Dim Color As System.Drawing.Color

'現在攻撃コマンド入力中のキャラの選択されていない攻撃コマンド
Color = System.Drawing.Color.White

If i = PP.MemberList.Item(PP.SelectedMemberNumber).SelectedCommandNumber Then

'現在攻撃コマンド入力中のキャラの選択中の攻撃コマンド

Color = System.Drawing.Color.Red

End If
DG.DrawMessage(PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Item(i).Name, 0, 20 + 17 * i, Color)


Next i

'プレイヤー側のステータス一部表示

DG.DrawMessage("HP:" & PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.HP.ToString, 0, 20 + 17 * (10 + 1), System.Drawing.Color.White)
DG.DrawMessage("LP:" & PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.LP.ToString, 0, 20 + 17 * (10 + 2), System.Drawing.Color.White)
DG.DrawMessage("WP:" & PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.WP.ToString, 0, 20 + 17 * (10 + 3), System.Drawing.Color.White)
DG.DrawMessage("JP:" & PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.JP.ToString, 0, 20 + 17 * (10 + 4), System.Drawing.Color.White)

'コマンド実行対象のモンスターのステータス一部表示

DG.DrawMessage("コマンド実行対象", 0, 20 + 17 * (10 + 10), System.Drawing.Color.White)
DG.DrawMessage("Name:" & MP.MemberList.Item(CommandReceiverNumber).Name.ToString & "(" & CommandReceiverNumber.ToString & "/" & (MP.MemberList.Count - 1).ToString & ")", 0, 20 + 17 * (10 + 11), System.Drawing.Color.White)
DG.DrawMessage("HP:" & MP.MemberList.Item(CommandReceiverNumber).CurrentParameters.HP.ToString, 0, 20 + 17 * (10 + 12), System.Drawing.Color.White)
DG.DrawMessage("LP:" & MP.MemberList.Item(CommandReceiverNumber).CurrentParameters.LP.ToString, 0, 20 + 17 * (10 + 13), System.Drawing.Color.White)
DG.DrawMessage("WP:" & MP.MemberList.Item(CommandReceiverNumber).CurrentParameters.WP.ToString, 0, 20 + 17 * (10 + 14), System.Drawing.Color.White)
DG.DrawMessage("JP:" & MP.MemberList.Item(CommandReceiverNumber).CurrentParameters.JP.ToString, 0, 20 + 17 * (10 + 15), System.Drawing.Color.White)

'HPが0になったモンスターを除去

Dim j As Integer = 0

Do

If MP.MemberList.Item(j).CurrentParameters.HP <0 Then
MP.MemberList.RemoveAt(j)
CommandReceiverNumber = 0

Else

j = j + 1

End If

Loop Until MP.MemberList.Count = 0 OrElse j > MP.MemberList.Count - 1

'リストに誰も残って無ければ勝利。

If MP.MemberList.Count = 0 Then

DG.DrawMessage("全員を倒した!", 0, 377, System.Drawing.Color.Yellow)
WinFlag = True

Exit Do

Else

End If


System.Windows.Forms.Application.DoEvents()


System.Windows.Forms.Application.DoEvents()

'現在のパーティをそのまま描写

DG.DrawPartyWithCurrentFormation(PP)


System.Windows.Forms.Application.DoEvents()



DG.Show()


DG.Clear()

Loop

Catch ex As Microsoft.DirectX.DirectXException

Catch ex As System.NullReferenceException

Finally
'勝利したかエラーをシステムに補足されたら作成したものを全て開放して終了

PP.Dispose()
MP.Dispose()

DS.Dispose()
DI.Dispose()
DG.Dispose()
GameForm.Dispose()




End

End Try



End Sub



End Module

さて、問題点

○コマンド削除機能を実装していない
○カウンター系コマンドを実装できるかどうだか?
○コマンド選択・攻撃・勝利時のサウンド
○良いやり方が思いつかないのでコマンドが武器種ごとにおらず、全部いっぺんに表示されている。そのため←→キーで切り替えるルーチンを作ってない
○モンスターからのコマンドはない
○コマンド入力時・勝利時も、ポーズそのまま

★クイズ
・・・・まだ1つあるんですが、それは何でしょう?


バグった

2006-12-05 18:41:52 | プログラム
オブジェクト破棄しないまま、無限ループ内でnewで生成繰り返してたらPaint.NETを巻き添えにしてメモリ不足で落ちた(汗

再起動して対処。
=========================================
This text file was created because Paint.NET crashed.
Please e-mail this file to paint.net@hotmail.com so we can diagnose and fix the problem.

This text file was created because Paint.NET crashed.
Please e-mail this file to paint.net@hotmail.com so we can diagnose and fix the problem.

Application version: Paint.NET v3.0 (Beta 1 Release build 3.0.2525.34975)
Time of crash: 2006/12/05 16:11:03
Application uptime: 00:50:58.4687500
OS Version: 5.1.2600.131072 Service Pack 2 Workstation x86
.NET Framework version: 2.0.50727.42 x86
Processor: 2x Intel(R) Pentium(R) 4 CPU 3.00GHz
Physical memory: 1023 MB
Locale: pdnr.c: ja-JP, hklm: ja-JP, hkcu: n/a, cc: ja-JP, cuic: ja-JP

Exception details:
System.OutOfMemoryException: 種類 'System.OutOfMemoryException' の例外がスローされました。
場所 System.Environment.GetResourceFromDefault(String key)
場所 System.Exception.get_Message()
場所 System.Exception.ToString()
場所 PaintDotNet.Startup.UnhandledException(Exception ex)
場所 PaintDotNet.Startup.Application_ThreadException(Object sender, ThreadExceptionEventArgs e)
場所 System.Windows.Forms.Application.ThreadContext.OnThreadException(Exception t)
場所 System.Windows.Forms.Control.WndProcException(Exception e)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnThreadException(Exception e)
場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.Run(Form mainForm)
場所 PaintDotNet.Startup.StartPart2()
場所 PaintDotNet.Startup.Start()
場所 PaintDotNet.Startup.Main(String[] args)
------------------------------------------------------------------------------