12.31.2008

こともしも最後なので。

酔った勢いで更新。
今年もいろいろありました。
思い出せないけど。

来年は主力言語をC#、主力フィールドを原稿書きとして活躍できればいいなぁと思ってます。
みなさん、良いお年を!

12.23.2008

「LinuxがMac OS Xよりも優れている10のこと」は、1/3くらいしか当たって無いと思う。

もと記事はこちら
要するに、MacOSを選択するユーザが多い中、いかにLinuxを選択することが賢いかを、10個の例をあげて説いている記事。
完全にLinuxサイドに立って書かれた記事で、中立性/公平性はゼロなので、半分くらいは当たってるかもなと思って読んでみたら、1/3くらい当たってれば良い方じゃないの?という感じだった。

私もLinuxerだし、Linux好きだし、同意できる点も多々あるけれど、あまりにもLinuxをひいきしすぎ。
例えば、移植性だったらNetBSDの方が優れてるだろうよ。
Linuxカーネルの複雑極まりないコードよか、ずっと移植しやすいと思うよ。NetBSDのコードの方が。

柔軟性に関してだって、「Linuxを選択するから」得られる柔軟性ではないじゃないかと思ってしまった。
例に上がってるようなのを柔軟だと言うなら、別にFreeBSDを選択しても、同様の柔軟性は得られると思うよ。

それから、OSとハードを抱き合わせで販売しているMac陣営に対して、PCを相手に長くOSだけ開発してきたLinuxを同次元で比較するのはナンセンスだと思う。

セキュリティの項目は、きちんとこれこれの理由で(あるいはこれこれのデータを根拠として)Linuxの方が優れていると言えないなら、項目として挙げるべきじゃなかったと思う。
記事中でも書かれている通り、これがMacよりセキュリティ面で優れている理由にはならないだろうよ。

コストも導入コストだけ見たナンセンスな見解。
ランニングコストまできちっと見積もって比較しないと意味がないと思う。

アプリケーションの数で比較するのもナンセンス。
使う側にとって重要なのは、「数多くのソフトウェアが動作する」でなく、「使いたいソフトウェアがきちんと動作する」じゃないんだろうかね?
LinuxでPhotoshopやIllustratorを安定して動かせる?

ユーザーに対するやさしさという項目では、すでに前提となっている
「AppleのMac OS Xが成功した理由の1つとして、OSのインタフェースをユーザーにとってやさしいものにし、ほとんどすべての作業を誰でも簡単に行えるようにしたことを挙げることができる。」
がダウトだと思う。

キーボードは慣れの問題。
例えば私は、Linux上ではほとんどすべての作業をEmacsを通じて行ってしまうので、ここで挙げられている優位性を感じることができない。
「しかし多くの人々は2ボタンマウスに慣れ親しんでいるのである。」というのも、優位性を示す根拠にはならないと思う。


……あれ?全部ダメじゃん(笑)

12.20.2008

日本学生支援機構のシステム作ったの、どこの会社だ!!!!

という、怒りのタイトル。
日本学生支援機構では、毎年貸与の継続申し込みが必要なわけですが、このときに貸与継続理由なるものを何箇所か入力します。
ここで注意書きに(全角200文字以内・必須)と書かれているんです。赤文字で。

で、全角200文字以内って言ったら、私たちの感覚からして半角400文字以内だと思うでしょうよ。
それで、いつものクセで数字を半角で打ち込んで、180文字ぐらいに収めて送信ボタンを押したら、全角200文字以内ですとか言われて送信できない……。

いろいろ試行錯誤した結果、半角文字が含まれているとダメなご様子。
っていうか、こんなカスみたいなシステム作って納品したり、こんな仕様にしたのどこのドイツだ!!!

と、怒り心頭でこの記事を書き起こしてるわけです。


あともう一点。
今年から奨学金の返還が滞納した人の個人情報が個人信用情報機構と名乗る団体に提供されるようになったそうです。
で、その同意書も書いて提出しろとの指示。

奨学金貸与継続申し込みの冒頭にも、返還は義務ですから、将来の経済設計を考えて~なんて書いてある。

あのね。
ひとこと言わせてもらうけど

金借りないと教育受けられないような国づくりしといて、それで、金を貸して、返せ返せと取り立てるってアンタ!どんな神経してるんだよ!
金返せの前に、教育に金のかからない国づくりしてからにしろよ!!!!


将来設計云々も、現状の国民の経済状態を観て言ってるんだろうかね?
昨年の今頃なんて、こんなに経済状態が悪くなるなんて、誰にも予想できなかったのに、それを計画的に予想しろとは……。
どんだけ無茶な要求なんだろうと思うね。
あまりにも頭でっかちなお役人根性で金貸してるから、始末に悪いと。

もっと借りる側の立場に立って金を貸してくれる機構なら、返そうって気になるんじゃないの?みんな。

好きで金借りるやつなんて居ないでしょうよ。
もっと常識的に考えて欲しいもんだ。

無神経な言い回しに無性に腹が立ったよ!

12.19.2008

CodeZineに記事が掲載されました。

およそ2週間ぶりの更新。
今後もこんな感じでトロトロやってきます(笑)
Distro Freakをアップしようと思ったら、サーバ障害(しかもリアルな炎上による影響の上、今日新宿でウンウン唸って走る消防車見たんだよねwww)らしく、しばらくなんともなりそうにないので、こちらだけ更新しときます。

表題のとおり、CodeZineにて記事が掲載されました。

C#による多言語対応アプリケーション開発のコツ

と題して、coLinux ManagerやらScribefireやらを日本語化した時のノウハウをざっくりまとめた記事になっています。

多言語対応アプリを.NETを使って書く必要に迫られている方、海外の.NETなオープンソースアプリを日本語化したいなぁとお考えの方の助力になれば幸いでございまする。

今後もちょいちょい記事を書かせてもらうと思うので、よろしくお願いします。

12.06.2008

Wall.E観てきた

およそひと月ぶりの更新。

今日公開の、Disny - Pixarの新作映画、Wall.Eを観てきた。
おともだちバンドなる黄色いバンドまでもらってしまって、すっかりWall.E信者だ。

これまでのPixar作品のように、3Dの表現技術が著しく向上したなぁと感じる場面はそうなく(ただし、爆風の表現は素晴らしいと思った)、実写取り込みなども使った、これまでのPixarとはちょっと違った雰囲気のある映画であると思った。

宇宙空間での運動や、スペースデブリの表現など、もうひと工夫ほしいなと思う場面もあったが、作品のテーマは時代の流れに即していると思うし、ニモの監督だけあって、人情ドラマ的な作りこみがうまく、大人が見て楽しめる作品に仕上げてあるなと思った。

日本語吹き替え版で観たのだが、吹き替えに関して言えば、Eveの音声に一部人間味が出すぎているなと思うところがあったほかはおおむね良い感じだと思った。
というか、EveとWall.Eは元音声のままでよかったのではないかと思う。

ネタバレになってしまうが、宇宙船のキャプテンがマニュアルをマニュエルと読み間違える場面。
日本語吹き替え版ではマニュアルとカタカナで書かれているので、絶対に読み間違うはずはない。
マニュアル→マニュエルの読み間違えは、あのマニュアルと書かれた部分が、Manualと書かれていればこそだ。
なんだか、こういう小さいミスが物語を面白くなくしている気がしてならなかった。

というか、日本語化するなら音声と字幕のみにして、作品そのものには手を加えないでほしいと思うのは、私だけだろうか?
日本語訳がほしければ、字幕のように出せばいいだけの話だし、何よりちょっとした表記物ぐらい、訳なしだって雰囲気で理解できたり、意味が通じたりするだろうに。
それ以上に、手を加えることで作品の質を落としてしまうような気がしてならない。
(それなら字幕版を観ろという話になるけれど、あくまで映像の話であって、音声は日本語が良いのだ。)

この辺は、他の日本語吹き替え版にも言えることだから、そういった業務を行っている会社は、その辺を再検討してみて欲しいなぁ。

最後は愚痴っぽくなっちゃたけど、Wall.E自体は観る価値のある作品だと思うので、ぜひ多くの人に観て欲しいなぁ。

……そうそう、行くならぜひ「大切な人」と。
なぜ大切な人と行くべきかということの答えは、映画館で知ることができます。


これでトイストリーから続いたPixarの初期に発想された映画は一通り終りなのかな?
これらに続く素晴らしい作品が出てくることを、楽しみに待つとしようかな。

11.16.2008

Slimeを導入する

ふと思い立って、Slimeを導入する。
Hyperspecも併せて導入しようかと思ったけど、なんかうまくいかないので、今日のところはSlimeのみにしておく。

参考ページ:
その1
その2

やったことは
# apt-get install slime
→このときに、Lennyだと追加パケージが選択された

んで、.emacsに

;;slime
(add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/")
(add-hook 'lisp-mode-hook (lambda ()
(slime-mode t)
(show-paren-mode)))

