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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0928
ウチすけ有線または無線LANで接続し、ゲームのLAN対戦をしたい25解決


ウチすけ

リンク

2008/9/28(Sun) 10:58:30|NO.19816

こんにちは、はじめて質問します。
現在HSP歴4年です。
今度通っている学校での学園祭でPCゲームを作ることになりました。
HSPは安定版の最新を使ってます。
パソコンを5台(サーバープログラム用1台+クライアント4台、OSは全てWin XP pro)を使って行います。
そこで数値の情報をサーバー・クライアント間で相互でやりとりする方法を教えてください。
C
   |
C---S---C
|
C
S=サーバー機
C=クライアント機

変数のやりとりは全てサーバー経由でおこない、できる限りリアルタイムで送受信できればいいと思います。
クライアントプログラムは各パソコン同じものにして、サーバーは基本、操作しないものにしたいです。

処理内容の予定

クライアント
・サーバーから他プレイヤーのデータをリアルタイムで受信。
・サーバーに自分のデータをリアルタイムで送信。
・ゲームの進行。

サーバー
・クライアントの接続管理。
・クライアントから送られてきたデータを別のクライアントに送信する。
・受信したデータをチェックし、最終順位を出す。

よろしくおねがいします。



この記事に返信する


kossgong

リンク

2008/9/28(Sun) 16:52:17|NO.19821

僕も通信対戦のゲーム作ってますがかなり難しいですよw
完成するのに一ヶ月〜二ヶ月程はかかるかと。

とりあえず接続までのスクリプト↓

サーバ

#include "pcbnet2.as" TITLE "サーバ" port = 40000 ;使用ポート 人数 = 0 ;接続中の人数 dim soke2,50 mes "使用ポート" input port,100,20,16 objsize 120,24 button goto "サーバを立てる",*立てる stop *立てる tcpmake soke,port if stat != 0 : end cls *メイン redraw 0 color 255,255,255:boxf color 0,0,0:pos 0,0 mes "接続中の人数:"+人数+"" gosub *接続要求 redraw 1 await 0 goto *メイン *接続要求 tcpwait soke : if stat = 1 : gosub *接続受付 return *接続受付 tcpaccept soke2(人数),soke if stat != 0 : cls :mes "正しいソケットが指定されていません。":wait 180 :end if stat = 0 : 人数 + 1 return

クライアント

#include "pcbnet2.as" TITLE "クライアント" IP = "127.0.0.1" port = 40000 mes "IP" input IP,100,20,16 mes "ポート" input port,100,20,16 objsize 120,24 button goto "接続",*接続 stop *接続 isip ""+IP+"" : if stat = 0 : cls : mes ""+IP+"はIPではありません" :wait 180 :end if IP = "" : cls : mes "接続先IPを入力してください" : wait 180 :end cls : mes ""+IP+"へ接続しています・・・" tcpopen soke,""+IP+"",40000 if stat = 0 : goto *接続中 if stat != 0 : cls : mes "エラーが発生しました" : wait 180 :end *接続中 tcpiscon soke if stat = 2 : cls : mes "エラーが発生しました" :wait 180 :end if stat = 1 : cls : mes "接続した" :goto *メインループ wait 0 goto *接続中 *メインループ await 0 goto *メインループ



kossgong

リンク

2008/9/28(Sun) 16:55:04|NO.19822

クライアントの

tcpopen soke,""+IP+"",40000
の40000の部分はportにしてください><



ウチすけ

リンク

2008/9/28(Sun) 17:09:49|NO.19823

hspsockでやってるので、hspsockで解説してくれると助かります。
pcbnet2の方が簡単であれば、pcbnet2.asの入手方法を教えてください。



kossgong

リンク

2008/9/28(Sun) 17:13:19|NO.19824

機能的にpcbnet2の方が勝ってると思うのでpcbnet2をオススメします。
pcbnet2は↓でダウンロードする事ができます。
http://www.pcbsoft.net/for-hsp-users.html



ウチすけ

リンク

2008/9/28(Sun) 17:56:07|NO.19827

プラグインの導入方法を教えてくれませんか?個人が開発したプラグインの導入初めてなんです。
あとpcbnet2の解説サイトを教えてください。



kossgong

リンク

2008/9/28(Sun) 18:03:12|NO.19828

スクリプトエディタがあるフォルダにpcbnet2.asとpcbnet2.hpiを置いて、
pcbnet2.hsをhsphelpに放りこめばいいと思います。



GENKI

リンク

2008/9/28(Sun) 18:39:45|NO.19830

> スクリプトエディタがあるフォルダにpcbnet2.asとpcbnet2.hpiを置いて、

