RU 📌 Pinned

Как сделать?

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

Martin Doriel,
MSECSCOUNT() нельзя ничего “присвоить”, т.к. это не переменная, а функция, просто для удобства скобки чаще всего не пишутся. Использовать в выражениях ее можно как угодно.

Цитирую справку: “Числовое значение переменной / элемента массива может быть в интервале [-2147483648, 2147483647].”

2147483647 миллисекунд ~= 2 147 483 секунд ~= 35 791 минут ~= 596 часов ~= 24 дня (суток) игры.
MSECSCOUNT учитывает только время, проведенное в игре.

Nex
Я был не верно понят.

Martin Doriel:

переменной присвоить значение MSECSCOUNT

Чему? -переменной. Что сделать? -присвоить значение MSECSCOUNT.
По типу: press_1=MSECSCOUNT

Martin Doriel:

сделать с ней какие-нибудь операции (например: деление на еще одну переменную с MSECSCOUNT или их умножение

По типу: press=press_1*press_2 именно это выражение вызывало небольшой страх) (хоть и используется в основном в игре разность по времени, а не его умножение, просто предел интересен был)
Но ответ исчерпывающий.

Долго бился над одним кодом, но не все получилось. Наконец сдаюсь и обращаюсь к профессионалам. :)
Мне необходим кусочек кода, который будет добавлять через полсекунды в начало строки один символ (значение отдельной переменной, это уж я сам). А строк-то десять штук.
Скажем, при запуске локи в основном окне:
й
ы
с
и т.д.

Через 500 мс:
ый
аы
ос
……
Еще через 500 мс:
вый
ваы
рос
……
Как это можно сделать? Возможно, надо десять курсоров на каждую строку, которые через каждые полсекунды возвращаются в начало своей строки? :)

как вариант

#main
i = 1
:loop
	*clr
	func('string_end', 'первая строка',i)
	func('string_end', 'вторая строка',i)
	func('string_end', 'третья строка',i)
	func('string_end', 'четвертая строка',i)
	i += 1
	wait 500
! устанавливаем ограничение по самой длинной строке
if (i <= len('четвертая строка')): jump 'loop'
-
#string_end
! показать n символов из конца строки
! $args[0] - строка
! args[1] - кол-во символов
$result = mid($args[0], len($args[0]) - args[1] + 1)
-

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

Спасибо, werewolf. Сейчас попробую )

werewolf, все-таки код не работает так, как надо. В строке выводится лишь один символ. Обьясняю подробно, в надежде, что ты поможешь :)
Есть две локации. Первая:

#main
DISABLESCROLL=1
PLAY 'soound/main.mp3'
$result = mid($q[0], len($q[0]) - args[20] + 1) 
!это выражение я, скорее всего, неверно вставил
'<<$q>>'
!а это первая строка. Пусть пока одна. Здесь должны выводиться произвольные значения переменной $q. Каждое новое значение (текстовое) должно прибавляться к предыдущему, только в начало строки. Так получается "бегущая строка".

Вторая локация:

#code
!рандомно выбираются значения переменных, как текстовые, так и числовые
$q=rand(1,15)
if $q=10:
 $q='q'
end
if $q=11:
 $q='w'
end
if $q=12:
 $q='e'
end
if $q=13:
 $q='r'
end
if $q=14:
 $q='t'
end
if $q=15:
 $q='y'
!!! твой код
i = 1 
:loop 
*clr 
func('main', '<<$q>>',i) 
i += 1 
wait 500 
if (i <= len('<<$q>>')): jump 'loop'

Укажи, пожалуйста, что неправильно.

тот код, что я приводил рассчитан на ситуацию, когда ты знаешь всю строку и просто выводишь ее начиная с конца
а у тебя при изменении получилось так что в переменной $q находится один символ - он и выводится
есть 2 варианта
1) изменить твой код так чтобы он генерировал сразу всю строку и сохранял ее в $q (только из локации main убери ‘<<$q>>’

  • а то будет выводится 2 одинаковых строки) 2) изменить принцип вывода из расчета что строки мы не знаем, а генерируем каждый символ отдельно
    где-то так
