メイン

開発 アーカイブ

2008年07月15日

[開発] <警告!>まだあなたのゲームにリプレイ機能を実装してはいけません!なぜなら……(後編)

この記事を読まずに、あなたのゲームにリプレイ機能を実装するのはあまりに危険です……。

なぜなら……。

gamedev02.jpg

前回のゲームにおけるリプレイの実装方法の続き、後編です。

お読みでない方はまずは前回からどうぞ。

乱数の処理

乱数は再現可能なものを使います。
最初に使っていたのは線形合同法でした。

GuNMeNのときは何を思ったか、
あらかじめ線形合同法で生成しておいた65536個の乱数テーブルを使ってました。
まあ、これはあまり意味ないです。
(たぶん、家庭用ゲームみたいなことがやりたかったのかと)

今は、乱数生成ルーチンには Mersenne Twister を使っています。
Mersenne Twisterも再現性があります

ちなみに乱数種(シード)の自分で初期化をする場合は、
そのシード値も記録する必要があります。

さらっと書きましたが、最初にまずハマるところですので注意を。

面倒くさいので最近は、乱数種の変更すらしてませんw
つまり、乱数種固定で初期化wwww

また、これは重要な点なのですが、
自分の場合は乱数オブジェクトを複数持っています。
今のプロジェクトだと主にメインの更新処理で使うもの用と、エフェクト用と、描画用を持っています。

乱数オブジェクトを複数持つ利点は、
ちょっとした変更に強いことです。
つまり、ちょっとした変更をしてもリプレイをずらさないようにすることができるのです。

エフェクト弄りたいなーってときは、
エフェクト用の乱数オブジェクトのインスタンスを別に持っていて、
ゲーム進行に影響を与えないようにしておけば、
エフェクトを弄っても、リプレイに影響がでません!!
(逆に、あくまでエフェクトがメインのゲーム進行に影響を与えない前提です。エフェクトの上にキャラクターが乗れる、とかいう仕様では無理です。まあ、そうなったとしても、それをエフェクト以外に割り当てるだけですが)

描画を飛ばす場合は、飛ばしていいものだけを書いておく

更新処理が固定フレームレートベースで、
描画をスキップするような実装をする場合、
前提として、描画処理と更新処理をわけます

そうなると、絶対に実行される更新処理の方(キャラクターの移動とか)は、描画の方に入れないようにする必要があります。

逆に言うと、描画の方には飛ばしちゃいけないものを入れないようにしないといけません。

例えば、こんな感じ。

自分の場合、描画処理でも乱数を使いたくなるので、
描画処理用にも乱数オブジェクトを 1つもってます。
そうすると描画が飛ばされたりしても、
更新処理用の乱数には影響がでません。

ハードウェアは変えないこと

ハードウェアが再生環境と同じアーキテクチャでないとダメだと思われます。
ようするに、リプレイを記録した環境と同じような計算をするハードウェア環境で再生しないとダメです。

これに関しては今は大丈夫ですが、将来どうなるかわかりません。
10年後は再生できる環境が残っているものでしょうか?

極端な例ですが、Intel社のCPUとモトローラー社(以前のMacの)のCPUとでは、
エンディアンが異なりますよね?
考慮していない場合は、同じように再生できません。
(もちろん、浮動小数などそれ以外にも考慮しないといけないものがありますが……。)

リプレイ時にキー操作

リプレイを再生中に、早送りとか、ポーズとか、終了したりとか。
あれ?キー判定どうすんの?

簡単ですよ!
メインで使っている(再生で使っている)キー入力オブジェクトとは別にリプレイ中のキー操作オブジェクトを生成して使うだけです。

だけです、さらっと書きましたが、キー入力周りをそういう風に組んどけってことですw

↓こんな感じ。

記録中は以下のような感じだとすると、

  • Player Aのキー入力オブジェクト(記録中)
  • Player Bのキー入力オブジェクト(記録中)

再生中は以下のような感じ。

  • Player Aのキー入力オブジェクト(記録から再生してるだけ)
  • Player Bのキー入力オブジェクト(記録から再生してるだけ)
  • リプレイ画面のキー入力オブジェクト(記録はもちろんしてない)

再生中のフラグが立ってるときだけ、「リプレイ画面のキー入力オブジェクト」を処理する。
(記録中は生成すらしない)

リプレイ画面のキー入力オブジェクトは、Player A(B)のキー入力オブジェクトのクラスを使いまわしてます(インスタンスでなくてあくまでクラス)。

あらかじめキー入力をクラス化しておけば、こんなのはサックリできますよ。

バージョンアップしても大丈夫なように場合わけする

バグ報告をもらってバグ修正したり、
バージョンアップしたりして、
前のリプレイが再生できなくなったりすると、
かなり萎えますよね?

そこでこの方法をとります。

ひそかに、前述の WireBattler や GuNMeN は、
(リリースした範囲の)昔のバージョンのリプレイも再生できます。

これは、リプレイのデータファイルにバージョン番号を埋め込んでおいて、再生時に古いバージョン番号の場合には、古いルーチンを動かしているのです。
ですので、昔のリプレイも同じように再生できます。

例えば、GuNMeNは最初にコミケでリリースしたバージョンより、
現在のリリースバージョンの方がバランス調整がしてあり、
キーボードでもプレイしやすくなっています。
なんと、その新しいバージョンでも、
昔のコミケの時のリプレイデータが普通に再生できるのです!
(現に、タイトル画面を放っておく事で見られるデモプレイは、昔のバージョンのリプレイをそのままつかっているのです)

その代わり、バグって落ちるリプレイとかは、
バグ報告をもらって直しても、依然、落ちるままですwww
(今はそうそうないですが、未熟な時代に(WireBattlerを作っていたくらいの時)頻発しました)

