5.2. Как сделать кнопку "Назад", работающую на каждой локации?
В: Как сделать кнопку "Назад", работающую на каждой локации?
О: Чтобы иметь возможность с любой локации вернуться на предыдущую, нужно использовать локацию-обработчик перехода на новую локацию. Допустим, мы создали локацию "при_переходе" и на самой первой локации в игре прописали:
$onnewloc = "при_переходе"
Таким образом каждый раз при переходе на любую локацию с помощью goto, xgoto плеер будет выполнять и код локации "при_переходе".
Теперь нам нужно прописать в локации "при_переходе" код, который будет запоминать последнюю локацию.
Если мы напишем просто:
$current_loc = $curloc
Эта строчка кода будет просто прописывать название текущей локации в переменную $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 запишется название текущей локации, т.е. значение "кухня".
Осталось только привязать команду перехода, например, к действию. На той же локации "при_переходе" пишем это действие:
if $back_loc <> "":
! если переменная $back_loc не пуста
! создаём действие для возврата
act "Назад":
goto $back_loc
end
end
Данный код позволяет вернуться только на одну локацию назад. То есть, если мы перешли из "кухни" в "комнату", действие "Назад" вернёт нас из "комнаты" в "кухню", а из "кухни" снова в "комнату".
Если мы хотим "запомнить" весь путь, а затем с помощью кнопки "Назад" воспроизвести его в обратном порядке, нужно воспользоваться более сложным кодом:
if $back_loc[]<>$curloc and back_act=0:
! если в последнем элементе массива нет названия текущей локации
! а так же если мы совершаем переход не по действию возврата
!записываем в последний элемент массива название текущей локации
$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