Как сделать?
…
Nex,
Nex:
Боевые системы обсуждались во многих темах, ссылки собраны здесь: http://qsp.su/index.php?option=com_agor … ;Itemid=57
Почитал, спасибо)
newsash,
newsash:
a+=1 - это a=a+1
a_n - эквивалент задержки, количество дискретов времени между вызовами процедуры (обработками локации) ‘герой’
n тоже нужно присваивать значение? А то у меня чет не работает нифига %)
newsash,
в FAQ есть “как сделать бой”. А конкретную боевую систему каждый пишет для себя сам, поэтому в FAQ нет смысла давать ссылку. В FAQ собраны прямые ответы на вопросы, а не просто “информация по теме”.
SV_fep:
n тоже нужно присваивать значение? А то у меня чет не работает нифига %)
Если это вызывает вопросы, то лучше создать пару простеньких игрушек прежде, чем лезть в боёвку. :)
‘a_n’ - это переменная, которая отвечает за длительность задержки. Само собой ей нужно заранее присваивать значение.
Кстати, в этом коде есть недоработки, я его написал только, чтобы общий принцип показать.
можно еще вопрос?чуть поправил код и процесс встал, ничего не могу понять. Не появляется действие “нанести удар”.
Можете объяснить почему?
*clr
'Здоровье <<$Имя>>: <<здоровье_героя>>'
'Здоровье <<$имя_врага>>: <<здоровье_врага>>'
wait 100
if a = a_n or b = b_n :
Else
a += 1
b += 1
if a = a_n:
act 'нанести удар':
атака_текущая = атака_героя+rand(0,3)
pl'Вы нанесли <<$имя_врага>> урон <<атака_текущая>>.'
здоровье_врага = здоровье_врага - атака_текущая
*clr
'Здоровье <<$Имя>>: <<здоровье_героя>>'
'Здоровье <<$имя_врага>>: <<здоровье_врага>>'
a = 0
delact $selact
if здоровье_врага<=0:
'Вы убили <<$имя_врага>>.'
delact $selact
act 'Далее':gt 'победа'
exit
end
end
end
if b = b_n:
атака_врага_текущая = атака_врага+rand(0,3)
pl'<<$имя_врага>> наносит урон <<атака_врага_текущая>>.'
здоровье_героя = здоровье_героя - атака_врага_текущая
b = 0
*clr
'Здоровье <<$Имя>>: <<здоровье_героя>>'
'Здоровье <<$имя_врага>>: <<здоровье_врага>>'
if здоровье_героя<=0:
'Вас убил <<$имя_врага>>.'
act 'Далее':gt 'поражение'
exit
end
end
end
gt curloc
SV_fep:
можно еще вопрос?чуть поправил код и процесс встал, ничего не могу понять. Не появляется действие “нанести удар”.
Можете объяснить почему?
Вставь перед “wait 100” строчку
*P 'a=<<a>>; b=<<b>>; a_n=<<a_n>>; b_n=<<b_n>>'
И расскажи, какие значения отображаются.
newsash,
a_n = 6
b_n = 5
Если выводить счет на экран, то все ок, счет идет, враг бьет. А когда “a” набирает “6”, то игра останавливается, а действие не появляется.
SV_fep:
Если выводить счет на экран, то все ок, счет идет, враг бьет. А когда “a” набирает “6”, то игра останавливается, а действие не появляется.
Вроде exit в конце if a = a_n должен быть.
end
exit
end
if b = b_n:
И ещё у тебя всё залипает из-за внешнего if’а, который у тебя никак не используется.
if a = a_n or b = b_n :
Счётчик доходит до a = a_n, после чего выполняет ничего из этого if’а и возвращается на ту же локацию. Кстати, странно, что залипает не при b = 5. Возможно, нужно перед переходом на локацию сбрасывать a и b в ноль.
Ок, я уменьшил кол-во строк кода, просто для теста, и опять такая же фигня. Счетчик доходит до 4, а действия нет %)
сс = 4
*clr
'счет :<<c>>'
wait 100
if c = cc:
act 'сбросить счетчик':
с = 0
end
else c +=1
end
gt curloc
SV_fep,
у тебя код состоит практически из одних ошибок.
1. Нельзя смешивать однострочную и многострочную форму IF. См. второе сообщение в теме Грабли.
2. Переменные “c” и “сс” у тебя пишутся то русскими буквами, то латиницей. В результате ничего не работает. Т.к. на клавиатуре это одна и та же кнопка, это весьма распространённая ошибка.
3. Оператор перехода должен быть не в конце локации, а в двух местах: сразу после увеличения “с” внутри IF, и сразу после обнуления “с” в действии сброса счётчика.
Nex,
Разве у меня что-то написано после If?
А вот такая конструкция работает (только это не совсем то, что нужно)
if a = 3:
act 'сбросить счетчик':
a = 0
xgt curloc
end
else
wait 100
a +=1
*clr
'Счет: <<a>>'
xgt curloc
end
Можете объяснить почему первый вариант не хочет работать?
Разве у меня что-то написано после If?
Да. Многострочный оператор IF заканчивается словом END.
END у тебя на предпоследней строке, GT CURLOC - на последней.
Первый вариант не работает потому, что в нём ошибки. Ошибки я перечислил. Исправишь - будет работать.
Nex,
Nex:
- Нельзя смешивать однострочную и многострочную форму IF. См. второе сообщение в теме Грабли.
Там вроде одна форма.Все, понял
Nex:
- Переменные “c” и “сс” у тебя пишутся то русскими буквами, то латиницей. В результате ничего не работает. Т.к. на клавиатуре это одна и та же кнопка, это весьма распространённая ошибка.
Тоже думал об этом, проверял много раз, все латиница.
Nex:
- Оператор перехода должен быть не в конце локации, а в двух местах: сразу после увеличения “с” внутри IF, и сразу после обнуления “с” в действии сброса счётчика.
Вот это помогло 0_о А можете объяснить, как это повлияло?
SV_fep:
Вот это помогло 0_о А можете объяснить, как это повлияло?
У тебя goto $curloc зацикливался. Т.е. добавляется действие, if заканчивается и снова переход на локацию, при котором действие удаляется. Бесконечный цикл.
А действия отрисовываются, когда заканчивается выполнение кода локации (ну и кода $onnewloc), если не ошибаюсь.
Тоже думал об этом, проверял много раз, все латиница.
Я сужу по тому что ты опубликовал на форуме. Может в своей игре ты уже исправил на латиницу, но в сообщении форума было именно так как я сказал.
А можете объяснить, как это повлияло?
Очень просто. Если помещать код перехода не внутрь IF, а в конец локации, то переход будет осуществляться всегда, то есть будет идти бесконечно по кругу. Так называемое “зацикливание”.
Обычно в таких случаях плеер сразу закрывается, но у тебя он “выглядит живым” из-за WAIT.
newsash,
newsash:
У тебя goto $curloc зацикливался. Т.е. добавляется действие, if заканчивается и снова переход на локацию, при котором действие удаляется. Бесконечный цикл.
Ок, понятно. Мне казалось, что должно появиться действие и пока его не жмакнешь, программа не продолжит читать код.