🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

2回答

1347閲覧

Dxlib 毎フレームでメモリを確保するという行為は危険なのでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2019/11/23 13:44

編集2019/11/24 11:14

質問1.提示画像の通り最初はプレイヤー居るのですが数秒たつと画面からいなくなり上のデバッグ用のpos座標のY軸の値がバグりますこれは何をしたのでしょうか?また描画は触っていないので提示コードには載せていません。
質問2、スマートポインタも何かしらの不具合を起こすのでしょうか?

一番怪しいのはCollision_Update(){}のposだと思い移動済みの値を見るためのfutureで値を作りそれを最後にposに入れているのですが何を
したかわかりません。デバッグログを表示させましたが確かに値がおかしくなってます。

※追記
future変数を値型にしたら正常に動くのですがなぜ参照にするとこのような現象が起きるのでしょうか?問題は解決しておりますが参照型にすると起きるので原因が気になります。

デバッグログの Log.txt
イメージ説明
![イメージ説明]

#include "DxLib.h" #include <vector> #include <math.h> #include <fstream> #include "string.h" #include <iostream> #include "frame.h" #include <memory> #define DEBUG 1//デバッグ有効 1 std::ofstream ofs("Log.txt"); #define CELL ((int)64)//マス目 /*速度関係*/ #define MOVE 5.0f;//移動速度 /*重力関係*/ #define GRAVITY_FORCE -2//減る数 #define GRAVITY_MAX -10//最大落下速度 float gravity = 0;//落下重力/ /*ジャンプ関係*/ float jump; class game { private:/*デバッグ用*/ #if DEBUG int t = 0; #endif private: enum class key{ Up, Down, Left, Right, Jump,//spaceキー Invalid,//無効 }; class Position { public: float x; float y; Position() { x = 0.0f; y = 0.0f; } /* Position operator + (Position p) { //this + p; // return p; } */ }; std::unique_ptr<Position> pos;//座標////////////////////////////////////////// std::unique_ptr<Position> move;//移動係数///////////////////////////////////// key *State;//キー状態 public: int map[100][100] = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, }; int player_graph[10]; int map_graph[40]; bool isGround; int rev; bool jump = false; int aniClip;//アニメ番号管理 game(): pos(std::make_unique<Position>()), move(std::make_unique<Position>()) { pos->x = 100.0f; pos->y = 0.0f; State = new key; rev = 0; aniClip = 0; isGround = false; LoadDivGraph("mario_resource/Mario_64px.png", 7, 7, 1, 64, 64, player_graph); LoadDivGraph("mario_resource/Block_64px.png",40,10,4,64,64,map_graph); } /*Yの符号を逆にする関数*/ float rev_y(float t) { return t * -1.0f; } /*等速直線運動のY 落下 return マイナスの値*/ float gravity_force() { if ( gravity > GRAVITY_FORCE ) { gravity += -3; return gravity; } else { return gravity = GRAVITY_MAX; } } /*キー入力*/ void key_Update() { if (keybord(KEY_INPUT_LEFT) > 0)//← { DrawFormatString(100, 100, GetColor(255, 255, 255), "Left", true); move->x = -1; *State = key::Left; }else if (keybord(KEY_INPUT_RIGHT) > 0)//→ { move->x = 1; *State = key::Right; }else if (keybord(KEY_INPUT_UP) > 0)//上 { *State = key::Up; }else if (keybord(KEY_INPUT_DOWN) > 0)//下 { *State = key::Down; }else if (keybord(KEY_INPUT_SPACE) > 0)//ジャンプ { *State = key::Jump; }else//何も押していない時 { *State = key::Invalid; } } int d; /*移動処理*/ void Move() { if (*State == key::Left) { move->x = move->x * MOVE; }else if (*State == key::Right) { move->x = move->x * MOVE; } else if (*State == key::Invalid)//左右に動いてないとき { move->x = 0; } move->y += rev_y(gravity_force()); //d = move->x; } /*セル検索 衝突時: true */ bool Find_Cell(Position *p) { int px = (int)p->x / CELL; int py = (int)p->y / CELL; if(map[py][px] == 1) { return true; }else{ return false; } } int dd = 0; /*---------------------------------------------------当たり判定----------------------------------------------------------------*/ void Collision_Update() { //Position* future = new Position(); std::unique_ptr<Position> future(std::make_unique<Position>());///////////////////////// future->x = pos->x; future->y = pos->y; /* p->x = future->x + move->x; p->y = future->y + gravity_force(); p2->x = future->x + move->x; p2->y = future->y + gravity_force(); */ /*X 補正*/ /*-----------------Right---------------*/ if (*State == key::Right) { Position p; p.x = future->x + move->x + CELL; p.y = future->y; if (Find_Cell(&p) == true) { dd = 1; int px = ((int)p.x / CELL) * CELL; px -= CELL;//マイナス future->x = px; } else { Position p2; p2.x = future->x + move->x + CELL; p2.y = future->y + CELL; if (Find_Cell(&p2) == true && isGround == false) { int px = (p2.x / CELL) * CELL; px += rev_y(CELL);//マイナス future->x = px; } else {//当たっていないときX future->x += move->x; } } } /*-----------------Left-----------------*/ if (*State == key::Left) { Position p; p.x = future->x + move->x; p.y = future->y; if (Find_Cell(&p) == true) { int px = ((int)p.x / CELL) * CELL; px += CELL; future->x = px; } else { Position p2; p2.x = future->x + move->x; p2.y = future->y + CELL; if (Find_Cell(&p2) == true && isGround == false) { int px = ((int)p2.x / CELL) * CELL; px += CELL; future->x = px; } else {//当たっていないときX } future->x += move->x; } } /*--------------重力-----*/ // Position* p = new Position(); Position p; p.x = future->x; p.y = future->y + move->y; p.y += CELL; if (Find_Cell(&p) == true) { int py = ((int)p.y / CELL) * CELL; py += rev_y(CELL); future->y = py; isGround = true; } else { p.x += CELL; if (Find_Cell(&p) == true) { int py = ((int)p.y / CELL) * CELL; py += rev_y(CELL); future->y = py; isGround = true; } else {//当たってないときY if (isGround == false) { future->y += move->y; } //isGround = false; } } ofs << "future-> : " << future->x << " , " << future->y << std::endl; *pos = *future; } /*-------------------------------------------------------------------------------------------------------------------------*/ /*-----------------------------計算----------------------------*/ void const Update() { key_Update(); Move(); Collision_Update(); DrawFormatString(0,0,GetColor(255,255,255),"Pos: %.2f , %.2f",pos->x,pos->y,true); DrawFormatString(200,0,GetColor(255,255,255),"frame: %d",Fps::now(),true); DrawFormatString(200, 100, GetColor(255, 255, 255), "move: %.2f", move->x, true); //DrawFormatString(100, 100, GetColor(255, 255, 255), "Right", true); DrawFormatString(100, 100, GetColor(255, 255, 255), "%d",dd, true); } /*-------------------------------------------------------------*/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2019/11/23 14:03

