Как сделать?

Re: Как сделать?

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

RedRoses
useravatar
Offline
2 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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

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

 Спойлер Show Spoiler Hide 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:
 Спойлер Show Spoiler Hide 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:
 Спойлер Show Spoiler Hide 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 вывод, ибо я помимо вывода, собираюсь пихать в массив эвенты, события, чуток рандома и много остального, что должно исполнятся как отдельный код.

Oliver
Magni nominis umbra
useravatar
Offline
560 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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

Aleks Versus
воздвигатель башни
useravatar
Offline
1466 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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

Oliver
Magni nominis umbra
useravatar
Offline
560 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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

7H3_D31M0S
Разработчик игр
useravatar
Offline
12 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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

7H3_D31M0S
Разработчик игр
useravatar
Offline
12 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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 написал(а):

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

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

 Спойлер Show Spoiler Hide 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 нужно просто обращаться к этой локации.

Aleks Versus
воздвигатель башни
useravatar
Offline
1466 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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

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

Вета
useravatar
Offline
503 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

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

Код:


!//--- Инициализируем где-то массив с предметами
$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'

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

Oliver
Magni nominis umbra
useravatar
Offline
560 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Oliver, спасибо, Такой вариант я знаю, но неужели нет более изящного способа, чем добавлять руками все свойства? Предметов может и немного, а вот свойств не два... ну, может, кто-то ещё сталкивался и подскажет.

Вета
useravatar
Offline
503 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
967
Всего опросов:
14
Всего сообщений:
16790461
Сообщений на этой неделе:
4
Пользователи форума:
 
Всего пользователей:
2315
Последним зарегистрировался:
Aleksandra Краева