Войти
ПрограммированиеФорумОбщее

Детские вопросы по Unity ( В чем преимущество Scriptable Object как переменных? ) (4 стр)

Страницы: 13 4 5 611 Следующая »
#45
(Правка: 4:30) 4:25, 31 дек. 2018

tac
> не по вашей ли логике это должно быть в классе Scene? общему для всех, и
> печатание должно проводиться одним вызовом не зависимо от сцены?
а оно и так производится одним вызовом, при обработке команды help. не? :)

if ((action == "?") || (action == "h") || (action == "help"))
{
  PrintHelp();
  if (current != null) current.PrintHelp();
}
или ты говоришь, что внутри Program.PrintHelp() должна проверяться текущая сцена? ни к чему это.
Глобальные какие-то переменные заводить. Принцип: разделяй и властвуй.

tac
> а уже если переопределили и надо общую справку вызвать сделать внутри
> base.PrintHelp() ?
это ещё зачем? по такому коду в игре всегда будет сцена. По сути - вся игра будет завязана на сцену.

При текущем подходе игровой движок сцену использует (а не наоборот)
А у меня специально подразумевается, что сцены быть не может.
Например - при первом запуске игры, можно дать возможность игроку сделать load или new game.

Более того, команда "stats" тоже никак на сцену не завязана.
Отдельная сцена должна заниматься - отдельной сценой, а не нести в себе реализацию всей игры, зарытой где-то в базовом классе.
Это очень неудобно.


#46
4:27, 31 дек. 2018

skalogryz
посмотри выше, я дополнил, нет, завтра найду время разжую

#47
(Правка: 4:28) 4:28, 31 дек. 2018

tac
> посмотри выше, я дополнил, нет, завтра найду время разжую
посмотрел, дополнил.

не торопись отвечать. не гонка!

#48
(Правка: 4:35) 4:31, 31 дек. 2018

class Scene
  {
  public abstract bool Action(string[] action, GameState state, ref ActionResult result);
  public virtual void PrintHelp() 
{
тут должна быть реализация для общего хелпа, а не выносить отдельно

Console.WriteLine("h, help, ? - помощь (вот это окно)");
  Console.WriteLine("q, quit - выход");
  Console.WriteLine("stats  - состояние");
  Console.WriteLine("look    - оглядеться");
}
  public virtual void Look() {}
  }

в противном случае, сам себе противоречишь

заодно становится понятно, что нефиг abstract ы навешивать, и наоборот , вложенные классы делать .. 2 конструкции практически никогда не оправданные, от слова совсем

#49
(Правка: 4:40) 4:35, 31 дек. 2018

tac
> тут должна быть реализация для общего хелпа, а не выносить отдельно
нет, конечно.
Если сцена будет рапортовать хелп, то код по выходу из игры должен быть реализован в базовом Action().

А что если кто-то при реализации SceneX накосячит и забудет вызвать наследника?
то всё - игра упадёт, и никто об этом не узнает до времени runtime.
Если я не реализую такую завязку, то такой ошибки не возникнет в принципе, из-за архитектурного решения. (т.к. часть команд обрабатывается вне сцены!)

tac
> в противном случае, сам себе противоречишь
в том то всё и дело, что противорения нет
Сцена занимается только сценой, а не главным меню.
А вот игровой движок, уже сам разбирается, как и что ему делать.
Обрати внимание, что сцена не обрабатывает "look", вместо этого, за неё это делает движок, вызывая соотствующий метод.
Добавление общего хелпа, в базовый класс, как раз вызовет противоречние.

tac
> заодно становится понятно, что нефиг abstract ы навешивать, и наоборот ,
> вложенные классы делать .. 2 конструкции практически никогда не оправданные, от
> слова совсем
я готов убрать слова "abstract" совсем, таким вот образом:

class Scene
{
    public virtual bool Action(string[] action, GameState state, ref ActionResult result) { return false;  }
    public virtual void PrintHelp()  {}
    public virtual void Look() {}
}

Хотя с точки зрения разработки (и архитектуры) правильнее оставить "abstract" у класса Scene.
Чтобы никто не думал создавать его прямой экземпляр (компилятор не даст).

#50
(Правка: 4:39) 4:38, 31 дек. 2018

skalogryz
дальше нет места дискусии, это очевидная вещь, я все сказал что хотел ... ты разорвал общие поведение на два костыля, ты или штаны одень, или крест сними

