こまけぇこたぁいいんだよ!!@MTG LifeCounter(紹介)

※現在β版です、予期せぬ不具合が発生する恐れがあります
※当アプリは T-01B/IS02 での動作を想定して作成しています。

 Magic:The Gathering(以下MTG)プレイ時の利便性を図るための、オリジナルアプリです。
 最新版はコチラからどうぞ。
 最新版で追加した機能は、赤字で表示しています。

 現在の最新版は Ver1.00 です。
 最新版をインストールすると、INIファイルがデフォルトのもので上書きされてしまいます。
 既存のINIファイルを残したい場合は、EXEと同じフォルダ内にある「setting.ini」を退避してからインストール後、上書きしてください。

・更新履歴
11/01/23
Ver1.00
 追加
 ・各マナシンボルごとに長押しメニューを追加。
  例:白マナを長押し⇒「白マナをクリア」というメニューが出る
 ・オプションメニュー内にキーボードショートカットの一覧を追加

 修正
 ・1人用画面と2人用画面の操作性をなるべく統一させるため、一部レイアウト変更
 ・画像選択用のダイアログを標準のファイルダイアログを廃止し、標準の画像ダイアログに変更
 ・β版終了
 ・本ページの説明が冗長になってきたのでばっさりカット
 ・Ver1.00対応の説明に更新(11/06/26)

10/10/09
Ver0.91
 修正
 ・マナプールのクリア、カウンターのクリアをそれぞれ分離
 ・2人用画面のメニューが縦長になってきたため改善
 ・1人用画面において、キーボードによるショートカット使用時、IME制御が半角英数字に自動的に切り替わらないことがある問題を修正

10/10/03
Ver0.90
 追加
 ・カウンターを新たに2つ(紫、黄)増設。毒、PW忠誠値管理などに。
  (マナカウンターとは別であることを明確化するため、カウンターの形は別です)
 ・カウンター追加に伴い画面レイアウト変更
 ・2人用画面のメニューを削除、画面長押しで表示されるように変更

10/09/19
Ver0.81
 追加
 ・アイコン(仮)実装
 ・1人用画面でのキーボードからのショートカット実装

10/08/25
Ver0.80
 追加
 ・1人用ライフカウンターでのマナプール管理を可能に
 ・ライフカウンター画面からのマナプールON/OFFの切り替えを可能に
 ・2人用ライフカウンターで、プレイヤーごとにマナプールON/OFFの切り替えを可能に
 ・オプションに「アプリ起動中は自動サスペンドを行わない」の機能を追加
 削除
 ・操作メニューより「画面方向変更」を廃止
 ・オプション項目「ライフカウンター座標位置指定」を暫定廃止
 ・オプション項目「終了時に画面方向を縦にする」を廃止

10/07/26
Ver0.76
 ・公開

◆機能
・ライフカウンター(画面フリックによる増減も可能)
・1人分/2人分のライフを管理可能
・1人用の画面では背景画像の指定が可能
・マナプールの管理
・乱数による6面ダイス機能付き

◆動作条件
T-01B/IS02での動作確認済み
WindowsMobile6.5.3以上で動作確認
WindowsMobile(Emulator)6.5上での動作確認
.NET Compact Framework2.0以上が必要
(恐らくWindowsMobile6以上ならば起動はすると思います)
ディスプレイ解像度480*800以上

◆スクリーンショットでの解説
(以下の画像は開発途中のものが含まれています、実際のものと差異があるものがあります)
—————————————————————–

起動直後のタイトル画面。
各メニューボタンにより画面遷移します。

—————————————————————–

 

上段の画像:1人用の画面
中段左の画像:背景画像を指定したもの+マナ管理機能をON
中断右の画像:背景を長押しでメニュー表示

ライフカウンター右の「▲」をタップか画面を↑方向へフリックでライフ増加、
ライフカウンター右の「▼」をタップか画面を↓方向へフリックでライフ減少。

メニューの内容は
・カウンターをON/OFF — 画面上へのカウンター表示ON/OFFを切り替えます
・クリア        — マナプールやカウンターを任意のものを0にします
・ダイスロール     — 6面ダイスを振ります
・リセット       — ライフの値を初期値に戻します(オプションで指定)
・終了         — タイトル画面へ戻ります

—————————————————————–

2人用 の画面を開いたところ(オプションにて「カウンター管理をデフォルトでON」を有効にした場合)
基本的な操作方法は1人用画面と同一です。ただし以下の点に注意が必要です。
・Player1、Plaer2の名前が表示されます(名前はオプションで指定)
・Player2は上下左右がさかさまになっています。
 これは、向かい合って座っている人側からの操作を考慮したためです。
・フリック操作でのライフ増減は、本体の向きが縦/横のどちらなのかで判定方法が違います。
   縦の場合:上下の真ん中でPlayer1か2を判定
   横の場合:左右の真ん中でPlayer1か2を判定

メニューは各プレイヤーごとに画面下部に表示されています。
・Reset — ライフを初期値にします
・Clear — マナプールを0にします

それ以下のメニューは画面を長押しすることで表示されます。

隅にある「↑」「↓」の矢印で表示されているものが、マナ値の増減を示します。「↑」のときにマナボタンを押せばマナが増え、「↓」のときにマナボタンを押せばマナが減ります(0以下にはなりません)。「↓」のときは色が赤くなります。

—————————————————————–
 

オプション画面の項目です。
各項目の意味は以下です。
 ・ライフ初期値
   — ライフの初期値です。3ケタまでの表示は確認していますが、それ以上ははみ出ます。

 ・フリック調整値
   — フリック操作したときにY座標がどれだけ動いたらライフが増減するかを定義する値です。
     小さくすると大量の増減が、大きくすると細かい増減がしやすくなります。

 ・カウンター管理をデフォルトでON
   — チェックが付いている場合、最初からマナプール管理ONの状態にします。

 ・アプリ起動中は自動サスペンドさせない
   — チェックがついている場合、「ライフカウンター」画面を表示中は
      自動サスペンドを行わないようにします。
      ※バッテリー消費が激しくなります

 ・背景画像
   — 1人用画面の背景画像を指定します。
      画像サイズはおおよそ、縦で480,750 横で800*430です。
      参照ボタンを押してWM標準の画像ダイアログが出ます。
      この機能を使えば簡単にオリジナルのライフカウンターにすることが出来ます。

 ・ライフ表示位置 
   — (V0.80以降、暫定廃止中)

 ・デフォルトプレイヤー名
      2人用画面で使用する、プレイヤー名を設定します。

◆今後の機能実装予定
・実行中のマナプール管理機能ON、OFF      完了
・1人用画面でのマナプール管理機能の実装    完了
・マナプール管理機能ON時のレイアウト見直し…… 完了
・↑あるいは、ライフカウンター位置とマナボタン位置を全てオプション項目化
・アイコンの用意(Ver0.76~0.80はWindowsデフォルトのアイコンです……) 完了?

◆懸案事項
・起動中はスリープさせない   完了
・偶に、タイトルバーが上に重なってしまうことがある。
 ⇒ただし別アプリでも多発するため、ハード側の不具合?

◆注意事項(お約束的なもの)
※当アプリを使用して発生する不祥の事態に対して、当方は責任を負わないものとします
※特に再配布などは制限してませんが、著作権的なものはOD-10Zにあります

◆凡人のひらめき (※作者のぼやき)
「iPhoneにはMTGライフカウンターがあるらしい(知合い談)……折角WM手に入れたんだから俺もこいつで使いたい! でも探したけどみつからねぇ! じゃあ作る!!」
以上の経緯があって作りました。背景画像指定を可にしたのは、完全に俺得アプリにするためです。
好きなカードとかイラストは数多くあれど、それのライフカウンターはほとんどありません。かといって画像印刷して自作しようにも手先は不器用だしスキャナの性能も悪いし印刷の質が悪いプリンターしかないし……。
そんな方に朗報なアプリです。これなら画像をPCで軽く加工するだけで、すぐにオリジナルのライフカウンターになります。
どうせならフリック入力できたほうがそれっぽいよね、ということでフリック機能も手動で実装しました。存外楽でした。
実は仕事以外でプログラム作って公開するのはこれがはじめてだったりします。へんなところもあるかもしれませんが、生暖かく見守っていただければ幸いです。
また、何か要望等がありましたらコメントをお願いします。

