先ほど言ったことをテストしてみました。
S/Cが扱い易かったので、今回はpcbnet2を利用させて頂きました。
私用によりあまり時間が無かったため、
説明は手抜きで、見づらかったり無駄な部分があるかもしれませんがどうかご容赦ください。
[pcbnet2]
http://www.sharkpp.net/hsp/plugin/pcbnet2.html
クライアント用
#include "pcbnet2.as"
#uselib "kernel32.dll"
#cfunc GetTickCount "GetTickCount" int
//クリックで球発射
IP = "127.0.0.1" : port = 24654 : size = 24 ;接続先情報
dim recv,size : dim send,size;受信データ,送信データ
tcpopen sock,IP,port;サーバーに接続
repeat
tcpiscon sock;接続確認
if stat = 1 : break
if stat = 2 : end
await 10
loop
repeat
tcprecv recv,0,size,sock;必要な情報を受信
if stat != 0 : break
await 10
loop
cid = recv(0) : TIME_S = recv(1);cid:接続ID TIME_S:ゲームが開始されてからの時間
title "同期テスト [ID:"+cid+"]"
randomize 3510
bmax = 100;最大球数
pmax = 100;最大接続人数
bsize = 10 : bsp = 0.3;球の大きさ、速度
dim bf,bmax,pmax;球が発射された時間(同期用)
ddim bx,bmax,pmax,2;球のx座標
ddim by,bmax,pmax,2;球のy座標
ddim br,bmax,pmax;球の角度
dim bid,pmax;球のID
dim con,pmax;接続情報
dim bc,pmax,3;球の色
p = 1 : con(cid) = 1;自分のIDを接続済みに設定
repeat pmax
bc(cnt,0) = rnd(128)+128 : bc(cnt,1) = rnd(128)+128 : bc(cnt,2) = rnd(128)+128;球の色を設定
loop
randomize
onclick gosub *発射
TIME_MS = GetTickCount()-TIME_S
TIME_SS = GetTickCount()
repeat
gosub *受信
gosub *処理
gosub *描画
await 10
loop
*受信
tcprecv recv,0,size,sock;球が発射されたかどうか受信
if stat != 0{
if con(recv(0)) = 0 : con(recv(0)) = 1
bx(recv(1),recv(0)) = double(recv(2)) : by(recv(1),recv(0)) = double(recv(3));球の座標
br(recv(1),recv(0)) = double(recv(4));球の角度
bf(recv(1),recv(0)) = recv(5);球を同期
goto *受信
}
return
*処理
TIME_N = GetTickCount();同期用
repeat pmax
if con(cnt) == 1{;接続されているか
cn1 = cnt
repeat bmax
if bf(cnt,cn1) != 0 {;球が発射されているか
bx(cnt,cn1) = bx(cnt,cn1)+cos(br(cnt,cn1))*(TIME_N-TIME_SS+TIME_S-bf(cnt,cn1))*bsp;球を移動
by(cnt,cn1) = by(cnt,cn1)+sin(br(cnt,cn1))*(TIME_N-TIME_SS+TIME_S-bf(cnt,cn1))*bsp;球を移動
bf(cnt,cn1) = TIME_N-TIME_SS+TIME_S;同期用
}
loop
}
loop
return
*描画
redraw 0
color : boxf
repeat pmax
if con(cnt) == 1{;接続されているか
cn1 = cnt
color bc(cnt,0),bc(cnt,1),bc(cnt,2)
repeat bmax
if bf(cnt,cn1) != 0 : circle bx(cnt,cn1)-bsize,by(cnt,cn1)-bsize,bx(cnt,cn1)+bsize,by(cnt,cn1)+bsize,0;描画
loop
}
loop
redraw 1
return
*発射
bf(bid(cid),cid) = TIME_N-TIME_SS+TIME_S : bx(bid(cid),cid) = double(mousex) : by(bid(cid),cid) = double(mousey);球の情報を設定
r = rnd(65536) : br(bid(cid),cid) = double(r);球の角度
send = cid , bid(cid) , mousex , mousey , r , bf(bid(cid),cid);送信データ
tcpsend send,0,size,sock;送信
bid(cid)++
if bid(cid) == bmax : bid(cid) = 0
return
サーバー用
#include "pcbnet2.as"
#uselib "kernel32.dll"
#cfunc GetTickCount "GetTickCount" int
screen 0,120,320,8
gsel 0,2
title "Server"
port = 24654
tcpmake mysock,port;サーバーをオープン
if stat != 0 : dialog "ERROR" : end;開けなかったら終了
pmax=100 : size = 24
dim con,pmax;接続情報
dim sock,pmax;ソケット
dim recv,size/4;受信データ
dim send,size/4;送信データ
notesel log
log = "START !\nOPEN [Port:"+port+"]";ログ
mesbox log,640,480,0;ログ
TIME_S = GetTickCount();同期用
repeat
TIME_N = GetTickCount()-TIME_S;ゲームが開始されてからの時間
tcpwait mysock;接続要求がきているか
if stat == 1 {
repeat pmax
if con(cnt) = 0{
con(cnt) = 1;接続済みフラグ
tcpaccept sock(cnt),mysock;接続を受け入れる
send = cnt,TIME_N;IDとゲームが開始されてからの時間を送信
tcpsend send,0,size,sock(cnt);送信
noteadd "CONNECT [ID:"+cnt+"]",0 : objprm 0,log;ログ書き換え
break
}
loop
}
repeat pmax
if con(cnt) == 1{;接続されているか
tcprecv recv,0,size,sock(cnt);データ受信
if stat != 0{;受信されていたら
recvid = cnt
repeat pmax
if con(cnt) == 1 and recvid != cnt : tcpsend recv,0,size,sock(cnt);受信したデータを他のクライアントに送信
loop
}
tcpfail sock(cnt);接続が切れた場合
if stat != 0 : con(cnt) = 0 : noteadd "DISCONNECT [ID:"+cnt+"]",0 : objprm 0,log;接続フラグを修正し、ログ書き換え
}
loop
await 10
loop