2017-04-15 13 views
-2

私のコードに問題がありますが、これはOpenGLに関係する大きなコードから抽出されたものですが、まだその問題を実証しています。衝突検出の呼び出し(col.detect())なしで動作します - あなたが壁の動きを妨げていないとみなした場合、私はコメントを外すとプログラムが壊れます。コンパイルしたコード自体は間違っているとは思えませんが、私が期待しているように動作しません。すべての助けをポンゲームの盗難 - maybyクラスへのポインタ

おかげ 敬具

collision.h

#pragma once 
#include "Ball.h" 

class collision 
{ 
public: 
    collision(); 
    collision(Ball ball); 
    void detect(); 
    ~collision(); 
private: 
    Ball *point; 
}; 

Ball.h

#pragma once 
class Ball 
{ 
public: 
    Ball(); 
    double getpx(); 
    double getpy(); 
    double getvx(); 
    double getvy(); 

    void setpx(const double px); 
    void setpy(const double py); 
    void setvx(const double vx); 
    void setvy(const double vy); 

    void update(); 
    ~Ball(); 
private: 
    double position[2] = { 0, 0 }; 
    double velocity[2] = { 0.1, 0 }; 
}; 

collision.cpp

#include "collision.h" 

collision::collision() 
{ 
} 

collision::collision(Ball ball) 
{ 
    point = &ball; 
} 

void collision::detect() 
{ 
    if (point->getpx() > 1 || point->getpx() < -1) 
     point->setvx(-point->getvx()); 
    else if (point->getpy() > 1 || point->getpy() < -1) 
     point->setvy(-point->getvy()); 
} 

collision::~collision() 
{ 
} 

Ball.cpp

#include "Ball.h" 

Ball::Ball() 
{ 
} 

double Ball::getpx() 
{ 
    return position[0]; 
} 

double Ball::getpy() 
{ 
    return position[1]; 
} 

double Ball::getvx() 
{ 
    return velocity[0]; 
} 

double Ball::getvy() 
{ 
    return velocity[1]; 
} 

void Ball::setpx(const double px) 
{ 
    position[0] = px; 
} 

void Ball::setpy(const double py) 
{ 
    position[1] = py; 
} 

void Ball::setvx(const double vx) 
{ 
    velocity[0] = vx; 
} 

void Ball::setvy(const double vy) 
{ 
    velocity[1] = vy; 
} 

void Ball::update() 
{ 
    position[0] += velocity[0]; 
    position[1] += velocity[1]; 
} 

Ball::~Ball() 
{ 
} 

main.cppに以下

#include <iostream> 
#include "Ball.h" 
#include "collision.h" 

using namespace std; 

int main() 
{ 
    Ball tennis; 
    collision col(tennis); 

    while (true) 
    { 

     tennis.update(); 
     col.detect(); 

     cout << tennis.getpx() << endl; 
     cin.get(); 
    } 

    return 0; 
} 
+0

編集:collision :: detect()のif文をifに変更すると、col.detect();を使用してプログラムが実行されない部分が解決されます。これは、xとyの両方の衝突条件を同時にテストするのを止めます。 –

+1

ポインタ、リファレンス、値の違いとデバッガの使い方を学んでください。おそらく、 'collision :: collision(Ball&ball)'が必要になります。ここでは、関数の復帰時に破棄される変数のアドレスを取って、Ballのコピーを作成しています。 – stijn

答えて

1

は、次のあなたがpointを使用するときにあなたのプログラムが未定義の動作を起動するようになります:

collision::collision(Ball ball) 
{ 
    point = &ball; 
} 

pointがなるように定義されている場合:

Ball *point; 

問題は、あなたが自動ストレージ期間を持つオブジェクトのアドレスを記憶していることです。その機能が完了した後にballが存在しなくなり、無効なオブジェクトを指すようになります。point

あなたはおそらく、参照によってボールを取りたいと思っていました。プログラムでstd::unique_ptrまたはstd::shared_ptrのサービスを使用することをお勧めします。

+0

愚かな間違い、助けてくれてありがとう...ポインターに関する追加情報も本当に知っておくと便利です。ありがとう –

0

変更

collision::collision(Ball& ball) 

に次のコード

collision::collision(Ball ball) 

それはあなたの問題を解決する必要があります。問題は、Ballが、コンストラクターが終了してもアドレスが有効でなくなったローカル変数であることでした。解決策:オブジェクトを参照によって送信し、ポインタに格納されたアドレスはmain()関数で作成されたオブジェクトになります。

関連する問題