Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su
5.2. Как сделать кнопку "Назад", работающую на каждой локации?
В: Как сделать кнопку "Назад", работающую на каждой локации?
О:
Чтобы иметь возможность с любой локации вернуться на предыдущую, нужно использовать локацию-обработчик перехода на новую локацию. Допустим, мы создали локацию "при_переходе" и на самой первой локации в игре прописали:
Таким образом каждый раз при переходе на любую локацию с помощью `goto`, `xgoto` плеер будет выполнять и код локации "при_переходе".
Теперь нам нужно прописать в локации "при_переходе" код, который будет запоминать последнюю локацию.
Если мы напишем просто:
Эта строчка кода будет просто прописывать название текущей локации в переменную `$current_loc`. Например, если у нас есть две локации "комната" и "кухня", то при переходе в "комнату" в `$current_loc` запишется значение "комната", а при переходе из "комнаты" в "кухню" — значение "кухня".
Значит, перед тем, как записать в `$current_loc` название текущей локации, мы должны предварительно сохранить значение из `$current_loc` в другой переменной. Таким образом наш код будет выглядеть вот так:
$back_loc=$current_loc
! сохраняем название локации, на которую пришли (текущая)
$current_loc=$curloc
Теперь, когда мы зайдём в "комнату", в `$current_loc` запишется значение "комната". Если дальше мы перейдём в "кухню", значение "комната" из `$current_loc` пропишется в `$back_loc`, то есть в `$back_loc` окажется значение "комната", а в $current_loc запишется название текущей локации, т.е. значение "кухня".
Осталось только привязать команду перехода, например, к действию. На той же локации "при_переходе" пишем это действие:
! если переменная $back_loc не пуста
! создаём действие для возврата
act "Назад":
goto $back_loc
end
end
Данный код позволяет вернуться только на одну локацию назад. То есть, если мы перешли из "кухни" в "комнату", действие "Назад" вернёт нас из "комнаты" в "кухню", а из "кухни" снова в "комнату".
Если мы хотим "запомнить" весь путь, а затем с помощью кнопки "Назад" воспроизвести его в обратном порядке, нужно воспользоваться более сложным кодом:
! если в последнем элементе массива нет названия текущей локации
! а так же если мы совершаем переход не по действию возврата
!записываем в последний элемент массива название текущей локации
$back_loc[]=$curloc
end
! обнуляем переменную back_act, чтобы разрешить запись в массив $back, если мы захотим перейти на новую локацию
back_act=0
! создаём действие возврата
! только если есть куда возвращаться
if arrsize('$back_loc')>1:
act "шаг назад":
! выставляем переменной-маркеру back_act значение 1,
! чтобы запретить запись в массив $back при возврате на предыдущую локацию
back_act=1
! непосредственно переход
! записываем во временную переменную название предыдущей посещённой локации
local $backward = $back_loc[arrsize('$back_loc')-2]
! удаляем из массива текущую локацию
killvar '$back_loc',arrsize('$back_loc')-1
! переходим
goto $backward
end
end