質問1.提示画像の通り最初はプレイヤー居るのですが数秒たつと画面からいなくなり上のデバッグ用のpos座標のY軸の値がバグりますこれは何をしたのでしょうか?また描画は触っていないので提示コードには載せていません。
質問2、スマートポインタも何かしらの不具合を起こすのでしょうか?
一番怪しいのはCollision_Update(){}のposだと思い移動済みの値を見るためのfutureで値を作りそれを最後にposに入れているのですが何を
したかわかりません。デバッグログを表示させましたが確かに値がおかしくなってます。
※追記
future変数を値型にしたら正常に動くのですがなぜ参照にするとこのような現象が起きるのでしょうか?問題は解決しておりますが参照型にすると起きるので原因が気になります。
#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); } /*-------------------------------------------------------------*/
とりあえず、C++において、new/deleteを使ってはいけませんと申し上げましょう。スマートポインタを使うように(std::unique_ptrとか)書き換えてください。それはそれとしてCollision_Updateは悪くなさそうなんだけどなぁ・・・
ポインタ変数をすべてstd::unique_ptrに変更しました。質問を編集しました。以前として同じ現象が変わりません。座標はCollision_Update()しか触ってないのでどうしてもここしか考えられないのですが僕は何をしたのでしょうか?
ソースを拝見するだけでは原因が分かりそうにないですね。
きっとFind_Cell関数で抜けがあるように思えます。
> C++において、new/deleteを使ってはいけません
これは古い考え方なので保守性に欠けるという一面もありますが、私個人としてははnew/deleteがしっかり出来るのならわざわざ禁止する意味はないと思います。
そうですか 値になると動いて参照にすると発生する理由が知りたいです。
回答2件
あなたの回答
tips
プレビュー