Проблема при изменении переменной класса

0

Я пытаюсь написать небольшую игру, где окна выходят из верхней части окна. Но по какой-то причине я не могу изменить внутреннюю переменную в классе, y-координату. Я не знаю, что у меня что-то не хватает, но я не могу найти ошибку.

Box.h

#pragma once
#include "SDL.h"
class Box
{
public:
    Box();
    ~Box();
    void setX (int a);
    void setY (int a);
    void setSpeed (int a);
    void setSurface ();
    void render(SDL_Surface *source, SDL_Window *win);
    void update();


private:
    int x;
    int y;
    int speed;
    SDL_Surface *sur;
    SDL_Rect rect;
};

Box.cpp

#include "Box.h"
#include "SDL_image.h"

#include <iostream>

void Box::setX(int a)
{
    x = a;
}

void Box::setY (int a)
{
    y = a;
}

void Box::setSpeed (int a)
{
    speed = a;
}

void Box::setSurface()
{
    sur = IMG_Load("C:/hello.bmp");
    if (sur == NULL)
    {
        std::cout << IMG_GetError();
    }
}

Box::Box()
{
    speed = 5;
    y = 0;
    x = 3;
    rect.x = 0;
    rect.y = 0;
}

Box::~Box()
{

}

void Box::render(SDL_Surface *source, SDL_Window *win)
{
    SDL_BlitSurface(sur, NULL, source, &rect);
    SDL_UpdateWindowSurface(win);   
}

void Box::update()
{
    setY(y + speed); //I've also tried y = y + speed
    rect.y = y;
}

main.cpp

#include "SDL.h"
#include "Box.h"
#include "SDL_image.h"
#include <iostream>

bool init();
void update(Box test);
void render(Box test);
SDL_Window *win;
SDL_Surface *source;

int main(int argc, char *argv[])
{
    init();

    bool quit = false;
    SDL_Event e;
    Box test;
    test.setSurface();
    test.render(source, win);

    while (quit ==false)
    {
        while( SDL_PollEvent( &e ) != 0 )
        {    
            if( e.type == SDL_QUIT )
            {
                quit = true;
            }

        }
        update(test);
        render(test);


    }
    return 0;
}
void update(Box test)
{   
    test.update();
}
void render(Box test)
{
    test.render(source, win);
}
bool init()
{
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
    {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);

    if (win == NULL)
    {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }
    source = SDL_GetWindowSurface(win);
    return true;
}
  • 0
    Вам не нужно показывать нам всю свою программу. Показывать только соответствующий код. Приведите нам минимальный пример, который мы можем взять и скомпилировать, чтобы получить ту же ошибку.
  • 0
    Хаха, прости. Я думаю, это было немного излишним.
Теги:
class

1 ответ

3
Лучший ответ

update берет свой Box аргумент по значению, поэтому копия оригинальной Box всегда выполняется, когда update(test) называются. Затем эта копия изменяется, а оригинал остается неизменным. Чтобы исправить это, сделайте update взяв его аргумент по ссылке.

void update(Box& test);

void update(Box& test)
{   
    test.update();
}
  • 0
    Решил мою проблему. Большое спасибо! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню