「Android Studio」Dxライブラリで重力を考慮した物体の移動

今回は重力を考慮した物体の移動の実装をしたいと思います。空気抵抗などは考慮していません。

下記のファイルはengine.hというヘッダーファイルです。

物体の移動に関する関数はCircle構造体のtransfer関数で記述しています。

コメントアウトの部分は消してもらってもかまいません。

#include "DxLib.h"
#include <cmath>

using namespace std;

struct Vector2D
{
    double x;
    double y;

    Vector2D(double _x, double _y)
    {
        x = _x;
        y = _y;
    }

    Vector2D add(Vector2D v)
    {
        return Vector2D(x + v.x, y + v.y);
    }

    Vector2D mul(double _x, double _y)
    {
        return Vector2D(x * _x, y * _y);
    }

    int dot(Vector2D v)
    {
        return x * v.x + y * v.y;
    }

    int cross(Vector2D v)
    {
        return x * v.y - v.x * y;
    }

    double length()
    {
        return sqrt(x * x + y * y);
    }

    Vector2D unit()
    {
        return Vector2D(x / length(), y / length());
    }
};

struct Circle
{
    double x;
    double y;
    int radius;
    Vector2D velocity = Vector2D(0, 0);
    Vector2D accel = Vector2D(0, 0);

    Circle(double _x, double _y, int _r, Vector2D _v, Vector2D _a)
    {
        x = _x;
        y = _y;
        radius = _r;
        velocity = _v;
        accel = _a;
    }

    void transfer(Vector2D gravity)
    {
        /*if(type == Dynamic)*/
        {
            velocity = velocity.add(gravity);
            velocity = velocity.add(accel);
            //velocity = velocity.mul(deceleration, deceleration);
            x += velocity.x;
            y += velocity.y;
        }

    }
};

engine.hをインクルードして、以下のプログラムを実行します。

#include "DxLib.h"
#include "engine.h"
#include <thread>
#include <chrono>

// プログラムは android_main から始まります

int android_main( void )
{
    if( DxLib_Init() == -1 )		// DXライブラリ初期化処理
    {
        return -1 ;			// エラーが起きたら直ちに終了
    }

    SetGraphMode(1080, 2220, 32); //1080×2220にサイズ変更

    int light_b = GetColor(0, 255, 255);

    /*
    Line line1 = Line(300, 300, 500, 500);
    Line line2 = Line(500, 1000, 600, 1100);
    */

    Vector2D gravity = Vector2D(0, 0.98);

    Circle ball = Circle(0, 1000, 30, Vector2D(20, -20), Vector2D(0, 0));

    this_thread::sleep_for(std::chrono::milliseconds(5000));

    while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen()==0)
    {
        /*
        DrawLine(line1.x0, line1.y0, line1.x1, line1.y1, light_b, TRUE);
        line1.rotation(1, CENTER);

        DrawLine(line2.x0, line2.y0, line2.x1, line2.y1, light_b, TRUE);
        line2.rotation(1, START);
        */

        this_thread::sleep_for(std::chrono::milliseconds(10));
        ball.transfer(gravity);
        DrawCircle(ball.x, ball.y, ball.radius, light_b, TRUE);

    }

    /*
    DrawLine(0, 0, 1079, 0, light_b, TRUE);
    DrawLine(1079, 0, 1079, 2219, light_b, TRUE);
    DrawLine(1079, 2219, 0, 2219, light_b, TRUE);
    DrawLine(0, 2219, 0, 0, light_b, TRUE);
    */

    WaitKey() ;				// キー入力待ち

    DxLib_End() ;				// DXライブラリ使用の終了処理

    return 0 ;					// ソフトの終了
}

実行結果は以下のようになりました。

綺麗な放物線を描いていますね。

今回はいじょうになります。

ではまた。

コメント

タイトルとURLをコピーしました