Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 2.
В предыдущей части мы с Вами создали первый проект. Настало время его наполнения.
В предыдущей части мы с Вами создали первый проект. Настало время его наполнения.
Например, пишем «Привет Мир», жмем на «Build», кликаем по «Play» и наслаждаемся Вашим величием.
Окей, начало положено. Каждый кто играл, в игры на этом движке (мы то с вами знаем, во что вы все играли), знает про переходы. Окей, сказано, сделано. Переходы осуществляются посредством двойных квадратных скобок, например: [[переход_1]]. Новый пассаж, указанный в двойных квадратных скобках появляется автоматически.
Получаем вот такой простой результат:
Вообще в документации, написано, что возможностей несколько больше. И мы ими воспользуемся, но потом.
А сейчас мы ссылку на второй пассаж заменим текстом. Делается это через вертикальную черту «|». А еще в документе может быть дохрена переходов на один и тот же блок. Например вот так:
Все 4 варианта ведут в пассаж «переход_1».
Ну и для окончательного понимания, сделаем несколько переходов. Из одного пассажа, может быть сколько угодно переходов и куда угодно, а также переход может возвращаться сам в себя.
Окей, мы с Вами сделали переходы, но они такие.... маленькие. По ним трудно попасть мышкой. Можно было бы сделать просто текст больше (про редактирование и разметку текста, мы с Вами говорили в блоке про HTML).
Но я человек, все делающий через ж... поиск новых путей, поэтому решил сделать таблицу, с текстом внутри, при этом, чтобы вся ячейка была нажимаемой. К счастью, я человек глупый, а ChatGPT умный, так что, он всю работу сделал за меня. (запрос был следующий: Как в HTML сделать таблицу шириной во все окно, при этом чтобы внутри была закраска определенного цвета. При этом если в таблице ссылка, то должна нажиматься вся ячейка. ).
как бы боты не были умны, человеки все еще слишком глупые, чтобы излагать свои мысли и желания понятно. Уточняйте, расписывайте свой вопрос подробнее и тогда вы будете ПРАВИЛЬНО услышаны и вам дадут ПРАВИЛЬНЫЙ ответ
В итоге к css добавились следующие блоки:
Все это нужно добавить сюда:
В конечном варианте я заменил простой перехода на <table><tr><td style="font-size: 20px;">[[НАЗАД В ГИЛЬДИЮ|guild]]</td></tr></table> в итоге получилось следующее:
Еще раз:
[[НАЗАД В ГИЛЬДИЮ|guild]]
и
<table><tr><td style="font-size: 20px;">[[НАЗАД В ГИЛЬДИЮ|guild]]</td></tr></table>
это функционально один и тот же блок. Просто Теперь при нажатии на серую область, а не только на текст, будет произведен переход на новый пассаж. Но вы можете оставить и просто текст. Большинство авторов так делают и это не является проблемой (style="font-size: 20px увеличивает размер текста в таблице). В примерах кода для простоты я убрал все блочные элементы, поэтому, если вы просто копируете что-то, а у вас нет красоты, то не забудьте, что нужно писать
<table><tr><td style="font-size: 20px;">[[НАЗАД В ГИЛЬДИЮ|guild]]</td></tr></table>
вместо простого
[[НАЗАД В ГИЛЬДИЮ|guild]]
ПЕРЕМЕННЫЕ
Окей, как переходы делать между пассажами мы научились. Но я делаю не просто линейную игру, а легкий РПГ с элементами рогалика. У меня должно быть золото, кристаллы, какие-то вещи – все это надо как-то в игре обозначить.
Для любой переменной в SUGARCUBE используется символ «$». Например:
$золото
$кристалы
$количетсво_обещаний_похудеть_к_лету
Заметьте, что к пробелам этот движок (как и любой другой в мире) очень чувствителен.
При этом, сами переменные могут быть любыми:
$тракторист = 300 (целые числа)
$водка = 0.2 (рациональные числа)
$совесть = "нет" (любой текст)
$заваленная_сессия = $армия (любая другая переменная)
Вообще тут более подробно расписано, но я нуб и не все понимаю. Но для разработки простой игры и моих знаний хватит.
<<SET>> И УСТАНОВКА ПЕРЕМЕННОЙ В ССЫЛКЕ
Для того, чтобы назначить и записать переменную в игру используется 2 основных способа:
1. Через команду SET: <<set $золото = 10>>, оно же <<set $золото to 10>> (подробнее тут)
2. Через модификатор ссылки: [[переход_1][$золото = 10]]. (подробнее тут)
ВАЖНО: человеки, знакомые с любым программированием, знают о чем речь, для остальных просвещаю: = и ==, это два принципиально разных по значению символа. «=» используется для присвоения (обозначения), в то время, как «==» обозначается для сравнения (когда проверяется условие, равна ли переменная $золото десяти).
Еще раз:
$золото = 10 мы говорим игре, что теперь количество нашего золота равно 10.
$золото == 10 мы проверяем, равно ли количество золота 10.
В чем разница, между <<SET>> и модификатором ссылки?
Напишем 2 простых пассажа:
В обоих случаях пассаж назван first, и ссылка возвращается в него же. Но в первом случае у персонажа в любом случае будет определенное количество монет, а во втором только после НАЖАТИЯ.
При маленьких рассказах, что именно вы выберете не имеет значения, но в более – менее крупных проектах, изменение значения по нажатию, либо изменение значения вне зависимости от выбора игрока имеет значение.
STORYINIT
В движке есть возможность назначить такой пассаж, как StoryInit. Это уникальный пассаж. Его нигде не будет видно, и нужен он лишь за тем, чтобы заранее определить переменные (через тот самый <<set>>).
Ничто не мешает Вам пойти по пути хардкора и переменные назначать в простых пассажах.
Единственная разница будет лишь в том, что назначенная через StoryInit переменная будет в игре ПОСТОЯННО, в то время, как назначенная через простой пассаж переменная активируется (появится в игре) лишь тогда, когда вы дойдете до своего пассажа. Поверьте, игра (особенно сложная) от этого будет глючить и не раз.
Так, что крутые и уважающие себя дядьки определяют переменные заранее. Например, у меня StoryInit сейчас выглядит так:
У меня бы голова взорвалась постоянно искать пассажи, где я поместил ту или иную переменную. Но я умный: теперь у меня голова болит от того, что я не помню, где я эту переменную изменил.
Итак, школа закончилась, начинаем делать игру:
ТЕКСТ и БЛОК <<IF>>
Сначала я просто наклепал вводный рассказ на несколько частей, но потом решил немного схитрить.
Можно написать просто много пассажей подряд:
А можно сделать все одним действием: вписав следующий текст:
В пассаже StoryInit задаем глобальную переменную (ничто Вам не мешает задать ее в простом блоке, но будьте серьезным дядькой): <<set $story = 0>>
Далее в пассаже first вписываем следующий текст
И получаем ровно тот же самый текст, но всего в одном пассаже (надеюсь вы еще помните про разницу между «=» и «==»):
Только что мы с вами познакомились с логическим элементом <<IF>> (подробнее).
Выглядит он следующий образом:
<<if УСЛОВИЕ>><</if>>
Есть еще варианты:
<<if УСЛОВИЕ>><<elseif УСЛОВИЕ>><</if>>
<<if УСЛОВИЕ>><<else>><</if>>
<<if УСЛОВИЕ>><<elseif УСЛОВИЕ>><<else>><</if>>
Во всех случаях должно быть открывающее <<if>> и закрывающее <</if>>. Это важно, иначе вы постоянно будете видеть что-то вроде.
Теперь, если вы каким-то образом пропустили всю информатику в школе, то разберемся с самым базовым логическим элементом. Начнем сразу с примера (не забудьте заранее задать значение переменой):
В данном примере, мы проверяем равная ли переменная $турецкие_лиры числу 10000. Если равна, то пишем первый текст. Если не равна (даже если больше) пишем второй текст.
По такому же принципу после <<if>>, но до <<else>> пишется <<elseif >>. При чем этого <<elseif >> может быть сколь угодно много, главное не забыть вписать УСЛОВИЕ.
Так же важно пометить, что допускается <<else>> не писать, если Вам нужно вывести кусок текста только при одном единственном условии:
Если углубиться в документацию, то можно писать и более монструозные конструкции:
Настолько большое внимание я заострил на этой теме потому, что:
1.Я нуб в программировании и это мой основной способ задавать условия в моей игре;
2. Они все равно используются часто и в других играх, так, что ошибаться вы будете и часто.
Если говорить в контексте моей игры, то 16 изначальных блоков превратилось в 7:
StoryAuthor
Хорошо, вроде понятно, но появилась необходимость следить за переменной $story. Вставлять что-то вроде: "Параметр story равен $story", в конце каждого блока неудобно, да и удалять потом придется, так что для отображения необходимой информации ее проще вывести в блок слева:
Для этого создаем новый пассаж и называем его StoryAuthor
Это еще один уникальный пассаж движка наравне со StoryInit. В самом пассаже пишем значение той переменной за которой нужно следить, например:
В результате несложных махинаций получаем вой такой результат:
Кстати, только что мы с вами узнали, что если в пассаже написать переменную, то (при условии, что она определена заранее, например через <<set>> в этом же пассаже или в StoryInit) отобразится ее значение. В примере выше я один раз нажал на first и у меня значение $story поменялось на 2.
Может оно и выглядит просто, но на более поздних этапах разработки у меня уже получилось следующее:
Для успокоения совести напомню еще раз, что из одного пассажа можно вести несколько путей. Например у меня это реализовано в возможности пропустить обучение (другой момент, что я понял, что у меня вся первая глава – одно большое обучение, но об этом тавтологическом позоре я узнаю от себя позже).
Текст пассажей:
(что за $story +=0, вы уже знаете из документации по блоку SET (да-да, учите английский))
В следующей части разработаем механику боя и перемещение по комнатам подземелья.
Еще раз напоминаю про бесплатных ботов:
Спасибо за информацию! Случайно набрел на статью и нашел много полезностей для своего проекта)