Показать сообщение отдельно
Старый 04.01.2019, 20:18
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 27  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
@deepNoise,
1. Тебе нужно написать парсер строк. В кадрах такие вещи не делают.
2. Тебе нужна вменяемая система, управляющая вариантами дейтсвий. Сейчас все построено так, что для каждого вопроса должно быть задано 4 варианта ответов - ни больше ни меньше. Захочешь сделать больше или меньше и все сразу пойдет по... В общем, в кадрах такие вещи не делают.
3. Брать текст из клипов - это вообще бред. И это бред вдвойне, учитывая, что сами клипы вообще по сути не используются.
4. Даже для самого простейшего текстового квеста тебе нужно иметь хотя бы начальный багаж знаний в используемом языке и ООП. С наскоку такие вещи не делают. Прочти хотя бы руководство по AS3 Колина Мука. После него и сам язык поймешь и в ООП вникнешь и тебе уже не захочется возвращаться к коду в кадрах. Даже учитывая то, что flash похоронили (это не точно), AS3 как ЯП очень хорош для новичков. После него легко сможешь изучить любой другой ООП язык.


P.S. Чисто из спортивного интереса на коленке набросал, но далее развиваться тем же путем не рекомендую
Код AS3:
 
var SPEED_TAG:String = 'speed';
var PAUSE_TAG:String = 'pause';
 
var pauseTimer:Timer=new Timer(20, 1);
pauseTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onPauseComplete);
 
function frameLooper(event:TimerEvent = null):void {
    if (currentSymbol < text.length) {
		var tag:Array = getTag(text, currentSymbol);
 
		while (tag != null) {
			execTag(tag);
			currentSymbol += tag[2];
			tag = getTag(text, currentSymbol);
		}
 
		var symbol:String = text.charAt(currentSymbol++);
        answer_tf.appendText(symbol);
 
		//тупо костыль, вызывающий слушатель frameLooper повторно, если текст надо вывести без задержек
		if (timer1.delay == 0) {
			frameLooper();
		}
 
    } else {
        timer1.stop();
    }
}
 
function onPauseComplete(event:TimerEvent):void {
	if (currentSymbol < text.length) {
		timer1.start();
	}
}
 
//если в указанной позиции установлен тэг, вернет массив [имя тэга, значение, кол-во непечатаемых символов]
//массив передается как есть в метод execTag
//если тэга в позиции нет, вернет null
function getTag(text:String, pos:int):Array {
	if (text.charAt(pos) == '<') {
		var endIdx:int = text.indexOf('/>', pos);
		var tag:String = text.substring(pos + 1, endIdx);
		var tagLenght:int = tag.length + 3;
		var removeWhitespacesRex:RegExp =  /[\s\r\n\u00A0]+/gim;//регулярка для удаления всего лишнего из строки тега(пробелы, переносы)
		tag = tag.replace(removeWhitespacesRex, '');
		var result:Array = tag.split('=');
		result.push(tagLenght);
		return result;
	}
	return null;
}
 
 
function execTag(tag:Array):void {
	switch (tag[0]) {
		case SPEED_TAG : {
			timer1.delay = tag[1];
			break;
		}
		case PAUSE_TAG : {
			timer1.stop();
			pauseTimer.delay = tag[1];
			pauseTimer.start();
			break;
		}
		default : throw 'Неизвестный тэг ' + tag[0];
	}
}
Строки должны быть такого вида:

<speed=40/>Вы пошли налево.<pause=1500/><speed=20/> Куда теперь?<speed=0/>
1. Пойти налево. 3. Пойти вверх.
2. Пойти направо. 4. Пойти вниз.