2007年10月アーカイブ
このソフトは以前は「ウルトラキッド」「ファンファーレフォトグラファ」「HYPER KiD」「The Graphics[ペイント]」等の名前で売られていたソフトの後継で、なかなか使いやすいフォトレタッチソフトです。名前をころころと変えつつバージョンアップしてきて、今はソースネクストから1,980円で販売されています。
ソースネクストというとちょっとイメージが悪いかもしれませんが(失礼)、フォトグラファは38,000円もした結構まじめに打倒Photoshopを狙っていたソフトです。結局、低価格版Photoshopの出現と同時に、当時いっぱいいたライバルもろとも打ち砕かれてしまいましたが…
機能的にはフォトグラファからCMYKモードが省かれた程度なので、それが必要ない人には十分です。また、10年前からプログラムが大して変わって無いので、動作も非常に軽いです。
難点は、説明書がヘルプファイルしかないので、この手のソフトを初めて使う人には難しいかもしれないこと。また、Photoshopプラグインに対応していますが、動くのは稀でほとんど動きません。(1つ前のPaintgraphicの方が互換性高かったようです)
私はPhotoshopよりもこちらの方が好きなので、ウルトラキッド2時代から愛用しています。ちょっとした画像編集ソフトが欲しいけどフリーのGIMPには馴染めなかった人は試してみてはいかがでしょうか。
テレビゲームをしていて、1体なら弱い敵が2体・3体いると物凄く強く感じたことはありませんか?実は全く同じ敵が2体になると、その強さは単体の2倍ではなく3倍強くなります。
敵の強さというのは感覚的なもので数値で表すのは難しい要素ですが、ここでは「その敵を倒すまでにこちらが受ける被害」で評価することにします。
まず、敵Aを倒すのにかかる時間をt、その間にこちらが受けるダメージをdと定義します。
敵が1体のときにこちらが受ける被害は、当然dになります。
2体の場合はどうなるかというと、A1を倒すのにtの時間がかかり、その間A1とA2から攻撃されるので2dの被害を受けます。次にA2を倒すのに同じくtの時間がかかり、その間にdの被害を受けます。結果的に、2tの時間がかかり3dの被害を受けることになります。
1体のときはd、2体のときは3dなので、この評価方法では3倍強いことになります。同様に3体のときは6倍、4体のときは10倍になります。
ただし、複数の敵に同時にダメージを与えるような攻撃をせず、また敵の数をなるべく減らすように1点集中で攻撃することが前提になります。(2体に満遍なく攻撃すると4dの被害を受けてしまうので損)
アクションゲームの場合はここまで単純にはいきませんが(システムや立ち回りによって4倍以上にも2倍以下にもなる)、ターン制のRPGやシミュレーションゲームでは大体この評価方法が当てはまると思います。
ゲームを作る際は、この敵の数と強さは比例しない法則を覚えておいた方がいいでしょう。1体の敵より少し強い敵を用意しようとして単純に同じ敵を2体、3体にすると想定以上に敵が強くなってしまいます。
遊ぶ側も、敵の数が減れば劇的に弱くなることを覚えておくと攻略が楽になります。ただし、全体攻撃魔法のような複数同時に攻撃する手段があれば、場合によってはそちらを使った方が楽になります。
Windowsでゲームプログラムを作成する際に、忘れがちだけど必要な処理をまとめておきます。
- タイマー精度の設定
timeBeginPeriodでタイマの精度を1msに設定します。この設定はtimeGetTime以外にも、GetTickCountやSleepの精度にも影響します。終了時にはtimeEndPeriodで元に戻しておきましょう。
これを忘れると動きがスムーズでなくなったり、fpsが低くなったりします。また、単独で起動したときよりも、メディアプレーヤーと同時に起動したときに動きがスムーズになるという症状が現れます。
- スクリーンセーバーの起動抑制
スクリーンセーバーが起動する直前に、アクティブなウィンドウに対してWM_SYSCOMMANDメッセージで通知されます。wParamがSC_SCREENSAVEのときはスクリーンセーバー、SC_MONITORPOWERのときはモニターのパワーオフです。このメッセージをDefWindowProcに渡さないようにすると、スクリーンセーバーの起動を抑制することができます。
スクリーンセーバーの起動は、キーボードやマウスの入力で判定していて、ゲームコントローラは全く関知しません。そのため、ゲームコントローラをメインで使うゲームの場合は、何も対策していないとゲーム中にスクリーンセーバーが起動してしまいます。
このメッセージは、自分のウィンドウがアクティブのときにしか送られてきません。最小化されていたり、他のウィンドウがアクティブのときはスクリーンセーバーが起動します。
Vista以降のOSでは、スクリーンセーバーの設定で「再開時にログオン画面に戻る」にチェックが入っていると、このメッセージでスクリーンセーバーの起動を抑制することはできないようです。
- IMEの無効化
ゲーム中でIMEを使用しないのならば、ImmDisableIMEでIMEを無効にしておきましょう。IMEが有効のままだと、ゲーム中に日本語入力をONにすると、それ以降キーを押すたびに左上の方で文字がチラチラ表示されてしまいます。
- フルスクリーン時にタイトルバーを無くす
フルスクリーンモードのときは、ウィンドウスタイルをタイトルバーの無いものに設定します。
WindowsXPやVistaでLunaが有効に設定されているとタイトルバーの角が丸くなり、このままDirect3Dでフルスクリーンに設定すると、画面の左上と右上に隙間ができてしまいます。この部分をマウスでクリックすると、フォアグラウンドウィンドウが切り替わってしまいます。
- Winキーの無効化
Winキーを押すと、スタートメニューが開きます。ゲーム中にうっかり押してしまったときにスタートメニューが開いてしまっては困るので、これも無効にしておきましょう。
一番簡単で確実な方法は、IDirectInputDevice8::SetCooperativeLevelのdwFlagsにDISCL_NOWINKEYを設定します。
どれも1~2行程度で済む簡単な処理ですが、忘れるとゲームプレイに支障をきたすことがあるので、必ず設定しておきましょう。
DirectX8用アス比固定拡大ツールを更新しました。
東方シリーズでスナップショット撮影をすると落ちる問題を修正しました。
原因はif文の条件が真逆になっていたという、マヌケなミスorz
DX8用からソースをコピペしたはずのDX9用では、何故か間違っていませんでした。
この本の内容はEffective C++に良く似た形態で、短い文の格言と、それに対する詳しい説明から成っています。
Effective C++はあくまでもC++の言語仕様や標準ライブラリの範疇での説明しかありませんが、こちらの本は標準ライブラリの実装の悪い点の指摘があったり(basic_stringが103個ものメンバー関数を持つ不必要に巨大なクラスである点等)、標準ライブラリから飛び出てboostライブラリの紹介があったりします。boostの紹介は、標準ライブラリでは対応できない部分だけで、必要以上に押し付けてきたりしないので、boostに興味がなくても安心して読めます。
Effective C++と比べるとこの本の方がより実践的で、たんに奇麗事を並べているだけでなく、現実的なことが書かれています。例えば一番最初の項目は「些細なことにこだわるな」で、プログラミングのプロならば自分の書き方と少々違っているコードでも簡単に読み書きできるはずだから、必要以上にコーディング規則を押し付けないということが書かれています。また、ほとんどの項目に例外事項の説明があり、その規則を適用する必要がない、あるいは適用すべきではない状況の説明もあります。
ただし、C++を勉強中の人がEffective C++とこの本のどちらかだけを読むとしたら、私はEffective C++を薦めます。Effective C++は、まだ自分でクラスをうまく定義できない人に向いている本で、C++ Codeing Standardsは一通りクラスが使えるようになった人に向いている本だと思います。
アスペクト比固定拡大ツールは、フックを仕込んでアプリケーションからDirect3Dへのアクセスをトラップしています。
ただし、DirectXは全てCOMクラスで実装されているので、よくあるAPIフックのようにDLLのインポートアクセステーブル(IAT)を書き換える方法ではフックすることができません。
そこで、まずはプロキシDLLを使ってDirect3DCreate9(8)の呼び出しをトラップし、そこから返されるIDirect3D9のVtblを書き換えています。プロキシDLLを使ったフックはD3DSpyでも使われています。
Direct3DCreate9にフックを仕込む手段は、アプリケーションのエントリポイントで一度停止させてからd3d9.dllのIATを書き換える等の方法もありますが、その方法ではアプリケーションをランチャーから起動させる必要があって面倒なので、今回はプロキシDLLを採用しました。(元になったのがネトゲ用に作った窓化ツールだったというのも理由)
COMクラスは、各メソッドへのポインタが並んだテーブルへのポインタを持っています。これはVisualC++の仮想関数と互換性のある形式で、C++からはこのテーブルの存在は意識する必要がないのですが、CでCOMクラスを扱う場合はlpVtblというメンバを持った構造体として定義されます。例えばBeginSceneをCから呼ぶ場合は、lpD3DDev->lpVtbl->BeginScene(lpD3DDev)となります。 *1
C++の形式ではVtblに直接アクセスする手段が無いので、C形式の方がフックしやすいです。C++の場合でも、d3d9.hをインクルードする前に#define CINTERFACEと書いておくと、定義がC形式に切り替わります。
メインの処理は大雑把に言うと、CreateDeviceをフックして指定された解像度のレンダーターゲットテクスチャを作成して、それをバックバッファのように見せかけています。Presentの段階で本物のバックバッファに比率を調節して拡大コピーします。
ただし、BeginStateBlockとEndStateBlockがVtblを書き換えるという方法で実装されているので注意が必要です。せっかくVtblを書き換えてフックを仕込んでも、これらのメソッドが呼ばれるとVtblが初期化されてしまいます。対策として、BeginStateBlockが呼ばれた時点でEndStateBlockにフックを仕掛け、EndStateBlockの後でVtblを元にもどすようにしました。
また、マウスカーソルは最初はGetCursorPos等をフックして座標変換するつもりでしたが、その方法では上手く動作しなかったので、本物のカーソルは非表示にして座標変換した位置に自分でカーソルを描画しています。しかし、いくら調べてもアニメーションカーソルに関する資料が見つからなかったので、今はカーソルはアニメーションしません。
DirectX9用のアス比固定拡大ツールを更新しました。
前のバージョンは、Debug版ランタイムでしか動かなかったので、Retail版でも動くように直しました。
動かなかった原因は、なぜかIDirect3DDevice9::GetStreamSourceで返されるIDirect3DVertexBuffer9のVtblが壊れていました。DirectX側のバグなのか、それとも私のプログラムに原因があるのか調べるのが面倒だったので、この部分(追加の処理を入れる前後で同じ状態に保つ処理)をスッパリと削除しました。
どうせ前のフレームでセットした頂点データを、そのまま次のフレームでも再セットせずに使うプログラムなんて無いので問題ないでしょう。
昨日始まったアニメ「しおんの王」を見ていたら、輪郭線の細さが気になりました。
アニメ製作がデジタル化される以前のセル画の時代には、輪郭線は絵の構成要素としての役割とは別に、彩色の際に色がはみ出るのを防ぐ緩衝エリアとしての役目がありましたが、今ではそのような必要性はないので太さは関係ないんですね。
また、被写界深度効果もかなり積極的に使われていました。被写界深度効果は他のアニメでも使われていますが、たとえばドラゴノーツが半径1~1.5ピクセルのぼかしで注意していないと気付かない程度なのに対して、しおんの王ではかなりキツく輪郭線が完全に消失する程かかっていました。
同じカットでピント位置が変化する表現も多く(複数の人物が発言するほぼ全てのシーン)、発言するキャラにピントが合うように変化していました。ただ、少しやりすぎで見難い感じがしましたがw
DirectX9用のアスペクト比固定拡大ツールも作りました。
アスペクト比を固定したまま画面を拡大するツール for DirectX9(仮)
とりあえず東方風神録の体験版で動作確認したバージョンを暫定公開しておきます。
私は今まで郵便貯金のキャッシュカードとセゾンのクレジットカードが一緒になった郵貯カード《セゾン》VISAを使っていたのですが、郵便局の民営化でこの提携が切れてしまい、キャッシュカードとクレジットカードで分かれることになりました。参考リンク
ゆうちょ銀行は現時点では新しい提携先の発表はありませんし、キャッシュカードとクレジットカードで2枚のカードを持つのは嫌だなぁと思っていたので、他の金融機関と提携している年会費無料のクレジットカードを探してみたら、これが意外と少ない。
結局、1枚にまとめるのは諦めて、貯金を新生銀行、クレジットカードをAmazonクレジットカードにしました。
新生銀行はコンビニATM利用時の手数料が24時間無料で、以前から口座を作ってありました。Amazonクレジットカードは、ポイントの還元率が非常に高く、還元の単位が500ポイント毎というのも使いやすいです。Amazonギフト券での還元なのでAmazonでしか使えませんが、一年間に使うお金の半分がAmazonではないかという私には非常にありがたいカードです。 *1
新生銀行にも新生VISAカードがありますが、どうせオンライン決算にしか使わないならクレジットカードを持ち歩く必要もないので、今回は見送りました。
他に検討した中でお勧めは三菱東京UFJ銀行です。ここのスーパー普通貯金(凄いのか普通なのか謎の名称)に100万円50万円以上貯金しておけば、コンビニATMが24時間無料で利用できるようになります。貯金が50万円未満でも、キャッシュカードとクレジットカードが一緒になったスーパーICカードで、1円でもクレジットカードの利用があればコンビニATMが無料になります。
これらの情報はほとんど夜中の3時にK塚さんにメッセで教もらいました :-)
某掲示板でこっそり配布していたアスペクト比固定拡大ツールを公開しました。
アスペクト比を固定したまま画面を拡大するツール for DirectX8(仮)
DirectX8を使用したフルスクリーンのアプリケーション専用です。

