视图 class 未接收更新的模型 class 数据

View class is not receiving updated Model class data

型号class

class spaceshipModel {
private:
Vector2f position;
float speed, acceleration, energy, fuel;

public:
//Contructor
spaceshipModel() : position(0, 0), speed(0), acceleration(0), energy(0), fuel(0) {}

//Destructor
~spaceshipModel() {}

//Sets
void setPosition(float _x, float _y) { position.x = _x; position.y = _y; }

void setSpeed(float _speed) { speed = _speed; }

void setAcceleration(float _acceleration) { acceleration = _acceleration; }

void setEnergy(float _energy) { energy = _energy; }

void setFuel(float _fuel) { fuel = _fuel; }

//Gets
Vector2f getPosition() { return position; }

float getSpeed() { return speed; }

float getAcceleration() { return acceleration; }

float getEnergy() { return energy; }

float getFuel() { return fuel; }

};

查看class

class spaceshipView {
private:
 Texture* image;
 Sprite sprite;
 spaceshipModel model;

public:
 //Constructor
 spaceshipView() : image(0) {}

 //Destructor
 ~spaceshipView() {}

//Setting the image
void setImage(Texture* _image) { image = _image; }

//Drawing the image
void drawImage(RenderWindow* _window) {
    sprite.setTexture(*image);
    sprite.setPosition(model.getPosition());
    sprite.setScale(Vector2f(0.2f, 0.2f));
    _window->draw(sprite);
    _window->display();
}
};

主要

A 遗漏了很多代码,但我随后在 main 中调用了它:

int main() {

//Call instance of the Spaceship model
spaceshipModel shipModel;

//Call instance of the Spaceship view
spaceshipView shipView;

//Create the texture of the spaceship from file
Texture spaceship;
spaceship.loadFromFile("spaceship.png");

//Create the window
RenderWindow window(VideoMode(800, 600), "Spaceship with MVC");

//Run the program as long as the window is open 
while (window.isOpen()) {

    //Check all the window's events that were triggered since the last iteration of the loop 
    Event event;

    while (window.pollEvent(event)) {

        //"Close requested" event: we close the window 
        switch (event.type) {

        //Window closed by pressing the X
        case Event::Closed:     
            window.close();
            break;

        //Checking for key pressed event
        case Event::KeyPressed:

            //Pressing esc to close the window
            if (event.key.code == Keyboard::Escape) {
                window.close();
            }
            break;      

        //We don't process other types of events
        default:             
            break;
        }

        //Clear screen with white BG
        window.clear(Color::White);

        //TESTING THE SETTING OF THE POSITION
        std::cout << shipModel.getPosition().x << ", " << shipModel.getPosition().y << std::endl;
        shipModel.setPosition(100, 100);
        std::cout << shipModel.getPosition().x << ", " << shipModel.getPosition().y << std::endl;

        //Set and draw the image
        shipView.setImage(&spaceship);
        shipView.drawImage(&window);

    }
}

return 0;

}

宇宙飞船画得很好,但只设置在 (0, 0)。即使将位置设置为 (100, 100),如上所示。图像停留在 (0, 0)。当我在视图 class 中使用模型 class 的 getPosition 函数时,我认为数据没有正确更新,即使 cout 测试确实显示了变化。

我做错了什么?有人可以给我一些指示吗?

在上面的代码片段中,来自 main()shipView.modelshipModel 对象是两个不同的对象。您可以使用 spaceshipView 中的 setter 让您的 shipView 知道模型,或者直接调用 shipView.model 的方法。