カテゴリー

アクセスカウンター


since 1996/06/14

Count per Day

  • 31今日の訪問者数:
  • 40昨日の訪問者数:
  • 890月別訪問者数:
  • 1現在オンライン中の人数:

Webプログラミングメモ

NTT Docomo 文字コードはSJIS。 画像はGIF。2003年以降の機種はJpegもOK。 JavascriptやCookieは非対応。 Willcom フルブラウアザなので、まぁ何でも困ることは無いかも。 Vodafone 画像はPNGとJpeg。2005年以降の機種はGIFもOK。 EZweb 画像はPNG。最近のはJpegとGIFに対応。

プログラミング本

DirectX Amazon:4798013161  Direct3D/Input/Soundで痒い所に手が届く…そんな本。 Amazon:4797329807  DirectXの基礎学習にはお勧め。エフェクト系がちょっと詳しい。Ver2なので初版を持ってる人は買う必要が無いかも。 Amazon:4798007811  これも基礎学習系。ただし後半はシェーダ系中心なので、初心者には取っつきづらいかも? Amazon:477751272X  DXUT(Feb 2007版)がとても詳しい。 Amazon:4777510077  とても微妙な本。広く浅くって感じ。数少ないDirectPlayを扱ってるけど、結局浅いので…。 通信 Amazon:4797330449 winsockの基本的なリファレンスとして役立ちます。 Amazon:4797328479 持ってないけど、数少ないオンラインゲームの通信ネタ本。 Amazon:4797328460 持ってないけど、数少ないオンラインゲームの通信ネタ本。

VC++.net2005の環境設定

 Windowsアプリの開発環境であるVisualC++.net 2005 Express Edition(以下、VC)のセットアップ方法です。  無料だけど環境設定が面倒で、Windowsを再セットアップする度に調べるのが大変なので、メモとして残しておきます。 WindowsUpdateとかで.net Frameworkを全部入れておく。重要な更新に含まれてないことがあるんで注意。 MicrosoftからVCを落としてインストする。 Platform SDK(Windowsアプリを開発するキット)をインストする。 DirectX SDK(DirectXアプリを開発するキット)をインストする。ちなみに、頻繁にバージョンアップする上に、頻繁に仕様が(下位互換無しに)変わるので、どこかのライブラリを使うなら、ソレにあったSDKを入れること(複数のバージョンの混在も出来たはず)。 C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults\corewin_express.vspropsをメモ帳とかで開いて、AdditionalDependencies="kernel32.lib"を以下の内容にする。 AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib" C:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\html\1041\AppSettings.htmの441〜444行目をコメントアウトする(;´Д`) // WIN_APP.disabled = true; // WIN_APP_LABEL.disabled = true; // DLL_APP.disabled = true; // DLL_APP_LABEL.disabled = true; VCを起動して以下のあたりを更新 ツール→オプション プロジェクトおよびソリューション→VC++ディレクトリ 実行可能ファイル – 「C:\Program Files\Microsoft […]