ただ、パラメータなどを外部に出している時はちょっと処理が増えるので面倒ですが、やる価値はありますよ。

ていうか、このこと初めてかいたよ!
ユーザーの視点から立つとリプレイデータが使えなくなる、ということは避けるべきは当たり前なのですが、やっている人どれだけいるのかなあ。

大体、リプレイ実装の際の注意点はこんな感じですね。

コラム:洋ゲー関係のリプレイについて

個人的には、市販のFPS、RTS類のリプレイが気になっているところです。

昔から FPS、RTSなどは大概可変フレームレートですし、
どう同期をとっているものやら、と。

自分が一時期プレイしてた Tribes 2 なんかは途中から記録して、そこから再生も可能でした。
ネットワークゲームですが、記録するマシンのネットワークが遅くてもばっちり対応できてました。
(Tribes2のネットコードの優秀さは定評があったのをさしおいても)

もちろん、可変フレームレートでも、他機種でも再生可能でした。

あとは、RTSもきちんとできますよね。
自分がよくリプレイを見ていた Rise of Nations や Command & Conquer Generals あたりもかなりリプレイはきちんと動いていました。

ただ、ほとんどのRTSはバージョンアップしたら、
前のバージョンのものが再生できなかったり、
再生できても途中からずれるという、けっこう適当なんだけれども……。
(パラメータやプログラムなどのバージョンわけの仕組みはずさんな模様)

まあ、この辺の洋ゲーマジックは一度暴いておきたいところです。

参考になるのは Quake3 のソースとか、
Torque Engine(Tribes2用ゲームエンジン)とかかな?

まとめ

以上のような形でリプレイ実装の記事を書いてみましたが、参考になったでしょうか?

ちなみに、今回の記事で紹介した実際にリプレイが動いている自作ゲーム「WireBattler」、「GuNMeN」、「GanGanGan 体験版」の全てのソースファイル(Delphi用)は「GuNMeNパッケージ版」に収録されています。

実際にリプレイが実装されて動いているゲームとそのソースファイルが見てみたい方は、お手に取ってみて下さい。参考になるのではないかと思います。
(各ゲームのソースコードは CDの /omake/source ディレクトリに .zipファイルで入っています )

ぜひ、あたなも自作ゲームにリプレイを実装してみてください。
ゲームの提供の幅が広がるはずです。

では、今回はこの辺で終わりにします。
ありがとうございました。

[2008/07/20] 誤字脱字修正。

参考リンク

[ 開発 ]

2008年07月13日

[開発] <警告!>まだあなたのゲームにリプレイ機能を実装してはいけません!なぜなら……(前編)

この記事を読まずに、あなたのゲームにリプレイ機能を実装するのはあまりに危険です……。

なぜなら……。

gamedev01.jpg

さて、ちょっと前の話題ですが、
リプレイに関する話題が流行っていました。

そのことについてうちでの実装方法を書いてみようと思います。

うちの場合は、基本的に入力情報を全部記録して、
再生時に与えてやるという感じです。
いわゆるキー入力記録タイプ

面倒くさい気がしますが、入力情報を取得するAPIやライブラリにラッパーをかませてやれば簡単です。

大概、WireBattlerとか GuNMeNのときに悩みまくったので、
それ以降、このタイプの記録方式ではそんなに苦労していないですね。

自分のリプレイ実装の実績

  • WireBattler:2D格闘ゲーム
    リプレイの他に、もっとも連続技をつなげたところから再生する機能もあり
    固定フレームレート
  • GuNMeN:2D固定画面アクション
    インターネットランキング対応で、他人のリプレイをダウンロードして再生することもできる。
    固定フレームレート。
  • Gan Gan Gan:2Dシューティングゲーム
    今のところ体験版のみのリリース。
    ステージごとに再生が可能。
    可変フレームレート(但しベースは60FPS)

入力情報記録タイプで気をつけることをいくつか

実績を見てわかるように、この記事では、基本ベースフレームレートが固定のものに使えるリプレイのテクニック及び注意点を解説しています。

ぜひゲーム作りにお役立てください。

途中でずれたらオワリ\(^o^)/

この入力情報を記録するタイプでは、
最初から再生して、途中でずれたらそこで失敗になります。
一度ずれたら、その後ずーっとずれっぱなしになるためです。

なので、かなり厳密に作る必要があります。

キー入力の記録

まず、この方法の基本はAPIから取得したキー入力を全部記録しておくことです。

かなりメモリーを食うのでは?とか思った人います?
大丈夫です、安心してください。
まあ計算すればすぐにわかりますがたいした容量ではありません。

カーソル4方向 + 4ボタンなら 8bits=1byteです。
60FPSとしたら、30分記録するのに、

1 * 60 * 60 * 30 = 105 kbytes

2人プレイなら2倍、ボタンが2倍ならさらに2倍になるだけです。

全然大丈夫ですよね?

というか、10年以上前から オンメモリーで全部記録していましたが問題はなかったです。
もし精神的に嫌なら、zlibのストリームにでも突っ込んでいけばよいのではないでしょうか?
(WireBattlerのころは一応、自前でリアルタイムにランレングス圧縮をかけてました。今は素でオンメモリーストリームに突っ込んでいるだけです)

記録と再現の仕方ですが、ラッパーを作ってやるとよいです。
つまり、記録時に実際に入力したキー情報をラッパーを通した段階で記録し、再現時には実際のキーは無視してそのラッパーから記録したものを出力してやるだけです。

そうすれば、キー入力を処理する外側からは、
まったく同じように見える(=同じようにプログラムを組める)よね?

全部初期化すること

