RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2435246 views

есть 2 способа
1) с помощью команды copyarr перемещаем содержимое массива во временный массив, работаем с временным массивом, потом перемещаем обратно

$arr[] = 'test1' & $arr[] = 'test2'
$array_var = '$arr'

copyarr '$tmp_array', $array_var
$tmp_array[] = 'test3'
copyarr $array_var, '$tmp_array'

здесь главное не забыть переместить содержимое временного массива обратно
2) формируем строку кода и выполняем через dynamic

$arr[] = 'test1' & $arr[] = 'test2'
$array_var = '$arr'

dynamic "<<$array_var>>[] = 'test3'"

с этим способом надо быть осторожней - нужно четко представлять как будет выглядеть строка после замены подстрок

в принципе если нужно только получить значение из массива можно воспользоваться dyneval

! получаем первый элемент массива из предыдущего примера
$needed_data = dyneval("$result = <<$array_var>>[0]")

Ясно, спасибо.

Aleks Versus Moderator 13.12.2012 08:17 (13 years ago)

Bumbr,
всё-таки не пойму, как у тебя устроена организация предметов. Мне кажется ни к чему такой огромный код только для удаления предмета из инвентаря.
Если у тебя предметы хранятся в разных “как бы сумках”, тебе проще решить какой-нибудь маленькой базой. Два массива для этого вполне сгодятся. В массиве $предмет[i]можно хранить сам предмет, в массиве $сумка[i]можно хранить тип сумки, в которой лежит предмет. Естественно индексы элементов массивов должны совпадать. Код удаления предмета при этом выглядит так:

i=args[0]
killvar '$предмет',i & ! удаляем сам предмет
killvar '$сумка',i & ! удаляем информацию о типе сумки, в которой лежал предмет.

Это похоже на удаление строки из базы:

i $предмет[i] $сумка[i]
0 Отвёртка инструмент
1 Меч оружие
2 Лук оружие

К тому же не требует от кода знаний о том, в какой именно “сумке” лежит предмет.

Не до конца понимаю как хотите организовать инвентарь вы.
У меня есть 4 массива оружие, помощь, свет и разное. Значение элементов каждого массива соответствует предмету (если 0, то соответственно его отсутствие). Предметы игрок может подбирать в произвольном порядке, и в инвентаре они выводятся именно в том порядке в котором подбираются. Соответственно номер предмета в массиве изначально неизвестен.

Вы я так понимаю предлагаете сразу закрепить за предметом раздел к которому он принадлежит, сделав по сути двумерный массив в котором будет одновременно и код предмета и код “сумки”. Но как тогда определить порядок предметов в сумке?
Хотя скорее всего я не до конца понял вашу мысль. Такой способ представления данных для инвентаря довольно сложен для моего восприятия. В случае с моим методом, я легко могу представить инвентарь как 4 массива где каждый элемент является предметом, а тут…

Возможно я выбрал и не самую изящную реализацию, но она работает и отвечает всем требованиям которые я к ней предъявлял. Поэтому считаю что пока нецелесообразно переписывать код.

Aleks Versus Moderator 13.12.2012 14:38 (13 years ago)

Bumbr:

Не до конца понимаю как хотите организовать инвентарь вы.

:=D А я не хочу. Это ты хочешь.

Bumbr:

У меня есть 4 массива оружие, помощь, свет и разное. Значение элементов каждого массива соответствует предмету (если 0, то соответственно его отсутствие).

У тебя и предметы все пронумерованы? Я бы поостерёгся так делать. Сложно уследить за нумерацией всех предметов.

Bumbr:

Но как тогда определить порядок предметов в сумке?

Поскольку подобранный предмет записывается в последнюю ячейку массива, я не вижу проблемы в том, чтобы как-то определить порядок предметов. Чуть большую сложность составит написание кода, который будет выводить только те элементы, которые соответствуют нужной сумке, но это вполне решаемо.

Bumbr:

Вы я так понимаю предлагаете сразу закрепить за предметом раздел к которому он принадлежит, сделав по сути двумерный массив в котором будет одновременно и код предмета и код “сумки”.

именно. Мало того, руководствуясь принципом: “Любая вещь содержит всю полноту знаний о себе самой”, я стремлюсь не указывать сумкам, какие в них должны лежать вещи, а указывать вещам, в каких они должны лежать сумках.
Но это кому как удобнее.

Дописываю свою первую игру на QSP (точнее её пролог).
Игру уже можно пройти определённым способом, но пока дописаны еще далеко не все концовки.
Рассчитываю дописать её и выложить для тестирования через неделю или около того.

Вопрос собственно состоит в том, что если делать несколько игру отдельными модулями (вроде эпизодов или глав), то надо как-то передавать информацию между этими модулями. Как это можно реализовать?

Как работает система сохранений в QSP? Что сохраняет и как?

Пока вроде бы всё.

Bumbr,
если я правильно тебя понял, ты хочешь разбить игру на несколько разных файлов, которые будут запускаться последовательно. Этого делать не стоит. Если это нужно для структурирования кода, потому что его становится слишком много, пользуйся папками локаций. Если и папок недостаточно - можешь вести разработку в нескольких файлах, а на “релиз” всё объединять в один.

Aleks Versus Moderator 19.12.2012 06:23 (13 years ago)

Bumbr:

Как работает система сохранений в QSP? Что сохраняет и как?

