Пожалуйста or Регистрация для создания сообщений и тем.

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

Page 1 of 2Next

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

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

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

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

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

natallka333 отреагировал на эту запись.
natallka333

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

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

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

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

код ;

}

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

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

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

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

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

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

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

natallka333 отреагировал на эту запись.
natallka333

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

natallka333 отреагировал на эту запись.
natallka333
Цитата: 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:
// код, если иное значение
}

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

natallka333 отреагировал на эту запись.
natallka333

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

natallka333 отреагировал на эту запись.
natallka333
Цитата: 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()

natallka333 и OlgaMai отреагировали на эту запись.
natallka333OlgaMai

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

Page 1 of 2Next