基本的にプレイ開始時に全部初期化することです。
初期化を忘れて、前のプレイの状態変数なんかが残っているとずれます。

一番簡単なのは、オブジェクトのインスタンス確保で、データがすべて初期化されるように最初から組んでしまうこと。

そうすれば、プレイが始まったらインスタンス確保、
プレイが終わったらインスタンス開放。

つまり、メモリも一旦全部開放してすっきりさわやかにしてしまうのです。

浮動小数点がらみ

これが実はあまり再現ができてなくてよくわかってないのですが、
浮動小数点の丸めモードの違いがあると、計算結果がずれるんです。

それがどうも他のアプリケーションの影響などで、突然変わることがあるらしいとか。
(不確定すぎてすいません)

で、かなーり昔から(10年くらい前から)なんですが、
浮動小数の算術関数に FINIT でコントロールワードのリセットを入れまくるっていう方法を使ってました。

例えばこんな感じです。

で、Sinは直接呼ばずにこれを通すと。

ただ、この現象については不確実なので責任が持てませんw

CPUにより演算結果が変わるライブラリがある

Direct3DのサポートライブラリのD3DXとか使うと、場合わけして勝手に最適化したルーチンが呼ばれるためにCPUによって演算結果が変わるようです。
(主に浮動小数点。またか)

けっこういろいろなゲームの作者さんが「リプレイがずれる」という報告を受けているようなのですが、ほとんどが、これか、前述の浮動小数の誤差だと思います

いろいろ解決策はあるようですが、
自分の場合は、自前実装で回避でした。

というか、Direct3Dまともに使ったことねえwww
(DirectDraw派→CPU描画派→OpenGL派(いまここ))

コラム:WireBattler の途中再生機能

ちなみに、対戦格闘ゲーム「WireBattler」の最も多くつなげた連続技を見られる機能、つまり、途中から再生する機能は、記録時にある地点(地面にダウンしたとき)にフラグを立てておいて、リプレイ時にそこまで描画を全部すっとばして早送りしているだけなのです。

なのでCPUが遅いとけっこう時間がかかってしまいます。

次回に続く

長くなりすぎたので続きは次回に!

後編書きました。

参考リンク

[ 開発 ]

2008年03月01日

[開発] はてな質問終了とまとめ

以前、自分が「はてな」で質問した以下の項目が、先日終了しました。

ソフトウェア開発やプログラミングのスピードを上げる方法はありませんか? プログラマーとして生きていこうと決めたのですが、いつも見積もりの3倍時間がかかってしまいま.. - 人力検索はてな

後半だれてきて、後に行くほど返信に熱がこもっていないのはスンマセン(´д`)

サックリ私感でまとめ

  • なるべく正しい見積もりを伝えようということ
    3倍かかるなら、それを見越して。
    Ruby の創始者 Matz氏も、「普通に(特に悲観的でなく)見積もった時間に1.5から2.5までの係数を掛けることにしている。」と言われているくらい。
  • 効率化よりも、作業そのものを減らそう
  • 分担できるところは、他人に回そう。
  • コードを書くことに固執しすぎているので注意がいるだろう。
    どうしても美しく仕上げたがるので、妥協が大切。
    (趣味プロが長いせいか難しい( ´д`))
  • 人間なので集中することこそが早く仕上げるコツである。
    また、具体的なその方法関連書籍
  • 矛盾に陥るような負のサイクルは、断ち切る必要がある。
    あなたは効率化のために道具ばかり弄っていないか?
  • 言語環境などが目的にあっていない。
    Delphiでゲーム的な面。

基本的に、自分の今の状態にあてはまるものを選んでみました。
(他にも参考なる回答はたくさんあるので、ぜひ読んでみてください)

思うに、コードはやっぱり仕事モードで書かないと難しい。
趣味で培ったモノは足かせになることが多い。

最後のDelphiに関しては、書くことがあるのでまた後日に。

仕事場で話していたこと

スピードも大事だが、

毎日継続すればいつか終わる

ことを意識して続けようということを仕事場で話していました。

しかし、これはわかっているのですが、
残念ながら対象のプログラムに対する意欲がなかなかでないので無理でした。

早く終わらせれば、次々にこなせられれば、
やる気がでるのでは?と思って、はてなで聞いていました。

鶏が先が、卵が先か。
最近、自分のやる気が絡む物事は、これが多い。

ある種のバラドックス的な無限ルーチンに陥っている感。

感想

いつもはてなで質問してもロクな答えがなかったので(ぉぃ)、
思わずちゃんとした答えが返ってきて、つい熱が入ってしまった。
残り2日でウォッチリスト 50userいっていたのでびっくり。
同じようなことに関心がある人はたくさんあるんだな、ということ。

速く仕上げるのに、小手先のテクニックよりも、
集中力がかなり大事という再認識。
それと、余分に時間をとって見積もる。
これらはすぐにできる。

それと、「遅れても少しづつ仕上げる」ためには、
やはりやる気がいる、という帰結になる。
(ますます、病気を治さなあかんという話にもなる)

完璧な銀の弾丸はないのだろう。
しかし、少しずつ早くするというテクニックだったり、
心構えだったり、ノウハウは確実にあると感じた。

とはいえ、結局のところ、一番心が休まったのは職場で話したことだったりする。

んで、今の意欲がなくて、現状止まっているプロジェクトに関しては、
今のことは置いておいて、
技術的欲求があることにシフトして、
それを元のプロジェクトに生かそうということになった。
英断だが、普通の会社だとこんなこと絶対無理だ。
(しかし、この技術的興味も一時的な欲求でまたイヤになるのか?と思うとかなり不安。これが負の連鎖か……これだけは避けねば)

