Милена - интерпретатор текстовых игр на LUA

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Вопросы по разработке

Сообщений 1 страница 30 из 54

1

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

0

2

Добрый день, Александр
Первый вопрос
Милена поддерживает все теги HTML? Тоесть я могу их использовать для оформления игры?

Отредактировано Lis (2010-03-24 16:51:19)

0

3

Милена использует движок htmlayout, который на данный момент поддерживает практически все теги HTML + собственные теги и надстройки. Так что Вы можете использовать при оформлении игры все HTML теги, которые Вам потребуются.

0

4

Спасибо, Александр
Еще вопрос если можно.
Я могу использовать Стили CSS в одельном файле для оформления.. как в HTML страницах

0

5

Извеняюсь, уже ответил на свой вопрос сам. Прочитал про HTMLayout
Да может  :cool:

Отредактировано Lis (2010-03-24 18:21:01)

0

6

Тут сложная история. Вы можете использовать глобальную таблицу стилей, указав имя файла в поле css таблицы text

text.css = "style.css"

Но Вам придётся продублировать некоторые параметры, определённые в файле ещё и в таблице text.

т.е. если, например, в style.css указан цвет текста, то Вы должны продублировать его в text.color, иначе меню (при нажатии esc) будет выводиться со стандартным цветом текста.

Для примера можно посмотреть файл style.css в папке scripts интерпретатора.

Но внешними файлами лучше не пользоваться, а описывать css в специальных полях таблиц text и button.

text.advanced - для текста
text.html - для определения стилей новых классов
button.advanced - для неактивированной ссылки
button.seladvanced - для активированной ссылки

0

7

Спасибо   :)
А не подскажите как мне заменить иконку курсора в игре?
Например присвоить ему изображение в формате .png

Отредактировано Lis (2010-03-24 20:00:37)

0

8

хм... что-то такое было.

Вот. Только png не получится сделать курсором. Его придётся сохранить как ico или cur (лучше cur, там указывается точка, относительно которой расположена картинка). Делается это вот так:

text.advanced = "cursor:url(dragcopy.cur);" --Для всего текстового поля
text.html = "cursor:url(dragcopy.cur);" --Для того, что за текстовым полем (ошибочка вышла в прошлый раз. text.html отвечает за стиль того, что под тегом html)
button.advanced = "cursor:url(dragcopy.cur);" --Для ссылок

Здесь надо заменить dragcopy.cur на имя файла своего курсора.

0

9

Благодарю Александр!
Позволяет ли "Милена" обрабытывать ввод с клавиатуры, тоесть я в квест хочу встроить небольшую мини-игру, которая бы управлялась клавишами курсора?

0

10

Да, конечно, позволяет.

Для этого надо создать локацию с именем, хранящимся в переменной key_pressed 'keypressed' (без кавычек) по умолчанию. Эта локация вызывается при нажатии на любую кнопку, кроме esc.

B этой локации нужно работать с переменной previous_key, в которой хранится код последней нажатой клавиши.

Коды клавиш курсора:

37 - Влево
38 - Вверх
39 - Вправо
40 - Вниз

Остальные можно узнать с помощью нехитрого кода:

Код:
:

endl
:keypressed
	pln(previous_key)
endl

0

11

Александр, Вы не подскажите как воздействовать одним объектом инвентаря на другие объекты
Тоесть в инвентаре есть объект "А" и объект "В". Игрок берет объект "А" и использует его на объекте "В" после этого получается объект "С"

0

12

Тут вот какая история. Допустим, у нас есть предметы "Фонарик" и "Батарейка".
Их нужно совместить. (Надо будет сделать пристройку к модулю инвентаря, ибо сейчас придётся ставить костыли).

Итак, для фонарика и батарейки делаем локации-меню и локации, на которых производится проверка на использование. (если у инвентарь только у игрока и его inv.prefix = 'инвентарь'). Понадобится вспомогательная переменная last_object - для хранения имени последнего выбранного объекта и ещё current_object для хранения имени текущего используемого объекта.

Вот самый простой вариант:

Код:
:
	require "new.inventory"
	inv.add('Фонарик')
	inv.add('Батарейка')
	function useto()
    --Изменяем действие на "использовать"
    inv.event = '_use'
    --Присваиваем last_object значение
    last_object = current_loc:gsub('_.*', '')
    --Выводим инвентарь (переходы осуществляются на локации с постфиксом _use)
    p 'Использовать на: ' inv.get();
    --Делаем всё, как было
    inv.event = '_menu'
	end
	proc(before_loc)
:start
endl
:Фонарик_menu
	useto()
endl
:Батарейка_menu
	useto()
endl
:Батарейка_use
	pln 'Невозможно.'
	goto('start')
