2013-12-10 3 views
2

Я пытался создать игру на C++, используя графическую библиотеку SDL 2.0, но у меня возникла проблема.Игра на C++ Доступ к отдельным переменным классам

У меня есть два класса пользователя и враг. Здесь вырубают версии обоих, просто спросите, и я вставить все дело

class User 
{ 
    public: 
     //Friends: 
     friend class Enemy; 


    protected: 
    private: 
     //The sprite position 
     SDL_Rect SpritePos = {10, 100}; 
}; 



class Enemy 
{ 
    public: 
     //Friends: 
     friend class User; 

     Enemy(); 
     int CheckEnemy(SDL_Surface* &ScreenSurface); 
     //Loads enemy images 
     bool LoadEnemyMedia(); 

    protected: 
    private: 
     //Controls the AI movement 
     void Movement(); 

     //Wizard 1's location on screen 
     SDL_Rect Wizard1Pos = {50, 70}; 
}; 

Функция Enemy :: Движение обнаруживает местоположение спрайта, а затем перемещает себя соответствующим образом, однако она имеет не может получить текущее значение Spritepos, только значение, которое оно инициализирует, в этом случае 10. Вот код функции Enemy :: Movement. Как я могу это исправить, помните, что эти функции работают в цикле.

void Enemy::Movement() 
{ 
    User Player; 


    if (Wizard1Pos.x < Player.SpritePos.x) 
    { 
     Wizard1Pos.x ++; 

    }else if (Wizard1Pos.x > Player.SpritePos.x) 
    { 
     Wizard1Pos.x --; 
    } 
} 

ответ

3

Player.SpritePos.x вернется член x члена SpritePos переменной Player

Если вы только получаете инициализированное значение вместо обновленного значения, вы, вероятно, чтение из другой копии, чем вы пишете к. Пока не будет больше информации о том, как и где записываются данные, я предлагаю вам ознакомиться с «Ссылка» и «Указатель».

Edit: Я вижу, ваш реальный код выглядит так же, как пример, который я предполагал, был упрощен:

void Enemy::Movement() 
{ 
    User Player; 
    printf("%u\n", Player.RefTest.x); 

    if (Wizard1Pos.x < Player.RefTest.x) 
    { 
     Wizard1Pos.x ++; 
    }else if (Wizard1Pos.x > Player.RefTest.x) 
    { 
     Wizard1Pos.x --; 
    } 
} 

Линия User Player; создает новый объект типа User в стеке, который затем прочитать из. В конце функции Movement() переменная стека Player удаляется. Player никогда не записывается.

Создание переменной под названием Player в одном месте, а затем создание другой переменной с именем Player в другом месте никоим образом не связывает 2 (исключение: глобальные переменные). Имена переменных не влияют на поведение кода.

Если вы хотите, чтобы Movement ссылался на уже существующий User, вам необходимо указать метод Movement(), в котором экземпляр User имеет в виду. Вы можете сделать это, добавив аргумент метода следующим образом:

void Enemy::Movement(const User & someCompletelyArbitraryVariableName) 
{ 
    printf("%u\n", someCompletelyArbitraryVariableName.RefTest.x); 

    if (Wizard1Pos.x < someCompletelyArbitraryVariableName.RefTest.x) 
    { 
     Wizard1Pos.x ++; 
    }else if (Wizard1Pos.x > someCompletelyArbitraryVariableName.RefTest.x) 
    { 
     Wizard1Pos.x --; 
    } 
} 

& говорит программе не сделать копию. const сообщает программе, что не разрешается ничего менять в player с точностью до Movement. const не добавляет никакой ценности, кроме предотвращения глупых ошибок, которые, как вы узнаете, чрезвычайно полезны.

+0

Я изучил использование ссылочной переменной, однако он все еще читает другое значение, когда я печатаю его из отдельного класса. Как я могу убедиться, что он читает правильную копию. – Mojachiee

+0

Мне нужно больше узнать о коде. Как насчет общедоступной папки dropbox/gdrive/skydrive? – Peter

+0

https://drive.google.com/folderview?id=0B5a8TxDpXYdfWUpGNWN6S2dUU00&usp=sharing – Mojachiee

Смежные вопросы