回答などででてきた参考になったサイト、書籍

けっこう過去に名著と聞いたことがある書籍が一杯あるので、
暇を見つけてはよんでいきたい。

すごく楽しみです。

最後に
皆さん真剣に答えてくださり、ありがとうございました。

[ 開発 ]

2008年02月22日

[開発] 人生が不安なので「はてな」で質問してみた

このままだと人生が不安で昼寝もできないので、
はてなで質問してみた。

ソフトウェア開発やプログラミングのスピードを上げる方法はありませんか? プログラマーとして生きていこうと決めたのですが、いつも見積もりの3倍時間がかかってしまいま.. - 人力検索はてな

[ 開発 ]

2007年10月24日

[開発] 東京に行ってきます

お仕事で、
東京コンテンツマーケット2007(TCM2007)に出展のため、
東京に、出張してきますヽ( ´ー`)ノ

徹夜で、ゲーム作ってましたが、
微妙に、自分の割り当ての、出展物が間に合ってない件(´д`)
でも、やるだけはやったので、
少しでも、いい結果が出ることを期待。

ちなみに、前回出展時に使ったムービーが youtube に
上がってたのを、紹介するの忘れてた。

これは、去年のTCM2006に、出展したプロモムービーです。

ムービー内のL-GAUGEは、ネットには未発表のはず。
自分がプログラムを担当しているもので、
前回の出展の際に商品化の話があり、
今回の TCM2007 で、特別にリニューアル版が展示されます。

今回の出展作品の紹介ムービーも、多分、
上げてもらえると思うので、
その時も紹介しようと思います。

[ 開発 ]

2007年09月06日

[開発] IE Reloaded ver 0.0.1 公開

IEReloaded

リハビリにて、必要なソフト作り。
正味、4時間で適当に完成。

『Internet Explorer Reloaded』(通称 IE Reloaded)
指定のフォルダ内のファイルが更新されていたら、指定のURLを更新するソフト。

HTMLをエディタで編集、デザインしている人向けです。

フォルダとURLを指定して、
エディタの横に置いておけば、

エディタでHTMLや、CSSを保存する!
 ↓
勝手にブラウザ(IE Reloaded)が更新される
 ↓
(゚Д゚)ウマー

ブラウザ部などは、全然未完成なので、
ちょっと使いにくいけど、
これだけでも、普通に使えるはず。

文字の大きさの変更などつけたいところはあるけど、
ベータレベルですが、
一応、配布しておきます。

ダウンロードは、こちらから。ver 0.0.1です。
(最新版はwikiにあるので、wikiからダウンロードした方がよいです)

最新版の提供、サポート、要望等は、wikiの方に

技術的な話

Delphiで、さっくりと。

GUIは、ToolBar2000 の拡張の TBX の拡張の SpTBXLib を利用してみました。

密かに大部分が、UNICODE対応になってますので、
国際版も作れるかも。

そこそこ有用だと思うので、
英語版くらいは作っておきたいところ。

ベータ版だから、さっくり作れるけど、
ブラウザだし、完成度上げるのは、大変そう。

参考リンク

[ 開発 ]

2007年08月12日

[開発] Lightweight Language Spirit (LL魂)ってあるのね

Lightweight Language Sprit 2007(LL魂)

Lightweight Language Spirit
スクリプト言語の会合セッション。

まとめリンク

うわー、おもしろす……。

ラインナップがすげえ。
Rubyに、Pythonに、Luaに、話題のxtal、なでしこまであるよー。
crowbarにDiksamまで(なんというマイナー)。

どうみてもLLじゃない、Java とか Clean があるのはご愛敬

行きたかったなあ。
旅費ないけど。

こういうのはすんごく、興味あるわけだけど、
積極的に参加できないのは、
自分が、LL(スクリプト言語)で、飯食えねえと思ってるからだと思う。
Rubyのまつもとさんを始め、飯食っている人には、失礼だけど。

じゃあ、何なら飯食えるの?というのは、あることはる。
いや、Delphiで、今、飯食えてないからさー。

しかし、プレゼン資料あったら、
穴が開くくらい見るあたり、興味はある模様。

[ 開発 ]

2007年05月24日

[開発] 組み込みスクリプト言語どうしよーか

組み込み言語

今作っているゲームの組み込みスクリプト言語どうすべきか。
主にデータの定義や宣言に使う。
今は、パラメータは、xmlで書いているけど、素のxmlだと計算ができないので痛い。

やっぱりちゃんとした、スクリプト言語を組み込みたいところ。

以下、候補。

  • Lua
  • Squirrel
  • Xtal
  • Ruby
  • Python

Rubyは、Pythonは、ゲームの組み込みにはちょっとデカイ印象。

Lua

Luaは、グラフィオンというプロジェクト(未公開)で、
以前に使ってみたことがあるけれど、
テーブルの扱いがなんかキモかった。
namespaceとして、テーブルを使おうとすると、文末に、"," がくるのがウザイ。
(どーでもいいところが気になるもの)

あと、関数呼び出しで、スタックを操作するってのがなんかキモイ。
キモイというか、脳が死ぬ。

Squirrel

Squirrelは、どうだろ。

実は、まだ試してないのだけど、
Luaの仕様にブチギレた FarCry のプログラマが作ったというので、
かなり期待をしている。
(そーいや、FarCryってLua使ってたなー)

つまり、ベターLua 的存在。

しかしながら、Squirrel の Delphiバインディングは、まだないみたいなので、
使うなら、作る必要性がでてくる。
そもそも、もし、C++依存だったり、DLL化を意識してない作りなら、
簡単に作れるかわかんないわけだけど。

