Please or Регистрация to create posts and topics.

Подсказки в игре

Page 1 of 2Далее

Здравствуйте!

Может подскажет кто, хочу добавить в игру подсказки. Сила Урагана убирает два неверных ответа - и, соответственно, при нажатии на значок-спрайт убирается 2 неверных ответа, а сам спрайт становится черно-белым (типа уже неактивным). С помощью чего это сделать проще?

Загруженные файлы:
  • Вам нужно войти, чтобы просматривать прикрепленные файлы..

Интересная задачка..

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

По логике, чтобы этим не занимался вручную, на спрайте при его выводе, прописать его функцию. То есть, спрайт.action = function(){подсказка()};

Он теперь будет выполнять функцию подсказка() каждый раз при нажатии.

В параграфе с вопросом можно прописать сама функцию.

подсказка = function () {

код ;

}

Вместо кода пишем переход на вопрос уже с двумя вариантами ответов. Прописываем серый цвет спрайту через .filter

Убираем функцию нажатия. спрайт.action = function(){};

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

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

спрайт.action = function(){подсказка()};

Убираем ему серый цвет.

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

Я думаю, теоретически можно обойтись без перехода и попробовать через clear(), update (). То есть, при нажатии удалить все что есть на экране, прописать изменения, и добавить вопрос уже с двумя вариантами. Тут вижу только логику, но будет ли работать.. функции капризные.

Цитата: Chris Nerson от 25.01.22, 02:25

Интересная задачка..

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

Спасибо за отклик! Насчёт фильтра серого цвета для спрайта и его активностью я додумалась, но вот с вопросами беда. Их 30 штук в каждой из пяти локаций, и в конце всех вопросов идёт подсчёт баллов. Если начинать вести ветки с двумя вариантами ответов, с тремя - в итоге параграфов будет уйма, а их и так уже 500+.

Попробовал через Update() Clear()... Получилась дичь. Clear() не работает вообще, либо я не понимаю работы функции.

Я правильно понял, у вас каждый вопрос в отдельном параграфе? Еще вопрос, что делают остальные сферы?

Как бы я решил эту проблему...

где-то перед вопросом пропишем функцию:

подсказка = function(параграф){

x=2;

спрайт.action = function(){}; // отключаем нажатие спрайта

спрайт.filter = "greyscale(100%)";

goto(параграф);

}

После этого, перед каждым вопросом (Важно, не внутри параграфа, а перед) задаем функцию с подсказкой для сферы земли: спрайт.action = function(){подсказка($$title)};

Переход на параграф с вопросом задаем с переменной x=1: \[[Следующий вопрос|вопрос 1{x=1;}]]

Можно вообще все в одной кнопке попробовать сделать:  \[[Следующий вопрос|вопрос 1{x=1; спрайт.action = function(){подсказка($$title)}; }]]

внутри параграфа (вопрос 1) :

switch(x) {
case 1:
choice("вариант1 - правильно","вариант2-неправильно","вариант3-неправильно","вариант4-неправильно",function(n){

if(n==1) {
// Ура, все правильно, плюсуем в копилку points.
} else {
// Все плохо, мы облажались
}

});
break;
case 2:
// Теперь следим за руками... Если мы нажмем во время вопроса на сферу, она перейдет на параграф с вопросом но под другой x, и покажется этот вариант

choice("вариант1 - правильно","вариант4-неправильно",function(n){

if(n==1) {
// Ура, все правильно, плюсуем в копилку points.
} else {
// Все плохо, мы облажались
}

});

break;
default:
// код, если иное значение
}

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

На мой взгляд пользоваться Свитчером куда проще, чтобы не делать тучу дубликатов одно и того же параграфа. Так у меня параграф, например, диалог с персонажем идет через switch, а переменная выбора задается ссылкой/кнопкой на этот же параграф и переменной выбора. Реплик бывает до 80-ти штук

Цитата: Chris Nerson от 28.01.22, 09:56

Попробовал через Update() Clear()... Получилась дичь. Clear() не работает вообще, либо я не понимаю работы функции.

Я правильно понял, у вас каждый вопрос в отдельном параграфе? Еще вопрос, что делают остальные сферы?

Как бы я решил эту проблему...

где-то перед вопросом пропишем функцию:

подсказка = function(параграф){

x=2;

спрайт.action = function(){}; // отключаем нажатие спрайта

спрайт.filter = "greyscale(100%)";

goto(параграф);

}

После этого, перед каждым вопросом (Важно, не внутри параграфа, а перед) задаем функцию с подсказкой для сферы земли: спрайт.action = function(){подсказка($$title)};

Переход на параграф с вопросом задаем с переменной x=1: \[[Следующий вопрос|вопрос 1{x=1;}]]

Можно вообще все в одной кнопке попробовать сделать:  \[[Следующий вопрос|вопрос 1{x=1; спрайт.action = function(){подсказка($$title)}; }]]

