質問内容
二つの物体body,body2がありますが、bodyにだけ速度を適用して移動させたいのですがなぜかbody2にも適用されてしまい片方だけ移動するということがでません。これはなぜでしょうか?
提示画像のように画面の中央から始まって片方だけ右に移動するはずがなぜか両方とも右に移動してしまいます。
知りたいこと
bodyにだけ速度を適用したい
調べたこと、試したこと
下記のサイトを参考にリファレンスを参照
body2にも別の速度を適用して試しました。
座標を表示して二つ移動しているつまり問題点が座標であることを確認
chatGDTを活用
下記のコンソールログを表示してbody,body2が別のものを参照しているか確認、
利用しているライブラリ
box2D: https://box2d.org/documentation/
dxlib: https://dxlib.xsrv.jp/dxfunc.html
SetLinearVelocity() : https://box2d.org/documentation/classb2_body.html#a832f3989a44f0d4782c80456832197ad
提示画像
コンソールログ
00000209A36FF540 00000209A36FF600 Hit 200.08 400.086 200.205 400.212 200.35 400.359 200.505 400.515 200.667 400.677 200.83
該当のソースコード
cpp
1#include <DxLib.h> 2#include <iostream> 3#include <box2D/Box2D.h> 4 5class MyContactListener : public b2ContactListener { 6 void BeginContact(b2Contact* contact) { 7 // 二つの物体が接触したときの処理 8 b2Fixture* fixtureA = contact->GetFixtureA(); 9 b2Fixture* fixtureB = contact->GetFixtureB(); 10 // 物体Aと物体Bの情報を使って処理を行う 11 12 std::cout << "Hit" << std::endl; 13 } 14}; 15 16 17// プログラムは WinMain から始まります 18int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 19{ 20 21 FILE* fp; 22 AllocConsole(); 23 freopen_s(&fp, "CONOUT$", "w", stdout); 24 freopen_s(&fp, "CONOUT$", "w", stderr); 25 26 27 ChangeWindowMode(TRUE); 28 SetDrawScreen(DX_SCREEN_BACK); 29 SetGraphMode(800, 600, 32); 30 if (DxLib_Init() == -1) // DXライブラリ初期化処理 31 { 32 return -1; // エラーが起きたら直ちに終了 33 } 34 35 36 b2Vec2 gravity(0.0f, 9.8f); // 重力ベクトル 37 b2World world(gravity); 38 39 MyContactListener myContactListener; 40 world.SetContactListener(&myContactListener); 41 42 // ボディの設定 43 b2BodyDef bodyDef; 44 bodyDef.type = b2_dynamicBody; // 動的ボディ 45 bodyDef.position.Set(200.0f, 200.0f); // 初期位置 46 47 b2BodyDef bodyDef2; 48 bodyDef2.type = b2_dynamicBody; // 動的ボディ 49 bodyDef2.position.Set(400.0f, 200.0f); // 初期位置 50 51 // ボディを世界に追加 52 b2Body* body = world.CreateBody(&bodyDef); 53 b2Body* body2 = world.CreateBody(&bodyDef2); 54 55 56 57 // ボックスの形状を設定 58 b2PolygonShape dynamicBox; 59 b2PolygonShape dynamicBox2; 60 dynamicBox.SetAsBox(100.0f, 100.0f); // 幅と高さ 61 dynamicBox2.SetAsBox(100.0f, 100.0f); // 幅と高さ 62 63 // ボディに形状を追加 64 body->CreateFixture(&dynamicBox, 1.0f); // 密度 65 body2->CreateFixture(&dynamicBox2, 1.0f); // 密度 66 67 std::cout << body << std::endl; 68 std::cout << body2 << std::endl; 69 70 while (CheckHitKey(KEY_INPUT_ESCAPE) == 0) 71 { 72 ClearDrawScreen(); 73 74 b2Vec2 velocity(10.0f, 0.0f); // X方向に5.0の速度 75 b2Vec2 velocity2(0.0f, 0.0f); // X方向に5.0の速度 76 77 // ボディに初速度を設定 78 body->SetLinearVelocity(velocity); 79 //body2->SetLinearVelocity(velocity2); 80 81 // b2Vec2 force(1000000.0f, 0.0f); 82 // body->ApplyForceToCenter(force, true); 83 84 85 // Box2Dのステップを進める 86 world.Step(1.0f/ 60.0f, 8, 3); 87 88 b2Vec2 body1pos = body->GetPosition(); 89 b2Vec2 body2pos = body2->GetPosition(); 90 91 std::cout << body1pos.x << std::endl; 92 std::cout << body2pos.x << std::endl; 93 std::cout <<std::endl; 94 95 // ボディの位置を取得 96 DrawBox(body1pos.x,body1pos.y,body1pos.x +100,body1pos.y + 100, GetColor(0, 255, 0),TRUE); 97 DrawBox(body2pos.x,body2pos.y,body2pos.x + 100,body2pos.y + 100, GetColor(255, 0, 0),TRUE); 98 // ボックスを描画位置に設定 99 100 101 102 ScreenFlip(); 103 } 104 105 DxLib_End(); // DXライブラリ使用の終了処理 106 107 return 0; // ソフトの終了 108}
回答1件
あなたの回答
tips
プレビュー