Squirrelで、長いコードを書く気はさらさらないのだけれど、
一応、SQDEVなるEclipseな、開発環境兼デバッグ環境もあるらしい

(どーでもいいけど、Squirrelって、末尾再帰対応するっぽい?そんなの組み込み言語にいるのかよ!)

困ったことに、素のSquirrelは、Lua同様スタック操作必須。
キモイヨー。

Xtal

Xtalは、期待の新星。
たぶん日本人によって作られている、ゲーム用組み込み言語です。
Luaや、Ruby、Python なども参考にされている様子。

まだ、ver 1.0 になってないようなので、
使うには早々かもしれないですけど、
機能や、言語仕様などを見ると非常に期待できます。

ただし、C++依存のようで、Delphiへの組み込みはちとつらいだろう。
DLLにして、依存部分をラップして……と、考えるとやはりつらそう。

参考リンク

[ 開発 ]

2007年05月16日

[ゲーム, 開発] 続、GBAで弾幕シュー

前に『GBAで弾幕シュー』ってのを書いたんですが、
作者さまからコメントいただきました。

1024発弾出せるって書いてあって、
GBAってそんなにスプライト出せるんだ……と思っていたのですが、
どうやら、そのままでは、出せない様子です。
(標準だと、128個)

スプライトダブラという機構を使って増幅している模様。
(詳しいことは、本家の解説記事『GBA で学ぶ古典的プログラミング (スプライトダブラ)』をぜひ。
ようは、水平復帰(HBLANK)割り込みを使い、
仕様上のスプライト制限を回避しているようです。
同じことをやっているものは、「超連射68k」が記憶に新しい(新しくない?))

ファミコンなんかの世代だと当たり前の技術らしいけど、
今でも使うんだなーと。

BulletGBAに関しては、XMLを解析して、真面目にやっているのではなく、
事前に、PHPで、C++に直接変換して、実行しているようです。
ループなんかも、全部展開しているらっすい。
すげえ。

この辺のことは、『粉骨砕身の覚悟でがんばります[2006年03月04日] - BulletGBA の歩み』に書かれています。
涙ぐましい努力……。

あと、やっぱり、スペック的に、固定小数点なのね。

コンバーターが、当初、Rubyで遅いってのは気になった。
そうか、XMLパーサー遅いのか……。

参考URL

[ ゲーム , 開発 ]

2007年05月03日

[開発] Windows Vista移行するか否か?

ちょっと、復帰してきたかもしれない(精神的に)
(というか、精神的 gdgdの状況書くころには、遅すぎて、反転間際)

さて、ソフトウェアのサポートの関係で、
Windows Vista移行するかどうかという問題。
同人とはいえ、売り物がある以上、動作確認せないかんよなあ。

Vistaに移行する長所

  • ソフトウェアの動作確認ができる。

Vistaに移行する短所

  • ソフトウェアの動作確認をしなくてはいけない(ぉぃ)
  • 普段使っているソフトが動かなくなる可能性がある
  • 昔のゲームが動かなくなる可能性がある(他人様のゲームの話です)
  • キャプチャーカード(MTVX2004)が動かなくなる(痛ええええ orz)=PS2とかの家庭用ゲームが(ry
  • 『窓使いの憂鬱』がVistaだと動くとか、まともに動かないとか(2chの情報)。

短所は、致命的過ぎるところがありー。
PC98のWindowsから、AT互換機のWindowsに乗り換えたときよりは、ひどくはないけど……。

しかし、窓使いの憂鬱はないと、オイラは何もできないので
代替手段を探すなりなんなりしないと困る。
(キャプチャーカードは、PS2とかやらなけりゃいい話(よくないよ))

しかし、今からパソコン買う人は、
自作派以外(ノートPC含む)は、
Vistaだろうし、動作確認用にはほしいところなんだが……。

とりあえず、
Delphi製アプリがそのままだと不都合ありまくり、らしいので、その辺が心配です。

まあ、メインマシンには導入せずに、仮想PCで……かな?
やっぱり。

Unixみたいに、ディスクイメージとかで配布されていればいいけど、
商用OSではそれは無理だな、それは。

とりあえず、Vistaを入手してからだな。

[ 開発 ]

2007年04月12日

[開発] シーン管理その2

スタックベース・シーン管理

『[開発] シーン管理が必要だなあ』の続き。

結局、図のような感じで、

  • Call(Scene) 呼び出し
  • Return 呼び出し元に戻る
  • GoTo(Scene) そのまま移行

をインターフェースに持つシーン管理クラスを作ってみた。
うまく動いている。

図のような決めうちならば、
GoTo(Scene)だけでよいのだけれども、
実際には、タイトル画面→面セレクト→ゲームメイン→……
以外にも、タイトル画面→ゲームメイン……
だったりすることもあるので、
Call(呼び出し)がやはり必要。

インターフェス周りだけ、適当に抜粋すると、こんな感じ。
private部は省いている。

(どうでもいいけど、このブログデザイン、横幅せまくて、ソースかきずれー)

TSceneを継承した、例えば TTitleSceneとか、TGameMainSceneとか、
TStageSelectScene を作ってやって、
SceneManagerから、GoToとか、Callとか、Returnする形

意外にすっきり書けた。

今回は、状態遷移時に、前のTSceneを開放せずに、
スタックには、TSceneのインスタンスをつんでおくことにした。
これで、Return時には、前の状態が復元されるようになる。
GAN GAN GANのときは、
スタックには、型情報のみ(TSceneClass)をつんで置いて、
インスタンスは、毎回生成、破棄してた)

これは、前に言っていた、Gems5のとは、違うっぽいね。
2chによると、

