Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 11.09.2017, 21:20
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 21  
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Код AS3:
const s:String = "hello";
const obj:Object = 
{
	(s as String):"world"
}
 
trace(obj.hello); // world
__________________
There is no thing in this world that is not simple.

Старый 11.09.2017, 22:01
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 22  
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
ZackMercury, обалдеть, кратко и эффективно. Всё заработало, спасибо!
Пошёл восхищаться и дальше учить мат. часть.

Добавлено через 3 часа 29 минут
Ещё раз поклон камраду ZackMercury, реализовал его совет в классе-хранителе игровых имён с выдачей оных в нужном падеже. Там же решено было складировать фамилии, наименования локаций и все прочие имена существительные, которые придётся по ходу игры склонять.

Сначала написал несколько однотипных методов-получателей элементов созданных объектов по идентификатору и номеру падежа. Примерно так:

Код AS3:
public class NamePool 
	{
 
		static private var firstName:Object = // Имена всех персонажей во всех падежах
		{
			(GlobalValues.CHARACTER_HERO as String): 	["Джек", "Джека", "Джеку", "Джека", "Джеком", "Джеке"],
			(GlobalValues.CHARACTER_APRIL as String):	["Маша", "Машу", "Маше", "Машу", "Машей", "Маше"]
		} 
 
		public function NamePool():void {}
 
		static public function getfirstName(characterID:String, languageCase:uint):String //Получить имя по ID персонажа
		{return firstName[characterID][languageCase]; 
}
Всё работает прекрасно. Но потом подумалось, что зачем писать идентичный код для каждого массива (имена, фамилии, клички, локации и много чего ещё), если само наименование переменной (в нашем случае firstName:Object), содержащей нужную инфо, можно точно также получать в качестве строкового идентификатора, чтобы потом к ней обратиться по полученному значению. Тогда сигнатура метода должна выглядеть вот так:

Код AS3:
static public function getWordCase(object:String, identificator:String, languageCase:uint):String
А вот как синтаксически сделать корректное обращение, мне не допереть. Просьба помочь. Спасибо.


Последний раз редактировалось Appleman; 12.09.2017 в 01:35.
Старый 12.09.2017, 17:46
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 23  
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Вообще, как правило, подобное не хранят в коде. Эта инфа выгружается в какой-то декларативный язык, вроде JSON/XML. Но как синтаксически возможный вариант:
Код AS3:
static public function getWordCase(object:String, identificator:String, languageCase:uint):String
{
	return NamePool[object][identificator][languageCase];
}
P.S. В ASC2 скобки при объявлении ключа ассоциативного массива не работают.
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 12.09.2017 в 18:25.
Старый 12.09.2017, 18:41
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 24  
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Спасибо, будем пробовать.

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

Старый 12.09.2017, 18:59
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 25  
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Руками не формируют, в AS3 есть специальный класс для этого.
http://help.adobe.com/ru_RU/ActionSc...0204-7ff5.html
__________________
There is no thing in this world that is not simple.

Старый 13.09.2017, 01:14
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 26  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Но потом подумалось, что зачем писать идентичный код для каждого массива (имена, фамилии, клички, локации и много чего ещё)
А я бы не советовал настолько обесчеловечивать код. И да, я бы не хранил "локации" даже в одном классе с "именами фамилиями кличками"..
Еще "поиграться":
Код AS3:
package 
{
	public class Quest 
	{
		private static const EPISODES_TEXT:Array = 
		[
		/* 000 */	"Если бы кто-то сказал Волку, что Красная Шапочка окажется дочкой *$n1 *$N1, он вряд-ли бы решился на преступление. Перейти дорогу *$n2 совсем не входило в его планы.",
		/* 001 */	"Волк уже однажды встречался с *$N4, и эта встреча до сих пор отзывалась в его памяти болью унижения.",
		/* 002 */	"Новой встречи с *$n4 Волк боялся как огня."
		]
 
		public static function getText(episode:int, character:String) : String
		{
			var text:String = EPISODES_TEXT[episode];
			for (var i:uint = 0; i < 6; i++)
			{
				text = text.replace("*$n" + i, Names.getName(character, Names.FIRST_NAME, i));
				text = text.replace("*$N" + i, Names.getName(character, Names.FAMILY_NAME, i));
			}
			return text;
		}
	}
}
////*********************************************
package 
{
	public class GlobalValues 
	{
		static public const CHARACTER_HERO:String = "hero";
		static public const CHARACTER_APRIL:String = "april";
	}
}
////*********************************************
package 
{
	public class Names 
	{
		static public const FIRST_NAME:String = "firstName";
		static public const FAMILY_NAME:String = "familyName";
 
		static private const firstName:Object = // Имена всех персонажей во всех падежах
		{
			(GlobalValues.CHARACTER_HERO as String): 	["Джек", "Джека", "Джеку", "Джека", "Джеком", "Джеке"],
			(GlobalValues.CHARACTER_APRIL as String):	["Маша", "Маши", "Маше", "Машу", "Машей", "Маше"]
		}
 
		static private const familyName:Object = // Фамилии всех персонажей во всех падежах
		{
			(GlobalValues.CHARACTER_HERO as String): 	["Николсон", "Николсона", "Николсону", "Николсона", "Николсоном", "Николсоне"],
			(GlobalValues.CHARACTER_APRIL as String):	["Шарапова", "Шараповой", "Шараповой", "Шарапову", "Шараповой", "Шараповой"]
		}
 
		static public function getName(character:String, nameType:String, nameCase:int) :String
		{
			return Names[nameType][character][nameCase];
		}
	}
}
////*********************************************
package
{
	import flash.display.Sprite;
 
	public class Main extends Sprite 
	{
		public function Main() 
		{
			trace(Quest.getText(0, GlobalValues.CHARACTER_HERO));
			trace(Quest.getText(1, GlobalValues.CHARACTER_HERO));
			trace(Quest.getText(2, GlobalValues.CHARACTER_HERO));
			trace("\n");
			trace(Quest.getText(0, GlobalValues.CHARACTER_APRIL));
			trace(Quest.getText(1, GlobalValues.CHARACTER_APRIL));
			trace(Quest.getText(2, GlobalValues.CHARACTER_APRIL));
		}
	}
}
__________________
Reality.getBounds(this);

Старый 13.09.2017, 19:07
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 27  
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Wolsh, ну ты просто добрый волшебник! Я как раз начал задумываться о том, как можно технологично предусмотреть подстановку строковых переменных в заранее созданные куски текста. Спасибо.

Скажи, а добавлять в текст заготовки под будущую подстановку значений в виде *$n1 *$N1 - это чисто твой креатив или подобный формат *$ - результат требований AC3 или какого-либо соглашения, принятого среди программистов?

Код AS3:
public static function getText(episode:int, character:String) : String
		{
			var text:String = EPISODES_TEXT[episode];
			for (var i:uint = 0; i < 6; i++)
			{
				text = text.replace("*$n" + i, Names.getName(character, Names.FIRST_NAME, i));
				text = text.replace("*$N" + i, Names.getName(character, Names.FAMILY_NAME, i));
			}
			return text;
		}
И ещё мне показалось, что в твоей программе падежи перепутались. Ведь при обращении к getName именно по i определяется падеж, в котором нужно возвращать имя. А они тупым перебором в цикле стоят - на выходе будет хрень.

Цитата:
А я бы не советовал настолько обесчеловечивать код. И да, я бы не хранил "локации" даже в одном классе с "именами фамилиями кличками".
Не совсем понял, что ты подразумеваешь под "обесчеловечиванием" кода и почему ты не стал бы хранить "локации" и "имена" в одном классе. Я рассуждал так. Если у нас есть определённое количество имён существительных в единственном числе (имена, наименования свойств персонажей и вещей, названия локаций и многое другое), которые должны выдаваться в нужном падеже в самых разных ситуациях, то почему бы их не забить все в единый класс? Ведь механизм хранения и методы выдачи - идентичные. Дальше только идентификаторы выставляй. А введя осмысленные константы на уровне всей программы (статические переменные класса GlobalValues), я гарантированно не запутаюсь. Ибо задав единожды CHARACTER_HERO:String = "hero", я использую эту константу при создании персонажа в качестве идентификатора, поставлю её же в массив, хранящий имена, буду по нему обращаться в любом месте программы...

Старый 13.09.2017, 20:22
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 28  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
это чисто твой креатив или подобный формат *$ - результат требований AC3
Да в принципе любое сочетание можешь использовать, только чтобы оно гарантировано не могло появиться в тексте по надобности. Я как то пролетел с #, набил текстов а потом оказалось что надо текст форматировать с HTML, задавая кое-где цвет шрифта)) К тому же *$ хорошо бросается в глаза и находится в тексте.
Цитата:
А они тупым перебором в цикле стоят - на выходе будет хрень.
Ну, так то я компилировал, хрени не было)) Тут не "тупой перебор", данный цикл заменяет ВСЕ алиасы от *$n0 до *$n5 и от *$N0 до *$N5 в тексте на имена в соответствующих падежах.
Цитата:
Не совсем понял, что ты подразумеваешь под "обесчеловечиванием" кода
Не люблю, когда названия методов (и свойств конечно) отражают больше "технический" контекст происходящего, нежели "исторический", смысловой. То есть getWordInCase() хорошо, когда возвращает что угодно, то есть если бы этот метод мог склонять ЛЮБОЕ слово. Но для каких-то более конкретных ситуаций мне бы хотелось более конкретных названий. Для имен я бы предпочел иметь getName(), для локаций — getLocation(), для цветов getColor() и тп. Никакого технического смысла в этом нет. Только удобочитаемость. Читать код тебе, нет смысла скрывать человеческую логику за абстрактными названиями. Иначе ты докатишься до "идеального" кода типа get(where:*, what:*, how:*, for:*, from:*, why:*):*
__________________
Reality.getBounds(this);

