チャットソフトを作ろう
ここではDDPDコンポーネントを使ったネットワークプログラミングの基礎ということで、簡単なチャットプログラムを一緒に作っていきましょう。
Delphiを起動し、「アプリケーションの新規作成」を選んでください。アプリケーションの名前は、DDPDTUTとでもしておきましょう。
ではまず、DDPDコンポーネントをフォームに貼り付けてください。
次に、USES節に、DPlayを加えてください。DirectPlay用の定数の宣言などがこのユニットの中で行われているので、これを書かないとDirectPlay用に定義されている各種定数が使えないのです。
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DPlay, DDPD;
では、TForm.OnCreateイベントに、ネットワークに接続するためのコードを書きます。
procedure TForm1.FormCreate(Sender: TObject);
begin
//いきなり接続
if not DDPD1.Execute then
Application.Terminate;
end;
基本的にはDDPD.Execute一発でOK。↓のようなダイアログが出てきて、接続に必要な情報をユーザーから受け取って、ネットワークへの接続が完了します。

ExecuteといえばTOpenDialogコンポーネントのようなコモンダイアログ関係のコンポーネントが思い浮かぶでしょうが、まさしくアレと同じ感覚で、接続できたら返り値にはTrue、接続できなかったら返り値にはFalseを返します。
この場合、接続がうまく出来ないようだったら、容赦無くアプリケーションを終了してしまう事にします。
「もうちょっとアプリケーションに即したデザインがいいな」というこだわりのある方や、「こんなダサいダイアログで俺様のアプリを汚すな!」という気骨の有る御仁は、このダイアログと同等の機能を持ったプログラムを自前で作る方法もありますので、一度リファレンスに目を通してください。
チャットの実装に進む前に、先ほど出てきたダイアログの操作方法について、DirectPlayの仕組みを混ぜながら説明していきます。
まず、最初にゲームに参加する際の名前の入力する必要があります。キャラクター名なりプレイヤー名なりを打ち込んでもらいます。

「次へ」をクリックすると、今度は接続方法(サービスプロバイダ)の選択に移ります。

TCP/IP接続などを選んで、「接続」をクリックすると次のように、更に項目を要求される事があります。

例えば、TCP/IP接続の場合は、接続先のコンピュータのIPアドレスが求められます。デバッグの際には自分のマシンを示す「localhost」を入力すると良いでしょう
必要事項を入力してOKを押すと、次へ進みます。

新たにセッションを作成するか、既存のセッションに参加するかを選択します。DirectPlayを使って行われているチャットやゲーム等のことを、ここではセッションと呼びます。

「新規セッション作成」を選んだ場合は、セッション名を入力して「セッション作成」をクリックすれば完了です

「既存のセッションに参加」を選んだ場合は、左のリストに出るセッション名をクリックすると、右のリストに選択したセッションに参加しているプレイヤー一覧が出ます。
「参加」ボタンをクリックするとセッションに参加します
…以上の文章は、あなたの作ったゲームのマニュアル等に転載しても構いません。一部修正してくださっても結構です。(^^)
それでは、チャットプログラムを作りましょう。
まずデザインはこんな感じで。

プログラムの動作としては、
では上から順に作りましょう。
Form.OnCreateイベントとともに、TDDPD.Executeメソッドで接続ダイアログを表示します。
procedure TForm1.FormCreate(Sender: TObject);
begin
//いきなり接続
if not DDPD1.Execute then
Application.Terminate;
end;
扱い方はコモンダイアログと同様で、接続に成功したならTrueを、そうでないならFalseを返すので、Falseが返ってきたら潔く?アプリケーションを終了します。
SendBtn.OnClickイベントハンドラを作ります。
procedure TForm1.SendBtnClick(Sender: TObject); begin DDPD1.Send(DPID_ALLPLAYERS, PChar(MessageEdit.Text), Length(MessageEdit.Text)+1); //自分のメッセージ欄にも入れる ChatMemo.Lines.Add(DDPD1.MyPlayer.ShortName + ':' + #$09 + MessageEdit.Text); //メッセージ欄をクリア MessageEdit.Text:=''; end;
太字の一行目の、DDPD1.Sendメソッドで、他のメンバーにメッセージを送信します。
Sendメソッドの引数は、順に
となっています。
この場合、他のメンバー全員がメッセージの宛先になるのですが、特定の一人を対象にする場合は、TDDPD.Playersプロパティを参照して、個人のIDを得ます。
続く二行は問題ないでしょう。
自分の送ったメッセージも、ChatMemoに表示して、ユーザの不安を解消し(^^;)、その後、MessageEditをクリアして、次の入力をしやすくします。
DDPDでは、他のプレイヤーからのメッセージが到着すると、OnArriveMessageイベントを発生しますので、それを利用します。
DDPD.OnArriveMessageイベントハンドラは、こんな感じ。
//メッセージが届いたよ procedure TForm1.DDPD1ArriveMessage(Sender: TObject; from: TDDPDPlayer; data: Pointer; dataSize: Cardinal); begin ChatMemo.Lines.Add(from.ShortName + ':' + #$09 + PChar(data)); end;
引数fromに、送りもとのプレイヤーについての情報が入ります。そして、dataとdataSizeに送られたデータと、そのサイズが入っています。
ここでは文字列しか送られてこないので、↑のようにして、ChatMemoに書きこみます。
セッションに対して新たにメンバーがやってきた場合、OnComesNewChallengerイベントを発生します。そういうわけで、DDPD.OnComesNewChallengerイベントハンドラを書きます。通信といえば、対戦。対戦といえば格闘ゲームということで、妙なイベント名がついていますが、気にしないでください(^^;)
procedure TForm1.DDPD1ComesNewChallenger(Sender: TObject; player: TDDPDPlayer; ShortName, LongName: String); begin ChatMemo.Lines.Add(ShortName + 'さんが、来ました'); end;
引数であるPlayerに、新たにやってきたプレイヤーの情報が入ります。
ShortName,LongNameには、プレイヤーの名前が入ります。
Executeメソッドで表示されるダイアログでは、プレイヤーの名前は一つしか要求していないので、ShortNameとLongNameに同じ値を入れる事にしています。
セッションからメンバーが退出した場合は、OnEscapeChallengerが発生します。
procedure TForm1.DDPD1EscapeChallenger(Sender: TObject; player: TDDPDPlayer; ShortName, LongName: String); begin ChatMemo.Lines.Add(ShortName + 'さんが、逃げました'); end;
完成〜
というわけで、チャットプログラムが出来ました! 簡単でしょ。
以上までに説明した要領で、アプリケーション同士の接続、メッセージの送受信が可能になります。あとはゲームなりツールなり、みなさんで好きな用途にご利用ください。