endl
:Фонарик_use
	--Если батарейку использовали на фонарик
	if last_object == 'Батарейка' then
    pln 'Вы вставили батарейку в фонарик.'
    inv.del(current_object)
	else
    pln 'Невозможно.'
	end
	goto('start')
endl
:common
	if not current_loc:find('_menu$') and not current_loc:find('_use$') then
    p 'Инвентарь: ' inv.get()
	end
	if current_loc:find('_use$') then
    current_object = current_loc:gsub('_.*', '')
	end
endl

В идеале нужно пользоваться контейнерами. Если Вы хотите получить из объектов A и B объект C, то A и B нужно будет удалить из инвентаря, а C соответственно, добавить.

Есть более сложный и более красивый вариант. (Действительно, нужно создавать модуль взаимодействия предметов).

Отредактировано Александр Граф (2010-03-28 10:53:18)

+1

13

Большое спасибо за преведеный пример

Александр Граф написал(а):

Действительно, нужно создавать модуль взаимодействия предметов

Александр, было бы очень здорово.  :cool:

походу работы с "Миленой" еще возник вопрос - можно ли разные локации описывать в разных *.MSF файлах, а потом походу игры их загружать из основоного файла.. Тоесть в струкруре игры например есть папка "Location" в ней ноходятся описаные локации которые будут потом вызываться из основоного файла.. Просто так удобно строить структуру игры. Сначала расписал файлы локацый, а потом в основной игре(файле) свормировать структуру когда и какакая локация вызывается.

0

14

Такая возможность есть. Для этого существует команда include.
Пользоваться так:

Код:
include('locations/1.msf')

1.msf оформлен, как основной файл. После вызова команды, локации, описанные в 1.msf можно вызывать в основном файле.

0

15

Александр, подскажите как задавать положение текста и изображение  в окне (на экране) "Милены" ?

0

16

Тут можно воспользоваться тегом div.

p '<div style="position: absolute; top: 320px; left: 320px;">Это текст в позиции (320, 320).<br>******</div>'

То же самое с картинками. Можно также посмотреть примеры htmlayout'а на этот счёт.

0

17

Кстати, можно указывать высоту и ширину в div'ах, ещё есть поля таблицы text

text.blockstart - то, что всегда выводится до текста (обычно теги. открывающие)

text.blockend - то, что всегда выводится после текста (закрывающие тэги).

0

18

Александр, еще вопросик. Как зделать окно "Милены" 800х600.. ?
Просто я сделал картинку которая будет служить фоном для игры (чтото типа визуальной темы), а по вверх нее будут уже выводится остальной текст и изображения

0

19

Можно воспользоваться командой window.fullscreen

в таблице config хранятся положение и размеры окна.

window.fullscreen(false, config.x, config.y, 800, 600, config.rr)

Правда, в меню останется пункт "На весь экран/в окне". Его можно удалить вот такой строчкой.
В таблице milena.menu хранятся пункты меню. В формате {name = 'имя пункта меню', command = 'выполнямеый при нажатии код'}.

table.remove(milena.menu, 6)

0

20

а можно еще сделать чтобы размер окна нельзя было растягивать? Что бы оно было всегда постояным

0

21

Пока - нет. Надо будет сделать такую возможность.

0

22

Добрый день!
Александр, подскажите как поменять фон главного меню в игре (которое появляется когда жмешь Esc) ?
А то у меня там часть фоновой картинки, и поэтому смотрится не очень красиво.
И как сделать что бы при растягивании окна фоновая картинка не дублировалась (text.bgimage="img/fon1.png") ?

Александр Граф написал(а):

Пока - нет. Надо будет сделать такую возможность.

Да это будет полезная функция  :yep:

а шрифт текста меняется этой командой - text.font ='fonts/font1.ttf' ? просто у меня никак не получается шрифт поменять
текст и картинки я понял как позицинировать на экране, а вот с сылками btn(”location”, ‘text’) немогу разобраться как их позиционировать ? знаю с помощью тега <div>, но что то ни как не получается
И какой командой загрузить фоновую музыку в формате *.mp3 ?  8-)

Отредактировано Lis (2010-04-03 11:36:31)

0

23

Итак, начнём)

1. С фоном главного меню небольшие проблемы:
Когда-то я думал, что классно будет, если у главного меню будет такая же картинка фоновая, как и в игре (и в моём варианте это действительно было классно)). Поэтому тут придётся сделать с вывертом:

Код:
text.bgimage = ''
text.advanced = 'background-image: url(img/fon1.png)'

2. чтобы картинка не дублировалась, можно сделать так:

Код:
text.bgrepeat = 'none'

3. Шрифт указывается не именем файла шрифта, а как в html указанием его названия и т. п.

Код:
text.font = 'Arial'

Есть, правда, возможность использовать свои шрифты. Это можно сделать так:

Код:
milena.style = [[@font-face 
      {
        font-family: NinjaLine;
        src: url(NinjaLine.ttf);
      }]]