Старый 13.09.2017, 21:45
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 29  
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Не люблю, когда названия методов (и свойств конечно) отражают больше "технический" контекст происходящего, нежели "исторический", смысловой.
С этим понятно. С падежами тоже разобрался. Весьма элегантно получилось. Но у тебя всё равно напутано, ибо именительный - это 0, а у тебя в тексте стоит *$n1, я потому и обратил внимание.

На счёт своего вопрос я имел в виду другую твою реплику, которую не процитировал:
Цитата:
И да, я бы не хранил "локации" даже в одном классе с "именами фамилиями кличками".
Почему ты так считаешь? Свою аргументацию, почему я решил собрать все существительные в едином классе, я привёл.

Старый 13.09.2017, 23:18
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 30  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Но у тебя всё равно напутано, ибо именительный - это 0, а у тебя в тексте стоит *$n1
Потому что в моем тексте нет именительного. "окажется дочкой Маши Шараповой" это Родительный.

Цитата:
Почему ты так считаешь?
Просто не люблю кучу-малу.
Скажем, окну настроек Персонажа не нужно знать названий локаций. Да если и нужно, дело не в этом. Просто люблю банальный порядок, когда мухи отдельно, котлеты отдельно. Да, с технической стороны они может быть одно и то же. Ну тогда и названия одежды, и еды в холодильнике, и товаров у торговца, и документов в шкафу у следователя. Тогда все в кучу? Фу.
__________________
Reality.getBounds(this);

Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 13:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:10.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.