RU 📌 Pinned

Как сделать?

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

Всем привет. Как в свою игру вставить webm видео? сколько раз пробовал в лучшем случае показвает иконку поврежденного файла в худшем вылетает с сообщением об ошибке. помогите пожалуйста.

Aleks Versus Moderator 22.02.2019 16:34 (7 years ago)

Andrik3206,
в этой теме вроде бы есть ответ https://qsp.org/forum/comments/24046

Подскажите, будьте добры, как сделать вывод текста, вбитового в основное окно, в начале локации? Операторы *P, *PL и *NL пихают текст в конец локации, а хотелось бы прямо противоположного. Заранее спасибо)

Aleks Versus Moderator 23.02.2019 16:46 (7 years ago)

De@th K!d,
я бы написал свою локацию примерно такого содержания

! add.string
$args[0]=$args[0] & ! текст, который нужно вписать сверху (строка)
$args[1]=$maintxt & ! забираем текущий текст из окна основного описания в переменную
! очищаем окно основного описания
*clr
! выводим тексты
*pl $args[0]
*p $args[1]

Потом, в том месте, где нужно добавить текст сверху:

gosub 'add.string','Строка сверху'

Здравствуйте, подскажите пожалуйста, как вставить в основное окно файл gif или avi. Вроде была такая возможность в описании?

RedRoses,
Вставить файл GIF - не проблема.
Для начала, в первой локации игры включите распознавание HTML (если, конечно, вы этого ещё не сделали). Потребуется вот такой код:

usehtml = 1

А потом в текст локации можно будет вставлять картинки. Пример:

'Вот мой текст.'
'А вот здесь картинка: <img src="где хранится картинка">'
'Гифки я тоже умею вставлять: <img src="где хранится гифка.gif">'
'А это снова мой текст.'

С AVI дело куда сложнее - классический плеер такой формат не поддерживает. Рекомендую посмотреть здесь: https://qsp.org/forum/comments/24035

Это альтернативная реализация классического плеера. Поддерживает больше HTML-тэгов, может проигрывать видео. Правда, есть некоторые глюки, связанные с counter, но они не слишком надоедливые.

NickoAilus,
Спасибо) Правда, та версия плеера avi, кажется, тоже не поддерживает, ну что ж делать, буду в гиф конвертировать)

Здарова, почаны.
Собственно, созрел вопрос, на который никак не могу найти ответ.
Map.qsp

Циклом заполняю массив данными, но попытки “передвигаться” по нему не выходят. Просто не сменяется содержимое экрана.
Локация start:

Spoiler
KillAll

ShowObjs  0
ShowInput 0
ShowActs  0
ShowStat  0

UseHTML = 1

gs 'GenMap'

*nl & *nl & *nl & *nl & *nl & *nl & *nl & *nl & *nl
*PL '<center><a class = "plain" href = "exec: gt ''travel''">Генерация карты</a></center>'

Локация GenMap:

Spoiler
maxIndex_Y = 20    
maxIndex_X = 20

! Заполнение данных массива 
index_Y = -20
:GenY
	index_X = -20
	:GenX
		$map['<<index_Y>>, <<index_X>>'] = {
			*PL '<center><<iif(index_Y>0, "Север - <<index_Y>>", "Юг <<index_Y>>")>>, <<iif(index_X>0, "Восток - <<index_X>>", "Запад <<index_X>>")>></center>'
			*PL '<center><b>Blank</b></center>'
		}
		index_X+=1
	if index_X<=maxIndex_X : Jump 'GenX'
index_Y+=1
if index_Y<=maxIndex_Y : Jump 'GenY'

KillVar 'maxIndex_Y'
KillVar 'maxIndex_X'

Локация travel:

Spoiler
dynamic $map['<<Y>>, <<X>>']

*PL '<center><a href = "exec: if Y<20: Y+=1 & gt curloc">Север</a></center>'
*PL '<center><a href = "exec: if X>-20: X-=1 & gt curloc">Запад</a> | <a href = "exec: if X<20: X+=1 & gt curloc">Восток</a></center>'
*P  '<center><a href = "exec: if Y>-20: Y-=1 & gt curloc">Юг</a></center>'

В чём соль. Если массив объявлять руками, то вывод через dynamic работает. Но это утомительно, создавать карту 40х40(от -20 до 20). И нужно мне именно через dynamic вывод, ибо я помимо вывода, собираюсь пихать в массив эвенты, события, чуток рандома и много остального, что должно исполнятся как отдельный код.

Aleks Versus Moderator 12.03.2019 15:54 (6 years ago)

Oliver,
подвыражения в фигурных скобках не раскрываются, пока ты не отправишь код в dynamic. Поэтому координаты выводит неверно/

Aleks Versus,
Спасибо, уяснил уже :)

Григорий Лебедев #2234 05.04.2019 17:56 (6 years ago)

Как сделать так, чтобы программа вытаскивала карты (переменные) из колоды (массива)?
Например, есть числа 1, 2, 3.
Программа выбирает случайное число. 2.
Остается 1 и 3.
Программа выбирает между ними. 3.
Остается 1.
Программа (очевидно) выбирает 1.
Больше ничего не осталось.

Григорий Лебедев #2234 05.04.2019 17:59 (6 years ago)

Пожалуйста, дайте мне простой код-каркас для генерации сетки и передвижения по ней.
Если можно, то с комментариями.

Aleks Versus Moderator 06.04.2019 07:17 (6 years ago)

7H3_D31M0S:

Как сделать так, чтобы программа вытаскивала карты (переменные) из колоды (массива)?
Например, есть числа 1, 2, 3.

Это просто.

