ページ 11

近況報告&教えてください

Posted: 2012年9月11日(火) 23:33
by 史上最悪のデスペナ
インするのを忘れてしまうので久しぶりのトピ立てです

近況報告
取り合えず、何とか他プレイヤーを(ちょっとだけ)画面に表示できるようになりました。こんな感じです
http://video.fc2.com/content/20120911SCEnUAmK
カメラの位置が低い、相手プレイヤーのモーションがないのは気にしないでくださいな
(ここで私信。softya(ソフト屋)さんへ。画面がおかしかったのはVC++2010のせいのようでした。フリーズするようになったので再インストールしたら画面も直りました


ついでに質問させていただきます。というか、VC++2010のバグが原因でないことを祈りたい。今日再インストールしたばっかなので
動画で、
1.VCから起動させたほうはちゃんと相手が見えるにも拘らず、.exeから起動したほうは相手キャラが見えません。
2.プレイヤーが相手プレイヤーから遠ざかると相手プレイヤーが浮かんでいくように見え、近づくと降りてくるように見える。しかし、実際の座標は変わってない
これはどうしてでしょうか

Re: 近況報告&教えてください

Posted: 2012年9月12日(水) 00:20
by softya(ソフト屋)
通信で起こる現象と何らかのプログラムバグが混じっている可能性がありますね。
それとVC++2010を入れなおして直ったバグは全コンパイルしたとかライブラリのリンクを間違いていたとか無いですか?

こういうややこしい問題は、原因を切り分けるために通信と同じ内容をファイルから入れた場合とか値を固定した場合などをチェックして見たほうが良いでしょう。
それとサーバーの通信テストも必要です、テスト用のクライアントを作成してクライアント1とクライアント2の相互で狙った値をサーバー経由で受け取っているかチェックする方法を考えてみてください。
なんにしてもサーバー絡みのものは通信データを時系列で取得してチェックするなどが基本です。マメにやりましょう。

【補足】
念の為に確認ですが1ループ中にカメラを何度か座標を変えていたりはしませんか? それをすると変な風に表示されても仕方ないのですが。

Re: 近況報告&教えてください

Posted: 2012年9月12日(水) 09:23
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:通信で起こる現象と何らかのプログラムバグが混じっている可能性がありますね。
それとVC++2010を入れなおして直ったバグは全コンパイルしたとかライブラリのリンクを間違いていたとか無いですか?
ライブラリのリンク自体は、バグが起こる直前までちゃんと動いていたので、それは大丈夫じゃないかと思います。
バグが起こる場合、大抵は
プログラムを編集→デバッグ→再度編集→バグ
もしくは
プログラムを編集→デバッグ→一旦終了→ほかのことをやった後再度起動→バグ
といった感じです
デフラグツールとかPCメンテナンス系を使った後もなったりするようです
softya(ソフト屋) さんが書きました:【補足】
念の為に確認ですが1ループ中にカメラを何度か座標を変えていたりはしませんか? それをすると変な風に表示されても仕方ないのですが。
1ループ中でプレイヤーの位置が完全に確定した時点でカメラ座標を決定しているので、何度も変えたりはしていません
softya(ソフト屋) さんが書きました:それとサーバーの通信テストも必要です、テスト用のクライアントを作成してクライアント1とクライアント2の相互で狙った値をサーバー経由で受け取っているかチェックする方法を考えてみてください。
単純に、コマンドプロンプトのような画面になるプログラムで
クライアント1は1、クライアント2は2を送信させて受信データを表示させる
クライアント1はHello, Client2、クライアント2はHello, Client1を送信させて受信データを表示させる
intとfloat混合型構造体に数値を代入(クライアント1と2で値は別)し、受信データを表示させる←実際のゲームで使用するのと同じ構造体
というのをこちらで質問する前にやってみましたが、大丈夫でした
なので、今度はゲーム画面に相手のデータ・自分のデータを表示させるようにしてみようと思います

Re: 近況報告&教えてください

Posted: 2012年9月12日(水) 11:15
by softya(ソフト屋)
比較しやすいように送信・受信をテキストログファイルに書きだすというのもやってみてくだださい。
その場合に送信データに連番を付加すると抜けとか順番の乱れなども検知できます。

Re: 近況報告&教えてください

Posted: 2012年9月12日(水) 21:44
by 史上最悪のデスペナ
史上最悪のデスペナ さんが書きました:なので、今度はゲーム画面に相手のデータ・自分のデータを表示させるようにしてみようと思います
1ループに一回表示させると比較が無理なので、60ループに一回更新するようにしたところ、同じデータを送受信していると思われました。
ちなみに、.exeのほうで表示されなかった件は解決しました。

コード:

sSendData *Data;
Data = new sSendData[OtherPCNum];//これを忘れていた
recv()
というオチでした
softya(ソフト屋) さんが書きました:比較しやすいように送信・受信をテキストログファイルに書きだすというのもやってみてくだださい。
その場合に送信データに連番を付加すると抜けとか順番の乱れなども検知できます。
了解です。

追伸
構造体を直接送信したほうが楽であり、
取り合えず「プログラムの最適化を一切考えずとにかくプログラムを完成させること」
を目標に作っているのでBYTE配列での送受信は現在はしておりません

Re: 近況報告&教えてください

Posted: 2012年9月12日(水) 22:02
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:比較しやすいように送信・受信をテキストログファイルに書きだすというのもやってみてくだださい。
連番自体はまだやっていませんが、データの比較の仕方が分かりません・・・・・・・

送信・・・・・・自身のデータ 88バイト
受信・・・・・・自身のデータ(サーバー側で計算した結果)+自身の周りのプレイヤーデータ 88×Aバイト
という風であり、
クライアントAとBの場合、受信したデータが毎回
クライアントA・・・・・・Aのデータ・Bのデータ
クライアントB・・・・・・Bのデータ・Aのデータ
の上、
同じPC上で手動で動かしているのでどちらか一方が最初のほうと最後のほうで地震のデータしか受信して無い部分があるため
どのように比較すればいいのか分かりませんでした

Re: 近況報告&教えてください

Posted: 2012年9月12日(水) 23:39
by softya(ソフト屋)
連番を付けないと比較で困ると思います。
それとsprintfなどしてテキストに変換してテキストログにしないとテキスト比較ソフトのwinMergeが等が使え無いですから困まると言う訳です。

Re: 近況報告&教えてください

Posted: 2012年9月13日(木) 19:53
by 史上最悪のデスペナ
何とかできました。sprintf部分で思ったように行かずに時間かかりましたが・・・・・

結果としては、チラッと見た限りでは大丈夫そうでした

結果はこちらです。今回必要な、
何回目の送信か、X座標、Y座標、Z座標
となっています。受信側は
自分の何回目の送信か、X座標、Y座標、Z座標、相手の(ry
となっています
Client1で受信側のデータで最初の60個近くの相手のデータで
すべて0なのは、
相手がゲームにインしてからキャラ作成をし・・・・・・
にかかった時間分、
プレイヤー自体はプレイしてないけどサーバー上はインしたことになっているためそのようなことになっています。

Re: 近況報告&教えてください

Posted: 2012年9月13日(木) 22:49
by softya(ソフト屋)
1)自分のデータを自分に送り返しているのが意味不明ですが、これの理由を教えて下さい。
2)相手のデータの座標系に異常は生じていないんでしょうか?空中に浮くんですよね?
3)あと相手と自分の送信通番は違うのではと言う疑問が生じました。これは表示していないんでしょうか?