広告

悪魔の布告

 備忘録、及び同じことで行き詰ってしまっている人が検索で辿り着けば……と思ってここに残しておきます。
 LogFontを使用して「DrawString」を行う際の注意点。

 回転した文字を表示したくて(説明しにくいですが、要は文字が書かれた紙を、賞状を渡すときにみたいにくるっと回して相手向きにした常態の文字)、LogFontを使用していたのですが、全部で7個ほど描画するうちの5つほどがうまく表示されない。
 最初は文字位置の指定が描画領域の範囲外になっていたりしたのかなーと思ってました。文字を反転すると描画開始位置で指定する座標も反転するのです。(通常なら左上隅の0,0座標からですが、反転すると基本は右下の隅の座標)
 ところがそこを直してもうまくいかない。はて、描画領域が小さいのに文字のサイズが大きすぎたかな……とか色の指定が背景と同じになっちゃってるかなとか宣言失敗してNullってんのかなとか色々調べましたが、原因が掴めない。
 あきらめかけたところで改めてDrawStringの構文を見直していたのですが、表示に成功しているところと別のところで何か変な違いがあることに気付きました。

失敗してたほう:
lg_Grapphics.DrawString(“文字列”, lf_LogFont, Brush, x, y)

成功してるほう:
lg_Grapphics.DrawString(“文字列”, lf_LogFont, Brush, x, y, New StringFormat((StringFormatFlags.NoWrap Or StringFormatFlags.NoClip)))

 違いは一目瞭然。引数の最後、フォーマット指定を省略していたかどうか、の違いがありました。
 いやこれは違うだろーと冗談半分に追記してやり直してみたところ、これで直りました_| ̄|○
 理由はわかりませんが、どうやらLogFontを使うときはフォーマットも指定しないと駄目なようですね……。自分はこれだけのことで数日間ほど悩み続けてました……。

 もしLogFontを使っての描画がうまくいっていない人がここを見かけていたら、一度確認してみてください。

————————————————————————————-

グレヴェン・イル=ヴェクは、ヴァティの体を持ち上げた。
「さあ、落ちる間にお前の失敗について考える時間があるだろうよ」

死の一撃

・アプリ起動のままスリープしロックがかかったあと、電話がくると落ちる <New!

 電話がかかってきたときに検知することはできます。
 が、なんかどうもこの調子だと、あらゆる場面でバグが発生しそうで怖いです……。

 と悩んでいた折に、文字列を上下反転して印字する方法がわかりました。LogFontを使えばいいみたいです。(画像として描画する、というイメージになるみたいです)
 流石にデフォルトで向きかえるのは無理かぁ……とは思ったものの、マナプール管理の部分などで描画処理は細々とやっているので、そこにさらに処理が追加になる程度で実現できそうです。というか、実験した分では一応出来ました。
 ということで、横向き固定という仕様をバッサリ切り捨てて、縦方向にも対応させる方向で作り直し中です。3連休中には形にできるとイイナ!

もつれ

 MTG LifeCounterアプリの小話です。

 ある程度大きなバグは取れたと思うものの、やはり細かいバグがいくつか点在しています。
 その中で1つ、バグなのかなんなのかイマイチ原因が掴めない現象が発生してます。

 現在このアプリは全画面表示を前提に作成しており、WindowState=Maximized で作成してあります。この設定にしておくと、アプリケーション実行中は画面上部のタイトルバーというかタスクバー?が非表示になります。(電波マークとかバッテリとかが出てるアレ)
 当初は想定通りに動いていたのですが、帰りの電車のなかで弄っているときに画面上部にタイトルバーが表示されてしまう、という現象がありました。その結果としてフォームの一部が隠れてしまい、画面の一部項目がその下に隠れてしまったのです。そんなに大きな影響はないものの、背景画像設定時などにはそれが一部隠れてしまうため、気になる。
 しかし帰ってきて調べてみると、デバッグ機IS02のほうでは発生していない。試しにT-01Bのほうを電源落として再起動してみると、ちゃんとタイトルバーが消えている……。

