ページ 11

移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月26日(水) 22:52
by 史上最悪のデスペナ
3D移動です

DxLibなのですが

コード:

VECTOR Speed_Vec = VGet( 0.0f, 0.0f, 1.0f );//基本速度ベクトル
VECTOR Accel_Vec = VGet( 0.0f, -1.0f, 0.0f );//重力加速度

if(KeyBuf[KEY_INPUT_W] == 1)
{
	//a->PC_C.Speedは実際の速度ベクトル。a->PC_S.y_rはキャラの回転度
	a->PC_C.Speed = VTransform( Speed_Vec, MGetRotY(a->PC_S.y_r-PHI_F) );
} else 
{
	a->PC_C.Speed = VGet( 0.0f, 0.0f, 0.0f );
}
if(KeyBuf[KEY_INPUT_SPACE] == 1)
{
	JumpKey++;
} else {
	JumpKey = 0;
}

if( MapHit[0].HitNum >= 1 )
{
	if( JumpKey == 1 )
	{
		a->PC_C.Speed = VAdd( a->PC_C.Speed, VGet(0.0f,0.3f,0.0f) );
	}
} else {
	a->PC_C.Speed = VAdd( a->PC_C.Speed, Accel_Vec );
}
a->PC_S.Pos = VAdd( a->PC_S.Pos, a->PC_C.Speed );
としているのですが、ジャンプを行うと
0.0001fぐらいずつ上昇し、(Y座標の表示値の変化がはっきりわかる程度のスピード)ウィンドウを消そうとするとログファイルがすごいことになります

34110:ソフトを終了する準備が整いました
34121:フォントの初期化を行います
34123:フォントの初期化は正常に終了しました
34143:Direct3DDevice9 の解放 3
34216:Direct3D9 DLL の解放 4
34221:DirectInput 関連の終了処理... 完了
34233:DirectSound の終了処理は正常に終了しました
34270:
34271:Alloc memory dump
34272: size: 76000( 74.219kb) file:ain\DxModel.cpp line:28957 ID:42243 addr:38d3fd98 data:<................> [01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00]
34273: size: 76000( 74.219kb) file:ain\DxModel.cpp line:28957 ID:42241 addr:38d2d440 以下略

結果、ログファイルのサイズが1415KBなどと凄いサイズになります
このログはどういうことなんでしょうか?

また、うまくジャンプさせるにはどうしたらいいのでしょうか?

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月26日(水) 22:58
by みけCAT
おそらくメモリリークです。
どこか別のところに原因があるのではないでしょうか?
例えば、モデルを毎フレームロードしているとか?

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月26日(水) 23:10
by 史上最悪のデスペナ
みけCAT さんが書きました:例えば、モデルを毎フレームロードしているとか?
ロード自体はしていませんが、毎フレームそのモデルをコピーして新しいモデルを作って、破棄してとしています。
これは、付近のキャラの数が変動するので、付近のキャラの数の分だけモデルをコピーしているからです

また、今まではX,Y,Zそれぞれにおいて変化量を足すという手法をとっていましたが、その時はジャンプも一応できていました。もちろん、エラーもありませんでした

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 05:06
by へにっくす
史上最悪のデスペナ さんが書きました:ロード自体はしていませんが、毎フレームそのモデルをコピーして新しいモデルを作って、破棄してとしています。
ちゃんと破棄しているのかコードがないので分かりませんが、
少なくとも

コード:

34271:Alloc memory dump
34272: size: 76000( 74.219kb) file:ain\DxModel.cpp line:28957 ID:42243 addr:38d3fd98 data:<................> [01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00]
34273: size: 76000( 74.219kb) file:ain\DxModel.cpp line:28957 ID:42241 addr:38d2d440 以下略
ain/DxModel.cppの28957行めあたりで確保しているメモリが解放されていないのでしょう。
そもそもいきなりウィンドウを閉じる処理でその破棄処理はありますかね?
そこを注意してみてください。

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 07:21
by 史上最悪のデスペナ
そもそも、DxModel.cppってなんなんでしょう?自作ファイルではないのですが・・・・・・・・・

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 09:50
by TOMY
史上最悪のデスペナ さんが書きました:そもそも、DxModel.cppってなんなんでしょう?自作ファイルではないのですが・・・・・・・・・
http://www.google.co.jp/#hl=ja&safe=off ... 5_func.htm

