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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
史上最悪のデスペナ
記事: 521
登録日時: 14年前

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

#1

投稿記事 by 史上最悪のデスペナ » 12年前

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などと凄いサイズになります
このログはどういうことなんでしょうか?

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 12年前

おそらくメモリリークです。
どこか別のところに原因があるのではないでしょうか?
例えば、モデルを毎フレームロードしているとか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

史上最悪のデスペナ
記事: 521
登録日時: 14年前

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

#3

投稿記事 by 史上最悪のデスペナ » 12年前

みけCAT さんが書きました:例えば、モデルを毎フレームロードしているとか?
ロード自体はしていませんが、毎フレームそのモデルをコピーして新しいモデルを作って、破棄してとしています。
これは、付近のキャラの数が変動するので、付近のキャラの数の分だけモデルをコピーしているからです

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

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

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

#4

投稿記事 by へにっくす » 12年前

史上最悪のデスペナ さんが書きました:ロード自体はしていませんが、毎フレームそのモデルをコピーして新しいモデルを作って、破棄してとしています。
ちゃんと破棄しているのかコードがないので分かりませんが、
少なくとも

コード:

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行めあたりで確保しているメモリが解放されていないのでしょう。
そもそもいきなりウィンドウを閉じる処理でその破棄処理はありますかね?
そこを注意してみてください。
written by へにっくす

史上最悪のデスペナ
記事: 521
登録日時: 14年前

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

#5

投稿記事 by 史上最悪のデスペナ » 12年前

そもそも、DxModel.cppってなんなんでしょう?自作ファイルではないのですが・・・・・・・・・

アバター
TOMY
記事: 53
登録日時: 13年前
住所: 愛知県
連絡を取る:

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

#6

投稿記事 by TOMY » 12年前

史上最悪のデスペナ さんが書きました:そもそも、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
ググったらそれっぽいのが一発で出てきました。

とりあえずまずはググってみたらいいんじゃないかな?
それでだめなら聞くしかないんだろうけど。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

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

#7

投稿記事 by 史上最悪のデスペナ » 12年前

貼ってくださったリンクは既に見たのですが、全然わかりませんでした

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 12年前

DxModel.cppはDXLIBのソースの中にあります。DXLIBはソースも公開してますので、その中を見れば分かりますよ。
まぁメモリリークと言うことなので何かいけない事をしているんでしょうね。ジャンプは関係ないと思います。

プログラムも大きくなってくるとバグとの戦いです。今後は、こういう悩みが増えるでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

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

#9

投稿記事 by 史上最悪のデスペナ » 12年前

史上最悪のデスペナ さんが書きました:

コード:

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のままのはずなのに・・・・・・
よくわからないけど治りました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#10

投稿記事 by softya(ソフト屋) » 12年前

史上最悪のデスペナ さんが書きました:
史上最悪のデスペナ さんが書きました:

コード:

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のままのはずなのに・・・・・・
よくわからないけど治りました。
メモリリークも直ったんですか?
それだとメモリ破壊を疑ったほうが良いと思いますが。

【補足】
「ウヤムヤのうちにバグを取ると後で必ず悪いタイミング再発する法則」
の言葉を送っておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

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

#11

投稿記事 by 史上最悪のデスペナ » 12年前

softya(ソフト屋) さんが書きました:メモリリークも直ったんですか?
それだとメモリ破壊を疑ったほうが良いと思いますが。

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

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

↑新しいトピとします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#12

投稿記事 by softya(ソフト屋) » 12年前

メモリ破壊の状況では何が起こっても不思議ではないでしょうね。
おかしくなる原因を探らない限り永遠に苦しめられると思います。

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

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

私のRPG講座でも例外のチェックを必ずするように書いています。
そのぐらい自分のために必要なことですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る