$card[0]='1'
$card[1]='2'
$card[2]='3'
:for
if arrsize('$card')>0:
    i=rand(0,arrsize('$card')-1)
    $card[i]
    killvar '$card',i
    jump 'for'
end

7H3_D31M0S:

Пожалуйста, дайте мне простой код-каркас для генерации сетки и передвижения по ней.
Если можно, то с комментариями.

вот это сложно. пока могу предложить только вот такую заготовку, быть может разовьёшь:

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

Во-первых, что представляет из себя карта рогалика. Это поле, где буквами, цифрами и символами условно показаны те или иные объекты. Каждый символ - клетка карты с заданными координатами, в которой находятся объекты. В нашем примере пустая клетка будет обозначена точкой, кусок стены буквой П (Внимание. Для корректного отображения карты используются только моноширинные шрифты). Итак первый этап составления карты для рогалика - рисуем карту:

ППППППППППППППППППППППППП
П.......................П
П.......................П
П.......................П
П.......................П
П...........I...........П
П.......................П
П.......................П
П.......................П
П.......................П
ППППППППППППППППППППППППП

Это карта комнаты шириной 25, длиной 11 клеток. В центре комнаты находится герой. Он обозначен буквой I. Координаты героя сейчас 0;0. Это значит, что координаты клетки, в которой он находится тоже 0;0, и это значит так же, что до того как герой попал в эту клетку, она была пустой.
Пусть для хранения координат героя используются переменные X (горизонтальная ось) и Y (вертикальная ось). Сейчас герой стоит в позиции 0;0, а значит:

X=0
Y=0

Мы наглядно написали это не просто так, но чтобы перейти к следующему этапу: помещаем карту в массив. Координаты клетки будут служить её адресом в массиве. Для наглядности и удобства нам нужен двумерный массив. В QSP не бывает двумерных массивов, однако есть обходной путь, чтобы сделать такой массив, используя строковые индексы. Вот как выглядит запись клетки с координатами 0;0 в таком массиве:

$map_cell['0;0']='.'

Как мы уже говорили, эта клетка до появления в ней героя была пустой, поэтому в ячейку массива и вносится значение "." (точка).
Клетка слева от героя расположена по адресу -1;0 клетка справа 1;0, клетка сверху 0;1, снизу 0;-1. Все эти клетки можно и нужно создать в массиве:

$map_cell['-1;0']='.'
$map_cell['1;0']='.'
$map_cell['0;1']='.'
$map_cell['0;-1']='.'

В идеале, необходимо вручную забить все 25х11 клеток, но комнату, подобную нашей можно и сгенерировать:

j=5		&	! координаты по вертикальной оси левого верхнего угла
:for_y
if j>-6:
	i=-12	&	! координаты по горизонтальной оси верхнего левого угла
	:for_x
	if i<13:
		if j=5 or j=-5 or i=-12 or i=12:
			$map_cell['<<i>>;<<j>>']='П'
		else
			$map_cell['<<i>>;<<j>>']='.'
		end
		i+=1
		jump 'for_x'
	end
	j-=1
	jump 'for_y'
end

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

Мы же теперь переходим к выводу карты на экран.

Для вывода карты на экран необходимо создать отдельную локацию и назвать её например "вывод карты". Эта локация должна очищать окно основного описания и отрисовывать на нём карту в соответствии с тем, какое сейчас положение на карте занимает герой, какую часть карты просматривает игрок и пр. Мы сделаем простой вывод карты в указанных пределах координат (x = -12;12, y = 5;-5). Для этого нам потребуется приблизительно такой же алгоритм, как и алгоритм генерации комнаты:

j=5		&	! координаты по вертикальной оси левого верхнего угла
:for_y
if j>-6:
	i=-12	&	! координаты по горизонтальной оси верхнего левого угла
	:for_x
	if i<13:
		if j=Y and i=X:
		! Если координаты положения героя и координаты клетки совпадают, выводим символ героя
			$map_print+='I'
		else
			$map_print+=$map_cell['<<i>>;<<j>>']
		end
		i+=1
		jump 'for_x'
	end
	! отрисовали строку, добавляем переход на следующую строку
	$map_print+='
'
	j-=1
	jump 'for_y'
end
*clr
*p $map_print

Теперь всякий раз при изменении положения героя, т.е. значений переменных X и Y нужно просто обращаться к этой локации.

Нужен хелп, ребятки, ибо привыкла я к хорошему, а как на куспе так сделать что-то не пойму.
У меня есть объект нож в виде массива.
$knife[’name’] = ‘Нож’
$knife[’desc’] = ‘Описалово’

И есть инвентарь, в который добавляются предметы:
$inv[] = $knife

И вот как бы мне сделать вывод через переменную инвентаря.
К примеру, $inv[0] = $knife
И надо как-то так:
‘<<$inv0>>’
‘<<$inv0>>’
ну что ес-но не работает.
А как-то можно вообще это сделать?

Вета,
Ух, сам над этим голову ломал.

!//--- Инициализируем где-то массив с предметами
$item['Нож, Имя'] = 'Нож'
$item['Нож, Описание'] = 'Стальной, отливающий блеском, нож. Пригодится, если нужно освежевать... кого-то.'

!//--- Там, где подбираем предмет
$inventoryName[1] = $item['Нож, Имя']
$inventoryDesc[1] = $item['Нож, Описание']

!//--- Там, где выводим
index = 1
:printItems
   *PL '<<$inventoryName[index]>>'
   *P  '<<$inventoryDesc[index]>>'
   index += 1
if (arrsize('$inventoryName')-1)>index: jump 'printItems'

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

Log in or Register to post comments.