285 :名前は開発中のものです。:2007/04/10(火) 00:13:19 ID:NhbAQuFj
>>277 
シーンは最初に全部確保して 
最後に全部解放してるよ。 

シーンスタックそのものが「アクティブなシーン」のスタックであって、 今アクティブじゃないシーンは別のリストに保管してる。 
でスタックに積まれてるものは一通り処理する。 

こうすることで移動画面中にメニューも表示して移動もメニュー選択も可とか 裏画面でデモ(通常ゲーム処理)回しながら上にウィンドウ表示とか 出来ますよ って趣旨だったと思う >Gems5 

ただ、ウィンドウ関係以外には特に利点は無さそう。 

286 :名前は開発中のものです。:2007/04/10(火) 01:08:35 ID:wXzQkwkx
マルチスレッドを実現する手段の一種ということ? 

287 :名前は開発中のものです。:2007/04/10(火) 01:12:58 ID:vYIHoF6r
>>285 
>でスタックに積まれてるものは一通り処理する。 
これ、厳密にはスタックって呼べなくね? 
LIFO≠スタック 

288 :名前は開発中のものです。:2007/04/10(火) 01:16:37 ID:EIMh3HFt
なんだ、シーンの遷移がスタック的なのかと思ってた。 

289 :285:2007/04/10(火) 01:26:00 ID:NhbAQuFj
>>287 
上にシーンを積んだときにサスペンド処理(シーンクラスのメソッド)を呼ぶようにして サスペンド中も実行したいシーンはその処理でサスペンド時も実行してねフラグを立てる とかそんな処理になっていたと思うから 一応一番上に積まれているのが 
現在のシーンってことになる。 
立ち読みだから細かいことは忘れたw 

スタック全体をなめるんだからスタックとは言わないと俺も思う。 

やはり、ちょっと違う感じ。
タスクシステムに近い?

[ 開発 ]

2007年04月09日

[開発] 逆引きって大事だよな

逆引き辞書

開発でも、プログラミング言語でも、
サーバー管理でも、とにかく、逆引きが重要につきる。

リファレンスマニュアルは、必須!
だけど、そこまでたどり着くのに、逆引き辞典は要ります。

こうしたい!→ならこうしろと。

こう、トラブルが起きた!→ならこう解決!

こういうのをデータベース化しておく必要があります。
ってな具合です。

そんなわけで、wikiなんかを自前で建てているわけですが。

小さなところで、OpenBSDのディスクフォーマットは、
何コマンド?って。
しばらく使ってないから、素で忘れてて。

mkfsコマンドねーーー!!ってそれLinuxですから。

で、「フォーマット」で検索しても全然でてこない。
(BSD文化だと、フォーマットって言わないからだと思う)
やっと見つけた!
newfsか!ってな具合。

まあ、こんなトラブルがやまほどあるわけで。

あと、マニュアルには、凡例がほしい。
実際に、どうやって使うの?っていう。
Microsoftの言語リファレンスは、凡例いっぱいで助かります。
Borlandのヘルプは、凡例少ないからちょっとアレ。

[ 開発 ]

2007年04月06日

[開発] シーン管理が必要だなあ

お仕事で、作ってるゲームの話。

タイトル画面とか、ゲームオーバー画面とか、
いろいろ増えると、シーン管理がいるなあ。

今は、ポインタで、状態遷移しているんだけど、
1ファイルに詰め込みまくってしまって、不衛生だし。

流行は、スタックベースのシーン管理?

2chによると

263 :名前は開発中のものです。:2007/04/01(日) 15:15:13 ID:Sn7iJUNq
>>260 
Gemsの5巻にスタックを使ったシーン管理が載っている。 

試してみたら、なかなか使い易かったよ。 

Game Programming Gems 5 日本語版Game Programming Gems 5 日本語版
Kim Pallister 加藤 諒 川西 裕幸

by G-Tools
Game Programing Gems 5 にサンプルあるらしいけど、
Gems5 タケ~~~~~よ。

『GAN GAN GAN』 の時は、確か、スタックベースでやってたけど。
使いまわすには、古いコードなんだよな……。
(GAN GAN GANのときは、タスクって名前つけてた)
つーか、かなりコードが、ごちゃごちゃだから整理しないと。

とりあえずは、『GAN GAN GAN』 のをゴニョゴニョ改良してみることにする。

続き:[開発] シーン管理その2

[ 開発 ]

2007年03月29日

[開発] Flash周りとかAS3とか

最近、web周りは混沌を極めておりますな……。

将来的に、Flash仕事が必要かということで、調べているのですが、
時代的には、ActionScript3 なのか?
プログラマさんは、みなそろいもそろって、
ActionScript3を使いまくってらっしゃる。

Flash8 + ActionScript2は、デザインツールって感じでしたが、
ActionScript3(Flex?)は、マ寄り(プログラマ寄り)にナットるんですかい?

おっと、ActionScript3は、Flex SDKっつーのが無料なので、
それを落とせばすぐに試せるのですかい。
なるほどー。

ナンカ、デモでも作る余裕があるといいのだが。

あと、デスクトップ環境としての、Flashはどうなん?
つまり、Apollo ってどうなんよ?

つか、Apolloってマギラワシー名前つけんな。
Apolloっつったら、RubyのDelphi(VCL)拡張だろうがよ!!

さらに、Apollo調べてたら、Flash関係なくて、
HTML+Javascriptをパッケージにできてデスクトップアプリケーションとして配布できる。
マルチプラットフォーム!フォォォォォォーー!
すばらしいが、何か空しさもある。
(Flash特有の別ドメインにアクセス不可な制限が外れると聞くと面白ことできそうだけど、
結局、オンラインでやることをデスクトップアプリにする意味は……あるか……
昔、Ruby on Rails製デスクトップアプリってあったくらいだし)

