1

私はこの質問に対する答えを高低で検索し、前方宣言、ポインター、および参照を含む多くの解決策を試みました。どこかで間違った構文を使用しているだけだと確信しています。何時間も無駄にした後、スタックオーバーフローに目を向けることにしました。

学習経験として、最初の CPP アプリケーションの 1 つをコーディングしようとしています。現在、Player オブジェクトと Ball オブジェクトがあります。Ball オブジェクトは、プレーヤー オブジェクトのメンバー変数とメソッドの一部にアクセスできる必要があります。これを行う方法がわかりませんでした。以下は、私のコードの非常に単純化されたバージョンです。特に重要なコードをコメントしました。

PlayState.hpp

#ifndef PLAYSTATE_HPP
#define PLAYSTATE_HPP
#include "Player.hpp"
#include "Ball.hpp"

class Player;
class Ball;

class PlayState
{
public:
    PlayState();
    Player player;
    Ball ball;
 };
#endif

PlayState.cpp

#include "PlayState.hpp"

PlayState::PlayState() {
}

void PlayState::update() {

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
    {
        ball.checkCollision();
        player.move(1);
    }
    ball.update();
}

void PlayState::draw()
{
    m_game.screen.clear();
    m_game.screen.draw( player.getSprite() );
    m_game.screen.draw( ball.getSprite() );
    m_game.screen.display();
}

Player.hpp

#ifndef PLAYER_HPP
#define PLAYER_HPP

class Player
{
public:
    Player();
    ~Player();

    void create();
    void setRotation(float);
    void setPosition(float, float);
};
#endif

Player.cpp はそれほど重要ではありません。

ボール.hpp

#ifndef BALL_HPP
#define BALL_HPP

class Player; // I don't think forward declaration is what I need???

class Ball
{
public:
    bool picked_up;
    bool throwing;

    Player *player; // this isn't working

    Ball();
    ~Ball();

    bool checkCollision();
};
#endif

ボール.cpp

#include "Ball.hpp"

Ball::Ball() {
    Ball::picked_up = false;
    Ball::throwing = false;
}

Ball::~Ball() {
}

bool Ball::checkCollision()
{
    float ball_position_x = Ball::getPosition().x;
    float ball_position_y = Ball::getPosition().y;

    // I need to access the player object here.
    float x_distance = abs(player.getPosition().x - ball_position_x);
    float y_distance = abs(player.getPosition().y - ball_position_y);

    bool is_colliding = (x_distance * 2 < (player.IMG_WIDTH + Ball::width)) && (y_distance * 2 < (player.IMG_HEIGHT + Ball::height));

    return is_colliding;
}
4

1 に答える 1

0

と言うとき、現在のオブジェクトと同じオブジェクトにあるものとplayerまったく同じという意味ですか? 最初にそのリンクを設定したい場合は、自動的に行うことはできません。playerplaystateball

PlayState::PlayState() :ball(&player){ //pass pointer to ball of its player?
}

class Ball
...    
Ball(Player *myPlayer);
...

}

Ball::Ball(Player *myPlayer):player(myPlayer) {
...

// I need to access the player object here.
float x_distance = abs(player->getPosition().x - ball_position_x);

また、プレーヤー オブジェクトへのポインターであるため、プレーヤーを使用するにはポインターを使用する必要があります。

Ball クラスの上の Player への前方宣言が必要です。上記の Playstate は不要です。

また、あなたのプレーヤーには GetPosition 関数がないようです。上記で含めるのを忘れたパブリックメンバー関数であると想定しています。

于 2012-12-06T05:26:06.037 に答える