ソフトウェア・ラボ

[ 実験 ] C++ でデリゲートを実装する悪魔の企画
じゃんけんプログラム
[ 解説 ] プログラミングに関する主張
クラスを徹底解剖してみようという無力〜な企画
デッドロック・パターン
例解リフレクション
コード サンプル
[ 試作 ] 迷路ゲーム
いてふ
Realistic Vision 1.0 復刻版
仮想鍵盤
Realistic Vision II

タイトルをクリックすると概要に移動します



C++ でデリゲートを実装する悪魔の企画

C++ マネージ拡張 ( .NET Framework ) には、デリゲートという便利な機能があります。これは従来の関数ポインタを拡張し、一個のクラスとしてカプセル化したものと考えることができます。さらに複数のデリゲートを連結したマルチキャスト デリゲートという機能もあります。これもまた、一個のクラスです。このシリーズでは、マネージ拡張を使わずしてデリゲートに類似したものを実装することを試みます。

2005 年 3 月頃のアイディア

  1. 関数ポインタの制限
  2. 引数のないメンバ関数の場合
  3. 引数を渡す(上)
  4. 引数を渡す(下)
  5. 引数付きのメンバ関数の場合

2010 年 3 月時点のアイディア

静的メンバ関数と非静的メンバ関数を統一的に扱うことができれば、下のように、機械語はもちろんアセンブラも使わずに、かつタイプセーフにデリゲートを定義できます。でも昔の記事もやってることは面白いので記念に残しておきます(笑)。知識ある人は比較して楽しんでください。

  1. 5年も経てば

じゃんけんプログラム

プログラミングの学習の一環として「じゃんけんゲーム」を作る事があるそうなので、私もちょっと C 言語で作ってみました。ただし、かなり実験的です。参考になるかどうか解りません。なにせ条件分岐がありませんので。

  1. コードと解説

プログラミングに関する主張

趣味でプログラムを書いてきたなかで、思ったことを書きました。

  1. [ 10 Dec 2004 ] 三つの刀
  2. [ 17 Dec 2004 ] マルチスレッドはクールだ
  3. [ 30 Sep 2007 ] C++/CLI の特徴

クラスを徹底解剖してみようという無力〜な企画

C における構造体が発展したのが C++ のクラスです。構造体とクラスの違いは数多くあるものの、ここでは特に「継承」について説明したいと思っています。ただし「継承の使い方」について説明するわけではありません。また、ほとんど「記憶と推測」に基づいて書いているので(誰に習ったわけでもないので)、書いてあることを信じて何かあったとしても、また、書いてあることが嘘だと信じて何かあったとしても、私は知りません。その辺りをご理解頂いた上で、参考程度に、お読みください。

注:これは 2004 年 4 月頃の記事です。既に情報が古いかも知れません。なお、参考にした文献は下記のリンクをクリックすれば表示できますが、これまた古い情報ですのでご注意ください。また、そのうちページ自体が消えるかも知れません。

[C++: 水面下の仕組み(Microsoft Visual C++ Web Site)]

  1. 単純な、単一継承
  2. 複雑な、単一継承 part 1
  3. 複雑な、単一継承 part 2
  4. 仮想関数の特殊な用法
  5. 多重継承について
  6. 仮想継承について
  7. (補足)COM における継承

デッドロック・パターン

マルチスレッド プログラミングにおける重要な問題のひとつであるデッドロックについて、そのコード例をいくつか紹介したいと思います。基本的に VB .NET での話ですが、C# や Managed C++ を使う場合でも参考になるかと思います。

  1. 例外による解放ミス
  2. 交互にロックを取得

例解リフレクション

霊界リフレクションとは、熟練した魔法使いが鏡を使い、霊界から……というのは冗談として、.NET の機能のひとつにリフレクションというものがあって、それを使うと任意の型に関する色々な情報を取得し、利用することができます。例えばコンストラクタを呼び出してインスタンスを生成するとか、プロパティに値を設定するといったことができます。

  1. 動的コンパイル
  2. 外部アセンブリの型情報
  3. オブジェクトのダンプ

コード サンプル

その他サンプルを掲載しています。

  1. ウェーブ ファイルの読み書き

迷路ゲーム

Maze

自動生成型迷路ゲームです。スタートは迷路の左上の隅で、ゴールは右下の隅です。キーボードの上下左右の矢印キーで移動します。Create と書かれたボタンを押すと、新しい迷路を作成します。おまけとして自動マッピング機能もつけましたが、歩いたところを全部描くと動作が遅くなるようなので、自分の周囲だけを表示するようにしています。スコアは 1000 点満点で、最小歩数で歩けば満点になります。

必要な環境 :
Microsoft .NET Framework 1.1 と、それが正常に動作する環境。

インストール :
下のリンクからアーカイブをダウンロードして適当なフォルダに解凍し、Maze.exe を実行してください。

アンインストール :
ディスクへは一切データを書き込みませんので、解凍したフォルダごと削除するだけで構いません。

ダウンロード
( Maze.zip - 9.81KB[ 15 Jul 2005 ] )


