HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0116
hitochan参加人数分だけ送信11解決


hitochan

リンク

2007/1/16(Tue) 19:11:48|NO.4849

皆さんに教えていただきオンラインゲームのプログラムも
少しずつ進んでいます。順調に進んでいたのですが、
ちょっとつまずいてしまったので質問します。

クライアントが別のクライアントの情報をサーバーから受信し、
配列変数に情報を代入しているのですがゲームに参加している人は増減しているので、
例えばzyouhou.cntに代入されている情報はクライアントAさんのものとは限らなくなると
思います。なので、あるキャラクターが別のキャラクターの情報で動いているかもしれなく
なると思います。難しく考えすぎているのかも知れません。
どうすればよいのでしょうか。



この記事に返信する


As

リンク

2007/1/16(Tue) 19:42:49|NO.4851

つまり、


 

zyouhou.0 = A zyouhou.1 = B zyouhou.2 = C  

から

 

zyouhou.0 = A zyouhou.1 = C  

Bが抜けたとして、 配列.1がCになってしまうということだと思いますが。
この配列は独立した情報なので、他の情報とは関わらないため、
予想している事態には陥らないと思います。

また、配列のシフトをやる場合結構CPUを食うので、配列ではなく
note命令を利用してみてはどうでしょうか?

以下に分割モジュールを示しますが、これを使えばnote命令でクライアント情報を
まとめることができるかと思います。

「名前,PosX,PosY,キャラクタピクチャID」
という値の入った文字列を「,」を区切り文字列として配列変数に代入します。


配列変数 arr.0 = 名前 arr.1 = PoSX arr.2 = PoSY arr.3 = キャラクタピクチャID


#module "selcut" //文字列分割 selcut 配列変数, 読み出す文字列, 区切る文字列 #deffunc selcut array p1,str p2,str p3 dim p1:s5=0:s3=0:s1=p2:s4=p3:repeat:s2=instr(s1,s3,p3):if s2=-1{s3=strlen(s1)+1}s3+=s2 p1(cnt)=strmid(s1,s5,s3-s5):if ("\""=strmid(p1(cnt),0,1))&("\""=strmid(p1(cnt),-1,1)){ p1(cnt)=strmid(p1(cnt),1,strlen(p1(cnt))-2)}s3+=strlen(s4):s5=s3:if s2=-1{break}loop:return #global



Ve

リンク

2007/1/17(Wed) 00:47:55|NO.4856

オンラインゲームのジャンルと接続形態を教えて下さい。



hitochan

リンク

2007/1/17(Wed) 16:47:29|NO.4860

ジャンルはとは具体的にどういうことを言えばいいのですか?(すいません。)
接続形態はTCPとかのことですか?それならTCPです。

Asさん
僕のスクリプトでは、repeat命令で何度も他のクライアントの情報(座標など)
を受信するため配列変数(zyouhou.cnt)としています。
名前は一度しか取得する必要がありません。
質問の付け加えで、他のプレーヤが抜けたとき、どの変数のプレーヤが抜けたのか
がどうしたらわかるのですか?
色々言ってすみません。



ゆちボン

リンク

2007/1/17(Wed) 17:17:38|NO.4861

>ジャンルはとは具体的にどういうことを言えばいいのですか?(すいません。)
Veさんが言っているのは「アクション」だとか「シューティング」とかの
ジャンルのことだと思います。



hitochan

リンク

2007/1/17(Wed) 17:53:19|NO.4863

>ゆちボンさん
>どうもありがとうございます。



>オンラインゲームのジャンル
僕はRPGを作りたいと思っています。
といってもまずはそのキャラの名前と動いていることをあらわせれば
よいと思っています。



As

リンク

2007/1/17(Wed) 21:51:35|NO.4866

>>NO.4860

なるほど。転送量を減らすために名前の部分は取得せずに
ポジションだけを取得するようにしているのですね。


でも、もう少しよく考えて見てください。

zyouhou.0 = Aさん zyouhou.1 = Bさん zyouhou.2 = Cさん
という設定だとして、 Bさんが他のマップに行ってしまったとします。
すると、