http://www.aexe.net/DxlibH_305_func.htm

http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=1085
ググったらそれっぽいのが一発で出てきました。

とりあえずまずはググってみたらいいんじゃないかな?
それでだめなら聞くしかないんだろうけど。

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 10:04
by 史上最悪のデスペナ
貼ってくださったリンクは既に見たのですが、全然わかりませんでした

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 11:04
by softya(ソフト屋)
DxModel.cppはDXLIBのソースの中にあります。DXLIBはソースも公開してますので、その中を見れば分かりますよ。
まぁメモリリークと言うことなので何かいけない事をしているんでしょうね。ジャンプは関係ないと思います。

プログラムも大きくなってくるとバグとの戦いです。今後は、こういう悩みが増えるでしょう。

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 16:14
by 史上最悪のデスペナ
史上最悪のデスペナ さんが書きました:

コード:

if( MapHit[0].HitNum >= 1 )
{
    if( JumpKey == 1 )
    {
        a->PC_C.Speed = VAdd( a->PC_C.Speed, VGet(0.0f,0.3f,0.0f) );
    }
} else {
    a->PC_C.Speed = VAdd( a->PC_C.Speed, Accel_Vec );
}
地面にあたっていない状態でSpaceキーを押しているから・・・・・・・?でした
それだとJumpkeyは0のままのはずなのに・・・・・・
よくわからないけど治りました。

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 16:16
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:
史上最悪のデスペナ さんが書きました:

コード:

if( MapHit[0].HitNum >= 1 )
{
    if( JumpKey == 1 )
    {
        a->PC_C.Speed = VAdd( a->PC_C.Speed, VGet(0.0f,0.3f,0.0f) );
    }
} else {
    a->PC_C.Speed = VAdd( a->PC_C.Speed, Accel_Vec );
}
地面にあたっていない状態でSpaceキーを押しているから・・・・・・・?でした
それだとJumpkeyは0のままのはずなのに・・・・・・
よくわからないけど治りました。
メモリリークも直ったんですか?
それだとメモリ破壊を疑ったほうが良いと思いますが。

【補足】
「ウヤムヤのうちにバグを取ると後で必ず悪いタイミング再発する法則」
の言葉を送っておきます。

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 16:30
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:メモリリークも直ったんですか?
それだとメモリ破壊を疑ったほうが良いと思いますが。

【補足】
「ウヤムヤのうちにバグを取ると後で必ず悪いタイミング再発する法則」
の言葉を送っておきます。
もしかしたら、
ほかのプレイヤーの表示がおかしい
今回のよくわからないまま治ったメモリリーク
今までよくわからないままバグ
は繋がっている可能性が・・・・・・・・?
潜在的なものなので何かあるとエラーがすぐに出るのでしょうか。

何か、いい解決方法はありませんか?
隠れたバグを見つけるとか、修復するとか

↑新しいトピとします

Re: 移動で(加)速度ベクトルでの考え方がうまくいかない

Posted: 2012年9月27日(木) 16:36
by softya(ソフト屋)
メモリ破壊の状況では何が起こっても不思議ではないでしょうね。
おかしくなる原因を探らない限り永遠に苦しめられると思います。

つまり、バグが出ている間にバグを潰すのが一番です。
バグをウヤムヤに修正すると原因不明なままとなります。

潰し方:ポインタの値のチェック処理を作る。
配列範囲外にならないように添字チェックを全部に埋め込む。
その他に例外値の検出処理を埋め込む。
破壊ポイントが明確ならデバッカのデータブレークを利用する。

私のRPG講座でも例外のチェックを必ずするように書いています。
そのぐらい自分のために必要なことですよ。