#51
(Правка: 4:42) 4:40, 31 дек. 2018

tac
> ты разорвал общие поведение на два костыля
тогда приведи перечень "общего поведения" и "двух костылей" :)
а то слишком общие слова получаются

хотя вместо перечня, можешь свой код предоставить.. например завтра. С тем же квестом! ))

#52
4:45, 31 дек. 2018

skalogryz
та блин, что не ясно? у тебя класс Scene для общего поведения - костыль раз, у тебя static методы во вложеном ДРугом классе тоже для общего поведения в сцене - костыль два ..

все ушел, мне можно не отвечать

#53
(Правка: 4:50) 4:46, 31 дек. 2018

Ребят,  я вклинюсь)
А я что - взялся все-таки за слишком сложное для новичка задание?

Ну, если учитывать что я хотел сделать игру на 100+ сцен с боевками и нелинейностью.

Код skalogryz я понял в лучшем случае на треть. Не только из-за структур, абстракций и их синтаксиса, но и в целом - в двух третях я не понимаю что делает та или иная часть кода. Ну, то есть вижу - ага, вот здесь List создан, здесь еще что-то, но общая картина очень смутная.
С одной стороны грустно, с другой - я пытаюсь вспомнить свои первые попытки в моей области, и понимаю, что насколько это смешно, настолько и необходимо.

Понятно, что хочется сразу любой урок на практике применить. Но, возможно, мне нужно еще хотя бы месяц поучиться теории прежде чем браться за код. С другой стороны, так я на своей шкуре ощущЩЮ(?)  что такое говнокод, что такое хорошо, а что такое плохо.

Кароч, запутался.

#54
4:47, 31 дек. 2018

skalogryz
> можешь свой код предоставить.. например завтра. С тем же квестом! ))
блин, мне за это деньги платят ) а тут уже скучно становится ... разве что в рамках работы с ТС

#55
4:47, 31 дек. 2018

У меня Сцена для сцены

#56
4:50, 31 дек. 2018

skalogryz
> > зачем эта пустая сущность?
> она общая для всех сцен.
та блин, хорош юлить

#57
4:51, 31 дек. 2018

Jeaniro
я бы советовал прочитать Г. Буч для теории, сразу станет яснее

#58
(Правка: 6:56) 6:39, 31 дек. 2018

tac
> та блин, хорош юлить
1) Ты должен отличать общий интерфейс, от специфичной реализации
2) базовый класс несёт общий интерфейс для сцен (кода там нет), а не общий код для всей программы.

Есть основной код, движок - он заведует всем и сценани тоже (например, загрузка, выгрузка, смена сцены)
Есть сцена, и она ничем не занимается, кроме как самой собой. Каждый экземпляр сцены (в терминах ммо - инстанс) несёт в себе данные о состоянии сцены.
Каждая сцена обрабатывает некие действия, которые могут поменять состояние сцены.

Например поля: keyAvail (лежит ли в комнате ключ), doorOpenned (открыта ли дверь) не доступны коду движка. Он о них ничего не знает. О них знает только класс сцены, и их состояние контролируется экземпляром класса. Исключительно.
Более того, сцена настолько занимается только собой, что ни один из методов Action, не меняет GameState напрямую. А наоборот, заполняет информацию о своершённом действии в ActionResult, и состояние меняет уже код движка.

в идеале, код сцены не должен ничего писать в Console.WriteLine() а возвращать строки (в случае с PrintHelp). А GameState класс, должен быть более защищён. Но на данный момент это не суть.

#59
(Правка: 6:49) 6:48, 31 дек. 2018

Jeaniro
> Не только из-за структур, абстракций и их синтаксиса
могу убрать, чтобы код оставлся в рамках изученного тобой.

Jeaniro
> в двух третях я не понимаю что делает та или иная часть кода.
спрашивай.

Сверни классы Scene1 и Scene2, чтобы глазу не мешали. Потому что их содержимое не есть суть.

+ Показать

Jeaniro
> С другой стороны, так я на своей шкуре ощущЩЮ(?)  что такое говнокод, что такое хорошо, а что такое плохо.
на практике, после отладки чужого (или своего, но которого писал 6 месяцев назад) кода

Страницы: 13 4 5 611 Следующая »
ПрограммированиеФорумОбщее