zyouhou.0 = Aさん zyouhou.1 = (Null) zyouhou.2 = Cさん
こうなり配列.1は何もなくなります。しかしこの状態で同じマップに違う人が
入ってきたとします。
 こういった場合、zyouhou.3を新たに作り追加することが一番容易に見えますが、
それだと配列が永遠に作られてしまう状態に陥るので不可能。もう一つは配列を
シフトする方法。この場合はCPUを多く消費してしまうため不可能。
結果的に、あいている配列に新しいユーザーを追加するしか他ありません。
こういうめんどうなことがあるので配列は使わずにnote命令をお勧めしたのですが…。
hitochanさんはこういうプログラムを作ることはできますか?
私は無理ですorz

まぁ…方法というのであれば…


/send add_user 3 ユーザー名,ピクチャID

↑こういった文字列データをクライアントにサーバーが転送してあげてください。
add_userは新しいユーザーを追加します。という命令。
3は配列の3に代入しますよ。ということ。
ユーザー名とピクチャIDは パラメータということで。



As

リンク

2007/1/17(Wed) 21:57:56|NO.4867

【追記】


ポジションの変更X,Yで絶対値指定 /send pos MAP番号 配列番号 X,Y 指定のマップに新しいユーザーが入ってきた。 /send user_add MAP番号 配列番号 キャラクタ名,キャラクタID ユーザーがMAPから消える /send user_del MAP番号 配列番号 運営者からのお知らせ(笑 /adminmsg <String>



Ve

リンク

2007/1/18(Thu) 00:09:40|NO.4870

どういうプログラムなのか良く分かりませんけど、
最大接続人数を作って、抜けた人の情報はnullにして使いまわしににした方が良いでしょうね。

zyouhou.0 = Aさん
zyouhou.1 = Bさん
zyouhou.2 = Cさん
  ↓
Bさんが抜ける。
  ↓
zyouhou.0 = Aさん
zyouhou.1 = (null)
zyouhou.2 = Cさん
  ↓
Dさんが入ってくる
  ↓
zyouhou.0 = Aさん
zyouhou.1 = Dさん
zyouhou.2 = Cさん

最大人数が一杯だったら弾きます。

>質問の付け加えで、他のプレーヤが抜けたとき、どの変数のプレーヤが抜けたのか
がどうしたらわかるのですか?

サーバの処理はどうなっていますか?
私の方法を参考になればと簡略化して紹介します。

if <最大人数に達しているか> : <達していなければ新規接続者の確認処理へ> : else : <接続者確認しない>
repeat (最大接続人数)
if <zyouhou.cntの情報がnull> : continue
 <zyouhou.cntの人が接続しているか確認> : if <zyouhou.cntはログアウトしてないか> : <ログアウトしていたらzyouhou.cntの人がログアウトした事をクライアントに知らせる>
loop

えー接続形態の意味が合ってる自分でも不安ですが…
大規模なMMORPGと少人数で遊べるMORPGがありますよね。



リアジ

リンク

2007/1/18(Thu) 08:06:45|NO.4873

最大人数だけの配列を確保して、
ログインしてる人はその配列に1を入れ、ログインしてない人は0を入れて、
repeatで最大人数だけ繰り返してその配列の中身が1なら処理するって感じでどうでしょうか
pcbnet2のサンプルもこんな感じだったと思います
MAXCLIENTS=最大人数

dim pj,MAXCLIENTS repeat MAXCLIENTS if pj.cnt==0 : continue --処理-- loop



hitochan

リンク

2007/1/18(Thu) 21:40:01|NO.4879

リアジさん、Veさん、Asさん返信ありがとうございます。
参考にさせていただきます。

Asさんの

/send add_user 3 ユーザー名,ピクチャID
は、そのマップに入るとサーバーが各クライアントにこの文字列
を送信し、クライアントが受信。
そしてnote命令で処理するということですね。
そのあと
instr関数でその文字列(send add_user)などがあるかどうか確認し
あればその後のパラメータ(?)を取得するというのはどうでしょうか。



hitochan

リンク

2007/1/20(Sat) 19:50:55|NO.4938

解決しました。
ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.