присоединяюсь к вопросу. Интересно было бы узнать.

Надумал только это. В справке написано:

Справка:

DEBUG - если значение переменной не равно 0, то отключается проверка идентификатора игры при загрузке состояния. Полезно для отладки.

Идентификатор игры, я так понял, - это что-то вроде хэш-суммы. Сохранения, скорее всего, содержат значения всех переменных и этот самый идентификатор. При загрузке сохранения, просто восстанавливаются значения всех переменных, в т.ч. все системные переменные. Если выставить debug=1, можно пробовать загружать сохранения от старой версии игры в новую. Т.о. ты можешь просто обновлять версию игры с добавлением новых глав. Тут необходимо предусмотрительно вставлять в нужном месте возможность перехода к новой главе, чтобы она не потерялась.

Есть вот такой вот код смены музыки

i=volume
j=0
$mp3name2 = $args[0]
:n
if i>0:
	 i = i - 5
	 play '<<$mp3name>>', i
	 wait 100
	 jump 'n'
else
	 :n2
	 if j<volume:
		 j = j + 5
		 play '<<$mp3name2>>', j
		 wait 100
		 jump 'n2'
	 else
		 play '<<$mp3name2>>', volume
	 end
end

$mp3name = $mp3name2
помимо него с музыкой общается только вот эта строка в каунтере

if isplay '<<$mp3name>>' = 0: play '<<$mp3name>>', volume

Вопрос в том, что когда вызывается функция смены музыки через func (’музыка’,’snd/2.flac’)
мелодия начинает играть с самого начала. Тоесть если игрок постоял на предыдущей локации и прослушал половину трека, то при смене музыки этот же трек начнёт играть заново и только потом затихнет и начнётся новый.

Bumbr,
Вот ошибки:
1. Вместо ‘<<$переменная>>’ нужно писать просто $переменная.
2. Переменной $mp3name нигде не присваивается значение.
3. Переменная $mp3name2 вообще лишняя.
4. По-хорошему нужно не просто уменьшать громкость предыдущего трека до 0, но ещё и выключить его.

Вот исправленный код

i=volume
j=0
:n
if i>0:
i = i - 5
play $mp3name, i
wait 100
jump ‘n’
else
close $mp3name
$mp3name = $args[0]
:n2
if j<volume:
j = j + 5
play $mp3name, j
wait 100
jump ‘n2’
else
play $mp3name, volume
end
end

Вообще это не очень хорошая реализация, т.к. из-за WAIT на время переключения блокируется интерфейс.

Оптимизация кода - это конечно хорошо, но то ‘<<$mp3name>>’ или $mp3name существенного значения не имеет. За напоминание о close - спасибо, это могло аукнуться в будущем, когда у меня играло бы 40 треков с громкостью 0.
Однако главная проблема, ради которой я собственно и поднимал тему так и не решена. Музака перед затуханием откатывается на начало трека.

P.S. Сейчас мне действительно приходится менять музыку после прогрузки интерфейса, что не очень удобно. Может вы знаете более удобный способ реализовать это?

P.S.2 Нашёл проблему, устранил. Тебе затухает с нужного момента, а всему виной неаккуратное редактирование кода (Забыл удалить close all перед вызовом функции). Однако вопрос о том чтобы избавиться от wait остаётся открытым.

но то ‘<<$mp3name>>’ или $mp3name существенного значения не имеет

Имеет, конечно. Лишний код ведёт к багам.

Bumbr,
вместо WAIT нужно использовать локацию-счётчик(COUNTER). Но это уже сложнее. Для примера см. Плавная остановка музыки в игре.

Реализовал затихание музыки через каунтер. С примером не считался, потому что не очень люблю разбираться в чужом коде, проще и интереснее самому попробовать.
Теперь музыка сменяется следующим образом:
в локации вызывается функция музыка через func (’музыка’,$mp3name,2)
где mp3name - название файла, а цифра 1 или 2 отвечают за то нужно ли чтобы затихала предыдущая или сразу играла новая.
Код функции музыка:

Spoiler

mus = args[1]
i=volume
$music = $args[0]
if volume>50:
SETTIMER 100
else
SETTIMER 200
end

Код в локации-счётчике отвечающий за музыку

Spoiler

if mus = 0: if isplay $mp3name = 0: func (’музыка’,$mp3name,2)

if mus = 1:
if i > 0:
i = i - 5
play $mp3name, i
else
mus = 2
i = 0
end
end
if mus = 2:
if i < volume:
i = i + 5
play $music, i
else
close $mp3name
play $music, volume
$mp3name = $music
killvar ‘i’
killvar ‘mus’
killvar ‘$music’
settimer 500
end
end

Реализовано немного через задницу, однако работает. Интересно, что при записи play $mp3name, i-5 функция не работала и пришлось добавлять строку i = i - 5. С i + 5 наблюдалось тоже самое, но сейчас вроде всё нормально и каких либо очевидных просчётов и возможных багов я не вижу.

Как сделать (и можно ли это реализовать в Аэре вообще) такую штуку, чтобы при наведении на одну ссылку был один фон, а при наведении на другую - другой? ВотЪ

AKA,
нельзя. В QSP принципиально нет такого понятия как “наведение курсора мыши”, потому что на мобильных устройствах мышь отсутствует.

Log in or Register to post comments.