さらに、ここに、JavaScript + AJAXが入ったりすると、
(むしろ敵対技術)
まさに、混迷を極めてきますなあ。

手当たりしだいに手を突っ込まないで、見極めたいですな。

オマケ:

flash3d_2007_03_29.jpg

Flashでも、3D動くんですね。
スゲー。解像度落とすと、20FPS出てるよ。
マウス操作が、なんかWiiのFPSみたいでキモイけどw

custom:media ≫ SWFZ Demo 2

[ 開発 ]

2007年03月22日

[開発] TechNet Plus サブスクリプション

Microsoft TechNet: TechNet Plus サブスクリプション

開発環境抜きの MSDNサブスクリプション と、思えばよいのかな?

なんと、年間定額で、
Windows Vistaや、Office 2007が、評価用にダウンロードできる!

Office2007βを今でも評価しまくっている自分には最適なのではないのか!?

開発環境がいらないなら、MSDNサブスクリプションよりお得なわけでしょうか。

TechNet サブスクリプション FAQ
によると、

  • 評価目的
    2chの関連スレによると、結構評価範囲は、広い模様
  • 仕事場でも、自宅でも使用可
  • 最大10台までイントール可能
    (ソフトごとなのか、全ソフトでなのかは不明?たぶんソフトごと)

あと、会社用に、
Microsoft Action Pack サブスクリプション
ってのもあるようだ。

こちらは、評価用ではないようだ。
というか、こちらの方が安い件。

2ch関連スレ: MSDN/TechNetサブスクリプション 5

[ 開発 ]

2007年01月30日

[開発] Google Code Searchはどうよ?

Google Code Search

先日、公開されたGoogle Code Searchが面白そう。

googleのソースコード版で、
なんと世界中のソースコードが検索できる!

ネット上では、

『Geekなぺーじ:Google Code Searchの危険な使われ方』
や、『秋元@サイボウズラボ・プログラマー・ブログ: Google Code Search のアレな活用法が続々と』
にあるように、セキュリティホールを見つけるような活用法ばかりが(´д`;)
(2chの Google Code Search スレでもこんなの、ばっかりw)

他には、いくつか、ブログで見られたのは、
コードでの変数名のつけ方を見る場合など。

『いやなブログ - 学校では教えてくれないバッドノウハウ英語 #3: if need be』や、『IGINブルネイ/syasudaの日記』
などで見られる。

おー。なるほど、変数名で、みんなこう使うんだー、
という使い方。

ちなみに、「○○するかもしれない」というのは、
上記ブログでもありますが、

などを使うようで。
参考になる。
今まで、CheckHogeとか、つかっててスッキリしなかったので、これからは、MayBeHogeにしよう。

RubyとかPerl的には、後置if文的な、HogeIfNecessaryも捨てがたいけど。

Google Code Searchに自分のコードを登録する方法

自分の書いたソースはやっぱりなかったりするわけでw

『ひげぽん OSとか作っちゃうかMona- - Google Code Searchに自分のコードをクロールしてもらう方法』によると、

『Google Code Search - Help Google Code Search find your code』のページに、以下を自分で登録することができるようです。

tar.gz,zipなどのArchiveファイルのURL 
CVSリポジトリ 
Subversionリポジトリ 

公開しているソース、追加してみるか……。

アレな方法以外に利用価値はあるか?

さて、Google Code Searchに、いくつか疑問点があるとしたら……

アレなセキュリティホール探す以外に、
何か革新的な使い方ってないだろうか?

変数名のつけ方に関しては、確かに確認はできるんだけど、
そもそも英語の言い回しを知らないと、
見つけることはできない罠(´д`;)

とりあえず、ライブラリの使い方を見るのに……って普通だなー。
(頭で、覚えておいて、何かあったときに使ってみようと思う)

APIも公開されているようだし、革新的な何かは出てきてもおかしくない。

Delphiが検索しにくい?

そういや、何故か、Delphiが検索しにくくて
"lang:Delphi"では無理。"lang:Pascal/Delphi"でも無理。

"lang:Pascal"だと、Delphiが出てくる罠。

なんでじゃー。

[ 開発 ]

2007年01月26日

[開発] ゲーム開発、近況

開発中

最近のゲーム開発は、主に、お仕事の方のを弄っております。

いや、しかし、マウス対応って難しいですね。

作っているのがカジュアルなゲームなだけに、
マウス対応が必須なのですが、
もともと、パッド前提のシステムだったため、
無理やり、マウス対応にしたら、上手く行かないのです。

結局、システム変更、別ゲーになりそうな悪寒です。

プログラミングの話で言えば、
ABAさんのソースコードとか見ながら、
面白そうな構造は取り入れたりしているのですが、
DelphiとABAさん使用のD言語がかなり違いすぎていて、
困りまくりんぐ。

テンプレートをほどよく使われているコードは、
まあ参考になるのですが、
ファイル同士が、相互参照しまくりーのなので、
DelphiだとDelphi特有のユニットの循環参照問題が解決できねー、とか、
ちょっとついていけないところが。

あと、今は、描画周りが、軽くOpenGLを使っているんですが、
DirectXを1から使うのもカッタルイナーという面もあり、
3Dエンジン使うの?とか、Delphiなら、OpenGLスキーとしては、
GLSceneあたりはどうか?
という話が、自分の脳内で展開されています。

最終的には、メガデモ系エフェクトを多用するようなゲームになりそうなので、
OpenGLでも全然大丈夫だと思うんだけど。

