RU 📌 Pinned

Как сделать?

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

Вета,
Это на html делается? Очень интересный подход.

У меня вопрос по части дизайна игры. Присутствует инвентарь описанный в моём предыдущем посте. Как лучше реализовать использование предметов? Рассматриваю пока всего три варианта:
1) Через проверку на наличие предмета просто добавлять действие к основным.
2) Делать проверку на предмет в самих основных действиях.
3) Реализовывать меню для предметов, чтобы их можно было использовать (и соответственно потратить) в любой локации, но в нужных местах сделать проверку на их использование.
Предметов не то чтобы очень много (как минимум пока), но и малым я не ограничусь, поэтому вариант надо выбрать с учётом большого разнообразия итемов. Лично я склоняюсь к третьему варианту, но хочется узнать мнение общественности.

Вариант 1 - самый рабочий. Но и второй, и третий тоже используются, в зависимости от ситуации и вкуса автора.

Для первого варианта, чтобы в глаза сильно не бросалось появление нового действия, можно сделать так. Будет какое-то промежуточное всегда доступное действие X на локации, выполнив которое добавляется действие Y для предмета.

Пример:

Кухня. На плите стоит кастрюля. Огонь на плите включён.
> Выйти из кухни
> Заглянуть в кастрюлю (X)

–> Заглянуть в кастрюлю

В кастрюле кипит вода. Вы вспоминаете, что не ели с утра, и в желудке раздаётся урчание.
> Выйти из кухни
<если есть “мясо”>:
> Сварить мясо (Y)

А вообще приёмов очень много, и не стоит себя в этом ограничивать, выбирая один лишь способ вздаимодействия с предметами. Главное, чтобы всё вместе хорошо сочеталось. Игр у нас уже много, можно выбирать из них наиболее понравившиеся приёмы и использовать. Изобретать что-то своё в таких базовых вещах вряд ли имеет смысл.

Aleks Versus Moderator 08.12.2012 18:44 (13 years ago)

Вета:

В первом столбце ВЕЩИ1, во втором ВЕЩИ2, которые появляются в процессе игры. Как сделать понятный код, чтобы они появлялись и занимали ячейки в зависимости от приобретения персонажем и к тому же были кликабельными (то есть в виде ссылки с выпадающим меню “ПРИМЕНИТЬ”).
Я что-то никак не могу построить логику…

Ну для того, чтобы были кликабельны, естесственно придётся делать гипер-ссылки. А вот со столбцами интереснее. Если ты знаешь количество предметов во одном из столбцов, не составит труда добавлять в таблицу строки. Скажем циклом. Если предметы хранятся в массивах, например, $objects1 и $objects2

$table='<table width=100%>'
u=max(arrsize('$objects1'),arrsize('$objects2'))
i=0
:for
if u>0:
	$table+='<tr><td width=50%>'
	if $objects1[i]!'':
		$table+='<a href="exec:,kf-блабла">'+$objects1[i]+'</a>'
	else
		$table+='&nbsp;'
	end
	$table+='</td><td width=50%>'
	if $objects2[i]!'':
		$table+='<a href="exec:,kf-блабла">'+$objects2[i]+'</a>'
	else
		$table+='&nbsp;'
	end
	$table+='</td></tr>'
	u-=1
	i+=1
	jump 'for'
end
$table+='</table>'
*p $table

Aleks Versus,
хороший код. Ещё можно в левом столбце сделать выравнивание по правому краю, а в правом - по левому. Ну и *PL заменить на *P, чтобы потом не натыкаться не непонятно откуда взявшиеся “пустые строки”.

Aleks Versus Moderator 08.12.2012 19:06 (13 years ago)

Nex,
Чё-то я только с выводом напортачил.:))) Последние элементы массивов будут выводиться в самом верху, и если один массив окажется больше другого, вверху таблицы окажутся пустые ячейки.

Aleks Versus,
точно :)
Ну, исправляй.

