2Dゲーム制作で物理演算による誤差の修正方法が知りたい

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 << fixtureA->GetBody()->GetPosition().x << std::endl;13 std::cout << fixtureB->GetBody()->GetPosition().x << std::endl;14 15 std::cout << "Hit" << std::endl;16 }17};18 19const float size = 50;20// プログラムは WinMain から始まります21int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)22{23 24 FILE* fp;25 AllocConsole();26 freopen_s(&fp, "CONOUT$", "w", stdout);27 freopen_s(&fp, "CONOUT$", "w", stderr);28 29 30 ChangeWindowMode(TRUE);31 SetDrawScreen(DX_SCREEN_BACK);32 SetGraphMode(800, 600, 32);33 if (DxLib_Init() == -1) // DXライブラリ初期化処理34 {35 return -1; // エラーが起きたら直ちに終了36 }37 38 39 b2Vec2 gravity(0.0f, 0.0f); // 重力ベクトル40 //b2Vec2 gravity(0.0f, 9.8f); // 重力ベクトル41 b2World world(gravity);42 43 MyContactListener myContactListener;44 45 // ボディの設定46 b2BodyDef bodyDef;47 bodyDef.type = b2_dynamicBody; // 動的ボディ48 bodyDef.position.Set(200.0f, 200.0f); // 初期位置49 50 b2BodyDef bodyDef2;51 bodyDef2.type = b2_dynamicBody; // 動的ボディ52 bodyDef2.position.Set(400.0f, 200.0f); // 初期位置53 54 // ボディを世界に追加55 b2Body* body = world.CreateBody(&bodyDef);56 b2Body* body2 = world.CreateBody(&bodyDef2);57 58 59 60 // ボックスの形状を設定61 b2PolygonShape dynamicBox;62 b2PolygonShape dynamicBox2;63 dynamicBox.SetAsBox(size, size); // 幅と高さ64 dynamicBox2.SetAsBox(size, size); // 幅と高さ65 66 // ボディに形状を追加67 b2Fixture *fix = body->CreateFixture(&dynamicBox, 1.0f); // 密度68 b2Fixture *fix2 = body2->CreateFixture(&dynamicBox2, 1.0f); // 密度69 fix->SetDensity(0.0);70 fix2->SetDensity(0.0);71 72 std::cout << body << std::endl;73 std::cout << body2 << std::endl;74 75 world.SetContactListener(&myContactListener);76 while (CheckHitKey(KEY_INPUT_ESCAPE) == 0)77 {78 ClearDrawScreen();79 80 b2Vec2 velocity(100.0f, 0.0f); // X方向に5.0の速度81 b2Vec2 velocity2(-100.0f, 0.0f); // X方向に5.0の速度82 83 // ボディに初速度を設定84 body->SetLinearVelocity(velocity);85 body2->SetLinearVelocity(velocity2);86 87 // b2Vec2 force(1000000.0f, 0.0f);88 // body->ApplyForceToCenter(force, true);89 90 91 // Box2Dのステップを進める92 world.Step(1.0f/ 60.0f, 8, 3);93 94 b2Vec2 body1pos = body->GetPosition();95 b2Vec2 body2pos = body2->GetPosition();96 97 std::cout << fix->GetBody()->GetPosition().x << std::endl;98 std::cout << body2pos.x << std::endl;99 std::cout <<std::endl;100 101 102//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////103 104 // ボディの位置を取得105 DrawBox(ceil(body1pos.x - size) ,ceil(body1pos.y - size),ceil(body1pos.x + size),ceil(body1pos.y + size), GetColor(255, 0, 0),TRUE);106 DrawBox(ceil(body2pos.x - size) ,ceil(body2pos.y - size),ceil(body2pos.x + size),ceil(body2pos.y + size), GetColor(0, 255, 0),TRUE);107 // ボックスを描画位置に設定108//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////109 110 111 112 113 ScreenFlip();114 }115 116 DxLib_End(); // DXライブラリ使用の終了処理117 118 return 0; // ソフトの終了 119}

コメントを投稿

0 コメント