[☆さとーしのソフトウエア][☆SINet SIGame WWW Chatサンプル]

SINet SIGame ActiveX コントロール マニュアル

for Win32 Version 1.0
  Copyright 2000. Sato-Si


本体のダウンロードはここでも出来ます
付属のマニュアルも参照してください。そちらには
それぞれの、メソッドや、プロパティごとの説明文や
「現実的な、プログラミングにおける、問題点と、解決方法」が書かれています
さらに、実際のプログラムは、付属のサンプルプログラムを参照してください。
ただし、このサンプルプログラムはVisual Basic 6.0のサービスパック4以降で
ないと、開いたり実行する事は出来ません・・・。その場合は、Visaul Basic 6.0
とサービスパック4以降を入手するか、ファイルForm1.frm にプログラムが、
入っているので、メモ帳などで開いて参照してください


( 説明の中のプログラムはVisual Basic です )

ActiveXコントロールSIGameのオブジェクト名を SIGame1とします
(Visual Basicに貼り付けると、標準で、これになります)

作者(さとーし)へのメール(サポート&バグ情報をください)

☆目次

0.
概念
0-1. どういうものか
0-2. 接続しているもの同士の識別方法
0-3. データ共有方式(送信・受信方式)&変数について

--------- 基本編 ---------

1.
接続方法
1-1. サーバで起動するプログラム
1-2. サーバに接続するプログラム (クライアント)
1-3. 接続を閉じるプログラム(処理を中止するプログラム)

2. 変数について(通信方式)
2-1. 自分の変数を設定するには
2-2. 任意のidの人の変数を設定するには
2-3. 変数が変更されかどうかを監視すには
2-4. 接続状態を表す特殊変数"cnt"について

--------- 応用編 --------- (まだ、工事中・・・・)

3.
接続した切断したの割り込みを検出する
3-1. 特殊変数"cnt"と、接続/切断 割り込みについて
3-2. 接続した
3-3. 切断した

4. 使わなくてもいい、メソッド。

5. ダイレクト・データ送信機能


0.概念

0-1.どういうのもか

 このActiveX コントロールでは、TCP/IPプロトコルを使用して
ネットワーク越えの同じソフトウエアと情報共有を手段を簡単に
行えるようにするためのものです。
 接続方式は、サーバ・クライアント型で、1カ所のサーバに
他の大勢が接続する(クライアント)方式をとります。
しかし、このソフトウエアでは、接続してしまえば、サーバも
クライアントも、特に意識しないですみます。
 ゲームなどを簡単に実装できるように設計しました。

0-2.接続しているもの同士の識別方法

 接続している一つ一つは、idで一意に識別されます。このidというのは
サーバに接続すると、サーバからもらえます。なお、
これは、単なる0以上の整数で、サーバのidは0で、あとは
開いているもっとも小さい数値のidをサーバが、接続してきた
クライアントに自動的に割り当てます。

0-3.データ共有方式(送信・受信方式)&変数について

 サーバや、クライアント一つ一つに、自由に自分の変数を
持つことが出来ます。同じ変数名でも、idが違えば、別の変数です。
また、この変数は、全員から自由に見たり書き込んだりする事が
でき、また、自由に増やすことが出来ます。変数が作成されたり
変更されたりすると、イベント(割り込み)が発生します。これを
チェックする事で、キャラクターの状態の変化や、合図の確認を
行うことが出来ます


1.接続方法

1-1.サーバで起動する プログラム

SIGame1.portNo = 12020
SIGame1.maxConnects = 5

SIGame1.StartServer

SIGame1.portNo = 12020
 これは、サーバで、待ち受けに使用するポート番号の設定です。
ソフトごとに別々の番号を付けます。ここでは、12020番を使いました
なお、他のソフトウエアの使用するポート番号と重ならないような
4桁ぐらいの数字を使うのが良いでしょう。

SIGame1.maxConnects = 5
 これは、今から起動するサーバへの接続許容個数です。
サーバも含まれます。この設定では、5なので、あと、4人まで
接続することが可能です。

SIGame1.StartServer
 サーバを起動して、すぐに戻ります。
誰かが接続してきたかどうかや、起動を失敗したのを検出するには、
「3.
接続した切断したの割り込みを検出する」を参照してください

1-2.サーバに接続する プログラム (クライアント)

SIGame1.serverIP = "192.168.1.1"
SIGame1.portNo = 12020
SIGame1.Connect