Re: 近況報告&教えてください

Posted: 2012年9月13日(木) 23:24
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:1)自分のデータを自分に送り返しているのが意味不明ですが、これの理由を教えて下さい。
例えば、HPとかはサーバーにあるキャラデータなどから計算して値を返したいのですが、そういうのが入っている構造体中に位置情報も含まれているからです。
また、サーバーでキャラを強制移動とかさせることも視野に入れています
今回、他のプレイヤーキャラの位置がおかしいということで、受信データログには構造体中の位置座標のみを記録しました
softya(ソフト屋) さんが書きました:2)相手のデータの座標系に異常は生じていないんでしょうか?空中に浮くんですよね?
この送受信している値を、描画前にMV1SetPositionに代入しているため、同じように表示されるはずなんですが・・・・・・・・
softya(ソフト屋) さんが書きました:3)あと相手と自分の送信通番は違うのではと言う疑問が生じました。これは表示していないんでしょうか?
ごめんなさい。どういうことでしょう?
例えば、Client2のRecvData.txtの1行目で
1,0.000000,-0.081667,0.000000,63,0.000000,-0.540000,0.000000
これは、
Client2が1回目に送信した(X,Y,Z)=(0.000000,-0.081667,0.000000)
鯖に保存されたClient1が63回目に送信した(X,Y,Z)=(0.000000,-0.540000,0.000000)
という風になっています。


クライアント⇔サーバー間のやり取りとしては
クライアント→構造体送信→サーバーで何らかの処理(未実装)→サーバー内のクライアントデータを上書き→vectorで動的にプレイヤーの構造体、付近のほかのプレイヤーの構造体を入れる配列作成→配列の要素数送信→配列送信→クライアント
としています

Re: 近況報告&教えてください

Posted: 2012年9月14日(金) 00:01
by softya(ソフト屋)
>> 3)あと相手と自分の送信通番は違うのではと言う疑問が生じました。これは表示していないんでしょうか?
すいません勘違いでした。
史上最悪のデスペナ さんが書きました: この送受信している値を、描画前にMV1SetPositionに代入しているため、同じように表示されるはずなんですが・・・・・・・・
1) MV1SetPositionで本当に代入されているかを確認すること。
2) 第三者視点で client1 と client2 を表示させて見ること。このテキストをサーバーの受信代わりに入力してみる。
あたりでしょうか。

Re: 近況報告&教えてください(トピ保守中)

Posted: 2012年9月16日(日) 12:45
by 史上最悪のデスペナ
ネットの調子が悪いのと、自作プログラムの通信部分の不具合により、全然手がつけれていません。
どれだけかかるか分からないので、下のほうに埋もれないよう保守するために時々報告できたらと思います