これは多分、プラグインを使っているスクリプトファイルの間違いではないかと。


とりあえず、HSPでの基本的なプラグインのインストール(導入)のやり方をまとめてみました。


HSPのインストールフォルダ(たいていはここ→C:\Program Files\hsp31)に、???.dllまたは???.hpiを置きます。
EXEファイルにしたあとは、作成したEXEファイルと同じ場所にもコピーしてください。
配布の際はEXEファイルとdll(hpi)ファイルは一緒に配布する必要があります。

HSPのインストールフォルダにあるcommonフォルダに、???.asまたは???.hspを置きます。
プラグインを使いたいスクリプト内で#include "???.as"または#include "???.hsp"と書けば使えるようになります。

HSPのインストールフォルダにあるhsphelpフォルダに、???.hsを置きます。
F1キーでヘルプを参照できるようになります。
???.hsはヘルプ用のファイルなので、用意されていない場合もありますがプラグインの動作には影響ありません。



ウチすけ

リンク

2008/9/28(Sun) 20:54:26|NO.19847

>kossgong様
>GENKI様
ありがとうございます。
現在事情によりHSP用のPCが使えないので、翌日やってみます。
あとサーバーとクライアント間の一回あたりの通信にはだいたいどのくらい時間がかかるんですか?



xxxz

リンク

2008/9/28(Sun) 22:20:49|NO.19849

pcbnet2は知名度はそれなりなのに、講座は少ないんですよね・・。

まだ未完成のようですが、見つけました↓
http://hnww.web.fc2.com/hsp_study/index.html



kossgong

リンク

2008/9/29(Mon) 19:29:40|NO.19870

>ウチすけさん
パケットのサイズと回線によって通信にかかる時間は変わります。



ウチすけ

リンク

2008/9/29(Mon) 20:08:08|NO.19872

>kossgong様
わかりました。実際に調べます。
それっ変数のやりとりのスクリプトを教えてください。調べましたが、いいサイトがありませんでした。



kossgong

リンク

2008/9/29(Mon) 21:02:48|NO.19875

こんな感じでいいでしょうか?

サーバ

#include "pcbnet2.as" TITLE "サーバ" port = 40000 ;使用ポート 人数 = 0 ;接続中の人数 send = "" jusin = "" dim soke2,50 mes "使用ポート" input port,100,20,16 objsize 120,24 button goto "サーバを立てる",*立てる stop *立てる tcpmake soke,port if stat != 0 : end cls pos 0,40 input send,100,20,10 button gosub "送信",*送信 *メイン redraw 0 color 255,255,255:boxf color 0,0,0:pos 0,0 mes "接続中の人数:"+人数+"" mes ""+jusin+"" gosub *接続要求 gosub *受信 redraw 1 await 0 goto *メイン *送信 if 人数 = 0 : return for i,0,人数 tcpput ""+send+"",soke2(i) next return *受信 for i,0,人数 tcpcount bafa,soke2(i) if bafa >= 1 { tcpget jusin,bafa+1,soke2(i) bafa = 0 } next return *接続要求 tcpwait soke : if stat = 1 : gosub *接続受付 return *接続受付 tcpaccept soke2(人数),soke if stat != 0 : cls :mes "正しいソケットが指定されていません。":wait 180 :end if stat = 0 : 人数 + 1 return

クライアント


#include "pcbnet2.as" TITLE "クライアント" IP = "127.0.0.1" port = 40000 bafa = 0 ;受信バッファ格納 jusin= "" send = "" mes "IP" input IP,100,20,16 mes "ポート" input port,100,20,16 objsize 120,24 button goto "接続",*接続 stop *接続 isip ""+IP+"" : if stat = 0 : cls : mes ""+IP+"はIPではありません" :wait 180 :end if IP = "" : cls : mes "接続先IPを入力してください" : wait 180 :end cls : mes ""+IP+"へ接続しています・・・" tcpopen soke,""+IP+"",port if stat = 0 : goto *接続中 if stat != 0 : cls : mes "エラーが発生しました" : wait 180 :end *接続中 tcpiscon soke if stat = 2 : cls : mes "エラーが発生しました" :wait 180 :end if stat = 1 : cls : mes "接続した" : input send,100,20,10 :button gosub "送信",*送信 :goto *メインループ wait 0 goto *接続中 *メインループ await 0 gosub *受信 goto *メインループ *送信 tcpput ""+send+"",soke return *受信 tcpcount bafa,soke if bafa >= 1 { tcpget jusin,bafa+1,soke mes ""+jusin+"" bafa = 0 } return



ウチすけ

リンク

2008/9/30(Tue) 15:57:25|NO.19880