SIGame1.serverIP = "192.168.1.1"
 これは、接続先のサーバのIPアドレスを指定しています。
 
SIGame1.portNo = 12020
 これは、接続先のサーバで待ち受けを行っている
ポート番号を指定してます

SIGame1.Connect
 サーバに接続を実行します
接続したかどうかや、接続を失敗したのを知るには、
「3.
接続した切断したの割り込みを検出する」を参照してください

1-2.接続を閉じるプログラム(処理を中止するプログラム)

SIGame1.Close

また、これは、サーバや、サーバ起動中や、接続中や
接続を試みている最中なら、その処理を中止します。
送信・受信中のデータも中止します。

なお、接続中にプログラムを終了すると、これが
自動的に呼び出されます。


2.変数について(通信方式)

2-1.自分の変数を設定するには

自分の変数を作成する・値を変更する:

SIGame1.SetMyVal "name", "さとーし"

自分の変数"name"に対して、値を"さとーし"と設定します
変数名、変数の値、ともに文字列です。
変数名は、大文字小文字を区別します。
変数名、及び、変数の値に使えない文字は、TAB(文字コード8)
改行文字のCR(文字コード13)LF(文字コード10)と、NUL文字
(文字コード はれ以外なら、いかなる文字の組み合わせでも
使えます。(つまり、日本語の変数名も使用可能です)

 接続中にこれを使うと、全員に 値設定の割り込みが入ります
「2-3.変数が変更されたかどうかを監視するには」を参照
 この機能は、接続していない状態でも、使うことが出来ます。
接続すると、全員から、自分の値を見ることが出来ます。

自分の変数を値を取得する:

Dim val As String
val = SIGame1.GetMyVal("name")

SetMyValでや、自分のidでSetValで設定してある値を取得します。
この場合は設定されていた値は val に、なります。
設定されてない場合は、""(ヌルストリング)を返します。
 これも、接続していない状態で、使うことが出来ます。

2-2.任意のidの人の変数を設定するには

接続している誰かの変数を作成する・値を変更する:

SIGame1.SetVal 2, "name", "たま"

idが2の人の変数"name""たま"と設定します変数名、変数の値、
ともに文字列です。
変数名は、"name"で、設定する値は、"さとーし"です。
変数名、変数の値、ともに文字列です。
変数名は、大文字小文字を区別します。
変数名、及び、変数の値に使えない文字は、TAB(文字コード8)
改行文字のCR(文字コード13)LF(文字コード10)と、NUL文字
(文字コード はれ以外なら、いかなる文字の組み合わせでも
使えます。(つまり、日本語の変数名も使用可能です)
※これは、SetMyValは接続していない状態でも使えますが
SetValは、接続中にしか使えません。
☆これで、自分の変数も設定できます。その時は自分のidに対して
設定します。(接続中はSetMyValの代わりにもなります)

 使うと、全員に 値設定の割り込みが入ります
「2-3.
変数が変更されたかどうかを監視するには」を参照

※自分のidや、他の人がどのidなのかを知る方法は、
「2-4.
接続状態を表す特殊変数変数"cnt"について」や、
「3.
接続した切断したの割り込みを検出する 」を参照してください。

接続している誰かの変数を値を取得する:

Dim val As String
val = SIGame1.GetVal(2, "name")

SetValや、(id = 2のひとが)SetMyValで、設定してある
値を取得します。この場合は設定されていた値は val に、なります。
設定されてない場合は、""(ヌルストリング)を返します。
 これも、接続していない状態で、使うことが出来ます。 

2-3.変数が更新されたかどうかを監視するには

次のように割り込みを記述します:

Private Sub SIGame1_OnSetVal(ByVal id As Integer, ByVal fromID As Integer, ByVal key As String, ByVal val As String)

  ' この割り込みの引数について
  ' id は、変更された人のid (整数)
  ' fromID は、変更を実行した人のid (整数)
  ' key は、変更された変数名 (文字列)
  ' val は、変更後の変数の値 (文字列)
  '  ※ここでは、GetVal(id,key) は、変更前の変数の値を返します
  '  そして、値が更新されるのはこのサブルーチンを抜ぬけた後です設定されます

End Sub

誰かが、SetVal や SetMyVal を実行すると、接続している全員に対して
この割り込みが発生します。
これを使えば、SetValや、SetMyValで、合図を出すことも可能です

さらに、特殊変数"cnt"の値の変更を監視する事によって、誰かが
接続してきた、切断された等を検出する事も出来ます。

2-4.接続状態を表す特殊変数"cnt"について

この、変数は、一人一人の接続状態、つまり、接続してきた
接続している、そして、切断した等を表すのに使用します。
接続し手いる場合は、値が"1"となります。切断中は"0"と
なります。

If SIGame1.GetVal(1,"cnt") = "1" Then
  ' id = 1 の人はいます
End If

If SIGame1.GetVal(3,"cnt") = "0" Then
  ' id = 3 の人は、いません
End If

If SIGame1.GetMyVal("cnt") = "1" Then
  ' 自分が接続中です
End If

SIGame1.SetVal(2,"cnt","0") ' id = 2の人を強制切断します(^^;
' ※変数"cnt"に対しては、"0"のみ 代入可能です

SIGame1.SetVal(0, "cnt", "0") ' サーバを落とします・・
' ※id = 0は、サーバです

そして、誰かが、接続してきたかどうかを
検出するには、OnSetVal に 以下のようにすると
知ることが出来ます。ちょっと長いですが、
大した内容ではないので、すぐに分かると思います

接続した

Private Sub SIGame1_OnSetVal(ByVal id As Integer, ByVal fromID As Integer, ByVal key As String, ByVal val As String)
  If key = "cnt" Then ' 特殊変数 "cnt"が更新された
    If val = "1" Then ' 値が "1"だ(接続)
      ' 誰かが接続してきた!(その人のidは、サブルーチンの引数のidです)
      ' 自分が接続したのを含む(サーバも)
    End If
  End If
End Sub
 

切断した

Private Sub SIGame1_OnSetVal(ByVal id As Integer, ByVal fromID As Integer, ByVal key As String, ByVal val As String)
  If key = "cnt" Then ' 特殊変数 "cnt"が更新された
    If val = "0" Then ' 値が "0"だ(切断)
      ' 誰かが去った!(その人のidは、サブルーチンの引数のidです)
      ' 自分が自分が切断されたのを含む 
    End If
  End If
End Sub
 

それが、自分かどうかを知るには、

' 接続時なら
' 接続したときの条件に これをつけ加える
  If id = SIGame.GetID Then ' idが、自分だ
      ' 自分が接続した
      If id = 0 Then
           ' サーバで起動した
      Else
           ' 接続が成功した
      End If
  End If

' 切断時なら
' 切断したという、条件の中にこれを加える
  If GetMyVal("cnt") = "0" Then ' 自分の接続状態が"0"だ
     ' 自分が切断された/切断した
     ' 接続に失敗した(接続の割り込み無しでいきなり呼ばれた時)
      ' サーバ起動を失敗した(接続の割り込み無しでいきなり呼ばれた時) 

  End If

他にも、自分が接続した、切断した、他の人が接続した、切断した等を
知る方法はあります。次の、「
接続した・切断したの割り込みを検出する
そのに説明があります。そちらを使用すれば、複雑な処理を行いたい
ときには、If 文をいっぱい書かなくてもすみます。

ここまでで、一通りのゲームに必要な通信機能の説明は終わりました。
これだけで、ゲームは出来ますが、これ以下は、さらに、細かい処理や
他の記述方法の説明が書かれています


3.接続した・切断したの割り込みを検出する

3-1.特殊変数"cnt"と接続/切断の割り込みについて

特殊変数"cnt"の値の変更を監視することによって、
接続してきた切断されたをまとめて監視することは出来ますが、
前のプログラムのように、If 文をたくさん書かなくてはならず
多少複雑です。それぞれの接続割り込みは、個別の
割り込み関数も、また呼び出されます。

次のような、イベントが用意されています

Private Sub SIGame1_OnConnect(ByVal id As Integer)
 ' 自分が接続した
 ' 引数id は、自分のidです
End Sub

Private Sub SIGame1_OnClose()
 ' 自分が切断された もしくは 接続に失敗した

End Sub

Private Sub SIGame1_OnCome(ByVal id As Integer)
 ' 誰かが接続してきた
 ' idは、その人に割り当てられたidです
End Sub

Private Sub SIGame1_OnLeave(ByVal id As Integer)
 ' 誰かがいなくなった
 ' idは、その人に割り当てられたidです
End Sub