# running_line
! это собственно функция, которая будет выводить строку
! кол-во символов который недо вывести
symbol_limit = 10
! кол-во строк которые надо вывести
line_limit = 10

line_i = 1
symbol_i = 1

:symbol_loop
	line_i = 1
	*clr
	:line_loop
		$lines[line_i] = func('generate_letter') + $lines[line_i]
		*pl $lines[line_i]
		line_i += 1
	if line_i <= line_limit: jump('line_loop')
	wait 500
	symbol_i += 1
if symbol_i <= symbol_limit: jump('symbol_loop')
--- running_line ---------------------------------

# generate_letter
!функция которая будет генерировать следуюущую букву
$result = rand(1,15)

if $result = 10:
	$result ='q'
elseif $result = 11:
	$result ='w'
elseif $result = 12:
	$result = 'e'
elseif $result = 13:
	$result='r'
elseif $result = 14:
	$result='t'
elseif $result = 15:
	$result = 'y'
end
--- generate_letter ---------------------------------

werewolf, ОГРОМНОЕ спасибо. Все работает. Осталось подкорректировать самую малость - и работа сделана :=D
Я поставил 20 строк ((line_limit = 20)) и символы, заполняющие всю строку (symbol_limit = 105). Но появилась одна проблема. Как только каждая строка выведет 105 символов, она останавливается. Это совсем не катит) Необходимо, чтобы каждая строка генерировала символы БЕСКОНЕЧНО (или почти) и постоянно двигалась. Я думал так: сначала поставим огромный лимит символов (symbol_limit = 1000000). Но оказалось, что строка, как только дойдет до края основного окна, ПЕРЕНОСИТСЯ на другую строку. Это тоже не катит) Необходимо, чтобы символы двигались постоянно, но каждая строка занимала свое место. Я вижу два варианта решения проблемы:

  • каким-то образом сделать так, чтобы строки “не видели” край окна и двигались себе вперед, до бесконечной длины;
  • как только строка достигнет длины в 105 символов, каждый последний ее символ ВЫРЕЗАЕТСЯ одновременно с генерацией нового символа в начале строки. Таким образом, поддерживается постоянная длина в 105 символов, но строка постоянно движется и меняется. А ты что предложишь?
Dark[Ol(U23)leneri] #34 16.04.2011 15:56 (14 years ago)

Во-первых, это у тебя на экране 105 символов. А у меня может быть 104
Во-вторых, второй вариант лучше. Только не вырезается символ, а переменной, в которой строка присваивается значение от второго символа и до конца.

Dark(Ol(U23)leneri):

Во-первых, это у тебя на экране 105 символов. А у меня может быть 104

Верно. Я все продумаю, не переживай )

Dark(Ol(U23)leneri):

Только не вырезается символ, а переменной, в которой строка присваивается значение от второго символа и до конца.

Нет, мне нужно, чтобы символ именно ВЫРЕЗАЛСЯ. Может, сможешь помочь с кодом этого вырезания?

в этом случае лучше всего изначально генерировать строку необходимой длины, а потом просто вырезать из нее нужные части для вывода
но для бесконечного движения текущий код не годится - использования wait блокирует любые действия, то есть игрок не сможет перейти на другую локацию, выбрать предмет и т.д.
для нормального функционирования нужно изменить принцип с использования wait на использование counter
пример такой реализации

werewolf:

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

Игроку и не нужно будет выполнять никакие действия до конца игры, он будет наблюдать. Потом увидишь) За пример кода спасибо, но оттуда я возьму не все.

werewolf,
Можно пожалуйста, поподробней. Как получилось так, что ни одного wait нет, но задержка есть, более того, игрок может выбирать действия?

AntiPod:

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

AntiPod, с помощью локи-счетчика :)
Благодарю всех помощников ) См. тему “Не-игры на QSP”.

Log in or Register to post comments.