внутри параграфа (вопрос 1) :

switch(x) {
case 1:
choice("вариант1 - правильно","вариант2-неправильно","вариант3-неправильно","вариант4-неправильно",function(n){

if(n==1) {
// Ура, все правильно, плюсуем в копилку points.
} else {
// Все плохо, мы облажались
}

});
break;
case 2:
// Теперь следим за руками... Если мы нажмем во время вопроса на сферу, она перейдет на параграф с вопросом но под другой x, и покажется этот вариант

choice("вариант1 - правильно","вариант4-неправильно",function(n){

if(n==1) {
// Ура, все правильно, плюсуем в копилку points.
} else {
// Все плохо, мы облажались
}

});

break;
default:
// код, если иное значение
}

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

Спасибо! Буду разгребать. Просто игру начинала делать год назад, тогда умела только параграфы городить. Спустя год вернулась и поняла, что нужно что-то менять. Хотя в кодах всё равно не сильна, делаю только по аналогии форумчан.

Если можно, помогите еще с одним вопросом. Как правильно объявить переменную-спрайт в параграфе и дать возможность выбрать игроку внешность (изображение-спрайт) ? Если можно полный код! ( Т.е. есть две аватарки, мужской и женский, если выбирает 1, то спрайт мужской висит всю игру, во всех пяти локациях, 2 - женский.) Понимаю, что через if else, только где в каком параграфе это вставить.

Ой, с удовольствием!
Я не раз приходил к выводу, что код - отражение логики разработчика. У каждого она своя, код индивидуален, а принципы - однотипны. Я бы хотел донести принципы, до которых дошел я. На последнюю инстанцию ни в коем случае не претендую, и уверен, у вас получится лучше, ведь это ваш код и Ваша логика.
Покажу как со спрайтами работаю я в своем проекте)
Пример:

 

Следим за руками! Пока, я показываю весьма удобную функцию спрайтов в тексте. Как бы аватарки, портреты диалоговых персонажей. На них нельзя нажимать, они просто нужны для обозначения. Далее покажу код выбора и такой реализации. К примеру, такой подход поможет с кастомизацией персонажа - картинок может быть сколько угодно много, сколько и вариантов выбора в списке. Все работает через  choice().

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

То есть, функция типа: спрайт = sprite("путь к спрайту") - заменяется на: условно, икс = "путь к спрайту"; спрайт = sprite(икс)

Далее, подпункт, у главного героя, игрока, будут статы, свойства и прочее по типу здоровья, маны, опыта, силы, ловкости и пр. Целесообразно указать все свойства игрока как свойства объекта, чтобы иметь к нему контекст.  Что мешает нам указать путь к картинке аватара, например, как одно из его свойств?

то есть:

герой = {}// объявляем пустой объект
герой.HP = 10; // задаем любые значения - текст, цифры, true\faulse, и даже целые массивы и другие объекты.
герой.опыт = 100;
герой.посетил_таверну = true;
герой.путь_к_файлу = "путь к файлу";

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

(на sv. не смотрите, это нужно для корректной работы сохранений/загрузки. Тут я воспользовался модулем сохранений от Morych)

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

Описанный случай в начале кодируется следующим образом:

Объясняю. Вначале выводится только список выбора. Ему присуждается функция обработки.
Когда нажат какой-то из вариантов, сначала запускается image(), та самая картинка в тексте. путь к файлу задается через переменную, допустим, икс = "путь к спрайту";     image(икс)  (никто не мешает тут написать путь к файлу от руки, к примеру image("http//1234.jpg")      )

После, мы присуждаем свойству главного героя путь_к_файлу соответствующую ссылку. (В моем случае url героя будет равняться url мужского портрета в первом варианте.)   В нашем примере: герой.путь_к_файлу = "Нужный нам путь к файлу"

У себя я так же изменяю  ему значения пола, фамилии, а можно еще и много чего угодно.

Все! Магия. Теперь чтобы прибегнуть к портрету ГГ в тексте не нужно каждый раз прописывать путь к картинке, проверять условия на пол/имя, а просто вызвать функцию по типу: image(герой.путь_к_файлу) - важно! внутри скобок указывается переменная, которая должна содержать текст(строку), если это сам путь, а не переменная - строка текста пишется с кавычками "". В данном случае, у нас именно переменная - без кавычек.

Абсолютно по такому же принципу мы задаем спрайты. Можно так же через окно выбора, а можно и другими способами, но суть:
икс = "путь к спрайту";  спрайт=sprite(икс)

 

PыSы - изменил опечатку в функции sprite()

Просто идеально, то что нужно. Мне легче ориентироваться по примерам. Сегодня по-ходу у меня всеночная😀.
Огромное спасибо, буду разбираться!

Page 1 of 2Далее