とりあえず、C++において、new/deleteを使ってはいけませんと申し上げましょう。スマートポインタを使うように(std::unique_ptrとか)書き換えてください。それはそれとしてCollision_Updateは悪くなさそうなんだけどなぁ・・・
退会済みユーザー

退会済みユーザー

2019/11/24 04:23

ポインタ変数をすべてstd::unique_ptrに変更しました。質問を編集しました。以前として同じ現象が変わりません。座標はCollision_Update()しか触ってないのでどうしてもここしか考えられないのですが僕は何をしたのでしょうか?
stdio

2019/11/25 01:23

ソースを拝見するだけでは原因が分かりそうにないですね。 きっとFind_Cell関数で抜けがあるように思えます。 > C++において、new/deleteを使ってはいけません これは古い考え方なので保守性に欠けるという一面もありますが、私個人としてははnew/deleteがしっかり出来るのならわざわざ禁止する意味はないと思います。
退会済みユーザー

退会済みユーザー

2019/11/25 02:36

そうですか 値になると動いて参照にすると発生する理由が知りたいです。
guest

回答2

0

ベストアンサー

C#

1/*等速直線運動のY 落下 return マイナスの値*/ 2float gravity_force() { 3 if ( gravity > GRAVITY_FORCE ) { 4 gravity += -3; 5 return gravity; 6 } else { 7 return gravity = GRAVITY_MAX; 8 } 9}

これは単なる私の勘だが、もしかしたら、とある時間を境にgravityの値が吹き飛んでいないかい?
GRAVITY_MAXの定義値がコメントアウトされていて、gravityの値が制御出来ていない気がする。
本来はgravityの値は固定なはずだ。

投稿2019/11/25 07:17

編集2019/11/25 07:18
stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/25 11:51 編集

指摘された関数の定義を return -10.0f;だけにしてmove.y += rev_y(gravity_force());を  = に変換したら動きました!
stdio

2019/11/26 03:08

ベストアンサーありがとうございます。 なぜgravityを変えたのか... そう、きっとジャンプしたかったのね...
guest

0

move->y の値も調べてみてください.
この値はmove()内でどんどん更新されているように見えますが,
絶対値がどんどん増大したりせずに想定内の値に収まっていますか?

投稿2019/11/25 05:33

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/25 06:43

収まっています。バグではなく参照型にすると発生します。値型にすると治るのでなぜバグるのかが知りたいのです。future変数
fana

2019/11/26 01:26 編集

別の回答はgravityの値が異常になるという指摘だけど,それを加算しつづけているように見えるmove->yの側が「想定内に収まっている」のならfuture,ひいてはposには影響ないように見えるけど…? (gravity → move->y → future → pos という道筋以外にgravityを直接参照する箇所があるのかな?) まぁ,よくわからないけど,解決したみたいなのでヨシ!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問