Re: 近況報告&教えてください(トピ保守中)

Posted: 2012年9月16日(日) 13:13
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:ネットの調子が悪いのと、自作プログラムの通信部分の不具合により、全然手がつけれていません。
どれだけかかるか分からないので、下のほうに埋もれないよう保守するために時々報告できたらと思います
通信をしないでログのファイル入力でプレーヤー1と2を移動表示させるのをぜひ試してみてください。
通信側に問題があるのか、他に問題があるのかを切り分けできます。
訳の分からない問題はデータに問題があるのか、あるいはプログラムに問題があるのかをまず区別する必要があると思います。
なので簡易なプログラムを作成して同じデータを動かした時に問題が出ればデータの可能性が高いでしょう。
簡易なプログラムで問題が出なければ大きくなった既存のゲームプログラムに問題があるのでしょう。

簡易なプログラムを作る手間のほうが今のプログラムをあれこれひねくり回している時間よりも少なくて済みます。
それと簡易なテストプログラムは動いている実績のあるサンプルコードなどから構築してください(自分のコードを出来るだけ使わない)。
これはデータ構造の問題やメモリ破壊バグを引き継がないための措置です。

Re: 近況報告&教えてください

Posted: 2012年9月17日(月) 21:49
by 史上最悪のデスペナ
遅くなりました

自キャラ動かす
DataA.txtに保存
DataB.txtから読み込み
相手キャラ位置設定

という風にしたところ
問題なく動きました
ということは
softya(ソフト屋) さんが書きました:簡易なプログラムで問題が出なければ大きくなった既存のゲームプログラムに問題があるのでしょう。
ですね・・・・・・・・
頑張って探してみます

Re: 近況報告&教えてください

Posted: 2012年9月17日(月) 22:18
by softya(ソフト屋)
次はデータの破壊ポイントを探すことです。
1) 受信後に変化しないデータであれば、受信後にコピーを作成してモデルに設定される直前にコピーされているデータと比較して見る方法があります。
2) とりあえずのテストの中で起こりえるデータの値の範囲を想定してプログラムの動作中にデータが値の範囲を外れたら警告を表示するという手もあります。
チェック関数を作成してプログラムのあちこちから呼び出します。
この時、プログラムのどこで外れたか__LINE__で行番号とか__FUNCTION__で関数名なども表示すると分かりやすいでしょう。__LINE__や__FUNCTION__はチェック関数の呼び出し時に引数とします。

【補足】
デバッグ力というかバグを発見する能力はプログラミングする上で重要です。
完成するかどうかはバグが取れるかに掛かっているわけですから。
なのでテストは重要で、データの検証方法は常に考える必要があります。

まぁ、バグを出さないプログラムとバグを発見しやすいプログラムを組むのが一番重要なんですけどね。

Re: 近況報告&教えてください

Posted: 2012年9月19日(水) 20:29
by 史上最悪のデスペナ
最近リアルが忙しいので全然プログラミングができていませんが
ふと思ったことがあるので保守もかねて投下

自キャラが離れたときに
他プレイヤーが
地面を基準にしてみると・・・・・浮き上がって見える
ですが、
画面中心を基準にしてみると・・・・・・消失点に向かっていくように見える
という風なので、
もしかしたら自分のカメラの設定がおかしいということはないでしょうか。

Re: 近況報告&教えてください

Posted: 2012年9月19日(水) 21:22
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:最近リアルが忙しいので全然プログラミングができていませんが
ふと思ったことがあるので保守もかねて投下

自キャラが離れたときに
他プレイヤーが
地面を基準にしてみると・・・・・浮き上がって見える
ですが、
画面中心を基準にしてみると・・・・・・消失点に向かっていくように見える
という風なので、
もしかしたら自分のカメラの設定がおかしいということはないでしょうか。
わざと聞きますが、それを確認する方法は何かアイデアはありますか?
考えて幾つかアイデアを出してみてください。
ちょっと時間の合間に考えてメモっておけば良いです。

※ デバッグとは発想力が勝負である。

Re: 近況報告&教えてください

Posted: 2012年9月24日(月) 22:51
by 史上最悪のデスペナ
申し訳ありませんが、リアルでの都合によりゲーム作成は一旦停止となりそうです。
少しずつでも空いた時間にやっていく予定です。
おそらく、ですが代わりのプログラミングをすることになります。
分からないことがまたたくさん出てくると思うのでその時はよろしくお願いします

Re: 近況報告&教えてください

Posted: 2012年9月25日(火) 00:14
by softya(ソフト屋)
分かりました。
こちらはとりあえず解決にしておいてください。

ところで代わりのプログラムとは同様にゲームなのでしょうか?

Re: 近況報告&教えてください

Posted: 2012年9月25日(火) 09:33
by 史上最悪のデスペナ
いえ、ちょっと訳ありで完全に別物です。
シミュレーションプログラム、もしくは機械を動かすプログラムとなりそうです。
同時並行になりそうな予感が・・・・・・
ゲームプログラムをしたいのに。。。。。。。