RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2427009 views

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:

  1. Нельзя смешивать однострочную и многострочную форму IF. См. второе сообщение в теме Грабли.

Там вроде одна форма.Все, понял

Nex:

  1. Переменные “c” и “сс” у тебя пишутся то русскими буквами, то латиницей. В результате ничего не работает. Т.к. на клавиатуре это одна и та же кнопка, это весьма распространённая ошибка.

Тоже думал об этом, проверял много раз, все латиница.

Nex:

  1. Оператор перехода должен быть не в конце локации, а в двух местах: сразу после увеличения “с” внутри IF, и сразу после обнуления “с” в действии сброса счётчика.

Вот это помогло 0_о А можете объяснить, как это повлияло?

SV_fep:

Вот это помогло 0_о А можете объяснить, как это повлияло?

У тебя goto $curloc зацикливался. Т.е. добавляется действие, if заканчивается и снова переход на локацию, при котором действие удаляется. Бесконечный цикл.
А действия отрисовываются, когда заканчивается выполнение кода локации (ну и кода $onnewloc), если не ошибаюсь.

Тоже думал об этом, проверял много раз, все латиница.

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

А можете объяснить, как это повлияло?

Очень просто. Если помещать код перехода не внутрь IF, а в конец локации, то переход будет осуществляться всегда, то есть будет идти бесконечно по кругу. Так называемое “зацикливание”.

Обычно в таких случаях плеер сразу закрывается, но у тебя он “выглядит живым” из-за WAIT.

newsash,

newsash:

У тебя goto $curloc зацикливался. Т.е. добавляется действие, if заканчивается и снова переход на локацию, при котором действие удаляется. Бесконечный цикл.

Ок, понятно. Мне казалось, что должно появиться действие и пока его не жмакнешь, программа не продолжит читать код.

Log in or Register to post comments.