(require 'slime)
(setq inferior-lisp-program "cmucl")
(slime-autodoc-mode)

を追加。
したら、M-x slimeでslimeモードが呼び出せる。
(私はcmuclを利用したけど、CLISPとかSBCLとかも行けるらしいよ)

起動がちょっと長いのが気になるけど、いろいろ便利だから使おうと思う。

11.10.2008

DirectX11

世間じゃWindows7なんてのが騒がれてる。
もちろん、私も7には期待してる。
ウルトラマン的にも、7ってなんか好きだったし。

んで、そんな7の陰でこしょこしょと進んでいるのが、表題のDirectX11。
実はWindows7よりも、こっちに関心があったりするのだが、私の手元ではXPマシンが現役で動いているため、当然DirectXは9から移行していない。

そう、DirectX10すら知らないのに、もう11の足音が聞こえてきたのだ。
おどろき~。

ただ、Vista→7がそうであるように、11は10や10.1ほど鬼のようなスペックを必要としたり、環境に厳しくしたりはしないとのこと。

しばらく忙しいから、そうそうゲームプログラムに触る機会はないだろうけど、いろいろ面白い展開が見えてきたら触ってみようかなぁ。
その前にPC新調しないとだな;

以下、DirectX11に関する参考ページ。
http://www.shacknews.com/onearticle.x/53810
http://www.4gamer.net/games/033/G003329/20080723006/

openSolaris 2008.05CDの

ちょっと必要になったので探した。
んで、見つけたのでmd5sumコマンドで使いやすい形にしてメモ。


69672dbfbce8504bea8abb5c68c75859 *os200805.iso


ご入用の方はどうぞ。
もうイメージをディスクに焼いちゃったから、必要ないんだろうなと思いつつ。

# これ探してて思ったけど、md5sumやらsha1やら、ハッシュデータばかり集めたサイトがあっても面白いかもね。
# OSS hash bankとか言ってさ。XMLデータでハッシュを配信してくれるの。
# んで、利用者はファイル名をキーにしてリクエストすると、ハッシュが簡単に取り出せる……みたいな。

11.07.2008

シンポジウム

白山でこちらのシンポジウムに参加。
思いのほか白山が近くて、到着したらやたらと早い時間だった(^^;

しばらく待ったけど、でかいね。東洋大学。
高校も併設(?)されてるみたいだし。

ホールもでかいし。
んで、講演内容だけれども、一番おもしろかったのはProf.Daniel Morse(カリフォルニア大学サンタバーバラ校)の講演。

その他、用事を済ませて、帰りがけにアキバでごにょごにょ。
まぁ、いい一日だったんじゃないだろうか。

11.04.2008

秋の夜長に。

なんだか眠れないなぁと思いながら、先日やりはじめたcoLinux Managerの日本語化作業をしはじめたら、こんな時間になってしまった;;

前回のリンクの内容はすでに最新のものに置き換わっている。(というか、上書きしてしまった)
というわけで、前回の記事から落としてもらうのも良いんだけど、こちらでもリンクだけ貼っておく。


本体

VC#2008で開けるソース

ライセンスは詳しく書いてないけど、本家と同じ。(日本語化した部分についても。)
変更点については、ソースファイルの方に入れたChangeLogが詳しい。

サポート等は一切してませんのでヨロシク。所詮自己満足のおすそ分けといったところ。
本家に日本語化したよーってメールしようか迷ってるんだけど、どうしよう?
(今のところChangeLogは日本語だけど、本家にメールするなら英語に書き直すかも。)

11.02.2008

映画を見る。

1日は映画の日。
だから1,000円で映画を見ることができるのだ!
(水曜日がレディースディなんだから、火曜日や木曜日をメンズデーにしてくれてもいいのにね。悲しいよね。フェミニストって、こういうところを是正しようとは思わないのかな?)

見たのはガリレオ。
そう、容疑者Xの献身というやつ。

感想としては率直に「切ないはストーリーで、最近の邦画としては、とてもおもしろかった」
ただ、気になる点がいくつかあった。


ので。
列 挙 し て み ま す。


以下、ネタばれになる可能性もあるので、読みたくない方とはここでお別れ。











OK?

1.血液型の謎
被害者の氏名がわかっていれば、そこから病歴をたどって血液型を調べることが可能なハズ。
発見された遺体と被害者の血液型が一致していたのは、偶然なのか、計算なのか?

2.歯科治療痕の謎
被害者の顔面はつぶされていて、歯科治療痕の照合が困難だとなっていたが、奥歯までつぶれていたんだろうか?
ざっとスクリーンに映った映像では、顔をボコボコにしている程度で、奥歯までつぶれているようには見えなかった。
であれば、虫歯になりやすい奥歯の治療痕を照合することが可能であったのではないか?

3.こたつのコードに残ったDNAの謎。
双方の被害者が同一のこたつのコードで殺害されたとするならば、両方とも絞殺された跡が首につくほど強く締めていたわけだから、両者の皮膚が付着しているのではないか?
洗っていた様子もないから、コードから同じような形で二つの別種のDNAが採取されたとなれば、警察はより早く真相に近づけたのではないか?

4.石神氏に対して、湯川が問うた問いの答えは?
解を出さないままのエンディング。
まぁ、状況から推察することができますけど。

理想化された理論に基づく観測結果と、理想的でない状況で行われる実測による観測結果は、案外大きな違いが出るものです。



ちょっと理系っぽい?

10.31.2008

エネルギー準位の計算

3次元の量子井戸の問題。(量子箱か?)
すんごい久しぶりに計算するもんだから、いろいろと忘れている。
んで、エネルギー準位を求めようと関数電卓片手にカタカタと計算。

でも、なんかおかしい。
いろいろ考えた結果、単位が間違っていることに気づく。
[J]じゃなくて、[eV]で出さないといけないんじゃないか?コレ。ということに……。
結局計算しなおし。
二度手間。
まぁ、解けたからよし。


C#国際化の問題に関して資料を発見。
近いうちに差し替えようと思う。

10.29.2008

coLinux Managerの日本語化。

前々からやろうやろうと思いつつ、やってなかったこととして、coLinux Managerを日本語化した。
ベースはcoLinux Manager 0.7.0。
といっても、完全じゃない気はするし(デバッグ用のコンソールメッセージはわざとオリジナルのままにしてある)、日本語にしたからって誰が使うわけでもないだろうけど。

ちなみに、WindowsFormの多言語化手法は探して見つかったので、それを用いて日本語化しているから、設定フォームは今のところ英語と日本語が混在している状況になっているはず。

でも、タスクトレイアイコンの右クリックメニューをどうやって多言語対応させていいかわからなかったから、元のメッセージと共に併記してある。
何かご存知の方、教えてぷりーず☆


以下、本体とソース。

本体は、あらかじめ公式から配布されているcoLinuxManagerをインストール→上書きでとかして使ってくださいな。(単体でも動くだろうけど。)

本体
ソース(VC# 2008)

ライセンスとか、詳しいことは本家をどうぞ。
それから、動作には.NET Framwork 2.0+が必要ですんで、あらかじめご用意を。

10.27.2008

USBメモリげっと。

久しぶりに秋葉原に繰り出す。

目的は前々からほしいと思っていたUSBメモリ。
予算が1,000円だから、当初amazonで880円で売っていた2GBのUSBメモリをゲットしようと考えていた。

んで、ヨドバシやらヤマダやらを見ると、軒並み2GBで1,000円オーバー。
今回目指すものである、USBメモリ2GBで880円というのは、秋葉でも高望みなのか?とすら思えた。

けれども、所詮そこは量販店。
量販店の販売価格が基準価格だと決め込み、街に繰り出す。

あきばおー、浜田電機、若松通商、他数店を見て回ったところ、浜田電機にて848円でUSBメモリをゲット。

しかもその容量たるや、なんと 4GB!

当初予定していた価格よりも安く、しかも倍の容量のUSBメモリをゲットすることに成功した。
購入したのはシルバーボディーに透明のキャップというシンプルなスタイルの製品で、通常見当たるべきメーカーロゴや容量の表記といったものは一切ない。

当然保証書や取扱説明書の類は付属しておらず、パッケージにもUSB Flash Driverとだけ書かれたシンプルなもので、裏面にもメーカー名や製品の名称といったものは一切記述されていない。
また、パッケージには(正規品では、おそらくネックストラップがおさめられていたと見える)不自然なふくらみをもつ、Made in Taiwanという品物である。(これを書いている時点では、アウトレットか何かなんだろうと納得している。)

この手の製品は、実は2GBUSBメモリと同じ容量しか認識されなかったり、そもそもメモリとして使えなかったりというのが関の山だと踏んでいたが、帰宅して確認すると、きちんと3.62GBのリムーバブルメディアとして認識される。
購入した時は気付かなかったが、差し込んで認識されると、おしりの部分にある青色LEDが鮮やかに光るところも気に入った。

やった。

言うまでもなくガッツポーズ。先日の数理科学に続き、いい買い物だったと思うが、さてこの製品、どのぐらいの期間使用できるだろうか?

10.24.2008

今週終り。

NHK教育でサイエンスゼロの再放送を見る。
ノーベル賞に関する話で、物理学賞と化学賞、それぞれについて解説してた。

物理学賞のほうはKEKの広報の方が来て、素粒子ってなんぞ?というところを中心に解説してたけど、肝心のノーベル賞受賞理由の論文については、「これを使うと粒子と反粒子が1対になってなくならないことに説明がつく」とか、そんな抽象的な話ばかりで、なんで益川‐小林理論で出てくる方程式が6次元にならないといけないのかとか、そんな話題には一切触れられなかった。

そんなところから見るに、CERNのLHCにまで解説の幅を広げたのは、広く浅く、一般視聴者に向けた放送だということを語っていると思う。

ディスカバリーチャンネルなら、もうちょっとマニアックな番組の作り方してくれるだろうに。
(あるいはNKHスペシャルで、改めてやってほしいところ。)

んで、化学賞に関する話は、雲をつかむような解説ばかりだった物理学賞の方とは打って変わって、非常にわかりやすいものだった。

いやまぁ、物理学賞の方が理論であって、観測データを視覚的に、わかりやすく見せることが困難である内容に対して、GFPの、くっつければ光るたんぱく質だよ!って言う方がわかりやすいってのは重々承知してるけど。

それにしても温度差があったと思う。
GFPの応用例として紹介されてた、iPS細胞に導入することで再生されたか否かを検証するっていう発想は面白いと思った。
まぁ、使えるのは研究室内の実験のみだろうけど。

だって怖いでしょ?再生した爪が光ってるおばさんとか。
(おしゃれとしてなら流行するか?)

10.22.2008

Lennyのアップデート。

時間はつくるもの。
いや、わかっちゃいるんですがね。

Debian GNU/Linux 5.0ことレニ助のアップデート。
やたらと時間がかかるなぁなんて思ってたら、PerlとEmacsの更新があった様子。

Emacsは更新の影響が出るかもだけど、Perlって普段使わないからわからんなぁ。
でも、基幹スクリプトのいくつかはPerlらしいし、安易に抜き去るわけにもいかんのだよなぁ。
(別に容量余ってるし、居てもらう分には構わないんだけど、こういう長いアップデートで不安になる。)

TeX Liveとかも最近アップデートが何度かきてたみたいだけど、TeXで文書を書く機会が減っているから、ちゃんと動くか確認できていないのが不安。
いざ使おうとしたら日本語が化けましたとか嫌だもんなぁ。(←と言いつつ、2・3回経験済み)

ま、いっか。

10.21.2008

近況

備忘録。

先日お出かけ→楽しかった。
プレゼンのテーマが決まる→これから資料探し。発表は11月半ばぐらい?
ローカル紙向け広告の作成→昨年の記事が無事見つかった。今日中に仕上がるかな?
プログラミング→Delphiぜんぜんいじってないorz。でもSchemeは楽しい。
書籍→数理科学がポアンカレの話題だったので衝動買い。後悔しない内容だと思う。

こんなとこか。
ぼちぼちウェブ上にも戻らなければな(笑)

10.09.2008

IME 2007 が遅くてお困りの方へ。

いやー。
めちゃめちゃ悩んでました。
IME 2007 がとにかく遅い。

日本語を打とうと、IMEを起動させようとすると、これがなかなか起動してくれない。
まさにナゼ???
な状態に陥っていたわけですよ。

んで、いろいろ探してたら、
猿頁(10) http://salv.miscnotes.com/2007/02/ime2007.php
にてまさしくこれだ!という方法を発見。

それは、
「Outlook関連の辞書を削除する」
ということ。(大事なことなので強調しました。)

どういう仕組みなの?は先のページに譲るとして
ここではやり方をば。

0.IME 2007の言語バーをタスクバーに入れている人は、それを復元します。
1.[ツール]→[プロパティ]とたどります。(ツールは工具箱みたいなアイコン)
2・あとは、[辞書/学習]タブの下部、システム辞書から、Outlook~な項目を[削除]すればOK。

ここで重要なのは、Outlookを標準のメーラーとして使っている人は、これをしない方がいいということ。
なぜ??と思った人は、先のページを見てください。

所詮ノウハウのなぐり書きなので、うまくいかなくても知りませんし、何かトラブルがあっても知りません。
それでもイイ!という方は、試してみると幸せになるかも。

ちなみに、私は幸せになれました。(←情報商材のキャッチフレーズみたいだな(笑))

# 追記:
IMEブログもみておくべし!

10.08.2008

ノーベル化学賞もスゴイ!

ちょっと遅くなって帰宅してみれば、ノーベル化学賞でも日本人の受賞者が出たっていうじゃないですか!!!

詳しく調べてないけど、クラゲの発光にかかわるたんぱく質を発見した功績でノーベル化学賞の受賞となった様子。

うまく表示できないときはこのメッセージが見えるはず。

受賞者はボストン大学の下村先生。本当におめでとうございます!

こうして連日先人たちの優れた業績が世界に認められると、興奮せずにはいられないワ!!!!


でも、昨日の南部先生といい、下村先生といい、日本は優秀な研究者が海外に流出していく現状をなんとかしないといけないと思うよ!!!!
(過去にも優れた研究をした人が海外に行っちゃうなんて、ざらにあったじゃないか!)



# 余談だけど、シカゴ大学の南部先生の写真が差し替わってるね。
# さすが海外は仕事が早い!
# それに対して、日本の機関はなにやってんの!

10.07.2008

!今年のノーベル物理学賞がスゴイ!

今年のノーベル物理学賞、なんと日本人研究者が3人も選ばれるという快挙!
追記:南部先生は、アメリカ国籍を取得されているらしいので、書類上はアメリカ人だとのこと。

やった!日本ハジマタ!!!!

出身大学でみると
・南部陽一郎=東京大学卒
・小林誠=名古屋大学卒
・益川敏英 =名古屋大学卒
とのことなので、万博以来元気だと聞く愛知から、またも元気な話題が出てきたという感じだね!

という訳で、昨日のObjectタグとあわせて。

まずはノーベル賞の受賞を伝えるページ。
うまく表示できないときはこのメッセージが見えるはず。

そんでもって、各研究者の方の略歴。
まずはシカゴ大学の南部先生。
うまく表示できないときはこのメッセージが見えるはず。

次にKEK(高エネルギー加速器研究機構)の小林先生。
うまく表示できないときはこのメッセージが見えるはず。

そんで最後は、京都産業大学の益川先生。
うまく表示できないときはこのメッセージが見えるはず。

こういうの見ると、やっぱり日本の研究者はスゴイと思うよ!
三人の先生方、本当におめでとうございます!


さぁ、明日も頑張ろう!!!!!

10.06.2008

Google mapをObjectタグを用いて呼び出せるか?

ちょっと気になったので。
Google map のリンクと書かれている箇所から表示されるソースをコピーしたものが以下。


大きな地図で見る

Objectタグを使ったものが以下。
(IEだと正常に表示されないカモ。)

うまく表示できないときはこのメッセージが見えるはず。
大きな地図で見る

ふむ。いい感じなんじゃないだろうか。

10.01.2008

メニエール病ってナンダ??

ここ数日ほど、やたらと目眩がするKetchupです。どうも。

四六時中そういう状態にあるわけではなく、起きがけとか、ふっと首を動かしたときとか、立ち上がる時とか、そんなときに目眩が襲ってきます。

知り合いに話したら、メニエール病じゃないか?って言われました。




……メニエール病ってなによ?

目を使いすぎたことによって起きる、やたらと体が目を応援したがるようになる病気?
それともナンカのさなぎか?




困ったときのWikipedia
曰く、目眩やら耳鳴りやらがする病気らしいので、案外当てはまってるかも。
早期治療で治るって話だけど、今のところ日常生活に困ってないので何もしません(笑)

っていうか、寝不足とか、そんな理由だけな気がしなくもないしね。

日常生活に支障が出るレベルになったら、病院いこう。
これって、耳鼻咽喉科でいいのかな?
それとも内科?
いきなり脳外科に行った方がいいのかな?(←脳外科だと、ほかの部分を指摘されそう)




話は変わって、ニコニコ動画の話。
なんで突然ニコニコの話題かといえば、我が家では受信できないtvkで放送予定の天体戦士サンレッドが、なんとニコニコで放送されるらしいから。

聞くところによると、ニコニコが公式にサポートして放映するアニメは画質が良いらしいので、今から楽しみ。

……でも、サンレッド(アニメ)のオフィシャルサイトには、情報が出てないんだよなぁ。【10月1日19時40分時点】
詳しく聞こうと思ってメールフォーム探したけど、見当たらないみたいだし。

せっかくインターネット使って、ブログ形式でアニメの情報発信してるのに、テレビと同じ単方向の情報発信じゃ意味ないよね。
対応は面倒だったりコストがかかるのかもしれないけど、インターネットを使っている以上、双方向で情報のやり取りをした方が、面白いコンテンツを作れると思うんだけどなぁ。

9.24.2008

有限ぷちぷち

モデルが透けるという問題、いっこうに解決しない。
テクスチャを張らないモデルだと、透けているような感じはないので、テクスチャに問題があるものだと思っていた。

んで、QDに頼っていたテクスチャ関連の部分を、ごっそり自前のものに差し替えてみた。
だけど、やっぱりモデルは透ける。
そりゃもう、スケスケだ。

だもんだから、これはテクスチャの問題じゃなく、表示周りの問題か、マテリアルの問題だと思う。
トラだと透けないから、アニメーションを内包しているモデルに固有の問題なのかもしれない。

あるいは、DDS→BMPに無理やり変換した画像ファイルを使っているからだろうか?
なぞは深まるばかり。

作業は進まない。

9.23.2008

やはり問題がみえてくる。

アニメーションに手をつけようと、さっそくDirectXのサンプルに入っているTinyを連れてきた。
が、このTinyに絡んでいくつかの問題が発生。

問題1.Tinyの座標軸が、トラさんと違う
→タイガーさんの表示に使っていた方法だと、Tinyの表示がおかしい。
→例の画像でも、Tinyは横回転をしている。(これでも調整した後の画像)

問題2.テクスチャがDDS形式だった
→すっかり頭になかったけど、そういえばこんな形式もあったなと。
→んで、これをQDのテクスチャクラスで読んだら、読み込んでくれませんでした(笑)
→結果、DDS→BMPコンバートという方法をとって対処したものの
→テクスチャクラスは新たに作る必要がありそう。

問題3.なんかTiny透けてね?
→原因不明。
→Tiny自身が透ける体質なのか、実はエフェクトを設定する必要があるのか……。
→これから原因究明しなくちゃいけないなぁ。

という訳で、アニメーションの手前で解決しなきゃいけない問題がまだありそうな予感です。

ゆったり、まったり、たのしく。

カメラをクラスに分けて、とりあえず動くところまでコーディングしました。
画像はそれを動かしてみたところなんだけども、まぁ、内部的な変化だから、見た目にはワカランわな(笑)

このクラスには、今後カメラをお手軽に動かせるような、そんな機能を付けていこうと思っています。
が、いつになることやら……。






さて、引き続き探していたモーションXファイルの取り扱いについて、かなり有効な資料が見つかりました。
(書籍なんですけどね)
カメラもクラスに小分けできたことだし、そろそろ本来の目的であるモーション付きXファイルの利用に戻ろうかと思います。

9.21.2008

たまには気分を変えて。

Delphi+DirectXヘルパー関数を気軽に使うクラスは、カメラの処理が手軽にできたほうがいいだろうということで、そちらに着手。

だけど、ずっと3Dのプログラムじゃ頭の中まで3次元になってしまうので、気分転換にSDL。

今回はLesson28。
今回はっていうか、前回の続きですな。

お題はパーティクルエンジン。
パーティクルっていうから、シューティングゲームなんかで見られる弾幕を想像してたら、動き回るスマイルさんの後ろにキラキラと小さなドットが瞬くだけでした(笑)

久しぶりにC++触ったけど、やっぱりキモイな。いろいろと。

9.20.2008

Visual C# 2008 SP1

というわけで、VC# 2008 SP1(ExpressEdition)を放り込んでみた。
ついでなんで、.NET Framework も 3.5 SP1 にしてみた。

これまでインストールしなかった理由として、手間がかかるというのがあげられるけど、こういう眠れない夜に限っては、その手間が眠気を誘ってくれるいい薬になる。

そんなわけで、まずは.NETFrameworkのアップデート。
インストール中に、セットアッププログラムを終了しろという警告が出たものの、無視したら通った。
なんなんだこれは……。

が、同様の報告をネット上でもいくつか見かけたので、とりあえず問題視しないことにした。


続いてVC#のインストール。
ExpressEditionは全とっかえが必要なので、先に古いものをアンインストールしておく。
んで、SP1のセットアッププログラムを落としてきてセットアップ。

こちらは特に問題なくインストールできた。
(ただ、ネット上では止まる、落ちる等の問題が出たという報告も見かけた)

後は特にやることはなし。

実際使ってみた感想としては、VC#について、起動速度がかなり向上していると思う。
これならストレスなく開発ができそう。

まぁ、しばらくVC#に触る機会はないんだろうけどw

9.17.2008

アクションゲームツクール

いつものように、本屋でファミ通を立ち読みしたら、伊集院光氏のコラムに話題が上がってた。
気になったので調べてみたら、GameWatchにニュースリリースがあった

最近のRPGツクールの動向からして、当然Rubyベースなスクリプトが書けないと話にならないようなツールなのかなぁ。と思っていたら、どうやらプログラミングのスキルは必要ないとのこと。

Rubyじゃアクションゲームの応答性には答えられないってことか?1.9ベースのエンジンなら、めちゃめちゃ早いと思うけど。

作ったゲームは箱○ことXbox350でも動作させることが可能になるんだそうで。
それによって何がうれしくなるのかはよくわからないけど(笑)

まぁ、GameWatchに上がってるスクリーンショットを見る限りだと、作るのはRPG以上に大変そうな感じがする。
アクションゲームならそれほど難しいテクニックがいらないんだし、HSPあたりで実装した方が楽にできるんじゃないかなぁ?

それに、ここにきていまさら2Dアクションツクールを出してくるっていう意図がわからん。

せっかくやるなら、MikuMikuDanceで出力したモーションデータを使って3Dのアクションゲームが作れますぐらいの出せばいいのに。

そしたら、オヂサン初音ミク無双とか初音ミクBASARAとか作っちゃうよw

静かにしてくれ

街宣車は規制されてるのに、なんで選挙カーと廃品回収のおっさんは規制されないんだ。

少なくとも、選挙カーは住宅街での走行を厳しく制限されるべきだと思うし(住宅街と規定されている地域では、スピーカーから音を出しちゃいけないとか。)、廃品回収のおっさんはスピーカーから出る音量をもっと小さくするべきだと思う。

こういうのってみんな公害だと思わないのかな?

9.16.2008

便利なcoLinuxコンソール

久々にcoLinuxの話題。
dev-MLだけに投げられた投稿ならよそうかと思ったけど、users-MLにも同様のメールが投げられているようなので。

本文をそのまま載せるのもアレなので、件のプログラムについて、ざくっと要約&紹介をしておきます。

coLinuxユーザーのPaoloさんが、colinux-console-ntに機能付加をしたそうです。
これまでのコンソールを踏襲しつつ、

・範囲選択でのコピー&右クリックでのペースト

の機能を付加。

すごくちっさい改良に見えますが、これが実に便利。
(colinux-consoleを使う人にとってはという但し書きつきですけどね。)
ダウンロードは以下から。

http://xoomer.alice.it/paolo.minazzi/colinux-console-nt.exe

使い方は、従来のcolinux-console-ntにコピペでインストール。
あとは従来のものと同じように呼び出し。
WIN+ALTキーで、従来のcolinux-consoleと同じふるまいをします。

85x25キャラクタの表示に対応しているので、まぁ、標準的なコンソールプログラムなのかなぁ。
Ver:0.7.3-20080524で動作確認がとれている様子。
ただ、自己責任で使うのは言うまでもないことですよ。

大きなブロックをコピペするときに、コンソールがクラッシュするという既知の問題があり。
Henryによれば、テキストカーソルの点滅スピード速すぎない?とのこと。

言われてみれば、確かにそう思う(笑)

まぁ、興味のある人は使ってみるといいかもね。

9.15.2008

当面の問題は解決。

一応、これで先に挙げた問題は解決したっぽい。
まだDirect3DのAPIについて理解の浅いところがあるから、そこを詰めないとダメかな?なんて思ったりするけれども、カメラワークとテクスチャの問題が解決したから、次のステージに進むとしよう。

JEDIヘッダとQuadrupleDヘッダの定義の違いからくるところは、とりあえずQuadrupleDヘッダに合わせることにした。当面は困らなそうだし。

俺はアホですかそうですかそうですねまったくですよね。

カメラワークが思い通りいかないよう><
という問題。

解決しました。

単純にIdleループ内でカメラの再設定をしていないからでした。

9.14.2008

六角大王[フリー版]でのモデリング>>>>>>>>DirectXをたたく

そんなわけで、六角大王のモデリングが難しすぎだと思います。
メタセコイアで3Dの世界に入ったアタクシとしては、六角大王でのモデリングは、お手軽さを損ねる原因の頂点に立つのでは?と思えるほど。

したがって、Xファイルを表示する方へ逆戻り。
朝言っていたことが夕方には変わっているというアレですね。

目的のためには手段を選ぶなとは、よくいったものです。

だけど、ただ表示したんじゃ芸がない。
そんな無駄な発想から、Xファイルを読み込んで表示するクラスを作りながらやってます。
だんだん拡張して、カメラを扱うクラスやライトを扱うクラスをそろえられたらいいなと。
そしたら、後々便利になるジャン!

使いなれないDelphiさんのポインタに苦戦しながら、なんとか形にはなりましたがね。
そんなわけで、いったんセーブです。




一応、メッシュそのものの表示までできるようになったわけだけれども、いくつか問題があって、

・JEDIヘッダとQDヘッダではD3DMATRIXの定義が違うため、どちらかに揃えると上手く行かない所が出てくる
・カメラワークがおかしい?(←サンプルプログラムで想定しているようにならない;
・テクスチャの表示には未対応(←だけど、こちらは光明が見えている

といったところが当面の課題。
アニメーションに程遠いというのは相変わらず。

そうそう、それと、DirectXSDKの付属サンプルをDelphi向けにリライトしたもののうち、いくつかのプログラムが手元で動きません(笑)

特に重要なアニメーションのサンプルが動かない;
エラーを見る限り、デバッグ用DLLをよこせって言っているようだけど、DirectXSDK入れるの嫌なんだよなぁ。

むしゃくししてやった、今は公開後悔している。――いや、本当に。

つい昨日、寄り道を予想と決意したばかりなのに、なにをやっているんだろうか。

メタセコイアでモデリングの練習をしてたら、ふとOpenGLモードがあることに気づき、そこから

・OpenGLって、比較的マルチプラットフォームなライブラリだった気がする
・OpenGLって、DLL化されてた気がする
・じゃあ、Delphiでも使えるんじゃないか?
・(DelphiのLibディレクトリをのぞいて)OpenGL.dcuがある!こりゃいけそうだ!!
・ネットで情報を探す→あれ?WindowsでOpenGL使うのって、Linuxと流儀が違ったりするの?
・どうやら流儀がだいぶ違うらしいことに気づく(ここまで2時間ほど消費)
・そういえば、GLUT使うと、統一的なインタフェイスでプログラミングできるって、授業で習った気がする。
・よし、Delphi向けGLUTを探そう。
・結構速く見つかったな。試すぞ。(ここまでさらに20分ほど)

・うごかねーーーーーーーー!!!

・このヘッダーがまずいんじゃね?(気づいたのがさらに3時間ほどたってから)
・使えるライブラリ無いの?
・さらに探す→サンプル付きのライブラリがあるじゃまいか!
・使ってみる

・またうごかねーーーーーー!!!

・ソースを微調整
・動いた!ktkr!!!!(ここまでさらに10分ほど)

そんなわけで、寝てませんよwwwww

苦労の結果提出できる画像がこれだよ!!!




ほんと!後悔するよNE☆
OpenGL好きだから、こんなもんじゃやめねぇけど!

使ったのはこれ↓
http://delphi.codefetch.com/example/k4/lunits/elfglut.pas?qy=getmenu

施した改造は、uses節にWindowsを追加したこと。

注意点として、glutInitの呼び出し方法が特殊で

glutInit( MS_LIB )

のように呼び出さなくてはいけないということ。
if文の条件式として呼び出せば、エラートラップもできていいのかもと思った。
あとは、C向けのGLUT開設サイトのサンプルソースが、ほとんどそのまま通る。
Delphi with OpenGLしたい人はお試しあれ。

# 追記
実行時にはglut32.dllを要求するから、どっかから拾ってくる必要があるよ!

# 追記2
眠い時に難しい漢字使ってタイトル書くもんじゃないね!

9.12.2008

遠回りして気づく。

Xファイルの表示だのなんだのやってみたけど、あんまり意味ないんじゃないかと気づく。
そもそも、やりたかったのはお手軽に3Dのゲームを書くってことだったし。

そんなわけで、本来の道筋に戻ります(笑)

とりあえずそれなりに動くものを仕上げてから、ここまで検討してきた事柄について再検討してみようと思うよ。

# これに気づいたのは、描画やらなんやらを自前でやりながら、お手軽さがたりないと思ったところから。

9.09.2008

遅くまでおきててもロクなことがない。

頭は回らないし、プログラムは書けないし。
そんでもって、ネットサーフィンした挙句、面白そうなライブラリを見つけちゃうし……。

だが、今はこの心躍る発見をつまみ食いしている場合じゃないのだ。
……だけどメモだけしとく。

・G3D――SDL+OpenGLで3Dゲームを実現するためのフレームワーク

案外開発も活発らしく、今やってることに飽きたらこちらに転向するかな。

もうひとつ。
こちらは思ったこと。

・MQOファイルを読み込んで、Xファイルと仲良く使えないかな?(←Xファイルが扱えれば、利便性は低い?
・Xファイルの取り扱い方について、SXをみならってクラス化してしまおうか

どちらも所詮思いつき。

僕敗北。

どうにもこうにも、SXファイルとの共存が難しい。
というか、SXLibと共存がすごく難しい。

どうしたものか(´ε`;)ウーン…。

QuadrupleDでの初期化処理→あとは普通のDirectXと同じっていうだけでも、だいぶ手間は提言されるものの……。

SXLibを使わないことによる弊害がどの程度発生するかによるのかな……?


もうすこし、SXLibについて精査する必要がありそうだな。

9.08.2008

ライティングの難しさ。

ここまでくると、もはやセンスの問題だとすら思えてくる(笑)
テクスチャ貼ったSX形式のキューブがいまいちうまくふるまわねー!!と思ったら、鏡面反射光をOFFにすることで、問題なくふるまってくれました。

Zオーダーの問題も、単純に私が座標系を間違えていただけでした。
右手座標とか、左手座標とかややこしいんだよ!
普段OpenGLで組んでるんだから仕方ないだろ!←ひどい言い訳

さて、ここまで来たら、今度はモーション付きXファイルについて考え始めてもいいかと思っているんだけども、まだ問題がある。

と、その前に、まずはうまくいった証拠として図をどうぞ。






さて、アニメーションに行く前に残っている(と思われる)問題。

1.カメラワーク
カメラの位置とか、制御というのをどうやるのがうまいのか理解できていないから、そこを考えないといけない。
勝手な思い込みかもしれないけど、QuadrupleDはカメラを動かすことで視点の移動を実現できるけど、DirectXはカメラが固定でオブジェクトの座標を変換することでカメラの移動を実現している気がする。

となると、QuadrupleDを叩けばどっかでつながっているところにたどりつくわけか。

なんにせよ、その辺は解決しないとどうしようもないと思う。

2.オブジェクトの回転
カメラに絡む事だけど、オブジェクトをその場で回転させたりする方法がよく理解できていない。
便利な行列変換やら行列操作のライブラリがあるから、フレームやらなんやらについて理解できればその場での回転も問題なく行けるものと思われる。

3.オブジェクトの制御
たとえば、シーンをレンダリングした後にXファイルを描画すると、シーンで最後に描いたフレーム内に描画されてしまう。
これをうまく使えば、思い通りの描画ができるんだろうけど、この辺はまだ調べないといけないところだと思う。

と、とりあえずはこの3点が課題。
3.は描画順序を工夫したり、Xファイル用のフレームを用意するだけだから、それほど手間ではないと思うけれども、1.と2.が解決しないことにはアニメーションをやっても面白くない気がする。

単純な解決法としてはQuadrupleDを使わないことなんだけど、それでは今回いろいろ調べてる意味がない。
(お手軽プログラミングのためにお手軽でない道を通るってのはバカに見えるかもしれないけど、目的のためには手段を選べない状況なんですな。)

3Dについて、もっと勉強しなくちゃ。

9.07.2008

確認作業は粛々と続く。

そろそろカスタムしたことによる有用性が見えてきたかもしれない。
図はQuadrupleDで提供されてるビルボード機能と、トラの回転画像を合わせるというもの。
サンプルのソースコードそのままで、普通にビルボードが表示できた。
(背景がトゥーンレンダリングのようになっているけれど、正体はメタセコイアでレンダリングした単なる一枚絵)



こうなると、当然SXファイルによるオブジェクトとの共存も考えられる。
それを実行してみたのが下図。
(Tiger.xと自分の作ったSXファイルとで)モデルのスケールが合ってないから、一度取りがちょっと大変だけど、基本的にはうまく行った。




だけど、ここでいくつか問題がある

・光源がおかしい(トラの設定でメッシュにあたっているせいか、白くなってしまっている)
・オブジェクトごとにZオーダーを持っているものと思っていたら、BeginSceneで描画を指示した順番に奥から描画されていく
・描画順序を変えると、座標は同じはずなのに描画結果が著しく異なる

この辺はまだ追跡調査の必要がありそう。

とりあえず問題解決。

カメラワークの方が簡単だと思っていたら、こちらの方が簡単だった。
というのも、TDGTextureオブジェクトがうまい具合にラップされていないテクスチャオブジェクトを参照する手段を提供してくれていたから。
実質一行だけで済んでしまった。

これなら、複雑なマッピングがされたオブジェクトでも、配列を定義してやればよさそうだから楽だな。
(クラスを噛ませるから、メモリの効率は悪いんだろうけど。)

画像はテクスチャを貼った昨日のトラ。






そんでちょっと手間のかかったカメラワークの方。
いろいろ考えた結果、ワールド(トラの住んでいる、画面の向こう側の3次元の世界)ごとグルグルまわしてみることに。

よく見てみたら、参考にしたソースもワールド座標を回してた。
そんなわけで、画像は回っている様子。



これでライブラリもそれなりにうまく動くことが実証できた。

使ったカスタムライブラリはこちら。
上のぐるぐる回るトラのサンプルはこちら。

お約束ですが、ご利用は自己責任で。

だいぶ手間取った&道のりは長い。

Xファイルを読み込んで、モデルデータを表示させるところまではできた。
具体的に言うと、JEDIのヘッダーを改造して、QuadrupleDと仲良くできるようにしてやった。
ただ、どうしても仲良くできなさそうな点が2,3見つかったので、QuadrupleDのD3D9.pasについても手を入れた。

これで、DirectXのヘルパー系関数を手軽に利用できるようになった(ハズ)

だもんで、まずは静止オブジェクトのロードと表示から。
と言っても、ほとんど前回参考ページとしてあげたサイトのソースをまる写ししただけなんだけど(笑)
図は、DirectXの最近のサンプルでおなじみ、虎のモデルを表示させるデモ。
まだテクスチャマッピングはしていないから、図のような無地のモデルになる。

(ただし、メタセコイア等できちんとマテリアルの設定がなされていて、モデルの地に色が付いている場合にはその色で表示される。)






という訳で表示までこぎつけた。
一応、使ってるヘッダー類はいつものところに上げておきます。

ドキュメントも何もないものですが。
そうそう、このヘッダーについて、SANDMAN氏やDirectXヘッダー関連のプロジェクトに問い合わせないように。

現状の課題は
・カメラワーク(おそらくこれが原因で2次元のような表示になっている)
・テクスチャマッピング(テクスチャはなんとかTDGTextureの力を借りられないものだろうか?)
といったところか。

アニメーションへの道のりは遠いな。

今日はもう寝よう。

9.05.2008

久しぶりにこんな時間まで起きている気がする。

最近すぐ眠くなるから、結構速くに寝てしまうんだけど、今日はなんだかこの時間まで起きている。
当然頭は回ってないけど(笑)

んで、すこし考えたり調べたり実践したりしたのでメモ。

まずはDirectXをDelphiさんから直接たたくっていう方法。
組んでみて、これはQuadrupleDに比べるとあまりにも労力が大きいうえに、Delphiでやる意味はどこにも無いことに気づいた。

QuadrupleDを使わないなら、Cから使った方が、資料も多いし楽だろうということだ。

だから、これはやらないだろう。
もしやるとしたら、QuadrupleD + Delphiという組み合わせを捨てる時だと思う。

これに絡んでDG-Caradを調べていたら、D3DDevice経由でD3DDeviceオブジェクトを直接操作できる(というか、D3DDeviceオブジェクトそのものがうまーく実装されている)ことに気づいた。

よく考えたら当然なんだけどね。

んで、これを利用すれば面倒な初期化処理はQuadrupleDに投げて、 Clootie graphics pagesのDirectXヘッダー(JEDIヘッダ)を用いてヘルパー関数の機能を拝借することができるんじゃないかと。
(ここ最近話題に上げてるアニメーションについては、ちょっと置いておく。)

いくつか型を定義する必要がありそうだけど、そのくらいはやりますわな。
(これは、JEDIヘッダが、DirectXヘッダーにまでT**というDelphi伝統の命名方法を採用しているのに対して、QuadrupleD搭載のヘッダでは、本家DirectXと同様の名称が採用されているため。
まだ試していないけど、おそらくコンパイラはじかれると思う。型の不一致で。
だから、どちらかに統一するか、キャスト等の型変換機構が必要になってくるんだと考えているから、型を定義する必要があるかもしれないという結論に至った。)

そんなわけで、明日の(今日の?)課題はこの辺を探ってみるということ。
参考になりそうなページだけ、メモ代わりにリンクしておく。

・参考になりそうなページへのリンク
http://www13.plala.or.jp/kmaeda/directx9/tiger2.htm

9.04.2008

気になったニュースとかいろいろ。

プログラミングの話ばかりしていても肩がこるので、たまには別の話題を。
(とはいえ、プログラミングの話題を上げている方がアクセス数がいいんだよな。)

のはらしんのすけ義塾大学というのが開校したそうで。
新手のSNSやネットゲームかと思いきや、公式のサイトに広告らしいものが配置されているわけでもなく……。
ドメインも中途半端だし(edu904って、エデュケーションくれよんのつもりだろうか?大学なら、アカデミーじゃないの?)、一体何がしたいんだろうか?
まぁ、開校って記述があるから、今後会員を集めてなんかやろうっていうのは目に見えてるわな。

んで、これに絡んでサービスを提供してる会社が気になったんで調べてみたら、パチンコとか小規模なネットゲームを配信している企業だそうな。
資本金1000万で社員75名って……。大丈夫なんだろうか?

社長の岡村隆って名前も、ナインティナ○ンか!?と思ってしまった(笑)


のはらしんのすけ義塾大学が、今後新しいタイプのネットワークサービスに成長したら面白いなと思うので、ここに書いておこう。

ただ気になるのが、大学という名称。
これって、学校法人法(私立学校法とかいうのかな?)とかに引っかからないんだろうか?
学校法人名乗ってないから大丈夫なのか?
それとも、ウェブサービスは法の及ばない範囲?
(もし詳しい方が居たら、そのへんおしえてぷりーず。)




そして、プログラミングの話題以外といいつつ、プログラミングの話題を(笑)
テクスチャの張り込みに関してだけど、TSXVertex**というクラスを用いてテクスチャの貼り付け情報を管理してやれば、問題なくテクスチャを張れそうな感じがしてきた。
というのも、SXLib9.pasをのぞいてみたら、SX形式の解説があって、

名称 | オフセット | サイズ | 備考
----------------------------------------------------------------------------
Signature | 0 | 16 | 'Simplified_X02 '
nVextices | 16 | 2 | 頂点の数
nIndices | 18 | 2 | 頂点数のインデックス数
dwFVF | 20 | 4 | フレキシブル頂点フォーマットのフラグ
VertexSize| 24 | 4 | 1頂点当たり何バイト必要とするか
DXVersion | 28 | 4 | DirectXのバージョン(FVFの識別用)
.
.
.
(中身)
.
.
.
名称 | オフセット | サイズ | 備考
---------------------------------------------------------------------------------
Vertices | 256 | VertexSize * nVertices | 頂点
Indices | 256+Vertices | 2 * nIndices | 頂点のインデックス

というのがSXファイルのフォーマットらしいから。
ここから読み取るに、テクスチャのマッピング情報は一切含まれていない。
だから、テクスチャのマッピング情報は別物だと考えていいのかもしれない。
(という考えから行けば、先日ラグナロクキャラクターのモデルできちんとテクスチャが貼れたのは偶然ということか?→ROKファイルのようにフレーム分割されているものではなく、シングルオブジェクトとして読み込んでいたからではないだろうか?)

というわけで、テクスチャ貼りに関しては振り出しに戻りました(笑)

それから、P3D形式のデータをQuadrupleDがどうやって動かしているかを考察してみた(またソース読んでない)んだけれども、単純にフレームごとにメッシュを読み込んで、フレームの位置と姿勢をP3Dの指示に従って動かしているだけなんだろうという結論に至った。

これはどういうことかと言えば、フレームを動かすだけだから実装は楽だろうけれども、ボーンアニメーションのようなアニメーションはできないよってこと。

これに対してモーション付きXファイルが想定しているのはボーンアニメーションだったから、そもそも相いれないものだったという認識でいいんじゃなかろうか?

書いててよくわからなくなってきたけど、アニメーションについては自前で実装するのも可能かもしれないという、光明的なものが見えてきたというだけのことです。

自前でアニメーションを実装したときにうれしいことは、六角大王フリー以外のXファイル書き出し対応3Dモデラによって3次元オブジェクトを作り出せることだろうな。

六角大王フリーで十分な私にとって見たら、さほど重要なことじゃないから、おそらく実装はしないだろう。
テクスチャのマッピングに関する情報はSXファイルに含まれていないことがわかったわけだし。

9.03.2008

フリー版でモデルデータを作成したときに困る点と、それに対する対処法、それからテクスチャの情報について。

昨日話題に上げたことの続き。

……と書きつつ、まずは昨日と関係ない話題に関することから。

六角大王フリー版は、ご存じのとおり左右対称のオブジェクトしか書き出せない。
でも、これだと片手に剣を持って、もう片方の手に盾を人とか、そういうオブジェクトを描画させることができない。
(武器グラフィックの変更とか、別のメッシュファイルを読みに行くという解決法もあるだろうけど、町の兵士とかはひとつのファイルになっているにこしたことはないだろうから。)

んで、これに対する解決策。
結構六角大王な人には常識なのかもしれないけどね。
左右のうち、いらない方の面を削除するっていう方法。

たとえば後半に紹介する画像は、その方法で剣を片手だけにしてある。
元はメタセコイアのデータで、それを3DAceで読み込み→左右対称にしてROKで書き出し→片手だけ剣の面を削除という手順でやっている。
(正直、結構手間がかかった。モーションまでお手軽にできるのはいいけど、やっぱりヘルパー関数をQuadrupleDと一緒にウマーくつかえる方法を模索した方が、結果的に労力の低減につながるかもしれないと考え中。)

まぁ、他に方法が見つからなければ、こんな方法を駆使する手もあるってことで。




さて、そんでもって昨日の続き。
テクスチャ情報を持たないメッシュファイルを読ませて表示させるとどうなるか?
答えば図のようになる。
これは、先日メタセコイアからXファイルとして出力→QuadrupleDを使って表示という作業を行ったのと同じモデル(実際には、ROK形式に返還後、先述した加工を施してある。)

ともかく、メタセコイアの時点では保持していたテクスチャのマッピング情報が失われたために、同じテクスチャを指定してもこんな結果になってしまったんだと思われる。







以上のことについて、解決策として思いついたものをメモ。
どれもたいへんそうなのに変わりないけど、時間のあるうちにこういうことを楽しんでやるっていうのも良いのかもしれない。

アイディア1.
Xファイルを扱えばいいわけだから、やっぱりJEDIのヘッダーを引っ張ってきて、QuadrupleDと組み合わせて利用できる方法を模索する。
これだと、SXには頼れなくなるから、レンダリングまわりも自分で制御しないといけなくなるのが一番の問題になるかな?
あ、テクスチャに関しても、TDGTextureという優れたクラスを利用できなくなるのか。

アイディア2.
メタセコイアのデータを利用したいわけだから、それを直接利用できればいいという見方もできる。
じゃあ、メタセコイアのアニメーションデータを扱える、Mikoto向けにコンバータを書けばいいんじゃないだろうか?
=>Mikotoのファイルフォーマットに関する資料が少なすぎて、アイディア1以上に骨が折れそう

アイディア3.
アニメーションX→P3Dデータへのコンバータを書けば問題解決?
先日の、モデルはXファイルで、アニメはP3Dでっていうのと同じ話だな。
あるいはSX形式そのものを拡張した独自形式を定義するのもどうだろうと思う。
(SX形式のファイルをひとまとめにして、それをメッシュリストとして扱えるような感じか?)
独自形式に拡張しても、アニメーションデータはP3Dを使えばいいんじゃなかろうか?

なんにせよ、モーション付き3Dっていうのは結構大変そうだ。
いっそのこと、QuadrupleDを捨てて、JEDIのライブラリあたりを経由して、DirectXを直接たたく方が手軽にできるんじゃないかとすら思えてくるね(笑)

それも一回やってみて、それから判断しても……。

9.02.2008

なんでめんどいか?っていうのと、その他の話題。

先のエントリで勝手に結論:とか出してたから、なんでメンドイのかを一筆。

実は、SXファイルの取り扱いについて調べていたところ、DirectXのサンプルプログラムではおなじみのイルカのモデルをDelphi+QuadrupleDで作ってみましたという人の記事を発見。(こちら

そこによると、形状ごとのモデルを用意する→頂点をブレンドしてアニメーションさせるという手順でアニメーションをさせていたのだ。

これは単純に、アニメーションのパターン数×1パターンで使うアクションの枚数分のファイルが必要になり、六角大王+HumanMDLの「ROKファイルとP3Dファイルを用意すれば、アニメーションできるザマスわよ。」という状況とはあまりにもかけ離れてくる――そう読んだからだ。

さらに、アニメーションのパターンによっては頂点のブレンド方法を変えなくちゃいけないことが予測される。ということは、とてもお手軽アニメーションとかいうわけにはいかなそうなのである。




だけど、後半で書いたP3DファイルがあればSXメッシュだけでもアニメーションできるんじゃないだろうか?
という疑問はかなりいい線行ってそうな感じがする。

P3Dファイルを扱うプログラムを実装した段階で気付いたと思うけど、P3DFigureの作成において、メッシュリストを引数として受け取るSpawnメソッドを利用していたからだ。

メッシュリストを引数として受け取るってことは、それが六角大王のファイルである必要はないということだろう。
つまりこれは、ほかのモデラを利用できるってことなんじゃないだろうか?
(まだ試していないから、今後の課題としてやってみようと思う。)




もし六角大王以外のモデラが使えると何が嬉しいか?
一番うれしいのは、テクスチャのマッピング情報をメッシュに持たせることが可能だということなんじゃないだろうか。
SXファイルのフォーマットについて詳しく調べていないから確かなことは言えないけど、少なくとも六角大王フリー版ではモデルにテクスチャを貼り付けることができないと聞いた。

けれど、六角大王で作られたデータはQuadrupleDの管理下に入った時点でSX形式に直されているハズなので、テクスチャを貼り付けることが可能だ。(テクスチャが貼れることは確認済み)

テクスチャが貼れるということは、テクスチャは何らかのマッピング指令に基づいてマッピングされているんじゃないだろうかと。そう考えたわけである。
(たとえば、メタセコイアだとUVマッピングによってマッピング情報をモデルに持たせることができる)

六角大王ではマッピングの情報をモデルに埋め込めていないわけだから、なんらかのデフォルトマッピングというのが定義されているのは間違いないんじゃないかと。そういう結論に至ったのだ。

テクスチャが貼れると、キャラに表情をつけたり、服の細かい模様を3Dで描かなくてもよくなる。
これは、多少規模の大きい3Dのゲームを作るなら便利な機能なんだろう。
同じ形の家だけど、テクスチャが違うから別の家に感じさせることができるとか。
(家の場合、アニメーションしなくても良いから、別に六角大王にこだわる必要は無いんだけどね。)




以上を踏まえてのとりあえずの結論は、SX形式に対応したポリゴンモデラがあればいいじゃん。
ついでだから、HumanMDLの形式でアニメーションつけられるようにしてさ。

ふぅ。

要するに、今あるものを使うのが一番楽だよってこと。
でも、話題自体は面白いからもう少し追いかけてみるかな。

結論:標準で提供されているのを使うのが楽。

昨晩考えたことについては、表題のような結論に達しました(笑)

さて、そんなわけで今日は六角大王のモデルデータを動かしてみるという話。

コードは昨日のを流用するとして、どこかからP3D形式(HumanMDLで作られたモーションデータ)のファイルをゲットしてこなきゃなりません。

が。

いつもどおりCypherS TufTさんにはこの条件に合致するデータが存在するので、今日もそCypherS TufTさんのお世話になります。
(いずれ、きちんとお礼をせねば。。。)

はてさて、こうしてデータが準備出来たら、一応HumanMDLでどんなモーションがあって、どんな動きをするのか確認しておいた方がいいでしょう。

この先読んでいただければわかりますけど、今回はモーション番号2番、全部で4フレーム時間あるアニメーションをさせるつもりでいます。

インデックスは0から始まるわけですから、HumanMDLで確認できるモーション、ジャンプ2と同じ動作をすれば、うまくいったと言えるわけですな。

そんなわけでさっそくコーディング。
まずはuses節にP3DLoaderユニットを追加して、TP3D, TP3DFigureオブジェクトを準備しますよ。

uses
...ROKLoader, P3DLoader;
.
.
.
ROKMesh: TSXMeshList;
P3DData: TP3D;
Motion: TP3DFigure;
.
.

こんな感じで。

んで、TP3Dオブジェクトを作成して、P3Dデータを読み込みマウス。

P3DData := TP3D.Create;
P3DData.LoadFromFile( 'jump.p3d' );


したらば、先に読み込んでおいた六角大王データと組み合わせて、P3DFigureオブジェクトを作ってもらいます。

Motion := P3DData.Spawn( ROKMesh, MeshFrame );

Spawnの引数は、六角大王のデータと、親になるフレームですよ。そこんとこお間違いなく。
当然、こうやってメッシュデータを取り出せるわけだから、昨日やったfor文による小手先のテクニックは不要になるわけだ。

あとは、Scene.Render( Root );する前に、

Motion.Move( 2, AnimationCounter );

とかすれば動き出してくれる。

ここでAnimationCounterはSingle型の変数で、表示するべき時間を表す変数。
Application.Idleが、50FPSだとだいたい20回/sぐらいの回数呼び出されるはずだから、極端に小さいとめちゃめちゃスローなアニメーションになる(当然、動きもなめらかになる)し、かといって大きいとやたらと素早く動く(すごく気持ち悪い)アニメーションになる。(さらには、動きがカクカクになる。)

増分の数値はお好みで。
まぁ、AnimationCounter := AnimationCounter + 0.01;ぐらいが丁度いいんじゃなかろうか?

あ、アニメーションは4フレームまでしかないと考えているから、

if AnimationCounter > 4.0 then
AnimationCounter := 0.0;

とかして、増分後にリセットしとくのを忘れずに。

忘れずにといえば、オブジェクトの解放もForm.CloseQueryあたりでこなしとくといいと思うよ。

さ、だんだんおもしろくなってきたぞ。

画像は静止してるけど、実際には画面内を回転しながらぴょこぴょこ動いてます(笑)
回転じゃなく、キーボードの指示に合わせて画面内を移動するとかさせたら、もう3次元空間を歩き回るアプリケーションは出来上がりになるわけか。

つくづくQuadrupleDの強力さには驚かされるね。

9.01.2008

疑問山積

眠いので、明日のためにメモと考えのまとめ。

これまでは六角大王のデータを読み込んで、HumanMDL(関係ないけど、マツド・サイエンス研究所で検索したら、最新版の配布ページにたどり着けた)でモーションデータを作成→QuadrupleD経由で読んで動かすっていう手法で3次元のアニメーションがいけるもんだと思ってたけど、リファレンスを読んでみたら形状データとモーションデータは分離して考えていいらしい。

つまり、同じ動きをしするけど違うモデリングを施されたモデルがあっても対処できますよってこと。

で、ここの部分について考察してみると、結局TSXMeshはROKデータをSXデータに変換して扱っているのではないかということ。(現時点ではソースとか読んでないから、確証は持ててない。)

従って、形状データは六角大王を使うのが簡単だけど、別に六角大王で作る必要はないんじゃないかってこと。
動きさえきちんとすれば、メタセコイアあたりでモデリング→Xファイルで出力→SXに変換して利用でも行けるんじゃないだろうかと。そう思ったわけです。

ただ、このときにはひと手間が必要で、六角大王でいうところのグループのように、Xファイルを分割しておく必要があるんじゃないかなぁ?と。
たとえば頭、腕、胴体、足からなるモデルなら、六角大王ではそれぞれをグループにすればいいけど、変換して使ってく方法では4つのXファイルとSXファイルを用意しないといけないんだろうなぁと思ったけわけです。
どうせメッシュリストに放りこんでしまえば、なんだろうと変わりないんだろうし。

となると、大まかなアクションをしてくれるP3Dファイルを六角大王のダミー人形クンデータかなんかで作成して、そのサイズに合わせて細かくモデリングしたポリゴンモデルを利用すれば、ふつくしい3次元モデルのアニメーションができるんじゃないの?と。そんな風に思うわけです。

まとめ

・六角大王でモーション用ダミーデータを作成→HumanMDLでモーションデータをつける
・メタセコイア等でポリゴンモデルを作成→動かしたいパーツごとにX形式で出力→それぞれをSX形式に変換
・SX形式に変換したモデルを読み込み→HumanMDLで作ったモーションデータを読み込み→QuadrupleDの力を借りて合体させる→こいつ…動くぞ!!→わー、はっぴーはっぴー。

問題になりそうなこと

・P3Dファイルには、読み込むべき六角大王ファイルの指定がされていないのか?
・読み込むべき六角大王ファイルが指定されていた場合、QuadrupleD上から使うにおいて問題はないのか?
・別々に読み込んで利用した場合、それぞれが連携してアニメーションしてくれるんだろうか?
・そもそも、内部的にSX形式に変換されているという読みが間違っていないのか?

うーん。
考えをまとめるつもりでエントリ起こしてみたけど、まとまらないなぁ。

まぁいいや。眠たいから、残りは明日の自分に任せよう。




どうでもいいけど今日から9月1日だ。
福田首相辞任とか、9月草々すぎる。
総選挙近いのかな?
次は麻生さん?
日本がよくなるならどうでもいいけど。


あ、カレンダーめくらなきゃ。

QuadrupleDで六角大王の形状データを表示する方法だと思うよぉ。

そんなわけで、とりあえず形状データを読み込めたので報告。
というかメモ。

基本的なソースはチュートリアルのポリゴンモデルを表示してみようというやつ。
んで、使った3次元モデルのデータは、例によってCypherS TufTさんより拝借。
六角大王のデータまで公開してらっしゃるとは、実にすばらしい。

さて、六角大王のデータが用意できたら、チュートリアルのソースを改造する。
まずはuses節に
uses
...., D3D9, SXLib9, s_mathpack, ROKLoader

というように、ROKLoaderユニットを加えておく。

これで六角大王の形状データを読めるようになる。

当然、チュートリアルでTSXMesh型として定義されていた部分は必要ないので削除。
代わりに
ROKMesh: TSXMeshList; //六角大王形状データ

な感じでTSXMeshList型のオブジェクトを準備しておく。

これは、六角大王のメッシュデータがグループという単位にわかれているからと理解した。
このグループという単位でHumanMDLを用いてアニメーションをつけることができる。
んで、QuadrupleDではそのグループをメッシュという単位に置き換えて扱うわけだ。
さらに複数のグループでひとつのROKファイルを構成しているから、ROKファイルからの読み込み→メッシュのリストとして考えるという発想に至ったと思われる。

さて、ROKデータの読み込みだけれども、これはいたって簡単。
先ほどの続きとして考えると、
// 形状データの読み込み
ROKMesh := TSXMeshList.Create( DG );
ROKLoadFromFile( DG, 'junp.rok', ROKMesh, 60.0 );

ってな具合になる。
ROKLoadFromFile手続きは、ROKLoaderユニットに定義されている手続きで、第二引数に指定されたファイルを読み込んでTSXMeshListデータとして第三引数に格納するというもの。
内容はクリアされてしまうものの、第三引数に渡すオブジェクトはインスタンス化されている必要があることに注意。

こうして読み込みまで出来れば、「あとはメッシュのデータを格納するフレームを

MeshFrame: TSXFrame;

てな要領で準備して、そこのMeshプロパティに放り込めばいいんですね。わかります。」
と思ったあなた。それは早計だ。

なぜならTSXFrameのMeshプロパティは、TSXMeshのデータしか格納できないから。
そう、TSXMeshListのデータは格納できないのだ。

そこでどうするか?
考えた結果、私は次のような方法をとった。

まず、QuadrupleDにおいて、フレームというのは「親フレーム→子フレーム→孫フレーム→...」というような感じに階層構造をもっている。
そして、一つのフレームにつき、一つのメッシュを保持することができるわけだ。
さらに描画のときには、親フレームから末代のフレームまで辿って描画をしてくれる。
(少なくともチュートリアルの実装では)

ということは、先のように用意したMeshFrameの子孫フレームに、ROKファイル内に存在する各グループをメッシュとして保持してもらえばいいわけだ。
簡単な図にすると

MeshFrame
┣(しっぽの形状データ)
┣(あたまの形状データ)
┣(腕の形状データ)




という具合だ。
こうすることで、MeshFrameがMeshListを保持しているように考えることができる。

で、それを実現するために次のようなコードを書いた。

for i := 0 to ROKMesh.Count-1 do begin
TSXFrame.Create( MeshFrame ).Mesh := ROKMesh.Meshes[i];
end;

Delphiがオブジェクト指向言語だから可能な記述方法であって、さらにTSXFrameがインスタンスを作成するときに親フレームオブジェクトを要求するという構造だからこそ可能な芸当かもしれないが、こうして読み込んでおくことで、描画の際のコードはチュートリアルから一切手を加えなくとも、きちんと3次元モデルを表示することができる。

画像はこの方法で読み込んだROKデータ。

3Dは面倒なことが多いね。

DirectX+Delphiで楽しもうと、QuadrupleDを導入してごにょごにょしちょるわけですが、さっそく壁にぶち当たりました。

というのも、QuadrupleDがチュートリアルでも使っているSXという(簡略化されたX形式みたいなもの)、3次元形状データのファイルは、シンプルという名前だけあってモーション付きXファイルは取り扱ってくれないようなのです。

メタセコイア+RoKDeBone2でモーション付きXファイルを作成してウキウキしてた私にとっては、これはなんとも苦い現実でございますことよ。

いろいろ調べて、JEDIが(ここでもジェダイの騎士か!)過去にDirectX9のヘッダーを変換していたらしいことを突き止め、それを利用すれば(正確には、そこに含まれるヘルパー関数をおさめたヘッダを利用すれば)いけそうだというところまで来ました。

が!ここでひとつ重要な問題が。
それは、JEDIによるっぽいDirectXヘッダーを利用するなら、QuadrupleDの恩恵はあんまり受けられないんじゃないかってこと。
(調べていくうち、せいぜい、Direct3Dオブジェクトの作成程度しか恩恵にあずかれないだろうという考えに行きつきました)

本格的にやるなら断然こっち(JEDI)なんだろうけど、とりあえず目先の問題として、お手軽にやりたいっていうのがあるからなぁ。
と思っていると、ここで救世主が。

どうやらQuadrupleDは六角大王フリーの形状データと、それを元にHumanMDLでつけたモーションデータを取り扱える様子。

そうか。モーションデータを取り扱うには、こっちを利用しなくてはいけないわけか…。

そんなわけで、現在はそちらを調べつつ試行錯誤中。

8.31.2008

浮気ばかりでごめんなさい。

SDLで2Dをいじりながらも、やっぱり3Dが楽しそうやなぁと思う今日この頃。
そんなわけで浮気しちゃいました。

っていうか、3D関連のほうが作っていて楽しいし、動いても楽しいんだよね。

まずはモデルの表示と、それにテクスチャを貼るだけ。



CypherS TufTさんのラグナロクキャラクターの3次元モデルを利用させてもらいました。

こういう扱いやすいモデルをおいていて下さるサイトさんが少ないので重宝してます。

んで、今後はこれを動かせるようにしたいなぁと。
もちろん先日入手したジョイパッドで(笑)

アニメーションをつけるには、RokDeBone2というツールが便利そう。
Xファイルへの書き出しもできるみたいだし。

先んじての問題は、私にセンスがないということと、ライブラリについての学習がぜんぜんできていないってことかな。

気になっている人のために言っておきますが、Delphi + QuadrupleDが制作環境です。
付属のドキュメント以外にドキュメントらしいドキュメントが転がっておらず、検索結果では一見ドキュメントっぽくみえても、私のように書き散らしただけのものだったり、ドキュメントとして機能してくれるドキュメント、特にサードパーティー製のドキュメントが皆無に等しいので(何回ドキュメントって言った?)、リファレンスを読みつつ、試行錯誤的にがんばっている状況です。

今後はしばらく、これに絞って遊んで行こうと思ってますよ。

8.30.2008

SDLよぉ!私は帰ってきたぁぁぁあ!!!

タイトルに意味がないのはいつものこと。そん
そんなわけでLesson27.
アルファブレンドのサンプルコード。

SDLを用いれば、アルファブレンドも値を設定して
SDL_SetAlpha( 透明度を指定したいサーフェス, 方式, 透明度 );
って関数を呼び出すだけで、簡単にサーフェスの透明度を指定できる。
あとは下地になるサーフェスの上に重ねて表示させてやれば、アルファブレンドが完成するというお手軽さ。

ノベルゲーム作る時なんかはサーフェスごとに透明度を設定できるわけだから、キャラクターのサーフェスはそのままで、背景だけフェードアウト→場面転換というような演出をするのには重宝するかもね。

あとは、雲のサーフェスを青空に重ねるときに、アルファブレンドを施してホンモノっぽく見せるとか。
(まぁ、雲のサーフェスが時間とともに動くような状況でもない限り、一枚絵で用意しちゃった方が簡単なんだけどね。)

そんなわけで、いつもの通りアイディアだけは浮かんできますな。

画像はサンプルプログラムを実行した時の画面。
フェードインとフェードアウトに使う画像だけこちらで作成、差し替えました。

キーボードの上キーと下キーで透明度を調整できるようになっている様子。
なかなか面白い。

これってクレーマー?

こないだブログにも書き散らしたり、本部オフィスにもブロークンなイングリッシュでメールした効果だろうか?
Delphi7のUpdateが利用できるようになりましたってメールが来ましたよと。

前回紹介したサイトからは(落とすだけ落として)まだ利用していなかったのでありがたい限り。
なにせこちらは公式のお墨付きだもんね。

さっそくおとしてアップデート。
でも、アップデート中に思った。

これってクレーマー?(笑)

いや、受けられるべきサポートを正当に受けようと思っているだけだよね……?

# そんな気持ちが、実に短い文面ではあるものの、お礼のメールを書くに至ったのかもしれない(笑)

8.29.2008

Joystickを華麗に操る。

SDLのLesson 25。
しばらくSDL触ってなかったけど、案外覚えてるもんだ。

んで、先日某カメラ量販店にて、580円でジョイパッドを手に入れてきた(モチロン10%のポイントもつけてもらった!)ので、それを試すべくLesson25に挑戦しようと思った次第。

ざっと組んでみてだけど、SDLのJoystickの扱いは、まるでファイルを扱うようにして扱えるというところがポイントだと思った。
デバイスをファイルという形で抽象化するのは、UNIXの文化なんだってね。(どっかで読んだ。)

ともかく、そのおかげで
・Joystickへのポインタを定義する
・SDLサブシステムを初期化して、Joystickが接続されているかどうかを調べる
・Joystickが接続されていたら、先ほどのポインタにSDL_JostickOpen( number )関数を使って、Joystickへのハンドルを割り当てる
・SDL_Eventを通じてJoystickから投げられてくるイベントを処理する
・使い終わったら、ハンドルを閉じる
というごく単純なステップでJoystickを華麗に操ることが可能になっている。

応答速度もそれなりなので、簡単な2Dのアクションゲーム程度なら処理できそう。
(もちろん、OpenGLやらDirectXやら使って3次元のシューティングとか実装した場合にも対応できると思う。)

せっかくジョイパッドを手に入れたし、なにかこれを使って遊べるゲームでも組もうかと思う今日この頃。

不思議な不思議なDirectX

という訳でDirectXの話。

SDLといい、まるでゲームプログラミングブログだな。
楽しいからいいけど。


さて、このDirectX、前にSDL+DirectXで簡単な三角形を表示させた時には取り上げなかったけれど、DirectXっていうのは実に奇妙な挙動を示す。
これは、ほかの言語から使っても同じ。
(たとえば、私はいまさっきDelphiからDirectXを利用するコードを書いたけれど、やっぱり同じだった。)

それはどんな挙動か?
それは、対象のウィンドウを乗っ取るという挙動だ。

SDL+DirectXで参考にしたソースコードを見直してみればわかると思うけど、描画するべきウィンドウのハンドル取得している。

おそらくウィンドウズは、DirectXから「これこれのハンドルをもつウィンドウについて、描画権をよこしなさい」といわれると、まったく反論できずに描画権を渡してしまうんじゃないだろうかと。
そう考えると、結構アレゲなライブラリなんだね。
DirectXって。

ともあれ、DirectXを利用するならSDLかますよりもDelphiから使った方が便利そうだというのがわかったから、DirectX叩かなくちゃいけないゲームとか作るときはそっちにお世話になろう。

なにより、Pascalがとても書きやすいし(笑)
C++とは大違いだ。
やっぱり理解している言語っていうのは差がでるものなんだね。

8.28.2008

ジェダイの騎士は強かった。

マックよりモス。
ロッテよりモス。

そんなモス派のケチャップが、午前4時半ぐらいをお知らせします。


深夜です。
最近体調がおかしくて、変な時間に起きてしまいます。

さて、先日Delphiの話を持ち出したのに、実はシステムを再インストールして以降、PCにDelphiを入れていなかったことに気づき、急きょインストールしました(笑)

そしたらCodeGearのサイトからDelphi7.1のアップデートパッチやらドキュメントやらがダウンロードできなくて、今日まで方々探してましたよ。

結論からいうと、ダウンロードできるところは見つかったんんだけれども、まずはCodeGearの日本オフィス曰く、「本社のサーバシステム移管の関係で、ダウンロードできない状態になっている。復旧のめどは立っていないが、早急に必要であればCDに焼いて送付しますよ」とのこと。

おかしな話だろう。
Delphiが製品として優れてるのは知ってる。
CodeGearがソフトウェア作りに関していい仕事してるのも知ってる。
でも、サポート体制がこれじゃ、顧客から見放されるのも無理無いと思ってしまった。
少なくともマイクロソフトに似たような事柄でデッドリンクを報告したときは、直しときましたからお好きにどうぞ的なメールが返ってきたのに。

CDを送付してもらうにも手間がかかるから、結局ネット上を調べたところ、どうやらCodeGearのFTPサイトにはファイルが置いてある様子。
っていうか、FTPに置いてあるならリンク修正するだけじゃないかw
「仕事しろw」とか思いながら、FTPにあるならきっとまとめページがあるハズ!とぐぐってみると、やっぱりありました。まとめページ。

それがこちら

このくらいの代替えページをさっと用意して使ってくださいって体制をとるぐらいのサポートは、やってくれてもいいと思うんだけどどうよ?>CodeGearさん

# 余談だけど、今はCodeGearってのはEMBARCADERO(えんばーきゃどえろ?)って会社の一部門らしいね。




んで、ここからが本題(笑)
SDLにハマってるってことのつながりで、DelphiにもSDLバンドルがあるだろうってことで探したら、JEDIってプロジェクトがSDLバンドルを作ってた。

でも、これ、ソースがすごい変態的になるというシロモノ。

もうちょっと工夫できなかったんだろうか?

一応入れてはあるものの、使う可能性は低いかなぁ。
ただ、JEDIの提供しているJEDI VCLってコンポーネントは驚くほどよくできていて、ちょっとしたツールを作るときにはものすごく役に立ちそう。


今日の朝食はモス。
そう決めたケチャップが、午前5時前ぐらいにお送りしました。

8.24.2008

Delphi2009とC++Builder2009

CodeGearからのメールより引用。

Delphi 2009 and C++Builder 2009 product announcement and two weeks of Live Webinars
start on Monday, August 25 at 5am Pacific Daylight Time (UTC-7)


ということで、Delphi2009とC++Builder2009が登場する模様。
MicrosoftがC#やらVBやらに注力して以来、経営のまずさもあって死んだといわれている両開発環境だけれども、当時Delphi7を数万円のバイト代をはたいて購入した俺にとっては、Delphiというのは絶対に捨てられない環境なのです。

今思えば、オブジェクト指向開発も、コンポーネント指向開発も、プログラムにかける情熱も、すべてにおいてレベルアップさせてくれたのはDelphi7だった。
モチロン、未だにお世話になってます。
まだあの価格を取り返せたとは思っていないのでね(笑)

詳しくはアナウンスやらスピーチやらで語られるのかもしれないけれど、.NETFramework3.5には対応するんだろうか?
……まぁ、次に使うとしても、Delphiを購入することはせず、フリー版で使うんだろうけど(笑)



そうそう、これからC言語を学習しようと思っている人で、ボーランドのC++コンパイラ(いわゆるBCC)を使おうと思っている人がいるならば、C++Builderを利用するといいです。
理由は簡単。
コマンドライン版のみのコンパイラは5.5だかで止まっているけど、C++Builder付属のものは最新バージョンのものだから。
パスさえ通せばコマンドラインからもbcc32コマンドで利用できるし、Windowsアプリケーションが書きたいと思えば、面倒なWindowsAPIを叩かなくても、お手軽にRADプログラミングが楽しめますよ。

8.23.2008

あなたは何言語プログラマ?

プログラミング業界って、たとえば
・Cプログラマ=C以外の言語は使えない人
・Javaプログラマ=Java以外の言語は使えない人
・VBプログラマ=(以下略

という認識が一般的なものなのだろうか?

私はC言語できますってことで多方面に自己紹介しているんだけれども、昨日あった人も、そんな自己紹介に上記の認識をあてはめて私に話しかけてきた。
「C#という、マイクロソフトさんが開発した言語がありましてですね……。」
とか。

いや知ってるでしょ。それくらい……。

ざっくりシステムの概要を話してくれればいいものの、.NETFrameworkを導入するとはどういうことかとか、.NETFrameworkの導入でプログラムが安全になりますとか、そんな話をしてくれた。

あんまりにも時間を食うんで、「アンセーフなコードをそちらさんが書かないという保証はありますか?」って聞いたら、「は?」って顔された。
だから、あんまり時間とられるの嫌なんだよねーって顔してみたら、横にいた上司がこちらがわかっていることを察したらしく、さくさくとシステムの概要だけ説明してくれた。

終わってから聞いたら、どうやらこの4月に入ってきた営業さんらしい。
理系出身者って、語りたがるからいけませんよねぇ。申し訳ないとか言われちゃった。


俺も理系なんだけど(笑)

8.16.2008

15パズルをいじくる毎日。

だんだんとSDLの扱いにも慣れ。

……Bloggerのマイレポート画面が変わってら。

あ、DistroFreakが雑誌に掲載された件がいつまでも上にあってうざったかったので、下のほうに沈ませましたw

さて、タイトル通り15パズルをいじくってみたという話。
昨日公開したアーカイブですが、一部環境で動かない現象が確認された(っていうか、zlibのdll同梱し忘れた)ので、差し替えておきました。

それから、少しいじくったバージョンがこちら

・どのくらいいじくったかっていうと、画面がおっきくなりました。
・ヘッダーと実装を分離してみました
・お手本画像が表示されるようになりました
・スクリーンサーフェスの取得方法とかを変更しました
・将来の拡張に備えて、関数の設定を変更しました

ってところだろうか。
相変わらず大域変数使いまくりの非オブジェクト指向なコードに変わりないけどw

ソース…じゃなかった、ケチャップがほしい方はこちらから。
コンパイル時にはmysdl.aを付け足すのを忘れずに。

8.14.2008

15パズルできあがり

今回リライトした一件で、私は(もしかしなくても)C++がダメな人間なんじゃないだろうかと思え始めた。

というか、オブジェクト指向な書き方をしない方が楽しい。
(いや、正確には、RubyやC#のように、完全にオブジェクト指向で書けるなら、それはそれで楽しいんだけど)

結局、パネルをオブジェクトとして扱っていたこれまでと違い、数値だけを配列に管理させるようにした。
(そうしたら、劇的に速度も向上した)

判定関数やシャッフル関数の実装も単純になったし。
何でもかんでもオブジェクト指向すりゃいいってもんじゃないな。
オブジェクトの設計考えてるときは楽しいんだけどね。

で、せっかくブログで作ってます日記を書いてたから、報告までに出来上がり品をアップ。

■ ランタイムも含まれているバージョンはこちらのリンクから(268KB)

■ ランタイムなんてなくていいぜ!って猛者はこちらのリンクから。(8KB)

■ あと、クソ汚くてもいいからソースよこせって人は帰ってください。
  ソースじゃなくてケチャップがほしいって人はこちらから入手できます。
  ただ、このケチャップもおいしくないです。
(4.57KB)

特にケチャップは、ヘッダーに関数の実装まで書いてるとか、大域変数使いまくりとか、「あー。あんまり考えたくなくて、好き放題やったんだなぁ。」というのがバレバレな内容。
お恥ずかしい限り。

ちなみに、必要ランタイムはSDLのランタイムなのであしからず。
(ドトネトフレームワークくれなんてことは言いませんのでご安心を。)

書き方としては良くないんだろうけど、楽しいからいいじゃん。

そんな趣味グラマのつぶやき。

15パズルをリライトしながら、自分のスキルの低さに嫌気がさしつつ、オブジェクト志向なぞガン無視のプログラムを書き続けている今日この頃。

そんなことを思ったのでした。


# そうそう、ブログタイトルとハンドルを変えました。
# 以後はKetchupとして心機一転、精進して参りますぞ。
# Vectorとかの登録変更は、また後日にでも。

8.13.2008

Distro Freakが雑誌に紹介されました。

そんなわけで、Distro Freakがアスキー・メディアワークス発行の「週刊アスキー別冊 カンタンUbuntu2」に紹介されました。



紹介ページの解説によると、ディストリビューションの紹介数450+だそうで。
そうか。そんなに紹介してたか…。

さて、当然気になる雑誌の内容ですが、基本的には以前に発行された「カンタン Ubuntu」の続きです。
以前に発行されたものがUbuntuのインストールに重点を置いていたのに対して、今回のはいかにしてUbuntuをデスクトップLinuxとして使うかという点に重点が置かれています。

大きく、
(1)ウルトラモバイルPC(UMPC)上で実際にUbuntuを使ってみるというレビュー記事
(2)各種アプリケーションの使い方(GIMPなど)
(3)プリンターなどの周辺機器の動かし方
(4)コマンドラインの使い方やほかのUbuntu系ディストリビューションの紹介
(5)Ubuntu使いへのインタビュー
(6)仕事で使うためのTips
(7)Ubuntuでサーバー構築
(8)トラブルへの対処
といった構成になっています。

記事の内容は比較的わかりやすいものの、周辺機器の使い方ではハードまで特定しての解説がなされたり、特定メーカーのみの紹介など、「つまずかないように」が配慮されすぎて、逆に実用上不便かな?と思う点も目立ったり。
まぁ、入門者向けだし、つまずかない解説としては、これがベストなんでしょうけど。

インタビュー記事はなかなか面白かったなぁ。
Linux使いって、自分の環境について語りだすと宗教論争になる可能性があるから、普段あんまり語りたがらないし。

きっと、良かった点はほかのブログさんがたくさん書くと思うので、DistroFreak的に気になった点をあとふたつだけ(笑)

・SUSEがRed Hat系ディストリビューションの代表として掲載されている
これは、Distro Freakとしては指摘せねばなるまい重要な間違いです。
Linuxの系図をみていただければわかるとおり、SUSEはRPMを採用しているものの、Slackware系ディストリビューションだからです。

・無料を前面に押し出しすぎ
重要なのは自由であって、無料はそれがもたらす副産物でしかないのです。
あんまりにもしつこく無料を前に押し出しすぎてて、重要な「自由である」ことがおろそかにされていると思うなぁ。

と、実に「そんなとここだわるの!?」という気になった点でしたが、気になったものはしょうがないでしょ。

とまぁ、そんな内容ですが、UbuntuでLinuxはじめたい人は買って損のない内容だと思うので、書店などで見かけたらよろしくお願いします。

わたしの.emacs

暑さにバテながらいろいろ考えてみたところ、私にとって最も重要なファイルがこれであろうという結論に達した。

さて、そんな悟りはおいとき、実は以前からemacs22にして以来(というかLennyにして以来)、Shellモードで日本語がうまく表示されないという不具合に悩まされていた。

今回も、以前にサポートブログで紹介したようなやり方でemacs環境をUTF-8に整え、環境変数$LANGもja_JP.UTF-8にしてあるから、当然の如くshellモードでも日本語が表示されるんだと思っていた。

けれど、実際使ってみるとそうではなく、ここしばらく、特にSDLを使ったプログラムをコンパイルするときに、頻繁にShellモードを呼び出さなくちゃいけなくなってから、この問題をなんとか解決できないものかと悩んでいたのだ。

で、今日一応の解決を見たのでその結果とともに.emacsを張り付けておこうと思う。

まずは.emacsから。

;;.emacs
(setq inhibit-startup-message t)

(set-locale-environment nil)
(coding-system-put 'utf-8 'category 'utf-8)
(set-language-info
"Japanese"
'coding-priority (cons 'utf-8
(get-language-info "Japanese" 'coding-priority)))
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)
(global-font-lock-mode t)
(setq backup-inhibited t)
(setq delete-auto-save-file t)

;; scheme-mode
(autoload 'scheme-mode "scheme-mode" "scheme" t)
(setq auto-mode-alist (cons '("\.ss$" . scheme-mode) auto-mode-alist))

;; html-helper-mode
(autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
(setq auto-mode-alist (cons '("\.html$" . html-helper-mode) auto-mode-alist))

;; css-mode
(autoload 'css-mode "css-mode" "Editing CSS" t)
(setq auto-mode-alist (cons '("\.css$" . css-mode) auto-mode-alist))

;; region
(setq transient-mark-mode t)

;; show clock
(display-time)

;; show column number
(column-number-mode t)

;; anthy
(push "/usr/local/share/emacs/site-lisp/anthy/" load-path)
(load-library "leim-list")
(load-library "anthy")

;; uim
(push "/usr/local/share/emacs/site-lisp/uim-el/" load-path)
(require 'uim-leim)
(setq default-input-method "japanese-anthy-uim")
(setq uim-default-im-prop '("action_anthy_hiragana"))
(setq uim-candidate-display-inline t)

(show-paren-mode t)
(setq show-paren-style 'mixed)

;; scheme
(setq process-coding-system-alist
(cons '("gosh" utf-8 . utf-8) process-coding-system-alist))

;; gosh interpriter path. -i option is interactive mode
(setq gosh-program-name "/usr/bin/gosh -i")

;; scheme-mode and run-scheme-mode use to cmuscheme.el
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)

;; pair of brace
(show-paren-mode)

;; indent
(put 'and-let* 'scheme-indent-function 1)
(put 'begin0 'scheme-indent-function 0)
(put 'call-with-client-socket 'scheme-indent-function 1)
(put 'call-with-input-conversion 'scheme-indent-function 1)
(put 'call-with-input-file 'scheme-indent-function 1)
(put 'call-with-input-process 'scheme-indent-function 1)
(put 'call-with-input-string 'scheme-indent-function 1)
(put 'call-with-iterator 'scheme-indent-function 1)
(put 'call-with-output-conversion 'scheme-indent-function 1)
(put 'call-with-output-file 'scheme-indent-function 1)
(put 'call-with-output-string 'scheme-indent-function 0)
(put 'call-with-temporary-file 'scheme-indent-function 1)
(put 'call-with-values 'scheme-indent-function 1)
(put 'dolist 'scheme-indent-function 1)
(put 'dotimes 'scheme-indent-function 1)
(put 'if-match 'scheme-indent-function 2)
(put 'let*-values 'scheme-indent-function 1)
(put 'let-args 'scheme-indent-function 2)
(put 'let-keywords* 'scheme-indent-function 2)
(put 'let-match 'scheme-indent-function 2)
(put 'let-optionals* 'scheme-indent-function 2)
(put 'let-syntax 'scheme-indent-function 1)
(put 'let-values 'scheme-indent-function 1)
(put 'let/cc 'scheme-indent-function 1)
(put 'let1 'scheme-indent-function 2)
(put 'letrec-syntax 'scheme-indent-function 1)
(put 'make 'scheme-indent-function 1)
(put 'multiple-value-bind 'scheme-indent-function 2)
(put 'match 'scheme-indent-function 1)
(put 'parameterize 'scheme-indent-function 1)
(put 'parse-options 'scheme-indent-function 1)
(put 'receive 'scheme-indent-function 2)
(put 'rxmatch-case 'scheme-indent-function 1)
(put 'rxmatch-cond 'scheme-indent-function 0)
(put 'rxmatch-if 'scheme-indent-function 2)
(put 'rxmatch-let 'scheme-indent-function 2)
(put 'syntax-rules 'scheme-indent-function 1)
(put 'unless 'scheme-indent-function 1)
(put 'until 'scheme-indent-function 1)
(put 'when 'scheme-indent-function 1)
(put 'while 'scheme-indent-function 1)
(put 'with-builder 'scheme-indent-function 1)
(put 'with-error-handler 'scheme-indent-function 0)
(put 'with-error-to-port 'scheme-indent-function 1)
(put 'with-input-conversion 'scheme-indent-function 1)
(put 'with-input-from-port 'scheme-indent-function 1)
(put 'with-input-from-process 'scheme-indent-function 1)
(put 'with-input-from-string 'scheme-indent-function 1)
(put 'with-iterator 'scheme-indent-function 1)
(put 'with-module 'scheme-indent-function 1)
(put 'with-output-conversion 'scheme-indent-function 1)
(put 'with-output-to-port 'scheme-indent-function 1)
(put 'with-output-to-process 'scheme-indent-function 1)
(put 'with-output-to-string 'scheme-indent-function 1)
(put 'with-port-locking 'scheme-indent-function 1)
(put 'with-string-io 'scheme-indent-function 1)
(put 'with-time-counter 'scheme-indent-function 1)
(put 'with-signal-handlers 'scheme-indent-function 1)
(put 'with-locking-mutex 'scheme-indent-function 1)
(put 'guard 'scheme-indent-function 1)

;; memo
(setq user-full-name "My Name")
(setq user-mail-address "email@post.com")
(defun memo ()
(interactive)
(add-change-log-entry
nil
(expand-file-name "~/.memo/memo.txt")))
(define-key ctl-x-map "M" 'memo)

;; password hide
(add-hook 'comint-output-filter-functions
'comint-watch-for-password-prompt)

;; c-mode hook
(add-hook 'c-mode-hook
'(lambda ()
(c-set-style "BSD")))

(add-hook 'c++-mode-hook
'(lambda ()
(c-set-style "BSD")))

;; ls color mode off
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

;; w3m
(require 'w3m-load)

;; wget-el
(load "w3m-wget")


ポイントは、太字で示したところと斜体で示したところ。
どうやら、太字部分斜体部分よりも前に定義されていないと、正常にエンコしてくれない様子。
(いろいろと順序を変えて試行錯誤しながらやった結果なので、外しているかもしれないけど。)

もし同様の症状でお困りなら、試してみるといいかもですよ。

8.12.2008

15パズルをリライト

やる気が出ないから、SDLのチュートリアルをなぞったりしながら、せめてSDLになれるくらいのことはしようと思って、結局15パズルをリライトすることにした。

まぁ、リライトしたからといってよくなるとは思えないんだけど、シャッフルについてもある程度いいアイディアが浮かんだし、判定関数も何とかなりそうな予感がしてるから、いっそリライトと。

本当は、SDLになれる以外にも、C++と仲良くなろうなんて目的もあったりするんだけどね。

# SDLDotNetなる面白そうなアイテムを発見した。
# こちらはある程度理解でき次第、まとめようかなぁ。。。
# ここで手を出したらアウトな気もする。
# C#の便利さに慣れたら、C++には戻ってこられないよNE☆

8.11.2008

夏バテというやつか。
いまいちやる気が出ない。

一日中ごろごろしてる日が、ここ2~3日続いてる。
まぁ、世の中は今週お盆休みみたいだし、休むのもいーよねー。

ごろごろ。

8.08.2008

MinGWで自作プログラムにアイコンを付与する方法

15パズルなんですが、うまいぐあいの判定関数&パズル生成関数が思い浮かばなくて、結局ちょこちょこと内部をリファクタリングしただけで、ニコニコを見てしまうという悪循環に(以下略

さて、そんな中で、MinGWでプログラムにアイコンを設定できないものかと思い立ち、ちょろっと探してやってみました。
(すでにダウンロードできる15パズルのファイルは差し替わっています)

ちなみに、(SDLとあわせているせいかもしれませんが)ウィンドウ左上のミニアイコンにはリソースからの設定ができていません。
たぶん、ゲームプログラムならフルスクリーンだったり、左上アイコンにはこだわらないだろうから問題ないんでしょうけど。

一番簡単なのは、
101 ICON "iconfilename.ico"
なんてのを適当なテキストエディタで作成して、resource.rcか何かのファイル名で保存しておきます。

次に、windres(今回私が相手にしているクロスコンパイル環境においては、i586~という長い名前だったので、適当にlnしておきましたよ。)を使って、
$ windres -o resource.o resource.rc
とすると、resource.oというオブジェクトファイルが生成できます。

あとはこれをコンパイル時に渡してあげればOK。
具体的には
$ mingw-cc filename.c resource.o
でいけるはず。
私はリソースIDを101にしたんだけれども、(リソースファイル内にほかのアイコンが無いせいかもしれないが)勝手にデフォルトアイコンとして付与されたから、よっぽど変なことしてない限り、これでいけるんじゃなかろうかと。

よし。今度こそ続きは帰ってきてからやろう。

# 何かいい判定関数/生成関数のアイディアをお持ちでしたら、教えてください。


以下、参考サイト(順不同)
http://www.sixnine.net/cygwin/translation/cygwin-ug-net/windres.html
http://www.m-oz.com/soft/mingw.html
http://www.arcpit.co.jp/winapi/api_01/ap010312.htm

気になると眠れない性格。

明日やると言いながら、気になって眠れなかったからつい手を出したらこんな時間に。

何が気になていたかというと、「パネルの入れ替え処理が動くように処理を書いたはずなのに、パネルの入れ替え処理が動かなかったこと」だ。

結論から言うと、クリップされる領域を勘違いしていたために、頭の中のイメージと実際の動作が一致しなかったという話。
紛らわしい書き方した自分が悪いんだけどさ。

そのほか、領域外参照やらマウスがクリックされた位置をゲーム内で使われている座標に変換する処理、升目に格納されている数値にまつわる処理でバグがあって、それをつぶしてたらこの時間(笑)

もう寝られないから、もうしばらくやろう。

ただ、まだ原因不明のバグがあって、それが-Os最適化をかけると、あるていどプレイした段階でSEGVで落ちるというもの。
なんか、普通のプレイにも影響でそうでいやだなぁと思いつつ、-Os最適化を外すと我が家では(今のところ)再現していないバグなので、とりあえず無視しようと思う。


現在の進捗は一人遊び(自分で入れ替えて、自分で解く)ができる程度。
パズルが解けたかどうかの判定や自動シャッフルは実装していない。
(あ、あと音も鳴りませんよw)

それでも遊んでみたい方はこちらからどうぞ。

先に言っておきますけど、バグがある可能性大です。
プレイできない可能性も大です。
自己責任でってやつです。

ちなみに、画像等々合わせて、製作時間にして5時間ちょっと。

うーん。SDLに慣れてないとか、アルゴリズムの基礎がなってないとか、勘が悪いとか、いろいろ原因はありそうだけど、もう少しがんばれないか>自分。

自分で作ってみると、よく理解していないところが浮き彫りになる。

そんなわけで、ちょっと寄り道して、しばらく15パズルを実装してみようと思う。
GDB以外のデバッガが無い中、いろいろなバグ(おもにSEGV)に悩まされつつも、どうにかここまで出来た。

コマの移動処理も書いたつもりだけど、うまく動いてくれない。
出来上がったかどうかも、シャッフルの処理も未実装。

…なんだ、普通に絵が出ただけじゃないか。

特に表示周りをよく理解していないことがよくわかった。
(というか、そこを除いたrSDLって何にも残らないから、要するに何にも理解してないってことなんだろう。)

今日は眠いし、残りは明日やろう。

8.07.2008

SDL:ウィンドウイベントに挑戦。

typo報告のメールは理解してもらえたようだ。
直しといたよという返信があった。こちらも安心したよ!

そんなわけでLesson25…と行きたいわけなんだけど、いかんせんウチにはジョイスティックやジョイパッドの類がない。
だから、Lesson25をとばしてLesson26、ウィンドウイベントをやることにした。
ジョイパッドは、必要になったら戻ってやろう。

# きっと、アクションゲームやシューティングゲーム(あるいは3Dを扱うようなゲーム)だったら必須なんだろうなと思った。

さて、ウィンドウイベントの実装だけど、実装したのは
・ウィンドウのリサイズに対応したイベント
・ウィンドウからマウスのフォーカスが外れたときのイベント
・ウィンドウからキーボードのフォーカスが外れたときのイベント
・ウィンドウのフルスクリーンモードとウィンドウモードの切り替え
ってとこ。

案外対応しているイベントが多くてびっくりした。
ウィンドウからフォーカスが外れたらゲームを一時停止してあげるとかいう処理を書くと親切かもしれない。
特にテトリスみたいな落ちものゲームやアクションゲームだとなおさらだね。

そろそろ何かゲームが書けそうな予感。
でも、ゲーム書くにはゲームに則したアルゴリズムを学ばなければいけないという罠。

# でも安心し給え俺。
# 遊びのレシピというハウツー本があるじゃないか。

画像はフルスクリーンにした状態。
わかりづらいわー…。と思った人は、自分で組んでみよう。

8.05.2008

SDL:ゲームデータのセーブ

Lesson24.
レッスン名的に、普通のファイルI/Oじゃなかろうかと思ったら、まさしくそうだった(笑)

それも、至極単純なファイル入出力。

# いつだか某掲示板で
# 3Dバリバリのすごいゲーム作ってるのに
# ハイスコアの記録方法がわかりません
# って質問していた人が居たのをふと思いだした。

まぁ、C++のファイルストリームに触れられたから良しとしよう。
それにしても、便利だなファイルストリーム。
Cのファイル操作とは大違いだ。

で、いったんコンパイルしたものの、なぞのセグメンテーションフォールトに悩まされた。
GDBで追ってみたものの、SEGVで落ちてるのはSDL_main関数だとか言われる始末。

悩んだ末、もう一回コンパイルかけてみたら普通に動いた。
何が原因だったんだろう?


黒点じゃつまらないから、スマイリーさんを導入。
キーボードも1~4までしか使ってないから、5に黒を割り当てるとかすれば、もうちょっとバリエーションが増やせるかも。

画像が見づらいのはご愛敬。




# あと、typoを見つけたので報告しておいた。
# あのブロークンな英語で伝わるんだろうか…。
# 失礼になっていないだろうか…ヽ(д`ヽ)。。オロオロ。。(ノ´д)ノ

8.04.2008

SDL:名前を入力させる

Lesson23。
残すところ、あと13項目。
この調子だと、一週間かからずにクリアできそう。

たぶん現状の知識でも、簡単なシューティングゲームぐらいは作れると思う。
まだまとまった時間がとれるわけじゃないからやらないけど。

今回はテキスト入力。
ただし、アルファベット+数字のみ。記号やら日本語やらは入力できませんよ。念のため。

もし日本語入力したいなら、SDL_inputmethodってライブラリを当たると良さげ。
(後継のSDL_textmanagerってやつが開発中なのかな?)
たぶん、ネットゲームとかのチャット機能には必須のライブラリになると思う。

さて、そんな入力機能を実装したわけだけれども、案外簡単で拍子ぬけ&自分がC++のライブラリをよく知らないことを改めて痛感。

画像は入力途中と入力後。
フォントは例によってみかちゃんを使用。
いい味出してるよね。みかちゃんフォント。

SDL:背景のスクロール

Lesson22.
キャラクターはそのまま、全く動かず、背景だけがスクロールしていくというプログラム。
そんなわけで、記述するべきコードの量もぐっと少なくなった。

コードの量が少なくなったので、なんか変わったことしようと思ったんだけど、コードを改変するとLessonに沿わなくなるので、コードの編集はやめて、グラフィックを変えることにした。

そんなわけで我が家の犬山係長補佐代理に登場していただいたわけだけれども、その場でアニメーションさせてもよかったかもしれないと、作ってみてから思った。
まぁ、スクリーンショットじゃアニメーションしてようがしてまいが、わからないんだけどね(笑)

SDL:スクロール

某人間のアニメーションでだいぶ手を抜いたので、今回はスマイル君をきちんと描きましたよ。
もちろん、背景も。

今回のプログラムに限っては、当たり判定じゃなくてスクロールがメインだから、スマイル君のように円形である必要もなく、たとえば(こないだから何度か口頭だけ登場している)星型のアイコンを描いてもいいんだろうなぁ。

DOT_WIDTH, DOT_HEIGHT定数をいじれば、もう少し大きめのキャラクターにも対応できそう。
ただ、スクロールが思った以上に広い範囲で行われるのが難点か。

このあたりは改良の余地がありそうな予感。

# どうでもいいけど、Bloggerの途中保存機能がヒドイ。
# これは、Operaとの相性が悪いのか?それともIME 2007との相性が悪いのか?はたまた別のものか?
# うざったいから切ると、今度はスタブで投稿に失敗したときに困るんだよね;;どうしたものか…。

祝・投稿数200件突破。

って、祝うべきなのか否か…。

まぁいいや。


久しぶりにLennyさんでapt-get update && apt-get upgradeしてみたら、驚くほど大量のアップデートが来てて目が点になってしまった。

よく考えてみれば、Lennyってまだtestingなんだよね(笑)

そういうところをまったく考えないで使っているあたり、ダメなんだろうなぁ。。。
これでもし、sidとかに移行したら、私は浦島太郎状態になること間違いなしだな。

cronにアップデートをスケジューリングするのも面倒だし…。

今度からはこまめにするようにしようと、100MB超えのファイル群を見ながら思うのでした。

# アップデートが終わらないことには、安心してSDLの続きができないじゃない!

SDL:アニメーション

英字配列なんて、三日もあればなれると思ってたら、本当に慣れてしまった(笑)
まだ記号系のキーに若干の不安があるけれども、これもそのうち解消されるでしょう。


そんなわけで、SDLのLesson20.
アニメーション男ことFOO氏の画像を用意しようかと思ったんだけれども、サンプルについてきた画像が予想以上になめらか~に動くことと、アニメーションのような連続コマの画像を作るのはめんどいんで、サンプルをそのまま利用することに。

タイマー使ってアニメーションさせれば、たとえばストリートファイターのように待機中にぜぇぜぇした雰囲気のアニメをするとか、ぷよぷよみたく、落ちてくる途中にぷよ~んとした雰囲気のゲームを作るとかできそう。

ってか、最近ゲームの話ばっかりだ。
これほどカッチリ私の性分にハマるライブラリっていうのは、VCL以来なもんで。

8.03.2008

SDL:円形を用いた当たり判定。

Lesson19.
円形を用いた当たり判定のプログラム。
ただし、注意しなければならイのは、楕円でなくて円形での当たり判定だということ。
つまり、きちんとした円出ない限り、判定はできない。

こういうたぐいの当たり判定を使うのって、たとえばブロック崩しゲームのブロック対ボールという、矩形で当たり判定すると苦情が来そうな所に使うとよさそうだよね。
ただ、Lessonでサンプルコードがあるとはいえ、組んでて非常に面倒だった。

ここまで3種類の当たり判定について勉強してきたわけだけども、一番簡単なのはやっぱり矩形での当たり判定だね。(世の中には色による当たり判定なんてのもあるらしいけど)
シューティングゲームの弾なら、十分小さいから、円形の当たり判定をしなくても、矩形で近似できるのかもしれない。

まぁ、ゲーム作るなら、当たり判定はどんな場合も必須だから、一つくらいはきちんと身につけておこう。
(考え方自体はどれも単純だけど、組むのが面倒だからライブラリ化しとくといいかもしれない。)

SDL:ピクセル単位の当たり判定

Lesson18.
ようやく半分。

今回はピクセル単位の当たり判定だけど、こんなに厳密な当たり判定を使う機会ってあるんだろうか?
基本的には矩形単位の当たり判定を応用したようなもので、前回のものが理解できれば、内容的に難しいところはない。

ソース中ではstd::vectorを使って、当たり判定用のマップを作っていたけれど、もしこれが人物ぐらい複雑な形状になったら、いちいち組んでられないと思う。

となると、人物画像の抜き(当たり判定用)画像から、自動的に当たり判定用マップを生成するようなコードを書く必要があるだろうな。

おそらく私は、この後に登場する円形での当たり判定と、前回やった矩形での当たり判定しか利用しないから、ここを詳しく突こうって気にはなれないけど。

あと、個人的には円形じゃなくて星型とか、多少複雑な形状でピクセル単位の当たり判定をデモしてほしかったなぁ。

Visual C#を放り込む。

キーボードとともに押し入れから出てきたウィザードリィをプレイしようとインストールしたら、インストールそのものは成功するものの、どうにもゲームのプレイまで行きつかない。具体的には、#4か#5かを選択する画面で、どちらを選んでもエラーをはいて終了してしまうのだ。

こうなったらしょうがない。
早くSDLを覚えて、そのうちウィザードリィ風ゲームを作らなくちゃいけないだろう。

そんなわけで、いつものとおりcoLinux managerからcoLinuxを立ち上げるわけだけれども、やっぱり右クリックへの反応がいまいち…というか、右クリックメニューが出てこないことが多々ある。

そんなわけで、多少改造できないものかとソースをダウンロード。
誰もやってくれないので自分で改造してみることにした。

が、いろいろとファイル構造が複雑。
うーん。。。こんなのいじってられないなぁ。。。
ドキュメントもないし。。。

ということで、リビルドだけ通してみることに。
対象の.NET Frameworkを1.0→3.5にあげてリビルドしてみた。

いまのところ、右クリックへの反応がいまいちだった症状は改善されているように見える。
今後、どうしても困ることがあったら、より深くソースを見ていこう。

バルーンヒントのON/OFFぐらい調節できるようにしたいしな。

矩形同士の当たり判定

ゲームには欠かせないね。
コリジョン判定ってやつ。
まだ矩形同士だけどw

そういえば、今は昔、SFC版ドンキーコングが神ゲームと称えられていた頃、ドンキーたちの当たり判定は、サルよりやや内側に切られた矩形での当たり判定だったなんて話を聞いたことがあるなぁ。(ソースはない。だから、記憶違いかもしれない。)

なるほど、あれだけアクション豊かなサルたちの当たり判定をどうやってるのか気になったけど、それなら解決できるのかと思った記憶が…。

そろそろテーブルゲームぐらいなら作れそうな予感。

さて、その話とは別に、キーボードが変わったわけだけど、さすがに1年以上触ってないと、US配列に戸惑うね。

アンダーバーとか、プラスとかマイナスとかコロンとかイコールとか、特に記号の入力で凡ミス連発。
特に多いのがカッコ。
微妙に位置がずれてるだけあって、意識しないで入力してしまうことが多々ある。
でもまぁ、この調子で毎日SDL使ったコードを書いてれば、すぐなれると思う。

それ以上に、Fキーが普通に利くことと、これまで利きの悪かったCtrlキー(正確にはCapsLockキー。日本語配列でも、こればっかりは入れ替えて使っていた)が、普通に聞くのはうれしい。
さっとしたタッチでもうまーく入力してくれて、さすがHHKといったところか。
どうしても困ったら、日本語配列のHHKを買おうかと思うけれど、たぶんないなぁ。
きっとこのままUS配列に慣らしちゃうんだろうな。
ともなれば、次にPCを購入するときはデスクトップか、ノートでもUS配列が選べるようにしないと、モバイルに不便だな…。

キーボードを持ち歩かないのは、HHKの理念からは外れてしまうんだろうけど(笑)

8.02.2008

Fキー対策

やっぱりFキーが聞かないのは不便。
たとえばEmacsの移動でもCtrl+Fを多用するし、私の場合、メールアドレスもFが入ってる。

Fが打てないor打ちにくいというのは、わたしにとって致命的なわけだ。

そこで、以前使っていたものの、諸般の事情から押し入れで眠っていたHHKLite2を引っ張り出してきた。

配列こそUS配列になってしまうけれど、2,3日もすればなれるだろう。

言うまでもなく、ノートパソコン標準のものよりずっとキータッチがいいし、Fが打てることで作業も快適になりそう…。


# あ、Debianのキーマップを変更しなくちゃいけないのか。
その必要はなかった。
よく考えてみれば、Putty経由で利用してるんだから、当たり前っちゃ当たり前なんだよね;

周りは夏祭りに出かける中、涼しくコーディング。

SDL, Lesson16.

今回は画像を動かすという話。
キーボードの上下左右キーに対応して、画面内の丸が画面を動き回るというもの。

きちんとDotクラスを設計して処理してるから、たとえばニュートンの運動方程式(ma=F)に従って、落下運動をするボールのシミュレーションとかなら、すぐに書けそう。

背景はFillで白い矩形に塗りつぶしているけれども、別の画像に差し替えてもよさそう。
(カラーキーの項目でやったのを応用すればいい。)

あと、いい加減Fキーの利きにウンザリしてきた。。。。
どうにかならないものか??

DirectX SDK を入れ替えてみる。

私にとって影響のありそうな変更はなかったものの、なんとなく気になったので入れてみる。
また400MB強をダウンロードしてしまった…。
おかげでWiiのバーチャルコンソールで落としたゼルダがだいぶ進んだ。

落としたら、前回同様Windowsにインストール→Linuxにコピー→Windows側のSDKを削除。
コンパイル&リンクも問題なし。
前回と同じ内容のプログラムだが、stripしたら9KBというコンパクトサイズで実現できた。
(いや、DLLが下請けしてくれてるからってことなんだけど)

最近気になってるのが、coLinuxManagerの安定性。
0.7.0以降更新されていないみたいなんだけど、タスクトレイに常駐するのはいいものの、たまに右クリックメニューが出てこないことがある。

バルーンヒントのON/OFFも調整したいし、いじってみるかと思ってダウンロードしたら、ソースがC#だった。
…開発環境入れるのが面倒だから、とりあえず我慢しよう。

あと気になってるのが、キーボードのFキー。
たまに利かないことがある。

4年目で色々ガタが来てるし、そろそろ修理なり買換えなり考えないといけないんだけれども、そんなお金はないんだよなぁ…。


よし、そのうち考えよう。

ムペンバ効果騒動、ここまでのまとめ。

スラッシュドットで話題になっていたので、ちょっと取り上げてみる。
(われらがボルツマンの敗北か!?と一瞬気になったのでw)

はじめに、ここまでのムペンバ効果に関する流れを整理しておくと

1.NHKのためしてガッテンにて、ムペンバ効果なる効果が取り上げられる。
2.大槻名誉教授のもとに、あれって本当なの?というメールが届く。
3.熱力学的にありえないだろwwwと、大槻教授がブログで批判。
4.他ブログやニュースサイトでも取り上げられる。
5.NHKは何度か実験しましたと主張。ブログ読者からも、実験しないで批判とは何事かと、大槻教授が批判される。
6.大槻教授も実験。すると、NHKの主張とは違った結果がでた。
7.ためしてガッテンを監修した北大教授が、複数の条件下ではあり得ると反論。
8.日本雪氷学会が本格議論へ。

といったこところ。
私が考える、今回の一連の騒動でまずかったと思えるところは

・NHKは、まるでお湯のほうが(どんな場合にも)早く結氷するように報じてしまった。(条件を整えるとなるとか、確率的な現象であるという説明があったが、それはほんのオマケのようなものだった)
・科学の世界では謎というような、昨今の脱科学、似非科学、オカルト科学な風潮を煽る(具体的にいえば、大槻教授がかみつきやすい)報道をしてしまった。
・NHKが何度も実験したとする実験も、いくつか疑問点が残る実験だった。
・大槻教授は、ためしてガッテンを確認せずに実験/批判を行った。

といったところ。
一部ブログでは、本筋と離れたところから大槻教授の主張を批判したり、本筋とは全く関係ないところに突っ込みを入れてるようなブログもある様子。
#(お祭り好きの集まりみたいな状態になってるという印象。
きちんと議論するつもりは無いんだろうね。こういう人たちは。)

ひとつひとつ、問題点を紐解いていこうと思う。

まず、NHKがお湯のほうがどんな場合にも結氷するかのように報道したことについてだが、最近のテレビの流れだと、これは仕方なかったと思う。
でも、視聴者にそういう誤解を与えたならば、報道局として謝っておくのがいいんじゃないだろうか?

次に、似非科学風味な報道をしたということについてだが、これも昨今の報道スタイルとしては当たり前な気がする。(いつだかの、でんじろう先生を使った歯磨き粉のCMに関して書いたときと同じ気持ち。)

3番目に、NHKが何度も実験したとする実験についてだが、疑問点については後に挙げる参考サイトが詳しいので、そちらを参照してもらいたい。

最後に、大槻教授の行った実験のまずかった点だが

・70℃と17℃という、実験の前提条件から大きく外れた水で実験を行った
(Wikipediaによれば、この効果を確認するには、35℃と5℃の水で実験するのが望ましいとされる)
・東京都水道局のページに掲載されている、対流が結氷に影響を与えるような、深い製氷器を利用しなかった
・深い製氷装置としてペットボトルを選択してしまった。
(ムペンバ効果の(再)発見者とされるムペンバ君の報告では、熱のやり取りは水の界面を通じて行われるとのことだったので、口の小さいペットボトルでは、それほど良い成果が得られないと考えられる)
・実験条件を整えないまま実験して、批判してしまった

というところじゃないだろうか。

この問題について、私が言えることは、
お湯を作るにも、お湯を結氷させるにもエネルギーが必要で、そのエネルギーは、水を結氷させる場合より大きくなることは明らかであるから、エネルギー問題が叫ばれる昨今、ホイホイとやるのは良くないよねってこと。

いろいろ調べてたら、よくあるお祭り状態になっていて、結局どっちが正しくても、みんなかまわないんじゃないだろうかと思った。

だって、お湯を沸かし始める時間から結氷させれば、結局水を結氷させるのと同じぐらいの時間を使っちゃうんじゃないかなと思うし。

よくわからない結論になったけど、要するに大槻教授はもう少し問題をきちんと把握してから批判しましょうってことと、NHKは科学者に批判されないような報道を心がけましょうってこと。

お祭り騒動に疲れた方は、どうぞコメントにて身近な環境問題対策についてお話しください。

以下、参考サイト。
スラッシュドット・ジャパン
大槻教授のブログ
Wikipedia - ムペンバ効果
水のおもしろ実験「お湯のほうが先に凍る?」- 東京都水道局
Archives - ムペンバ効果調査中(1)
Archives - ムペンバ効果調査中(2)
Archives - ムペンバ効果調査中(3)
Archives - ムペンバ効果調査中(4)

8.01.2008

SDL + DirectX9 + Direct3D + MinGW + Debian/GNU Linux での、DirextX9アプリケーションのクロスコンパイル

フレームレートの計算ばっかりじゃ面白くないなぁと思っていたら、手が勝手に動いてました(笑)
8月一発目のネタがこれとはね。

そんなわけで、やたら長ったらしいタイトルの通り、ド変態クロスコンパイル環境に、さらに変態な環境を付け加えてみようという試み。

まず理解していただきたいのが、DirectXを利用することで、確かに最近の3DCGで話題な機能の恩恵を受けることができるものの、SDLを使う意味はほとんどないということ。
つまり、SDLの利点であるマルチプラットフォームとか、高い移植性とか、そういうのをガン無視できる人だけがやっていい裏ワザ的なものだということ。
(もしマルチプラットフォームを捨てたくないならば、素直にOpenGLを使うべきですよ)

それから、そんなにWindows環境に依存したアプリを書きたいというのなら、素直にクロスコンパイル環境じゃなくてVisual C++とかを使うべきだということ。

この辺を理解していないと、(理解していても)「???」が頭に残る展開になること請け合い。



まず、前準備としてDirectX 9 SDK(以下SDK)をダウンロードしておく。
執筆時点での最新版はMarch 2008。ライブラリファイルを覗くと、すでにd3d10.libとかが用意されてる。違った。よく調べてみると、June 2008が最新らしい。時間があったら差し替えようか…。でも、そんなに大きな変更はないみたいだしなぁ…。悩むなぁ…。)

ダウンロードしておいたSDKを展開して、インストールを開始する。
入れるのはヘッダーとライブラリのセットだけ。
x86版に限れば(SDKにはx64版も付属している)、ヘッダーとライブラリを合わせてzip圧縮かければ、せいぜい3MBちょっと。
それに対してSDK全体の容量は圧縮時で400MB強、展開時で1GB弱。

なぜMicrosoftは必要なものだけダウンロードしてくれる、JavaSDKタイプのインストーラーにしなかったんだろうと小一時間考えたら、インストールしたヘッダーとライブラリをいつもの場所にコピー。
ヘッダーはめんどうならベタでコピーしてもいいけど、私はDXってディレクトリを新たに切って、そこに放りこみましたよ。(ライブラリはベタで放り込んだ)

いつもどおりの事だけど、ライブラリの変換作業とかそんなのは必要なかった。
いつからMinGWはこんなに進化したんだろう?

それが出来たら、チュートリアルサイトを見ながらコードを組む。

あ、WindowsにインストールしたSDKはもう必要ないから、削除してかまわないですよ。

出来上がったらコンパイル。
ここでもコンパイルコマンドには気をつける必要があって、
mingw-c++ filename -lmingw32 -lSDLmain -lSDL -ld3d9 -ld3dx9 -mwindows
のように指定する必要がある。
※ 必ずSDL関連ファイルを先頭に指定するというのがミソ。

あとはできたものをWindowsにコピーして実行すればOK。
サンプルそのままだと、全画面表示になるので注意。

ソースをみてもらえば分かると思うけど、コードはほとんどが通常のをDirectXを使ったプログラミングで使われるものがそのまま使われている。
というのも、DirectX自体、渡されたウィンドウハンドルを持つウィンドウに描画を行うかららしい。

だから実は、SDLで作られていようが、WinAPI直叩きで作られていようが、DirectXさんにとっては何の関係もないものということだ。

それなら私は、ウィンドウ生成が楽チンなSDLを選ぶなぁ。実行時にDLLが必要って手間はあるけどさ。
そうそう、コンパイルしたバイナリを動かすには、最新のDirectXランタイムが必要だから、動かない場合はそちらをインストールするとよさげ。

7.31.2008

さようなら7月、こんにちは8月

タイトルにこそ季節感を演出してみたものの、結局やることは変わらず。
SDL Lesson15.
Lesson14の内容を応用して、一秒あたりの平均フレームレートをタイトルバーに表示させるサンプルです。

コーディングしてて、目についた新要素もなく、粛々とコーディング。
以下、画像。


へー。うちのコンピューターの出せるフレームレートって、こんなものなんだ。

SDLでフレームレートのお勉強。

Lesson14
フレームレートを使った、単純なアプリケーション。

レッスンサイトの絵もそうだけど、ソースを組んでても、何をしてるのか理解しづらい。
要するに、フレームレートに合わせて文字列が上から下に降りてくるっていうプログラムなんだけど…。
(Enterキーで、落下速度を変化させられる。(言うまでもなく、実際にはフレームレートが変化している))

そんなわけで、組み上げてみたものは、GIFアニメにしてみた。
ただし、キャプチャーした画像枚数が少ないし、動きも雰囲気を味わってもらうためだけのもの(つまり、実際の速度では無い)から、それほど意味があるとは思えないけど。

Bloggerのイメージをアップロード機能でアップしたんだけど、アニメーションしてないみたい。
どうしたものか。。。めんどいから直さないけど。

そうそう、ここのところのレッスンは、Timerってクラスを設計してそれを利用しているわけだけれども、それだとコンパイル後のファイルサイズがめちゃめちゃでかくなる。

そこで利用するのが -02 とか -Os といった、gccのオプションと strip コマンド。
前者はコンパイラが最適化をかけてくれる。
-O2なら(確か)レベル2の速度最適化、-Osならサイズ優先の最適化がなされる。
stripコマンドは、プログラム中から余分なシンボル情報を削除してくれるユーティリティ。

この二つをかければ、おそらくファイルサイズが何もしない時の半分以下になるはず。
お試しあれ。


SDLで遊ぶ。

Lesson13
Advanced Timersってなってるから、もっと精度のいいタイマー関数を紹介してくれるのかと思いきや、SDL_GetTicks()関数をクラスでラップして、(C++から)扱いやすいタイマークラスに仕上げましょうって話題だった。

まぁ、なかなか汎用的なTimerクラスなので、今後タイマーを使うゲーム(ってほとんどのゲームが当てはまるけど)に使えそうな予感。
覚えるだけ覚えて、ゲームは作らないってのもあるかもしれないけど、未来のことは予測できないので。

だもんで画像だけ。
最近Opera ウィジェットに興味が出てきたことはナイショ。
SDL飽きたらそっちにいくかもしれない。



# トップのカンタンUbuntu2の宣伝は、(日付からおわかりいただけるとおり)
# 8月末まで表示させておくつもりです。
# ご不便をおかけしますが、ご了承ください。

7.30.2008

SDLで時間を測定その1

うってかわって、
SDL_GetTicks()関数を使って時間を取得しようというLesson12.
マニュアルによれば、経過ミリ秒を取得する関数だそうで、精度はミリ秒単位ってことでいいのかな?

起動してから背景使いまわしだってことに気づいたけど、直すつもりはなし。
(まぁ、画像ファイルさしかえればすぐ直るんだろうけど。)

とまぁ、特にコメントすることもなく、なんとなく組んだだけ。
テキスト表示部分を工夫すれば、ラーメンタイマーぐらいならすぐに実装できるかな?

7.28.2008

ズンチャカチャ♪ズンチャカチャ♪

帰りの車中で爆睡しながら、SDLの夢を見ました。

さて、今日も今日とて寝る前のLesson11。
今回はSDL_mixerを使うようで、ちゃんとインストールがうまくいってるかを確かめるいいチャンスになりそう。

そんなわけでざくっとコーディング。
いつもは配布されてるlesson[nn].zipファイルなんて持ってこないんだけど、今回は音素材をもらうためにダウンロード。

音素材は軽快なパーカッションの音源だった。
これなら、ゲーム素材配布サイトで探してもよかったかなぁ?

んで、例によって文字はみかちゃんフォントで描画。
みかちゃん好きになりそう(笑)

いつものように、オプションとして -lSDL_mixer を使わないとコンパイルが通らないので注意。
あと、Mix_PlayingMusic()関数とMix_PlayMusic()関数、Mix_PausedMusic()関数とMix_PauseMusic()関数など、SDL_mixerは紛らわしい関数名多すぎ。
関数名だけで10分ぐらいハマった。

引数の数が違う関数名のタイプミスなら、コンパイラが教えてくれるからいいけど、Mix_PausedMusic()とMix_PauseMusic()はどちらも引数なしで呼び出せるタイプの関数だったから、実行してから思い通りの動きをしてないことに気づくまで、間違っていることに気がつかなかった。
こういうの、潜在的なバグっていうんだろうね。

本当は、動画で音とか出せてるとカチョイイんだろうけど、めんどいからやらない。
というわけで、動いてる様子画像。

7.27.2008

SDL_gfx for Windows (and MinGW??)

SDL_gfxを試してみようかと思ったんだけど、いかんせん公式サイトじゃソースが配布されているだけで、Windows向けlibファイルとか、dllなんかが配布されていない。

で、みんなどうしてるのかと思って探してみたら、どうやらソースから自前でコンパイルしているらしい。
(なんて面倒なことを…)

きっと、ネット上にはそんな迷える私のために、コンパイル済みライブラリを配布してくれている親切な人がいるはずだと思って探してみるも、古いバージョンばかりが見つかる。

古いバージョンで我慢するかな・・・と思っていたところに、JessePなる人物が、2008/7/9付(ついこないだ!)で、最新と思しきSDL_gfxのコンパイル済みライブラリを作ったって、SDLのMLに投稿してた。

これを使わない手はないと思って、さっそくインストール。
(手順はSDL_imageなんかと同じ。)
で、入れたところで力尽きて、まだ試していない(笑)

時間があったら試そう。(どうやら、VC向けにコンパイルされたものらしいから、MinGWじゃだめかもしらんし。)

あと、そこで配布されていたものにはSDL_gfxのヘッダーファイルが含まれていなかったから、勝手に含ませてzipで固めて配布。
LGPLだし、問題ないよね?

(配布物に含まれているのは2.0.17のヘッダーだけど、DLLとlibがそれに対応していない可能性大。{←まだ試していないことに起因する}そんなわけで、もしうごかねーぞ、コンパイルとおらねーぞという問題が出たら教えてください。{&古いバージョンのSDL_gfxライブラリに切り替えればイケる可能性大なので、あきらめないでください})


# 以下、別文の機械翻訳

I need the SDL_gfx pre compiled library.

But, that library not distribute from the official SDL_gfx web site.

Today, I found the web, and I got that files.

Relation:
[I made below zip file include SDL_gfx header files]
[libsdl.org ML archives]
[JesseP's web site]
[SDL_gfx official web site]

7.26.2008

楽しいなぁ。SDLは。

プライベートで色々あって、相変わらずのお疲れモードだけれども、SDLは楽しいと感じる。
思えば、プログラミングを始めたきっかけというのが、「ゲームがやりたいけど買えない→よし作ろう」だったことを思い出した。

いつからツールやら実験データの変換フィルターやらばかり組むようになったのかなぁ。

そんな初心に還る思いがするからか、SDLでプログラムを組んでると、「あー。これとこれを組み合わせればこんなゲームになりそうだなぁー。」とか考えながら作ってる自分に気づく。
そしてこれが案外楽しい。

そんなわけでLesson10。
キーボードのどのキーが押されているかを判断するというプログラムなんだけど、我が家では2キー以上の同時押しに反応しなかったし、上下や左右といった反対キーの同時押しも反応してくれなかった。
アクションゲームやRPGつくるぐらいなら困らないだろうけど、格ゲーとなるとどうだろうか?
(後半にジョイパッドの取得があるから、それを応用するのかなぁ?)

これとスプライト処理を組み合わせれば、ダンスダンスレボリューションもどきぐらいは作れるんじゃないだろうかと思った。

例によって画像を複数くっつけようかと思ったけれど、各4キー+上右+上左+下左+下右という、合計8状態をキャプチャーしてくっつけるのは面倒だから、一枚にした。

最近2レッスン/日のペースで進めてるわけだけど、このペースなら、ひと月ぐらいで全部クリアできそう。
(理論値では36÷2=18なんだろうけど。そんなハイペースでやり続けるとは思えないので。)

ご冗談でしょうファインマンさんだか、ファインマンさん最後の手紙だかにあった、晩年彼が数学や物理学の問題を解くことを「楽しんでいた」という記述を思い出した。
確か彼は、初心に還ってそれらの問題に楽しみながら取り組んでいたというのが印象的だったなぁ。

まったりコーディング。

コーディングとはいえ、やっぱりやるのはSDL。
今回はLesson9、マウスイベントの処理。

久しぶりにC++に触ったなぁという気になった。
ここまでもC++で組んでたはずだけど、クラスとか意識しなかったし(作りもしなかったし)、今回ボタンイベントの処理において、久しぶりにC++でクラスを組んで動かしたわけで…。

ともあれ、マウスイベントをゲーム内で使うってことはそう無いんじゃないかなぁ?
(少なくとも、私が作るようなレベルのゲームではの話。ほとんど2Dのアクションゲームやパズルゲームなんかの、個人が趣味で作り捨て出来るようなタイプのゲームしか作らないし。)

でも、3D空間でキャラクターを動かすときに、マウスで操作できると便利だとか、2Dゲームでも、選択肢を選ぶときのカーソルの動きを、マウスである程度制御できると便利だとか(ノベルゲームなんかの場合ね)、役に立つことがあるのかもしれない。

画像は昨日と同じく、動きがないとわかりにくいタイプのプログラムだったことから、4つをくっつけてある。
重たいので、閲覧するときは注意。




# 最近毎日SDLのレッスンをこなしてるって記事書いてて思うんだけど、ソースもUPするべきかなぁ?
# でも、面倒なんだよね。ブログでそういう類のファイル扱うの…。

最近疲れてるのかな?

しばらくパソコンから離れて、のんびり農芸したり、本を読むのもいいかなと思った。
どうも、目の疲れやら体の疲れやらがとれないからなぁ。

まぁ、生活スタイルが不規則になってるっていうのもあるのかもしれないけど。

と、前置きはよしとして、Lesson8。
ここのところ、SDLが楽しくて、他の事をあんまりやってない。

トラ技の付録も、開けたきり手つかずだし。
接続してインストールして、五目並べゲームぐらい組めば満足するんだろうけど、まだそこまでいかないなぁ。
買っただけ満足なんて、そう無いのになぁ。
どうしたかなぁ。。。

そんなことは良しとして。
今回もみかちゃんフォントを使用。
前回、フォントがやや小さく感じたので、今回はポイント数を48にしてみた。


今回はループ内で押されたキーに対応する再描画が必要なんだけど、それをしてなかったり、7thのプログラムをだいぶ使いまわしたためにifの条件判定にミスがあったりして、15分ぐらいハマった。

gdbの使い方を覚えたいと思うと共に、クロスコンパイル環境だと、デバッグが難しいんじゃないだろうか?と思った。
Turbo debuggerとかでも、MinGWの吐き出すコードってデバッグできるんだろうか?
っつうか、大規模な環境を導入しなくてもさくさくMinGWの吐き出したコードをデバッグできるデバッガってないもんだろうか?(まさにgdbがそれなのかな?どうも、GNUファミリのコマンドをたくさん入れないと動かない気がするんだよなぁ。)

今回のプログラム、起動直後は背景画像が表示されてるだけだけど、矢印キーを押せば、押したキーに合わせてメッセージが表示される。
でも、キーを押していないからって、背景画像だけに戻ったりはしない。
そこをどうしたら背景画像だけに戻るか考えてみれば、キーが入力されている間だけXXするってコードはすぐに書けるようになると思う。

矢印キーの入力ができれば、ここまでのとあわせて、簡単なゲームぐらいなら作れそうな気がしなくもないけど、まだレッスンサイトの半分もいってないから、特別なにかを作ろうとは思わない。

あくまでゆっくりやってこう。

画像は、一枚だけだとわかりづらいかと思って、4枚くっつけてみた。
重たいから、クリックして見る人は注意。




# 追記
ということを書いたあとに調べてみたら、MinGWのGDBがあった。
解説サイトによれば、MSYSとかもダウンロードしろってなってたけど、GDBだけ落としてきて、展開→bin/フォルダからgdb.exeを取り出してみたけど、うまく動いてくれているみたい。
少なくとも、私が実行したいデバッグ作業(主としてブレークポイントの設定とステップ実行)はこなせそう。
これにprintfデバッグをつければ、小規模なデバッグ作業なら事足りるしね。
さ、gdbの勉強もはじめなきゃ。

7.25.2008

今日もきょうとてSDL(SDL_ttf で日本語を使う。)

そんなわけでLesson7。
SDL_ttfを利用して文字列を描画するっていうお話。

レッスンサイトでは、lazy.ttfってオリジナルのフォントを使っているけれど、私は使用条件のゆるいみかちゃんフォントを利用することにした。

そのほか、フリー(あるいはそれに近い条件)で使用できるフォントについては、このページがよくまとまってると思う
真面目なゲームとかじゃ、明朝やゴシックを使いたいこともあるだろうから、状況によっては参考にさせてもらおう。

さて、レッスンサイトのプログラムをそのまま使うと、実は日本語が表示できない。
以前に、今回構築したMinGWで日本語を通すにはソースをSJISにエンコする必要があるって書いたけれども、実はSDL_ttfに限って言えば、それも通用しない。

そのまま通しても、SJISにしても日本語が通らない。
じゃあどうするか?
レッスンサイトで
TTF_RenderText_Solid
となっているところを、
TTF_RenderUTF8_Solid
として、ソースコードをUTF8で保存→コンパイルを通せば、下の画面のように日本語を表示できる。

あとは、
mingw-c++ filename -lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_ttf -mwindows
としてコンパイルを通せばOK。
そうそう、SDL_ttf.hを#includeで指定するのも忘れずに。

これでSDL_ttfはdevel-VC8をもってきて、ヘッダーとライブラリをいつもの場所にコピーしておけば使えることがわかった。

追々調べてみると、どうやらfreetypeライブラリが必要なのは、*NIX上で文字を描画する場合だけらしい。
(Macだと必要なのかな?)今回の環境は、Windowsへのクロスコンパイル環境だから、freetypeのインストールは必要ないという結論になりそうな感じ。

文字が描画できると、またいろいろ出来そうなことの幅が広がる気がするよね。

7.24.2008

SDLの続き。

昔から、継続は力なりと申しまして(以下略

Lesson6。クリップというやつ。
たとえば、この例では一つのファイルに書かれた4つのボールをクリップして取り出しているけれど、実際のゲームだと、キャラクターのモーションパターンやマップチップ、魔法のエフェクトなんかでよく見る。

特にアニメーション系だと、ファイルオープンのオーバーヘッドが気になったりすることもあるから、あるていどの大きさの画像ファイルに、ある程度関連性のある画像をまとめて、クリップして取り出すような操作がいろんなところでテクニックとして扱われているみたい。

クリップまで出来たらから、たとえば適当なマップチップのセットから、マップを作りだすようなことも、ここまで学んだ内容でできるわけか…。



やらないけど。




眠れない。。。

ちょっとばかし、寝るタイミングを逃した感じ。

そんなわけで、SDLの続きをやる。Lesson5。

今回やるのはカラーキーを指定して、画像を重ねてみましょうというもの。
ゲームプログラミングでは必須?最近は違うのかな??
ミソは
Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );
関数でカラーキーを指定するところで、ここのSDL_MapRGB関数の第2~第4引数は、抜きたいカラーをR,G,Bの順に16進数で指定しなくちゃいけない。
ショッキングピンク(#FF00FF)なら、0xFF, 0, 0xFFってな具合。

そんな調子で作ったのが以下。
キャラの画像出力するとき、キャラのまわりにアンチエイリアスかけちゃったから、微妙にピンクが残ってる(笑)
でもまぁ、一応うまくいったので良しとしよう。

# 追記
よく考えたら、キャラクターの光の当たり方がおかしい。
明らかにおかしい。
やっぱり深夜に作業するべきじゃないな。
生産性どころの問題じゃないや…。

チュートリアルをこなす。

ほぼ日課になっていると噂(?)の、SDLプログラミングを進める。
今日はLesson4。

SDL_mixerやSDL_ttfの使い方じゃなく、イベントドリブンプログラミングの基礎が主題。
前回までは、2秒間ウィンドウが表示されたら勝手に消えたわけだけど、今回はウィンドウの×ボタンをクリックするまで、ウィンドウがそこに居続ける、ごく普通のタイプのプログラムを作ろうって話。

動かしてみると、CPUファンがウァンウァン唸りだした。
whileでループをかけてるのが原因だろうか?それとも、SDL自体が重たいのかな??

まぁ、とりあえずチュートリアルどおり進めただけだしな。
スクリーンキャプチャーをアップして寝ることにした。