ただ、自分、時代に乗り遅れていて、シェーダーとか全然弄ってないからなー。
どうなるものかと言う気はする。
(そもそもOpenGLのシェーダーって動いているのを見たことがな(ry)

シェーダー周りも書いてある、
『OpenGLプログラミングガイド 原著第5版 (大型本) 』とか欲しいのですが、
¥ 13,650 (税込)って、いかんせん高すぎる。
合わせて買いたい、なんて、3万円ですぜ。
(よりによって、リアルタイムレンダーリング第二版だぜ(←ほしい)

個人的に、HDRバリバリ効かせた、メガデモーな、
時間の合間にサクッと遊べるカジュアルゲーム、なんてのは
いいなーとか思うんですが。

[ 開発 ]

2006年12月20日

[開発] はてなのコードハイライト機能?

シンタックス・ハイライト

はてなダイアリー日記 - 入力したプログラムコードを色付けするスーパーpre記法 シンタックス・ハイライトの実装について

そういえば、しばらく使っていないはてなダイアリーが、
プログラムコードのシンタックス・ハイライトに対応していた。

これだけなら、別にすごくはない気がするが、
問題は、サポート言語の数。

a2ps a65 aap abap abaqus abc abel acedb ada aflex
ahdl alsaconf amiga aml ampl ant antlr apache apachestyle arch

art asm asm68k asmh8300 asn aspperl aspvbs asterisk asteriskvm atlas
automake ave awk ayacc b baan basic bc bdf bib
bindzone blank bst btm c calendar catalog cdl cf cfg
ch change changelog chaskell cheetah chill chordpro cl clean clipper
cmake cobol colortest conf config context cpp crm crontab cs
csc csh csp css cterm ctrlh cupl cuplsim cvs cvsrc
cweb cynlib cynpp d dcd dcl debchangelog debcontrol debsources def
desc desktop dictconf dictdconf diff dircolors diva django dns docbk
docbksgml docbkxml dosbatch dosini dot doxygen dracula dsl dtd dtml
(以下略)

数えたら、479言語あった

(ちなみに、手で数えたわけじゃないのでw
cygwinの wc コマンドです)

この数は、手動で対応したとは思えない。
これ、サポートの必要ないんちゃう?という言語まで
というか、ほとんど、聞いたことのない言語ばかりだし。

何かのライブラリを使っているのかなー。

何故か、D言語や django(PythonのWebフレームワーク)はあるのに、
すでに言語としては古めの Delphi をサポートしていないのが謎。
csは、C#だよね?(拡張子的に)
この辺にヒントがありそうだが……。
(あと、Brainf*ckがないとか、Cecilがないとか、どうでもいいです)

……その後、いろいろ探し回ったら、
発見!!

どうやら、Perlのライブラリ "Text::VimColor" らしい。

何故、わかったかというと、
"VimColor - source code highlight"
というサイトのサポート言語がまったく同じ(ry

でも、これ、裏でエディタの Vim を呼び出しているから、
Vimをインストールしてないと動かないな……。
あと、キャッシュしないと重いだろうし。

手軽に組み込むというわけにはいかないという、オチ。

[ 開発 ]

2006年06月29日

[開発] Haskell本(゚Д゚)

入門Haskell―はじめて学ぶ関数型言語 ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

いやー、『入門Haskell』、『ふつうのHaskellプログラミング(以下、ふつケル)』買いましたよ。
買ったのは、1ヶ月ほど前ですが。
流行には乗っとけってことでね。
いやはや、おいらもミーハーですねー。

とりあえず、『入門Haskell』はともかく(つか、ゴメン読んでないの)、
『ふつケル』の方は、すんごい読みやすいですわー。
プログラムやったことあったら、すいすい読めますね。
練習問題もついててよいです。

説明しときますと、Haskellという、
C言語とか、BasicとかDelphiとかと全く(といっていいのか)
パラダイムが異なるプログラミング言語の話です。

つか、Haskellすげーわ。

遅延評価なんか、なんだよありゃ。
必要になったら、評価する!って考えたなー。
どういう、実装になってるのか気になりすぎる。
学者さんが考えただけはあります。

どうでもいいけど、遅延評価って、量子力学のコペンハーゲン解釈みたい。
観測されてから、過去にさかのぼって、現れるみたいな。
箱を開けてから、ネコの生き死にが判定されるみたいな?

まあ、論理型言語のような匂いがするせいもあってか、
Haskellのような関数型言語パラダイムが
今後の主流になるとはちょっと思えないけれど、
C#が3.0くらいから、関数型言語に向かっているかようではあるので、
考え方は学んでおいてよいと思う。

モナドのところまではまだ読んでないので、この辺で失礼します。
つか、挫折するらしいから、読まないほうがいいかもしれないw

[ 開発 ]

2006年05月15日

[開発] プログラミング言語 スル。

面白い言語を見つけました。
『プログラミング言語 スル』。です。

SmallTalkと、Rubyにインスパイアされた.NET向けの言語だそうです。
たぶん、スクリプト言語です。

何が面白いかって、必要最低限の言語仕様と
シンタックスシュガー(構文糖)が全てという点。

SmallTalkのように、if文やwhile文、関数定義すら組み込みじゃない。
しかし、利便性のために、Rubyのような文法で、
シンタックスシュガーにより標準で可能になっています。

シンタックスシュガーって好きなんですよ。
文法的な原則を曲げて、実用的にしようってことですから。
実用的にってのが重要。

作者のblogみると、ソフトの組み込みが目的な様子。

そういえば、実行環境をダウンロードしてみて驚いたのは、
実行環境のコアだと思われるSRUCore.dllが、たった56KByteしかないこと。
びびりました。
ゲームもあったんですが(やねう氏のゲームの移植)、
ちょっと重い。スクリプトだから仕方ないのかな。

[ 開発 ]