Aleks Versus Moderator 08.12.2012 19:54 (13 years ago)

Поправил.

Набросал в институте апгрейд кода удаления предметов из инвентаря.
Проверить в данный момент не могу. интересует будет ли вложенный цикл(тот который j) смещать все предметы массива находящиеся по списку после удалённого? Суть в том чтобы избежать дыр в массиве. Максимальное кол-во предметов 50, через args[0] передаётся группа предмета (оружие, источник света, медикаменты…), а через args[1] код предмета в группе. В $inv хранится название локации-обработчика открытого меню в инвентаре, чтобы обновить список.

:оружие
:n
if i<50:
	 if оружие[i] = args[1]: 
		 оружие[i] = 0
		 j=i
		 :n2
		 if j<50:
			 оружие[j]=оружие[j+1]
                         j=j+1
			 jump 'n2'
		 end
	 i=i+1
	 jump 'n'
	 end
else
	 gosub '<<$inv>>'
end
Aleks Versus Moderator 10.12.2012 01:08 (13 years ago)

Bumbr:

интересует будет ли вложенный цикл(тот который j) смещать все предметы массива находящиеся по списку после удалённого?

Эммм… Что-то не пойму, как в принципе устроено хранение предметов в инвентаре.

По коду: Если ты знаешь номер элемента, который удаляешь, проще сделать просто killvar ‘оружие’,i. Хотя мне кажется, я всё-таки чего-то недопонимаю ввиду отсутствия остальной части. И потом, если это код удаления предмета, каким образом количество предметов может превысить 50? Количество лучше проверять при добавлении предмета.

Да, лучше делать KILLVAR - он удаляет элементы по заданному индексу, сдвигая все оставшиеся, чтобы не было “дыр”.

А вообще код неправильный, внешний цикл выполнится максимум два раза, да и то если первый элемент совпадёт с нужным. И почему GOSUB ‘<<$inv>>’, а не просто GOSUB $inv ? И где обнуление счётчика? Без обнуления эту процедуру нельзя будет вызвать более одного раза.

В том той дело что номер элемента в массиве неизвестен. Переменная i обнуляется в начале локации после чего идет переход к метке в зависимости от переданного args[0] (типа предмета). Я правильно понял, что вложенный цикл можно просто заменить на killvar ‘оружие’,i ?

Кстати в справке не написано что killvar сдвигает все элементы массива, убирая дыры. Я бы тогда и не заморачивался.
Основной цикл точно рабочий. Я бы привёл код всей локации, но не могу убрать его в спойлер.
Предметы добавляются добавлением кода предмета в массив. Проверки на кол-во предметов нет, да и не нужна она наверно. Просто пока что я решил ограничить цикл в 50 повторений.

Bumbr:

Я правильно понял, что вложенный цикл можно просто заменить на killvar ‘оружие’,i ?

Да.

Bumbr:

Кстати в справке не написано что killvar сдвигает все элементы массива, убирая дыры. Я бы тогда и не заморачивался.

Да, справка нуждается в доработке.

Bumbr:

Основной цикл точно рабочий.

Точно нет. Приглядись повнимательнее.

Переписал код с учётом killvar, чисто внешне работает так же как и предыдущий, но гораздо менее громоздкий. В этот раз привожу код от начала локации. Для остальных групп предметов код идентичен, поэтому его не привожу.

i=0
if args[0]=1: jump 'оружие'
if args[0]=2: jump 'помощь'
if args[0]=3: jump 'свет'
if args[0]=4: jump 'разное'
:оружие
:n
if i<50:
	 if оружие[i] = args[1]: killvar 'оружие',i
	 i=i+1
	 jump 'n'
	 end
else
	 gosub '<<$inv>>'
end

Bumbr,
а теперь у тебя лишний “end”.

См. Грабли, второе сообщение в теме.

Как пользоваться массивом, если его название хранится в переменной?

Log in or Register to post comments.