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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1215
hitochanオンラインゲーム8解決


hitochan

リンク

2006/12/15(Fri) 19:41:07|NO.4125

結構考えたのですが、わからないので質問させて頂きます。
今pcbnet2でオンラインゲームを作っています。
それで、登録画面(IDとパスワード)を作り、
ログイン画面をつくりました。
その次にキャラクター作成画面を作っています。
1キャラクターをinput命令で作る。
2その内容をサーバーに送りサーバーはテキストファイルにnoteaddで
 それを付け足す。
つまずいたのは2番で、サーバーは複数のクライアントから
接続要求を受けます。なので,サーバーはスクリプトを繰り返すようにしました。
繰り返すとなるとキャラクター作成の情報をとることができません。
(サーバーは繰り返しているがクライアントはキャラクター作成でとまったまま、つまり
送受信がうまくできない)
わかりにくい説明ですいません。
どのようにしたらよいでしょうか。



この記事に返信する


kanzaki

リンク

2006/12/16(Sat) 11:20:59|NO.4131

具体的なスクリプトでは無く恐縮ですが、
概念として、
サーバー側のスクリプトには、ある種のタイムアウトを設け
待たない(停止させない)命令・構造にしなければ成りません。
ユーザーからの入力待ちは、クライアント側で行います。
サーバーへは、入力待ち中である事を送ります。

サーバーの処理構造としては、

repeat 命令などで、順番に処理を掛けていきます。
配列変数を使用し、各ユーザーごとに、少しずつ処理します。
ユーザーの管理には、今どんな常態かを示すフラグのような物を作りましょう。
このフラグの内容に基づいて、case if 等で処理を決定します。
各ユーザーの処理で、止ってしまわないように、極力処理内ではrepeat等を使用せず(足しこみと、ifでやりましょう)
また、処理が混じらないように、全て専用の変数(配列変数で)で処理しましょう。




構造として


*スタート repeat  zyoutai.cnt = 通信内容によってクライアントの状態をフラグ化  switch zyoutai.cnt  case 0   処理内容:誰も繋いでいないので次のユーザーを処理します。   swbreak  case 1   処理内容:入力中なので諦めて次のユーザーを処理します。   swbreak  case 2   処理内容:ゲームを開始しているのでクライアントからの入力を処理しましょう…とか   swbreak  swend loop goto *スタート

という構造でしょうか…
以前、こんな構造でメッセンジャーっぽいのを作った事があります。



hitochan

リンク

2006/12/16(Sat) 18:02:24|NO.4135

>また、処理が混じらないように、全て専用の変数(配列変数で)で処理しましょう。
tcpgetで変数の内容が上書き(この言い方でいいか分かりませんが)されるので、
なぜ配列変数を使うのかがよく分かりません。どういうことなんでしょう。



kanzaki

リンク

2006/12/16(Sat) 19:24:58|NO.4136

複数のクライアントを処理しなければならない場合に
一番単純な考え方だと思ったからです。


例えば10人分まで処理するなら、

ソケットID等も、10個分記憶しなければなりませんし
ソケットIDを記憶する変数を、「sockid.cnt」とします。
配列の成分としては、?人目の処理 ということになると思います。

repeat で、人数分の処理を一回りさせる場合、
配列変数なら、変数cntを使用して、cnt人目の処理
とすることが出来ます。

repeat内の変数を10個ずつ用意する(配列にするのは)のは、勿体無いとも思いますが
実際に行いたい具体的な処理を提示されておりませんし、
この方が混乱しなくて済む様にも思います。
慣れてきたら、節約が可能か試行してみるのも良いかと思います。


概念としては
repeat 命令を使用することにより、次々に処理するユーザーを替えていきます。
各処理には、タイムアウトを設けて処理が停止しないようにします。
というだけの事ですが



>繰り返すとなるとキャラクター作成の情報をとることができません。
>(サーバーは繰り返しているがクライアントはキャラクター作成でとまったまま、つまり
>送受信がうまくできない)

で言いたい事が正しく取得できていないかもしれません。



hitochan

リンク

2006/12/16(Sat) 20:16:44|NO.4138

ということは、

*start repeat tcpget zyoutai.cnt,64,soc if cnt=10:break;10人参加できる場合 caseなどで処理 loop goto *start
こんな感じでいいんでしょうか。



kanzaki

リンク

2006/12/17(Sun) 03:06:40|NO.4145

そうですね、概念としてはそういう方向性ですね
例によってまた概念的な書き方ですが


tcpmakeでリスニングソケットを作成 *start repeat  if cnt=10:break;10人参加できる場合。  ↓新しく接続を受け入れる  if sockid.cnt = (適当に未接続時の値を考えておき(負数とかにすると良いかも?)今回のループではだれも接続をしていないなら):{   tcpwaitで接続要求をチェックし、tcpacceptで接続を受け、sockid.cntにソケットIDを代入   接続要求が無ければ、continue命令等で何もせずに次の繰り返しへ  }  ↓受け入れた接続からデーターを取得  tcpget zyoutai.cnt,64,sockid.cnt(今回処理するソケットIDはこのセッション専用なので)  ↓タイムアウトの処理  データーが送られていなければ、continue命令等で何もせずに次の繰り返しへ  ↓実際の処理ルーチン  caseなどで処理(もちろんIFでも良いと思います)  ↓タイムアウトの処理  待機中のステータスであれば、continue命令等で何もせずに次の繰り返しへ  ↓切断と接続可能な人数の回復  切断要求とかならば、切断処理、sockid.cntを始めとした変数のクリアの上、continue命令等で次の処理 loop goto *start


で、やり取りするデーターの構造ですが
クライアント側のステータスを示す(case文で望む処理ルーチンの選択をする為の)フラグと本文で
構成する格好になると思います。

case文で処理するルーチンでは
クライアントへ応答を送ったり
大きなデータを受信する為に、少しずつ受信したデータをくっ付けて行くとか
そういう処理を行いますが、databuffa.cnt 等としておけば、他のユーザーの処理を行っていても
そこは書き換えられたりすることは無く処理できますし

ちなみに、互いのユーザーのステータスが影響しあうのであれば
2個目のrepeatループを作って比較したり…


なお、これは概念の一例なので、
他のアイディアを思いついたなら、それの方が優れているかもしれません。

プログラムの全体の流れを検討しながら、大まかな処理の目的を羅列していく方法は
言語に関係なく有効な方法です。フローチャートと呼ばれる物に近い気がします。
大まかな設計図→細かな設計図 と、煮詰めていき
最終的に実際の言語に置き換えていくだけです。



ななしし

リンク

2006/12/17(Sun) 09:02:03|NO.4150

チャットのサンプルサンプルくらい見ろ



リンク

2006/12/17(Sun) 12:51:56|NO.4157

>ななしし
お前は黙ってろ



hitochan

リンク

2006/12/17(Sun) 22:16:43|NO.4161

わかりました!
ありがとうございました!



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