配列変数の送受信ってできますか?



s

リンク

2008/9/30(Tue) 18:19:52|NO.19881

やってみるといいのでは?
自分で調べられそうなものは実際にしてみるといいですよ!



kossgong

リンク

2008/9/30(Tue) 18:33:44|NO.19882

""+send+""を書き換えればできます。



ウチすけ

リンク

2008/10/13(Mon) 14:20:38|NO.20097

>kossong様
定期テストのため返信が遅れました。

試しましたが、わからないので教えてください。

1配列変数をまとめて送信するには・・・。
たとえばX(1)とX(0)の二つを同時にそう受信できるように出来ますか?

2データの送信元がわかるようにしたい。
シューティングなので座標をリアルタイムで送信させましたが、どれがどの座標かわからなくなってしまいます。



kossgong

リンク

2008/10/14(Tue) 18:57:05|NO.20154

>>ウチすけさん
>配列変数をまとめて送信
配列変数はそんな扱った事ないから良く分からないですねぇ・・・。
配列変数のデータを一つの変数に詰めて送信すればできるような気もする。

>データの送信元がわかるようにしたい。
まだそのレベルには達していない自分orz
サーバに接続してきた時に、接続してきたクライアントにIDを送信し、
クライアントが座標などを送信するデータにIDを付けてサーバに送信した後、サーバでIDの部分を抜き出せばできる予感。



ウチすけ

リンク

2008/10/16(Thu) 17:01:22|NO.20239

>>kossong様
IDをつけるやり方でやってみました。オンラインなので、簡易会員登録を可能にしてテストで動かしたのですが、"ID,パスワード"を送信させて、文字列操作系の命令を使用して分離させようとしましたが、どの命令を使えばいいかわかりません。
ご教授願います。



kossgong

リンク

2008/10/16(Thu) 19:36:45|NO.20254

>>ウチすけさん
strmidでできるかと。
でもstrmidにバグがあるとかどこかで聞いたような気も^q^



ウチすけ

リンク

2008/10/16(Thu) 22:48:50|NO.20269

>strmid
それだとIDとパスワードそれぞれの文字数がわからないと抜けないんです。
最大はそれぞれ8文字何ですがね。



GENKI

リンク

2008/10/16(Thu) 23:41:02|NO.20275

> "ID,パスワード"を送信させて、文字列操作系の命令を使用して
> 分離させようとしましたが、どの命令を使えばいいかわかりません。

ヘルプブラウザでstrmidを検索すると、検索結果のなかに、instrがあります。あと必要なのはstrlenでしょうか。
文字列操作関数はそれほど多くないのであらかじめどんな命令が用意されているか見ておくといいでしょう。

あとはパズルみたいなもので…。
データがカンマ区切りなら、カンマの位置を探してその位置を基準に文字列を切り出せばいいわけです。

いっそcsvstrという手もあります。


関連資料です。どうぞ。
HSP開発wiki - String
http://hspdev-wiki.net/?String


> でもstrmidにバグがあるとかどこかで聞いたような気も^q^

これでしょうか?
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200707/07090030.txt

それとも2バイト文字を途中でぶった切った場合の話かな?
これについてはバグというよりヘルプの記述に問題があります。
文字数と書いてありますが、実際は2バイト文字1文字は2文字相当です。
ヘルプを正とすればバグと言えそうですね。



ウチすけ

リンク

2008/10/17(Fri) 21:03:58|NO.20289

よく考えたらIDとパスワード認証は"ID,パスワード"で管理すればわざわざ分離の必要性がなくなるんですね。
もう一つ別の質問。
HSPで作ったソフトをタスクトレイで実行させることは可能なのでしょうか?
可能ならサーバープログラムをタスクトレイで実行させます。



flory

リンク

2008/10/18(Sat) 00:44:40|NO.20295

>HSPで作ったソフトをタスクトレイで実行させることは可能なのでしょうか?

結論から言わせてもらえば、可能です。


この掲示板の一番下、サイト内検索で「タスクトレイ」と検索してみてください。過去ログに同じ質問がありますから。

それだけでは不満足だというなら、Googleで「HSP タスクトレイ」とでも検索してみてください。



ウチすけ

リンク

2008/10/30(Thu) 13:25:00|NO.20497

お久しぶりです。
ゲーム開発を進行していますがある問題が発生し、一部データはサーバーを経由させずにクライアント間を直接やりとりさせることになりました。
サーバー間とクライアント間のデータのやり取りを切り替える方法を教えてください。



SYAM

リンク

2008/10/30(Thu) 14:06:30|NO.20499

どちらかのクライアントが、その通信のためのサーバーになるだけで後は普通に…



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