ゲーム製作アレコレ

 今日は雨が降ってるので、しみじみとパソコンをいじってます。寒いなー。コタツ出そうかな。あーでも後で買い物にも行かないとー(´・ω・`)  Flashでゲームを作るのは一旦リセットしてます。AdobeのFlashCS3で作ってたけど、ぶっちゃけFlashDevelopの方が使いやすい。よくあるFlash動画を作るならFlashCS3の方がいいかもね。まー、リセットというよりか、コードをそのまま流用して再構成し直してますって感じ。  あと、ちょっとググってたら、GameMaker(日本語非公式サイト)というサイトを発見。RPGツクールほど楽じゃないけど、かなり多岐にわたるゲームを簡単に作れるらしい。  どうも使ってみないとどの程度のことが出来るのか見えてこないけど、ネットゲーみたいのは作れないのかなーって感じ?

flash作成中のサンプル

 今まで、なんかいろいろ作っりつつもなんも公開してませんね… って、今回作成してるflashはよくよく考えると簡単にwebで公開できるじゃん! ってことで、作成中のを公開しちゃいます…と、言っても、まだ以下の事しかできません。

地図があって無いようなもの。 地図上をクリックすると、一応カーソルの方向に移動する。 ウインドウはあくまでサンプル。一応、タイトルをドラッグで移動、チャットウインドウ側は右下をドラッグでリサイズくらいはできる。

ってくらいしか出来ません。なお、テストなんてロクにしてないので、環境によっては挙動不審になるかも?Flash PlayerはVersion9じゃないと動かないと思います。 壁紙は昔作ったWebゲームのまんまなので、気にしないでくださいw そんな訳で以下のアドレスからアクセス出来ます。 http://pub.d77.jp/fg/test1/fg.html

flashでネットゲー

 flashでネットゲーってできるのかな?ってことで挑戦中。DirectXでもよかったけど、いつまでも時間がかかりそうだから手っ取り早く作れそうなプラットフォームはないかなぁって、たどり着いたのがflash。 flashっていうと、普通はWebアニメーションの作成ツールを思い浮かべると思うけど、最新版はちゃんとオブジェクト指向だし、結構複雑な画像処理を標準の機能で賄えるので、そこそこ手軽に作れるからいいかも。 サーバとの通信方法は、XMLを使った非同期っぽいのもできそうだけど、サーバ側を作り込むのが面倒だからperl/CGIでやりとりをしてみることにした。 リアルタイム性を維持するのはほぼ無理だけど、手軽に作れるし、まぁ1〜2秒インターバルくらいでいければいいなぁと、気軽に考えてます。 今のところ作ったのは…

通信クラス…クライアント側はほぼできあがり。サーバ側はゲームの内容に直結するから、まだシンプルな機能しか作ってない。 ダイアログクラス…ベースはほぼ完成。チャットウインドウ、メニューウインドウ(の形だけ)とかなら、XMLで定義すれば自動生成してくれるくらいまでできた。 チャット…テストは完了。受信は5〜10秒周期くらいにするつもりだけど。

と、まぁ基本的なところまではできてる。今は、マウスカーソルでフィールドっぽいところを移動するところを作ってる。移動方向のカーソルと、実際の移動はできるけど、スムーズじゃないし、内部データとの連動も全然考えてないので、まだまだの出来。 また、いつ飽きるかわかんないけど、2週間程度でここまでいければまぁいいでしょ? 作成中の画像には、REFMAPが配布しているフリー画像素材を使用してます。

クリエイター向けツール

昔から、プログラミングとかグラフィックとかは一通りやってるので、ゲームを作ろうと思いつくとさほど苦では無いんですが、唯一「音」関係が苦手なんですよ。 作曲はもちろんのこと、効果音なんてのも作れません。 で、とある本を読んでいたら以下のようなツールを見つけました。 別にゲームを作らなくても、楽しいツールですよ。

プログラマニア

 私ってプログラミングが趣味なんですよ。 たぶん、性格的に自分が満足いかないものに対して満足するまでの努力と時間を惜しまないので、パソコンを前にするとそれを実現する方法としてプログラミングがマッチしてしまったと。  んで、プログラムにはプログラム言語がつきものなんですが、それなりにプログラムを打ったことがある言語って、どのくらいなんだろうと思って数えてみた。 ※ちなみに、それなりの1つでもプログラムを作り上げたもののみ。 もう忘れた言語 COBOL まだ覚えてる/思い出すのはたぶん容易 ※同じ言語でも製品によって実装や扱いがかなり違うのは別とした。あと、TeraTermマクロとか実装がショボイのは含めてません。 アセンブラ(MASM) BASIC(NECのN88、SharpのNewZ) VisualBASIC WSH/VBScript(中身はVBと同じだけど、まぁ独自記述も多いので分けた) C C++ VisualC++(MFCとかCOMとか独自ライブラリっぽいの) VisualC# HTML(言語と言っていいものか?) WindowsのBATCHファイル Java JavaScript(含むJScript) ASP.NET(中身はVBと同じだけど以下略) MS-Access(中身はVBと同じだけど以下略) C-ShellのScript SQL Perl  結構やったなー。 ちなみに、最近はFlashのActionScriptを覚えようかなぁと奮闘中。 意外と知らない言語 PHP(使われ方がApacheとかと密接すぎるので嫌い)。 Ruby(Script言語のくせに文法上の制約が厳しいのですぐに投げ出した) VBA(アプリ依存ってのが嫌い) HSP(プログラムが書きづらすぎてやめた)  最近は歳のせいか、変な理由をつけて覚えたがらない…orz

散財その1-Flashの本

今日っていうかここ最近で買った本。別に読書の秋とか関係なく年がら年中読書をしている訳ですが、今回はちょっとFlashの勉強をしようかなと買いあさってみました。

通信制御

 今回は一連のDirectXがプログラミングの続きですが、DirectXとはあまり関係ないプログラムのネタです。通信対戦ゲームやMMORPGのようなゲームには、ネットワーク経由での通信制御が必要です。では、通信をどうやって実現しようか…? 今回考えた候補は以下の通り。

DirectPlay(DirectXのモジュールの一つで、ネットワーク通信専用モジュール。 フリーのソレっぽいモジュール(今回はHawkNLを使ってみた) 気合いで一から書く。

まぁ、最近blogでこのネタを扱わなかったのは、この辺でモンモンとしていたからです。 まず、DirectPlay。これは評判が悪いですね。何でかよく知らないけど。 まぁ、でも評判云々の前に、まるで通信対戦の概念を知らない私が選り好みをしてる方がアフォっぽいので、コーディングしてみた。 結果は、まず参考となるサイトが少ないですね。DirectX SDKのサンプルとかチュートリアルも、今使っている2007/Febには付いて無くて、2003/Summerまで遡ってGETしましたが、参考になるのがソレとHELPくらいしか無いので、非常に辛いです。サーバ/クライアントで繋がるくらいまで組んだけど、よく分からない分制御がしづらいのでDirectPlayはやめにしました。 次は、HawkNL。英語サイトしか無いのでわからん(笑。 まぁ、コードは組んだけど、せっかくこういうモジュールを使うなら、完全なブラックボックスで、あまり中身を意識しなくてもいいような使い方をしたい。SocketとかMulti Threadとかの機能があるけど、結局通常のAPIの焼き直しっぽくて、、、まぁ、不採用。

Amazon:4797330449

で、結局Socket(winsock)を使って自前で組みました。winsockのプログラミングって過去にやった記憶があったので本棚を漁ったら→こんな本を発見(リンク先は最近の本だけど、うちにあったのは同じやつの1998年度版)。既に10年近くの本だけど、winsock自体の仕様がほとんど変わってないってのは嬉しいね。 とりあえず、思いだし程度に1、2時間程度でサラっと読み返して、後はインターネットでサンプルコードを探してコーディング。いきなり現状のクライアントに組み込むのもアレなので、テストクライアントも作成って感じです。 現状はここまで。 簡単な通信は実現できたから、あとはマルチタスク化して多量の通信でも難なくこなせるような仕組みにしたいな。まだもうちょっといろいろと時間がかかりそうです。 以下、買ってないけど参考になりそうな本。これからこういうプログラミングをする人は参考にしてみて下さい。

Amazon:4797328479

 

Amazon:4797328460

 

[…]

strcpy

 コンピュータへの不正アクセスの方法として、buffer overflow(もしくはbuffer overrun)という攻撃があります。コンピュータには「メモリ(記憶装置)」というものがありますが(HDDとか半導体とかいうのは気にしないでください)、「メモリ」にはプログラムとデータが入っています。  しかし、ここがプログラム、ここがデータという明示的な境界はありません。それはプログラマが決めます。  どういうことかというと、砂場で遊んでいる子供が、砂場が狭いと「ここまではボクの遊び場、そこからはキミの遊び場」なんて境界を作ることがありますが、「砂場」の砂の色が違ったりとか壁があったりとかはしません。第三者から見れば、どこからがボクでどこからがキミの砂場かはわからない…つまり、論理的な境界であって、物理的な壁がある訳ではないです。 ※最近はメモリ保護機能とか、単純なレベルならOSが保護してくれます。  で、buffer overflowというのは、データを溢れさせてメモリ上のプログラムを書き換えることで実現する攻撃方法です。  こういうbuffer overflowな話でよく言われる例として、プログラム言語であるC/C++の関数の「strcpy」が例によく使われます。「strcpy」は文字列Aを文字列Bにコピーするという関数です。つまり、文字列Aが10文字、文字列Bが5文字しかキャパシティが無いと、あっさりbuffer overflowが発生します。はみ出した5文字分は、メモリ上の「プログラム」がかかれている場所に行くか、「データ」の場所に行くかはわかりません(意図的にそういうことをすることはありますが…)。  ちなみに、C/C++言語にはもう少し複雑な背景があって、こういう関数が「標準化」されています。C/C++言語はVisualC++とかgccとかBorland Cとか様々な種類がありますが、「標準化」された命令はそのまま実装されています。「この命令はヤバいので乗せない」なんてことはそうそう出来ません(移植性が損なわれる)。それが、こういうセキュリティ問題をさらに根深いものにしてるとも言えるのかな。だから、未だにstrcpyはC/C++にそのまま存在します。  で、今VisualC++でプログラムをしてるけど、最近のバージョンではこんな警告が出るようになりました。

warning C4996: ‘XXXXX’: This function or variable may be unsafe. Consider using XXXXX_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

訳)警告 C4996: ‘XXXXX’: この機能か変数が危険であるかもしれません。代わりにXXXXX_sを使用すると考えてください。 無効にするには、_CRT_SECURE_NO_WARNINGSを使用してください。

 strcpyを使うと警告(エラーじゃないので、無視すればそのまま使える)がでて、strcpy_sなんてものを使うことを薦められます。ちなみに、strcpy_sはstrcpyとほとんど同じだけど、「文字数」を指定してそれを超えるとエラーになります。プログラマーが文字数を間違えたら話にならないですが、まぁそんな感じであまり意識しなくても安全なプログラムを書けるようになっています。  こういった関数を多く使うと「標準化」されたプログラムでは無くなってきます。つまり、プログラムの「移植性」が損なわれてきます。しかし、JAVAのような違うベクトルから「移植性」を重視した言語が現れてきた今日では、そもそもそういう「標準化」の意味も薄れてきているのかなぁ…と、何となく思いました。 ※っていうか、過去のプログラムを使ったら警告だらけになって一つ一つ修正しています(T_T

目が〜

 右目が真っ赤になっちゃいました。どうも、まぶたの内側に変な腫物ができたようで、それが眼球を刺激しているようです。そんな訳で、今は左目だけでブログを書いています。 こういうときこそブログを書かなくては!…と言っても、左目は運転免許所をメガネ無しでギリギリ通る程度の視力なので、あまり見えません。ぶっちゃけ、ディスプレイの文字もかなりボヤけてます…。明日…仕事休んで眼科へ行ってきます…

ま、それはそれとして、上の画像は毎度おなじみDirectXなプログラミングネタ。 3Dゲームとかで、画面をクリックすると、そこに向かってキャラが走り出したりしますよね。この前の土日は、その「画面をクリックと仮想世界との連動」のプログラムをしてました。

「画面」という平面をクリックした場合、そこは仮想世界(3D)のどこをクリックしたのかを計算しなければなりません。これはさほど難しくなく、仮想世界のどこかにあるカメラから見ているので、そのカメラの中心位置からのマウスの相対位置で求めることが出来ます。

ちなみに仮想世界の視点は「点」ではなく、その点から少し離れた面としています(たぶん)。 クリックした場所がわかったら、こんどはそこから仮想世界の中で線を引きます。 線と仮想世界の地面の交点が、「クリックした場所」になるわけです。 ちなみに、「線」というのは、

2つの点 1つの点と方向

のいずれかがわかれば引けます。これは、小学校の算数で習います。しかし、「クリックした場所」という一点しか求めていません。 もう一つの情報である「方向」を与えます。方向というのは「カメラの向いている方向」というのがあります。ちなみに、「カメラの向いている方向」と完全に平行にはなりません。カメラで見た世界は「奥ほど広い」ので、「クリックした場所」が中心でないかぎり、距離が遠くなるほどに、カメラの向いている方向から離れます。

まぁ、その辺の微妙な演算をしてくれる関数が存在しているので、ペロっとデータを与えれば計算してくれます。 これで、クリックした点とそこからの線が求まりました。しかし、これでもまだ終わりじゃないです。その求めた「線」と仮想世界の中の地面という「面」の交点を求めなければなりません。 まぁ、この交点を求めるのも、関数+αで計算出来ます。

で、上の画像ですが、今回、テクスチャにちょっと細工をしました。四角いマス1つに「●」というマークを付けています。この世界は●という「面」の集合で出来ています。この画面の中には700くらいの●(面)があるでしょう。 つまり、一回クリックするごとに、このすべての●に対して、クリックしたポイントからの線と交わっているかを計算します。当然700●なら、700回計算です。

しかも、デコボコなので、手前の●と奥の●とかもあります。 最後の計算は結局力業なので、その分繰り返してやります。で、そんな計算地獄を2日間ほどかけてやってクリックした場所にカーソル(上の画像の赤丸で囲んでいる所にある赤いオブジェクト)が行くようになりました。 ちなみに画面描画をしながらこんな計算をしたら、画面が一瞬とまっちゃうので、この計算はバックグラウンドでガシガシやっちゃいます。

日頃、何気なくゲームでクリックとかしてると思いますが、裏ではこんなことをやってるんですよ。ホントに疲れます。 目がおかしくなるのもわかるでしょ?

 

鎧を着たり、武器を装備したり

またかなり時間が開いてしまいましたが、今回はキャラクターモデル系のプログラムを書いていました。あと、そのネタ用のモデルデータを作るのも一週間くらいかかっちゃったかな。 まずは、人が走っているところ。

[…]

人が降り立った

前回から大分時間が経ちましたがまたDirectXなプログラミングネタです。とりあえず、以下のような機能ができあがりました。

世界が広がった。 人が降り立った。

前回の舞台は100×100ポリゴン(実際にポリゴンは三角形なので、1×1の中には2枚のポリゴンが居ます)でしたが、今回は1000×1000ポリゴンです。

…と簡単に書きましたが、ここでいろいろやっています。まず、1000×1000のフィールドデータを一つ一つ作るのは面倒なので、お絵かきツールで地図を描いてそれを読み込むっていうのをまずやりました。まぁ、そこは難しくないけどね。

さらに、地平線の彼方にメモリを食われるのは勿体ないので、それを分割して、ある程度移動する毎に必要なデータを読み込むという処理をしています。簡単に書いたけど、案外計算が面倒です。 なので、データさえ作れば1000×1000以上も余裕で可能。さらに、フィールドデータの無いエリアを越えるとどうなるかというと、永遠と海が続きます。見えない壁にぶつかるのは虚しいですからね。 あとは、読み込む時に一瞬止まるので、データ読み込みとかを別スレッドで動かせればなぁと考えつつ、まだやってません。 「人」は、身動きしないモデルデータを読み込むのは簡単だけど、アニメーションするモデル(歩いたり走ったり)を処理するのはちょっと大変でした。次はたとえば剣を持ったら剣を表示とか、そういうオブジェクトの合成を考えないと…って感じ。 その辺まで出来れば、木とか建物とかのオブジェクトを管理するモジュールを作って、仮想世界の中にばらまけばソレっぽくなるかな。 ちなみに、この仮想世界の中でカメラを動かせますが、そこにもいくつか問題があります。たとえば、マウスをクリックするとそこに移動とか。 3Dモデルは、適当に3次元のベクトル座標を食わせれば、内部で擬似的に3D空間を作りつつ、カメラの位置にあわせで2Dに変換して画面へ表現するってことをほぼ自動でやってくれます。 しかし、2D空間でクリックした場合、それを3次元空間に変換して、クリックされたのは目の前のオブジェクトか、先のオブジェクトか〜なんて判定をしてやらないとなりません。…これってどうやるんだろう?(^^; あと、キャラクターの移動は単純に考えています。マビノギや、リネージュ、FFXIのようにスムーズにどこでも移動とは考えていません。仮想空間の中に擬似的に50cm四方の「マス」が存在していて、そこに移動します。つまり、ラグナロクオンラインみたいに、移動先は四角いマスの中になります。しかも、8方向の移動しか考えてません。 リアリティには欠けるけど、その先にある、人と人、人と物の衝突判定は、その50cm四方だけを考えればいいので、処理的には全然楽になります。 いろいろ書いたけど、まぁまだまだやることはいっぱいあるって感じ。

 

DirectXなネタ

なんか、最近プログラミングなネタばっかりですみません。 ってことで、また最近熱が入っているDirectXなネタ。 前回、影のコントロールが出来たので、今回は地形データをいじってみた。前回までは配列に手で一つ一つデータを入れていたんだけど、今回はペイントで描いた平面図をデータ変換して読み込ませてみた。ちょっと中国の山々みたいだけどね… モデルデータサイズも前回は20×20ポリゴンから、今回は100×100ポリゴンまで増やしてます(あ、あと海面も付加)。 あとは、モデルの中を移動する際に、動的に必要な分だけポリゴンをモデリングする機能を作れば、仮想世界の中での移動ができそう。 テクスチャとか、影の落とし方とかがショボいけど、テクニカルな部分は後回し。

法線その2(昨日の続き)

かんぺき♪やっと美しい影が付きました。 …今日のブログはこれだけw

法線

本題に入る前に〜…いや、DirectX(3Dゲームでよく使われるプログラムの基盤みたいなの)でプログラミングをしている訳ですが、ここまで作るのに実は一ヶ月くらいかかってるのよ。ウインドウを汎用的に表示てきるモジュールと、地面っぽいのを出すモジュール。まぁ、地面っぽいのはまだ制作途中だけど。 で、本題ですが、この地面おかしくないですか?立体なんですが、影がありません。 いろんな本とかネットで調べた結果、原因が分かりました。 こういう3D画像って「面」の集まりだけど、その一つの面に垂直な線を引きます(そういうイメージをしてみて下さい)。で、光はその面に当たると、面に垂直な線を軸にその反対側へ反射しますよね?その軸のことを「法線」って言います。

実は、この地面。その法線がすべて上を向いています。だから、どこの面に光が当たっても平らな地面と同じ反射の仕方をします。なので、陰影が無いと… … めんどくせぇな…そのくらい上手くやってよ… と、思いつつ法線計算ロジックを探しながら、一晩かけて作ってみました。 ※3Dモデリングツールとかで作れば、勝手に計算してくれるんだけどね。これは動的に地面を生成したいので、こつこつ計算して作ってます。

結果 なんか、この影嘘臭くね? 続きは明日でいいや…orz

DirectXっぽい備忘録

管理者のメモです。まぁ、興味のある人は読んでも損にはならないかも。 2007年5月時点での情報なので、鮮度にご注意を。

DirectX

Microsoftが作ったマルチメディア処理用API群。 最新はDirectX10だけど、WindowsVista以降にしか入ってないし入らない。 以下のコンポーネントを含んでいる。

DirectX Graphics…2D/3D処理。Direct3DとかDirectDrawとか言われていたものが統合されたモノ。 DirectX Audio…BGMとかSEの再生。 DirectInput…主にキーボードとマウスとジョイスティック制御。 DirectPlay…ネットワーク系。 DirectShow…動画再生とか? Managed DirectX

.NET FrameworkベースのアプリからDirectXを呼ぶ為のAPI。 今後はMicrosoft XNAに置き換わる。

Microsoft XNA

いろんなプラットホームに対応するように見せかけた、ゲーム開発用フレームワークで、WindowsとXBox360に対応している。年間一万円くらい払えばこれでXBox互換ゲームも作れる(作ってもプレイヤーも年間一万円くらい払わないと出来ない)。 開発言語はC#。 ボーンスキャニング、ネットワーク系のコンポーネントが遅れてる?

OpenGL

オープンソースのグラフィックライブラリ。マイクロソフトとは直接関係ない。 純然たるDirectX以外の最近のテクノロジーはまだまだって感じ。ある程度形がしっかりしたらいい感じになるのかな(でも今からC#なんて覚えたくない)。 開発ツールが無料になった分、マイクロソフトも成長したなぁと思う。

キャレット

カーソルには、マウスカーソルとワープロとかで文字を打つ場所にあるカーソルの二種類あるわけですが、文字を打つ場所にあるカーソルのことを「キャレット(caret)」って言います。 Windowsが出来る前の時代は普通にカーソルって言っていましたが、Windows時代になってキャレットって言うようになったそうな。

つうか、そんなのプログラマーくらいしか知らないよ。

で、4/29のブログにDirectXっぽいネタを書きましたが、今は3D描画では無くて、UI(ユーザインターフェース)…つまり文字とかコマンドを入力するようなところにチャレンジしています。 普通のWindowsのプログラムなら、画面上にボタンとかテキストボックスとかをペタペタ貼るだけで作れます。しかし、DirectXにはそんなものはありません。ボタンなら、ボタンの四角い枠から、ボタン上の文字、ボタンをクリックしたという処理とか、クリックした時に凹んだ画像までそういうプログラムを全部書きます。 文字入力のコピペ処理なんて、文字の選択中は選択範囲の色を反転させるとか、CTRL+Cを押すとどうのとか、考えるだけでイヤになります。 …ってのはまぁ面倒なので、DirectXのSDK(Software Development Kit:ソフトウェア開発キット)にDXUTというオマケが付いているので、今回はそれを利用。  だがしかし!うまく動きませんorz テキストボックスにメッセージを入力すると、普通はカーソル(キャレット)は右に移動しますが、移動しません(T_T DXUTのサンプルでCustomUIというのがありますが、それも同様。試しに別のパソコン(Windows2000)で試しても同じ。 う〜む。 ググってもそれっぽい情報が出てこないんだよなぁ〜。うちだけの問題なのかなぁ。 とりあえず、DXUTのソースを追ってみると、

CDXUTEditBox::Render(エディットボックスの描画処理)内にあるm_nCaretがどうもカーソルの位置を示しているっぽい。 「hr = m_Buffer.CPtoX( m_nCaret, FALSE, &nCaretX );」ってところで、m_nCaretと文字情報から、実際の相対座標をnCaretXに格納してるっぽいが、nCaretXには常にゼロが入っている。 ↑のCPtoX(CUniBuffer::CPtoX)を辿ると、「Analyse();」という関数が常にE_NOTIMPL(そんなオブジェクトねぇよ)を返している。 ↑のAnalyse(CUniBuffer::Analyse)を辿ると、_ScriptStringAnalyseが常にE_NOTIMPLを返している。

って感じ。それ以上先はわからん。ScriptStringAnalyseはusp10.dllってところで処理が動いているみたいだけど、このDLLのバージョンを変えてみたりとかしてもダメだったので、とりあえずギブ。 …  あぁ〜。今日の昼に食べた寿司は旨かったなぁ…(←現実逃避) …  とりあえず、m_nCaretにカーソルの位置が入っているので、その分の適当な数字をCPtoXの中でnCaretXに入れてやるとうまく動く感じ(実際には全角1文字も半角1文字と判断しているようで、全角文字を入れるとおかしくなる)。 まぁ、この辺はフォントクラスから情報を貰ってごにょごにゅすればうまくいくのかな。いい加減時間をかけるのが勿体ないので、そんな方向で逃げよう。

 そういえば、マビノギ(ネットワークゲーム)でも最近のパッチで文字入力(漢字変換)がおかしくなったけど、ゲームの開発者も同じような苦悩をしているのかな。

ネットゲー

G/W中いくつかやりたいことの一つで、3D(DirectX)のプログラミングに挑戦中。 とは言っても過去に挫折している上、今回は2週間でやっと

平らな板の表示。 光源設定。 カメラを自由に動かす。 中心位置を自由に動かす。

…ができたくらい(しかもこっそり例外エラーが出てるし)。キャラクターとか細かいものは後回しで、とりあえず頭で思い描いているモノが出来ればいいなぁ。