質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

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

Q&A

解決済

1回答

284閲覧

Box2Dライブラリ 一つの物体にだけ速度を適用する方法が知りたい

samidare_chan

総合スコア16

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

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

0グッド

0クリップ

投稿2023/12/10 23:38

編集2023/12/11 06:57

質問内容

二つの物体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}

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

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

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

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

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

fana

2023/12/11 06:35

何やらコンソールログに > Hit って出てるけど,それは本件とは関係ないのでしょうか? (そのライブラリのことは知りませんが,ぶつかったならば相応の何かが起きるのではなかろうか? と.)
samidare_chan

2023/12/11 06:49

velocityの値を0にしても表示されるため今回の件とは関係ないとも思います。
fana

2023/12/11 07:06

> velocityの値を0にしても表示される よくわからんですが,これが何故でてくるのか? というのを確認しなくて良いのでしょうか? 初期状態が既に「ぶつかっている状態」なのでは? という気もしますが. 物体のサイズ(?)を小さくするとか初期位置をもっとすっごい離してみるとかしても「Hit」って出てくるのか? 仮に出てこなくなったとして,その場合でも本件の問題が生じるのか? みたいな.
samidare_chan

2023/12/11 08:43

はい、原因はボディの大きさでした。100,100ではなく10,10にしたらぶつかったときに衝突してました。 しかしながら質問文の現象は解決しません。
guest

回答1

0

自己解決

原因

描画位置がずれている。

対処方法

ソースコードの

cpp

1// ボディの位置を取得 2 DrawBox(body1pos.x,body1pos.y,body1pos.x +100,body1pos.y + 100, GetColor(0, 255, 0),TRUE); 3 DrawBox(body2pos.x,body2pos.y,body2pos.x + 100,body2pos.y + 100, GetColor(255, 0, 0),TRUE);

の部分ですがbody1pos,body2posの座標は矩形の中央の座標なのでdxlibでは右上が0,0なのでそこを調整して以下のように行う必要ありました。

cpp

1 // ボディの位置を取得 2 DrawBox(body1pos.x - 100,body1pos.y - 100,body1pos.x + 100,body1pos.y + 100, GetColor(255, 0, 0),TRUE); 3 DrawBox(body2pos.x - 100 ,body2pos.y - 100,body2pos.x + 100,body2pos.y + 100, GetColor(0, 255, 0),TRUE);

投稿2023/12/11 09:01

samidare_chan

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問