2017-09-17 27 views
0

ボールが壁から飛び跳ねるゲームがあります。これは座標平面上にあります。ゲームをより面白く保つためにバウンスするときに、少々ランダム性が欲しいと思っています。ボールを一定のスピードで維持しながら、これをどうすればいいですか?今、私のコードは、それが直角でバウンスすることを意味します。ボールが跳ね返るときにボールの新しい角度を見つける(座標を使用)

ウィンドウの左上隅は0,0で、右下はwinW、winHです(今度は800,800に設定されています)。

ball.cppは、あなただけの速度を裏返しに加えて、ボールにランダムな角度を追加することができ

pos.x = start.x; 
pos.y = start.y; 

speed.x = .4f; // the f indicates that it's per frame. 
speed.y = .4f; 

void Ball::hitLeftRight() { 
    speed.x = -speed.x; 
} 

void Ball::hitTopBottom() { 
    speed.y = -speed.y; 
} 

void Ball::reset() { 
    // for a new level in game 
    pos.x = start.x; 
    pos.y = start.y; 
}  

void Ball::update() { 
    // called every frame 
    pos.y += speed.y; 
    pos.x += speed.x; 

    ballShape.setPosition(pos); 
} 
+0

...クランプされたランダム生成番号を追加することによって? – pmaxim98

+0

速度と反射角は独立しているので何ですか? –

答えて

0

スニペット。 <random>ヘッダーを使用し、0〜2 * piの値を生成することで、任意の方向に任意の速度を追加できます。または、以下の例のように、-22.5〜22.5度に制限します。またはpi/8.0ラジアン。

ランダム角度

もちろんインパクトの角度に基づいてそれらの値を微調整することができ、それは実装固有のものです。以下は、このような数字を生成することができる方法の例は次のとおりです。その後

#include <random> 
#include <cmath> 
#include <iostream> 


int main() { 
    constexpr double pi = 3.14159; 
    constexpr double bounceSpeed = 5.0; 

    std::random_device seed; 
    std::mt19937 generator(seed()); 

    // Numbers between - pi/2 and pi/8 gives angles between -22.5 and 22.5 
    std::uniform_real_distribution<double> random(-pi/8.0, pi/8.0); 

    double deltaX = cos(random(generator)) * bounceSpeed; 
    double deltaY = sin(random(generator)) * bounceSpeed; 

    std::cout << deltaX << "\n" << deltaY << "\n"; 

    return 0; 
} 

、あなたはそれぞれのxy速度にdeltaXdeltaYを追加することができます。

平野ランダム

それとも、ただの純粋にランダムな速度に満足している場合:あなたが望む速度範囲で二回機能、およびxyのにそれを追加

// Generate random double in range [min, max] 
double uniform(double min, double max) { 
    static std::random_device seed; 
    static std::mt19937 generator(seed()); 
    std::uniform_real_distribution<double> random(min, max); 
    return random(generator); 
} 

コールあなたのボール。あなたは速度ベクトルを正規化して、ランダムな速度を追加した後、あなたのボールの所望の速度を掛け可能性がボールの速度を維持するために

保管スピード

。それは一貫維持する速度を掛け

#include <cmath> 
#include <iostream> 
int main() { 

    constexpr double speed = 4.0; 

    double x = 3.0; 
    double y = 4.0; 

    double length = sqrt(x * x + y * y); 

    x /= length; 
    y /= length; 

    x *= speed; 
    y *= speed; 

    std::cout << x << "\n" << y << "\n"; 

    return 0; 
} 

:、長さによって除算を正規化する

+0

1つの数字を生成したいのではなく、2つの数字を生成したいのです。 – Sopel

+0

「スピードを維持する」部分が「ランダムな角度」部分にどのように適合しますか? xとyはデルタXとデルタYであるはずですか? – Nikki

0

開始するには、ボールの速度をフロートとして設定します。それから、あなたが今持っているもののようなxとyのメンバーで毎回動く速度を持ちます。あなたのスピード、あなたの動きの角度、そしてある種の三角法を使ってxとyをどれだけ動かすかを計算してください。あなたは、衝突が発生したときはいつでも、あなたは、あなたの角度があなたの新しいランダムな角度を追加し、速度を再計算再計算することができます

float Speed = 10; 
float Angle = 45; 
Velocity.x = cos(Angle * 3.14159/180) * Speed; 
Velocity.y = sin(Angle * 3.14159/180) * Speed; 

(度をラジアンに変換することを忘れないでください)。 (再び度をラジアンに変換する)。

//if (collision) 
Angle = atan2(Velocity.y * 3.14159/180, Velocity.x * 3.14159/180); 
Angle += rand() % 90 + 1; // Could also be subtracting here 
Velocity.x = cos(Angle * 3.14159/180) * Speed; 
Velocity.y = sin(Angle * 3.14159/180) * Speed; 

どの角度からどの角度で角度を付け加えているのか、どの角度から角度を付け加えているのかに基づいて角度を付け加えます。

void HitTop() 
{ 
    if (Velocity.x > 0) 
     //Subtract random angle 
    else 
     //Add random angle 
} 

これはすべての面で行います。

0

境界線に任意の形(矩形だけでなく)があるようにします。ポイントバウンスにおける境界正常(ユニット)ベクターが変更バウンス後

n = (n.x, n.y) 

、速度ベクトルである場合:

df = GaussianRandom(Mean = 0, Sigma = Pi/30) //arbitrary parameter 
      //seems in c++ it is std::normal_distribution 
n'.x = n.x * Cos(df) - n.y * Sin(df) 
n'.y = n.x * Sin(df) + n.y * Cos(df) 
:いくつかのランダム性を追加する

dot = speed.x * n.x + speed.y * n.y 

    //after reflection 
    newspeed.x = speed.x - 2 * dot * n.x 
    newspeed.y = speed.y - 2 * dot * n.y 

を、ほんの小さなランダムな角度で正常に回転

を使用し、n'を使用して反射を計算します。このアプローチはスピードの大きさを保つことに注意してください。

関連する問題