いてふ

いてふ

音楽や動画を再生しながら、次のエフェクトを同時にかけることができます。

・音程を上下させる
・再生速度を上下させる
・音量を上下させる
・ボーカルの声を消す

また、次のような特徴もあります。
・音声再生の CPU 使用率が低い
・WMP と比べて、少し音質が良い
・付属のライブラリが .NET に対応している(流用可)
・インターネット ラジオを再生できる
・(隠し機能ですが)音楽 CD を再生できる

対応するファイルの種類は、WMA, MP3, WMV, MPEG を始め、WAVE や AVI など非圧縮の形式にも対応しています。高速化等の処理は独自のルーチンで行なっているため、これ自体は OS や API の制約を受けません。

必要な環境 :
Microsoft .NET Framework 2.0
Microsoft DirectX 8.0a 以降
Windows Media Player 9 以降
以上が正常に動作するオペレーティング システム、及びハードウェア

インストール :
下のリンクからアーカイブをダウンロードし、解凍して下さい。
使用方法などは Itehu.txt に記載してありますので、必ず使用前にお読み下さい。

ver12.0 のダウンロード
( Itehu.zip - 776KB[ 10 Aug 2008 ] )


Realistic Vision 1.0 復刻版

Realistic Vision 1.0 復刻版

2000 年に VB5.0 で作ったロープレを、全面的に .NET で書き換えた復刻版です。操作方法などの詳細については、解凍後に help フォルダ内の readme.html をご覧ください。「然うして」のほうに、これの開発日誌(?)を掲載しています。

必要な環境 :

ハードウェア要件

ソフトウェア要件

インストール :
インストール作業はありません。下のリンクからアーカイブをダウンロードし、解凍後 RPG.exe を実行してください。

ダウンロード
( RPG.zip - 420KB[ 18 Mar 2007 ] )


仮想鍵盤

キーボードを使って MIDI の音を鳴らすソフトウェアです。突然、楽器を弾きたい衝動に駆られたものの、手元に楽器がない場合に代用できる、……という程ではありませんが、音階を確認するのには使えると思います。

必要な環境 : MIDI 音源を正常に使用できる Windows マシン

インストール :
インストール作業はありません。下のリンクからアーカイブをダウンロードし、解凍後 virtkbrd.exe を実行してください。操作方法については readme.txt をご覧ください。

ダウンロード
( virtkbrd.zip - 18.9KB[ 26 Nov 2006 ] )


Realistic Vision II

Realistic Vision II

コードネーム BWV1048 としてこっそり開発してきたRPGです。上にある Realistic Vision の続編という位置づけです。でも前作同様、いい加減です。なぜなら作りたかったのはシステムであって、ゲームそのものではなかったからです。ちなみにコードネームは、開発当初聴いていた曲です。

さて解凍してみると分かりますが、今回はその多くがVBppoiスクリプトで記述されています。実行可能ファイルが行なっていることは、主に画面表示に関する事と、位置情報の管理です。例えば上にある戦闘の場面では、上部のステータス情報および下部のコマンドメニューは、メニューを表示するコマンドをスクリプトから呼び出すことで行なっています。またそのコマンドは、パラメータとして渡されたプロシージャをコールバックし、そのプロシージャが次のメニューをカスケード表示するようになっています。もちろん、ここで選択されたコマンドに対する実際の行動も、スクリプトで記述します。例えば攻撃魔法ならば「○○を唱えた」と表示し、画面を点滅させ、自分のMPと敵のHPを減らします。ここでHPが0以下になったら、倒した場合の処理をし、さらに敵が一人も残っていないなら勝利ルーチンに移行します。

ところでこの戦闘画面を描画しているのは、実はプラグインによるものです。そもそも戦闘時に使うコマンドそのものがプラグインによって提供されています。また、その背景にある地形およびその上で発生する全ての処理についても、それようのプラグインが使用されています。実際のところ、EXE 本体がやっていることはあまり多くなく、RPGとしての共通部分の提供や起動関係のことしかやっていません。また、プラグインは必ずしもRPGと関係のあるものでなくても構いません。例えばセーブデータのロード画面から起動できる「ミニゲーム」は、純然たるシューティングです。

プラグインは .NET 系の言語で作るものですが、ゲームそのものは、多くの部分がテキスト ファイルで構築されています。興味が有る方は改造してみてください。必要な情報は(まだ一部ですが)、下のリンクからダウンロードできるシステム リファレンスに記載してあります。

必要な環境 :

下記の要素がインストールされている必要があります。

現在、動作確認済みの OS は以下です。

ただし構成によっては実行できないか、実行できても正常に動作しない場合があります。

インストール :
下のリンクからアーカイブをダウンロードし、任意のフォルダに解凍してください。解凍後、readme.txt をお読みください。そして BWV1048.exe を実行してください。

本体 ver1.2 のダウンロード
( BWV1048.zip - 1.12MB[ 11 Oct 2009 ] )

システム リファレンス
( BWV1048REF.zip - 83.7KB[ 11 Oct 2009 ] )



一言どうぞ