(;`・ω・´)なんぞこれ。

 IS02もT-01Bも昨晩にアプリを入れて、そのまま1日電源を切らないでおきました。時間経過で発生するならばIS02でも発生しないとおかしいのですが、今現在も正常に稼動しております。
 他に考えられそうな原因というと、T-01Bには「WkTask」がインストールしてあります。これはタイトルバーにPCのタスクバーのように表示できる便利ツールなのですが、これが何か影響しているのでしょうか……。
 固有設定で「常にタスクバーに表示しない」などは既に行っているのですが……。うーん、謎です。

 他、画面向き方向変更時のチェック中に気付いた点としては、
  ・一瞬縦方向になっている間に何かイベントが発生すると落ちる
  ・ロック画面が有効になると、ロック画面側が強制的に向き変更をしてくるため、落ちる

 2つ目の問題は現在画面がアクティブかどうかをチェックすればどうにかなりそうな気がします。
 しかし、これだけ微妙な問題が多いと、もうおとなしく縦画面も可能にしようかなぁとか思えてきます。
(縦を嫌がる理由は、その向きのときに自分と相手のライフカウンターを表示している場合に、向かい側の型が読めるように片方だけ文字の上下を反転させる方法がわからないから、だけなんですが)

バリンのやり戻し

 いざインストーラーとかを作ろうと思った段階で、アイコンを用意していないことに気付いた。

 追記。
 どうやら何種類かの大きさのアイコンを用意しないと、駄目みたいですね。
 スタートメニュー内のは……90*90? NX!に表示されてるやつの大きさがようわかりませんが……。
 アイコンは後回しにしちゃおうかなぁとか考えちゃってます。というか作ったことないので。

 とりあえず明日1日、暇な時にテストを兼ねて操作してみて、問題なさそうならMTGライフカウンター、公開してみます。

破滅的な行為

 画面回転処理でExceptionが発生し、終了してしまう件について、調べててわかったことを書いてみます。

・SystemStateの定義、記述方法に問題はない
たとえば画面オープン直後の画面向き変更処理や、MsgBoxをかませた場合に正常に動作することなどから、ここに問題はないことがわかる。

・MsgBoxをかませた場合の動作
落ちる箇所の1行前にMsgBoxを入れた場合、画面上では一度画面向きが縦に変更された後にMsgBoxが表示され、それを閉じた後に横向きに戻る。

・timmerで0.1秒待ってから画面向きを横にしようとした場合
0.1秒以下だと落ちる。(理由はわかっています)
0.1秒以上にすると、画面が一瞬だけ縦の状態になってから、直後に横になる。

 以上のことから、画面向き変更処理がまだ途中の段階で、画面向きを横にする処理を呼び出しているためにエラーが発生していると思われます。
 MsgBoxやtimmerを使用した場合は変更処理が終わってから横向きにする命令が実行されるため、エラーが発生していないわけです。

 ……さいですか。
 つまり横向き固定のアプリケーションを作る場合は、「画面が縦になった瞬間に横に戻す」という方法では実装出来ず、「画面向きが変更されるというイベントそのもの」を殺さないとどうしようもないわけですね。
 ……できるのかなぁ、それ。

 というわけで私の場合、今回はtimmerを使用して0.1秒待たせることにしました。
 この方法の場合、画面が一瞬だけ縦に戻るのが見えてしまうため見栄えは非常に悪く、あまりいい方法であるとは言えませんが、その部分は今後の課題としておきたいと思います。回転イベントそのものを無効に出来そうにない場合、縦方向での使用も考えて再配置処理やらを作る必要がありますね。
 横向きに拘っているのは個人的な理由なので、実際にアプリを使ってみて縦方向でも問題は無いのではないかと判断した場合は、縦方向での使用を実装する方向で考えていこうと思います。

 酔っ払っているので解りにくい文章になってしまったかもしれませんが、今回の問題に関してはとりあえず以上です。
 この件のアプリですが、これで(一応)問題解決のため、近々β版を公開したいと思います。
 内容はMTG用ライフカウンター。自分のライフだけを管理するモードと2人分のライフを管理するモードの2つをもち、画面のフリック入力でライフの増減が簡単に出来るようにしています。
 またマナプール管理機能(ON,OFF可能)も持たせてあり、マナ管理が大変な長いコンボ時などに効果を発揮する予定です。ちなみに1人用画面の場合、背景画像設定を行えるようにしてあり、自分の好きな画像のライフカウンターとして使えます。

以下、作成する必要がある残件内容。
・オプション画面

以下、近々作る予定の機能
・1人用のときにもマナ管理機能を出来るようにする
・一部画面レイアウトの変動を可能にする(文字サイズ等)

以下、現段階での既知の不具合
・画面回転時、一瞬だけ縦方向になった姿が見える(今回のメインの話題の件)
・マナ管理機能ON時の画面レイアウトが致命的に か っ こ わ る い

 乞御期待ッ!(基本は俺得アプリですが)

氷河期の災厄の象徴

 たまには技術的なことでも……。

 WindowsMobileは画面の向きが縦・横の2パターンで変化します(厳密にはもう2パターンありますが)。今作成中の、7/6記念のアプリケーションにて、画面向きを横で固定させたかったために以下の方法で画面向きを固定させる処理を書いています。

‘グローバル変数として以下を定義(画面回転の検知用)
Private dispStatus As Microsoft.WindowsMobile.Status.SystemState

‘ロード時に画面向き変更と、回転イベント検知用のイベントハンドルを追加
Private Sub frmStartUp_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Microsoft.WindowsCE.Forms.SystemSettings.ScreenOrientation = Microsoft.WindowsCE.Forms.ScreenOrientation.Angle270
  ’画面回転イベントを登録
  dispStatus = New Microsoft.WindowsMobile.Status.SystemState(Microsoft.WindowsMobile.Status.SystemProperty.DisplayRotation)
  AddHandler dispStatus.Changed, AddressOf Me.dispStatus_Changed
End Sub

‘画面回転時の処理
Private Sub dispStatus_Changed(ByVal sender As Object, ByVal args As Microsoft.WindowsMobile.Status.ChangeEventArgs)
  ’上記、Loadイベント内での宣言により、画面回転発生時に呼び出されるイベント
  If Microsoft.WindowsCE.Forms.SystemSettings.ScreenOrientation = Microsoft.WindowsCE.Forms.ScreenOrientation.Angle270 Then Return
  Microsoft.WindowsCE.Forms.SystemSettings.ScreenOrientation = Microsoft.WindowsCE.Forms.ScreenOrientation.Angle270
End Sub

T-01B実機だと上記赤色の※の部分で、エラー落ちします。(エミュ上でも変な動きになるんですが……)
キーボード出し入れでの画面回転しか試してないんですが、キーボードをしまったとき(縦になるタイミング)で落ちています。
しかし不思議なことに、※部分を
  MsgBox(“画面回転は出来ません”)
みたいにメッセージボックス表示処理を挟むと、何故か落ちなくなったりする……。
メッセージボックス表示中は画面が一時的に縦の状態で描画されるんですが、少し待たせたほうがいいのかなと思ってスリープを入れてみても、結果はエラー。
何が原因なのかイマイチわかりませんが、もうちょっと調べてみて解決したら、ここに載せようと思います。

ちなみにこれが解決すれば、β版レベルではありますが、ようやく1つ目のアプリ公開が出来そうです。
(MTG補助アプリですが)

というか気がつけばこんな時間に……明日大丈夫かな……。