Среда, 27 Ноября 2024, 01:06

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
ООП и сфмл
Raf_TankДата: Пятница, 03 Февраля 2017, 14:22 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем здравия. Захотел я в качестве школьного проекта написать игру (кстати норм ли для 10 класса?) и такой прикол. Есть два класса (стула), один выше другой ниже (но в этом наверное нет разницы, но всё-же), во втором классе есть функция которая при выполнении определённого условия меняет переменную в первом, вышестоящем, классе. Но она почему-то не меняется... вот кусочек кода:
Код

class Enemy{
private:.... //другие ненужные в этом вопросе переменные
public:
    int dir;
    int hp;
    float x, y;
    Sprite sprite;
    Enemy(String F,float X, float Y, const int W, const int H, int dir){//кусочек конструктора}
void move(float game_time){
                if (dir == 1){ sprite.setTextureRect(IntRect(0, 0, w, h)); sprite.move(0, -0.1*game_time); }
  if (dir == 2){ sprite.setTextureRect(IntRect(58, 0, w, h)); sprite.move(0,0.1*game_time); }
  if (dir == 3){ sprite.setTextureRect(IntRect(58, 58, w, h)); sprite.move(0.1*game_time,0); }
  if (dir == 4){ sprite.setTextureRect(IntRect(0, 58, w, h)); sprite.move(-0.1*game_time, 0); }
  }
///////////
class bot_shoot{
private:\\\\\\
public:
    bot_shoot(String F, String F2){опять конструктор}
void shoot_bot(float game_time, Enemy espr){ //вот и сама функция
   reload_time = reload.getElapsedTime().asMilliseconds();
   x = espr.sprite.getPosition().x;//с этими двумя строками проблем нет, т.к. на сколько я понял я лишь беру переменные из другого класса, а не меняю их.
   y = espr.sprite.getPosition().y;//
                 if (ysl) { espr.dir = 1; reload.restart(); } // ysl- некоторое условие.
   if (ysl) { espr.dir = 2; reload.restart(); }
   if (ysl) { espr.dir = 3; reload.restart(); }
   if (ysl) { espr.dir = 4; reload.restart(); }
    }
};
int main(){
Enemy e1(parametri_constructora);
bot_shoot bot1(game_time, e1);
bot1.shoot_bot(game_time, e1);

return 0;
}


собственно ошибки никакой нет, компилятор это всё запускает, но! Переменная dir в классе enemy так и не меняется, и соответственно спрайт не двигается так, как мне надо, как мне изменить эту переменную? p.s. простите за возможно корявое сокращение и изуродование кода, но старался чтобы было без лишнего и максимум понятно.
GudleifrДата: Пятница, 03 Февраля 2017, 14:34 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Цитата Raf_Tank ()
кстати норм ли для 10 класса?
Поздновато. Впрочем, по нынешним временам, когда на 10 строк игры приходятся мегабайты мусорного контента и гигабайты видеокурсов...

Цитата Raf_Tank ()
собственно ошибки никакой нет
Ошибка самая обычная. C (и его выродок - С++) передают параметры по значению. Значение Вы и правите, а сама переменная остается без изменений. Надо передавать по указателю (*) или ссылке (&).


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Пятница, 03 Февраля 2017, 14:35
Raf_TankДата: Пятница, 03 Февраля 2017, 14:47 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата Gudleifr ()
Надо передавать по указателю (*)

вот про указатель у меня была мысль, но я не особо понял как реализовать, можно поподробней, или желательно кусочек кода. p.s. почему ты так хейтишь С и плюсы?
GudleifrДата: Пятница, 03 Февраля 2017, 15:21 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата Raf_Tank ()
но я не особо понял как реализовать, можно поподробней
Лучше посмотрите в книжке, это очень важный вопрос. (Для C++ - Страуструп, ЯЗЫК ПРОГРАММИРОВАНИЯ С++, 2-е издание, не 1-е - слишком сырое - и не 3-е и последующие - там слишком много мусора).

Цитата Raf_Tank ()
почему ты так хейтишь С и плюсы?
В данном случае за то, что он мешает Вам изучать программирование. Возьмите любую программистскую фичу - файл, процесс, лямбды,.. даже ООП - каждая имеет свою историю и толкование в великих программистских талмудах. Однако, C++ пошел по пути своего толкования всех этих фиговин, совершенно не совпадающего с классическим. Для каждой - у него своя синтаксическая загогулина. Все бы ничего, но C++ сейчас используется не как самостоятельный язык, а как средство дополнительного программирования в суперпродвинутых системах (MS Studio, Unity...). И эти системы имеют свое толкование упомянутых фич. Три толкования на каждую фичу - Вы наверняка запутаетесь.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Пятница, 03 Февраля 2017, 15:22
JackNazaryanДата: Пятница, 03 Февраля 2017, 19:28 | Сообщение # 5
старожил
Сейчас нет на сайте
Цитата Gudleifr ()
Поздновато. Впрочем, по нынешним временам, когда на 10 строк игры приходятся мегабайты мусорного контента и гигабайты видеокурсов...

У нас некоторые товарищи аж на 3-4 курсах начинают хоть чему-то учиться. Нет ничего такого. Мои бывшие одноклассники в 10 классе только начинали осознавать, что задротство - ещё не весь мир

Цитата Raf_Tank ()
вот про указатель у меня была мысль, но я не особо понял как реализовать, можно поподробней, или желательно кусочек кода. p.s. почему ты так хейтишь С и плюсы?

Если поставить знак * или & перед названием переменной, будет передано не его значение, а ссылка на него. Т.е. при его изменении внутри функции изменится и значение вне её. Удобная штука
А товарищ Gudleifr хейтит всё и вся, все нормально.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг