RU 📌 Pinned

Как сделать?

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

Aleks Versus Moderator 16.09.2015 17:45 (10 years ago)

saks,
можешь забить куски кода на комбинации клавиш. Заходишь в меню “утилиты - настройки” Вкладка “комбинации клавиш”. Я так вставляю нормальные кавычки, например, отступы и комментарии.

saks,
Я тыкаю один раз “tab” и один раз пробел

а еще можно не просто тыкнуть тэбом, а выделить сразу много строчек и подвинуть их тэбом в один присест)

saks,Правильней все таки структурировать код непосредственно табуляцией.
Клавиша TAB табуляция. Сочетание клавиш shift TAB - обратная табуляция.
Кстати расстояние табуляции по стандарту 4 пробела, но можно менять в настройках на любое значение.

Ох, ребят, помогите пожалуйста. Бьюсь второй день об бубен - мозгов не прибавляется.
Прочёл статью по игровому времени:
дни = время / (24*60)
часы = (время - дни*24*60) / 60
минуты = время - часы*60 - дни*24*60
*PL ‘Время: <<дни>> день, <<часы>>:<<минуты>>.’
Но мне формат времени нужен следующий: [День недели], [Время:XX:XX], [Дата:День.Месяц.Год]
Вопроса два: 1. Как сделать то, что я описал?
2. Не могу врубится в формулу описанную Nex’ом. Т.е. почему именно так: дни = время / (24*60), и что есть “время” в этой формуле.
Запутался окончательно, шарил по форуму, конечно… Но тем не менее проблему не решил. Помогите, ребят, пожалуйста!

Aleks Versus Moderator 17.09.2015 07:07 (10 years ago)

Dower.Hollower,
Nex предлагал самый простой и наглядный способ организации времени.
1. Вести подсчёт времени в одной переменной. Обычно никто не ведёт в текстовых играх подсчёт в секундах, так что самое меньшее дробление - минуты. Время в примере у Nex’а считается именно в минутах.
2. Всякий раз когда на действие тратится время изменяем значение переменной, которая отвечает за подсчёт

время = время + 20 & !например
! или
минуты = минуты + 20 & ! если тебе так проще

3. Чтобы вывести текущее значение, сколько часов, дней и т.д прошло, используются усреднённые значения
в одном часе 60 минут
в одном дне 24 часа
в одном месяце 30 дней
в одном году 360 дней
Надеюсь, теперь понятно, почему время/(24*60)= дни ?
evp не так давно дал универсальную формулу Юлианского календаря. И объяснил, как им пользоваться.

А строка, где присутствует оператор *pl - это просто вывод на экран. В твоём случае делается так, я полагаю:

*pl '[<<день_недели>>], [Время:<<часы>>:<<минуты>>], [Дата:<<дни>>.<<$месяц>>.<<год>>] '

т.е. счётчик у нас будет считать только в минутах, получается так? Значит если мне нужно начало игры 1 января 2015 года это будет: 2015*360*24*60=1044576000 минут?
Следовательно у нас это число идёт в заданную переменную, затем прописываем код для дробления на часы/дни и т.д., а при действии добавляем определённое кол-во минут к уже заданной переменной, всё правильно понял?

Aleks Versus Moderator 17.09.2015 08:09 (10 years ago)

Dower.Hollower,
правильно. Но тебе не обязательно делать счётчик от нуля. Можешь подсчитывать время с начала игры, а потом увеличивать на отсчётное значение. Допустим сколько лет прошло с начала игры +2015. Лично я так делал.

Вопрос для искушенных.

Spoiler

В начале игры

music_on = 1
volume = 80
number = 0

Локация счетчик.

! если музыка вкл
if music_on=1:
	if isplay $tr[number] = 0:
	close $tr[number]
	number = number + 1
	play $tr[number],volume
	end
else
	close all
end
!сбрасываем треклист к началу.
if number > 7 : number = 0
if number < 0 : number = 0

Локация обработчик выбора предметов.

Spoiler
IF selobj = 'Музыка Вкл/Выкл.':
	if music_on=1:
		music_on=0
	else:
		music_on=1
	end
unsel
end
if selobj = 'Громкость -':
volume=volume-10
if volume<0:volume=0
'<<volume>>'
unsel
end
if selobj = 'Громкость +':
volume=volume+10
if volume>100:volume=100
'<<volume>>'
unsel
end
if selobj = 'След.Трек':
close $tr[number]
number=number + 1
play $tr[number],volume
unsel
end
if selobj = 'Пред.Трек':
close $tr[number]
number = number - 1
play $tr[number],volume
unsel
end

Требуется на выходе: гибкий плейлист с возможностью перелистывания мелодий вперед/назад, возможностью регулировки громкости и функцией вкл/выкл.
В данной реализации работает все кроме громкости, переменная меняется, но проигрывающаяся мелодия игнорирует её значение.

Aleks Versus Moderator 18.09.2015 09:23 (10 years ago)

bkz,
игнорирует, потому что трек уже проигрывается. Чтобы запустить с новой громкостью, тебе нужно перезапускать мелодию с текущим значением volume.

для Dower.Hollower и всех, кому интересно
Календарь, не привязанный к Юлианским формулам. Можно перекраивать под себя, если есть желание. Старался комментировать подробно.
calendar.qsp - ссылка удалена по причине грубейшей ошибки (19/09/2015).

P.S.: ))) Я там где-то напортачил. 32 декабря выходит.
P.S.S: ))) Ошибка исправлена. Календарь работает как часы.

Edited at 19.09.2015 12:30 (10 years ago)

Aleks Versus,

! устанавливаем текущие значения времени. Чтобы календарь работал корректно, должна быть выставлена хотя бы минута
time['day']=259
time['hour']=16
time['minute']=32
time['year']=2015

Вывод в окне:

Сейчас 16:32. 18 Сентября 2015 года. Воскресенье

Воскресенье

Aleks Versus Moderator 18.09.2015 20:18 (10 years ago)

evp,
Задать правильное положение дня недели тоже можно изначально, если ты его знаешь.

time['weekday']=5	&	!	текущий день недели

Если не знаешь, то может это не так уж и важно? Тут уж дело автора.

Это колесо не должно показывать точные совпадения по действующему календарю. Оно должно давать точные совпадения по календарю игры. Это может быть год из тринадцати месяцев по двадцать восемь дней, день не в счёт каждые сто лет, 10 дневная “неделя”, и 32 часа в сутках.

Aleks Versus, если вы говорите,что это вымышленный календарь, то зачем в нем високосные годы, взятые из реального календаря планеты Земля (к тому же из юлианского, а не более точного григорианского)? Как совместить

Aleks Versus:

год из тринадцати месяцев по двадцать восемь дней, день не в счёт каждые сто лет, 10 дневная “неделя”, и 32 часа в сутках

и продолжительность земных суток и длительность оборота вокруг Солнца планеты Земля, заложенные в коде вашегокалендаря?

Если вы хотели сделать земной календарь, то вам это почти удалось (почти - потому, что это больше похоже на Юлианский календарь). Вы проделали большую работу, которая, к сожалению, полезна только как практикум по программированию на QSP. Ибо все эти вычисления не имеют смысла при наличии готовых формул, существующих как для Юлианского, так и для, актуального сегодня, Григорианского календаря.

Если же вы хотели сделать некий вымышленный (неземной?) календарь, то наличие високосных лет - лишнее усложнение, тем более, что у вас зашита в код логика земных юлианских високосных лет. Кроме того - месяцы. Месяц это единица времени, применимая сугубо к системе Земля-Луна. Нет Луны - нет и месяцев. И недели. Неделя это длительность каждой из фаз луны (новолуние, растущая луна, полнолуние, убывающая луна). Какой еще календарь, кроме земного, может учитывать лунные циклы?

Но даже если оставить месяцы и недели, но убрать високосные годы, то ваш код уместится всего в несколько строчек.

!Задаем параметры календаря. В качестве примера взят календарь, похожий на земной.
minuts.hour = 60
hours.day = 24
days.week = 7
days.month = 30
months.year = 12
minuts[day] = minuts.hour * hours.day
minuts[month] = minuts.day * days.month
minuts[year] = minuts[month] * months.year

!Cобственно весь код календаря :)
year = time / minuts[year]
month = (time / minuts[month]) MOD month.year
day = (time / minuts[day]) MOD days.month
hour = (time / minuts.hour) MOD hours.day
minut = time MOD minuts.hour
weekday = day MOD days.week

Я уважаю ваш труд, но стоило ли? Вы не сделали полноценный земной календарь. А вымышленный, абстрактный календарь невозможно заранее представить в виде кода, ибо вы не можете предугадать всех фантазий авторов, а основываться на структуре земного календаря тоже нельзя.

Aleks Versus Moderator 19.09.2015 09:23 (10 years ago)

evp,
в високосных годах где-то я и напортачил. Показалось, что исправил ошибку, но теперь пропадает 1 февраля високосного года. Что-то с нумерацией дней у меня не клеится.

Да это Юлианский календарь. Делал его, чтоб набить руку, в то же время принцип мог мне пригодиться. О существовании формул для вычисления того или иного дня я, конечно, догадывался, есть же так называемые “вечные” календари, но на момент, когда делал эту систему, не был с ними знаком.

Нет, “весь код календаря” это расчёт текущей даты исходя из значения time - способ, который дают всем новичкам на форуме, но меня он не вполне устраивал.

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

Дополните правило високосности. Если год кратен 100, то он невисокосный (Григорианский календарь).
Как-то так:

if (year MOD 4 = 0) and year MOD 100:
    ! Правила для високосного года
end

И все-таки я не понимаю, чем это лучше, чем готовые формулы? :) Разве что в качестве упражнения.

Log in or Register to post comments.