text.font = 'Ninja Line'

Этот пример взят из примеров для htmlayout, папки @font-face.

4. Позиционировать ссылки можно так:

Код:
p '<div style="position: absolute; top: 320px; left: 240px;">'
btn('test', 'test')
p '</div>'

В локации выводится полностью текст, и не важно какой командой. Для ссылок div'ы не подходят, так как выводятся уже после тега a (точнее, в нём).

5. Фоновую музыку можно загрузить так:

Код:
mus = music.sound('music/fon.mp3', true)
--Музыка загружена, но не воспроизводится
mus:play() --Воспроизвести музыку

Команда music.sound возвращает таблицу, хранящую дескриптор звука (ну это не важно), принимает 2 параметра.
1. Имя файла с музыкой
2. Флажок зацикливания музыки (true или false)

С возвращённым значением можно делать следующее:

mus:play() - воспроизвести
mus:pause() - приостановить
mus:stop() - остановить (музыка начнёт играть с начала, если её воспроизвести)

Также можно изменять её громкость:

mus.volume = [значение от 0 (заглушить) до 1 (максимальная громкость)]

Поле active этого значения содержит флаг проигрывания музыки (true - проигрывается, false - нет)

mus.active

*Длинный ответ получился)

Отредактировано Александр Граф (2010-04-03 12:11:49)

0

24

Александр огромное спасибо !!
правда со шрифтами не получилось поменять, ну это пока не суть важно, я еще покапаюсь в них (может что сам не правельно делаю)

правда я немного подравил код чтобы фон не дублировался при растягивании окна
заместо text.bgrepeat = 'none' написал text.bgrepeat = false

А как заменить цвет текста в ссылки и ее размер

p '<div style="position: absolute; color:#ffffff; font-size:20; top: 480px; left: 40px;">'
btn('scene-1', 'Начало игры')
p '</div>'

что в здесь не верно?

А также в выше преведеном коде при его запуске слова в фразе "Начало игры" находятся на разных сточках, а не в одну. Как это можно подкоректировать?

0

25

Lis написал(а):

А также в выше преведеном коде при его запуске слова в фразе "Начало игры" находятся на разных сточках, а не в одну. Как это можно подкоректировать?

На этот вопрос на шел ответ.  :idea:
В теги <div> добавил style="width: значение;  и все выровнялось..

0

26

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

width: calc(self.text-width(self:value));

То блок будет учитывать ширину текста.

А с цветом - тут как раз такой случай, когда теги нужно писать в имени кнопки.

Код:
p '<div style="position: absolute; font-size:20; top: 480px; left: 40px;">'
btn('scene-1', '<font style="color:#ffffff;">Начало игры</font>')
p '</div>'

Вообще, если все кнопки однотипны, лучше пользоваться таблицей button.

button.color - цвет текста кнопки
button.selcolor - цвет текста выделенной кнопки
button.bgcolor - цвет фона кнопки
button.bgselcolor - цвет фона выделенной кнопки

button.style - стиль кнопки, заданный строкой. Если строка содержит B - жирный, S - зачёркнутый, I - наклонный, U - подчёркнутый

button.advanced - дополнительные параметры. Строка с css описаниями.
button.seladvanced - как advanced только для выделенной кнопки.

Я делаю вот такие кнопки:

Код:
button.color = "#C20600"
button.selcolor = "#E50706"
button.advanced = 'display: block; width: calc(self.text-width(self:value)); opacity: 0.75; border: 2px solid #eee; margin: 4px; padding: 2px; border-radius: 5px; background-color: white;'
button.seladvanced = 'opacity: 0.9;'

0

27

Александр, добрый день
Я хочу часть игровых функций вынести в отдельном файле.
Для этого мне надо создовать файл с расширением function .MMOD ?
А для того чтобы в основной игре вызывать нужные функции которые прописаны в этом файле, мне нужно его подключить командой require 'functions' ?...
И для чего служит команда -  package.path='.\\modules\\?.mmod;'..package.path

0

28

Да, нужно сделать так.
Команда package.path='.\\modules\\?.mmod;'..package.path служит для того, чтобы указать луа где искать модули. В данном случае добавляется папка modules в папке игры, там ищутся файлы с расширением mmod. По-моему эту строчку писать не нужно - просто создаём function.mmod, кладём его в папку modules и подключаем require "function". Вообще, лучше почитать справку по луа насчёт модулей.

0

29

Да, точно, токо что проверил.  :glasses:
если модули (*.MMOD) находятся в папке modules то строчку package.path='.\\modules\\?.mmod;'..package.path можно не создовать, а если в другой папке, то нужна команда package.path='.\\путь к папке с модулями\\?.mmod;'..package.path

0

30

Да, только я думаю - это не за чем)

0