<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>regul-flash.com</title>
	<atom:link href="http://www.regul-flash.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.regul-flash.com</link>
	<description></description>
	<lastBuildDate>Sat, 19 Nov 2011 13:42:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Guiber Prototype</title>
		<link>http://www.regul-flash.com/guiber-prototype/</link>
		<comments>http://www.regul-flash.com/guiber-prototype/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 13:38:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=440</guid>
		<description><![CDATA[Что такое Guiber? Это Graphic User Interface Builder. Точнее, это всего-лишь прототип и попытка решить одну маленькую проблему, которую я заметил уже не в одном проекте. Как вы собираете интерфейс? Точнее, как вы подбираете координаты для элементов/картинок/кнопок/текстовых полей и т.п.? Я видел и xml-файл(или любой другой конфигурационный файл), который программист заполняет вручную и потом некий [...]]]></description>
			<content:encoded><![CDATA[<p>Что такое Guiber? Это Graphic User Interface Builder. Точнее, это всего-лишь прототип и попытка решить одну маленькую проблему, которую я заметил уже не в одном проекте.<br />
<span id="more-440"></span><br />
Как вы собираете интерфейс? Точнее, как вы подбираете координаты для элементов/картинок/кнопок/текстовых полей и т.п.? Я видел и xml-файл(или любой другой конфигурационный файл), который программист заполняет вручную и потом некий класс на основании этого располагает элементы, пробовал и создание gui в Flash IDE и потом уже &laquo;натягивание&raquo; функционала в коде, которое тоже далеко не идеально, видел и задание значений x/y вручную прямо в коде. Xml и ручное введение равным образом имеют негативную сторону &#8211; нужно каждый раз запускать и &laquo;прицеливаться&raquo; чтобы построить интерфейс. Во Flash IDE, конечно, можно делать интерфейс, но в этом подходе есть ряд мелкий недостатков. Возможно есть и четвертый и пятый метод, о котором я не знаю. Но у меня (и не у меня одного) нет никакого желания вместо того, чтобы создавать информационные решения подбирать координаты x и y для элементов интерфейса. (Я сейчас не говорю о Flex).</p>
<p>Этот пост написан в основном, чтобы получить фидбек и узнать, насколько подобное решение будет кому-то полезно.</p>
<h2>Итак, что делает Guiber.</h2>
<p>Guiber получает на вход swc-библиотеки, позволяет расположить элементы и генерирует as3/xml расположения этих элементов. Т к. это прототип, делается это все очень примитивно и урезанно.</p>
<p>Рассмотрим пример. Путь у нас будет библиотека с 4 элементами:</p>
<p><a href="http://www.regul-flash.com/wp-content/uploads/2011/11/library.gif"><img class="aligncenter size-full wp-image-443" title="library" src="http://www.regul-flash.com/wp-content/uploads/2011/11/library.gif" alt="" width="379" height="538" /></a><br />
Создадим swc-файл AssetsLibrary.swc:</p>
<pre class="brush: plain; title: ; notranslate">
package {
	public class Assets {
		[Embed(source=&quot;../assets/background.png&quot;)]
		public var BackgroundAsset:Class;

		[Embed(source=&quot;../assets/blueButton.png&quot;)]
		public var BlueButtonAsset:Class;

		[Embed(source=&quot;../assets/orangeButton.png&quot;)]
		public var OrangeButtonAsset:Class;

		[Embed(source=&quot;../assets/closeButton.png&quot;)]
		public var CloseButtonAsset:Class;

	}
}
</pre>
<p>Теперь этот файл нужно положить в папку swc в папке Guiber&#8217;а. Запускаем Guiber и нажимаем Load SWC и располагаем элементы.<br />
<a href="http://www.regul-flash.com/wp-content/uploads/2011/11/guiber.jpg"><img src="http://www.regul-flash.com/wp-content/uploads/2011/11/guiber-300x220.jpg" alt="" title="guiber" width="300" height="220" class="aligncenter size-medium wp-image-447" /></a></p>
<p>После этого остается только нажать Project->Generate AS3 code и мы получим сгенерированный код:<br />
<a href="http://www.regul-flash.com/wp-content/uploads/2011/11/guiber_code.jpg"><img src="http://www.regul-flash.com/wp-content/uploads/2011/11/guiber_code-252x300.jpg" alt="" title="guiber_code" width="252" height="300" class="aligncenter size-medium wp-image-448" /></a></p>
<pre class="brush: plain; title: ; notranslate">
package com.guiber.assets {
	import flash.display.Sprite;
	public class UnknownAsset extends Sprite {
			public function UnknownAsset() {
				super();
				init();
			}

			public function init():void {
				// instance460
				var instance460:Assets_BackgroundAsset = new Assets_BackgroundAsset();
				instance460.name = &quot;instance460&quot;;
				instance460.x = 1;
				instance460.y = 81;
				addChild(instance460);

				// instance491
				var instance491:Assets_BlueButtonAsset = new Assets_BlueButtonAsset();
				instance491.name = &quot;instance491&quot;;
				instance491.x = 15;
				instance491.y = 252;
				addChild(instance491);

				// instance522
				var instance522:Assets_OrangeButtonAsset = new Assets_OrangeButtonAsset();
				instance522.name = &quot;instance522&quot;;
				instance522.x = 170;
				instance522.y = 252;
				addChild(instance522);

				// instance553
				var instance553:Assets_CloseButtonAsset = new Assets_CloseButtonAsset();
				instance553.name = &quot;instance553&quot;;
				instance553.x = 283;
				instance553.y = 96;
				addChild(instance553);

			}
	}
}
</pre>
<p>На этом действия прототипа заканчивается. Спасибо всем за внимание. Жду с нетерпением feedback!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/guiber-prototype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание своего Java Socket Server. Первый контакт</title>
		<link>http://www.regul-flash.com/java-socket-server-pervyj-kontakt/</link>
		<comments>http://www.regul-flash.com/java-socket-server-pervyj-kontakt/#comments</comments>
		<pubDate>Sat, 10 Sep 2011 23:54:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soket-server]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=362</guid>
		<description><![CDATA[Итак, пришло время того самого момента, для чего мы все это затеяли — сделать соединение между клиентом и сервером. В этой части мы создадим сервер при помощи библиотеки Netty, сделаем библиотеку на AS3 и проверим её. Чтобы понять процесс остановимся на простой реализации — клиент будет отправлять серверу сообщение, а сервер будет отправлять его обратно (это [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, пришло время того самого момента, для чего мы все это затеяли — сделать соединение между клиентом и сервером.</p>
<p>В этой части мы создадим сервер при помощи библиотеки Netty, сделаем библиотеку на AS3 и проверим её. Чтобы понять процесс остановимся на простой реализации — клиент будет отправлять серверу сообщение, а сервер будет отправлять его обратно (это называется echo-сервер).<br />
<span id="more-362"></span><br />
Делать мы это будем путем расширения кода, написанного в предыдущих частях.</p>
<h1>Создаем java-socket сервер.</h1>
<p>Создание сервера на Netty &#8211; процесс очень простой. Достаточно раз понять архитектуру этой библиотеки. Подробно с работой этой библиотеки можно познакомиться на <a href="http://www.jboss.org/netty" title="сайте" target="_blank">сайте</a> проекта.</p>
<h2>Создаем новый канал.</h2>
<p>Первым делом создаем фабрику для создания и управления Каналами и связанными ресурсами. Она будет обрабатывать все I/O запросы и генерировать ChannelEvent, которые мы уже будем обрабатывать</p>
<pre class="brush: plain; title: ; notranslate">
private static void initServer() {
	factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
	initGeneralChannelHandler();
}
</pre>
<p>Дальше создаем и настраиваем сам канал:</p>
<pre class="brush: plain; title: ; notranslate">
private static void initGeneralChannelHandler() {
	// Configure the server.
	ServerBootstrap bootstrap = new ServerBootstrap(factory);
	generalChannelHandler = new GeneralChannelHandler();

	// Set up the pipeline factory.
	bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
		public ChannelPipeline getPipeline() {
			return Channels.pipeline(generalChannelHandler);
		}
	});

	//Socket options
	bootstrap.setOption(&quot;child.tcpNoDelay&quot;, true);
	bootstrap.setOption(&quot;child.keepAlive&quot;, true);

	// Bind and start to accept incoming connections.
	bootstrap.bind(new InetSocketAddress(properties.getInt(&quot;server.port&quot;)));
}
</pre>
<p>ServerBootstrap является вспомогательным классом для настройки сервера. Использовать его необязательно, но это удобный стандартный вариант для создания канала. Итак, мы создаем и настраиваем ChannelPipelineFactory: при каждом новом соединении будет вызываться getPipeline() — в нашем случае это наш созданный класс GeneralChannelHandler (о нем будет написано ниже). Также можно указать специфические параметры канала (bootstrap.setOption(&laquo;child.*&raquo;, &#8230;)). И последним делом мы указываем порт по которому будет происходить соединение — этот параметр мы берем из файла condif.xml:</p>
<pre class="brush: plain; title: ; notranslate">
&lt;entry key=&quot;server.port&quot;&gt;9777&lt;/entry&gt;
</pre>
<h2>Теперь подробней об GeneralChannelHandler.</h2>
<p>GeneralChannelHandler должен быть наследником SimpleChannelHandler. Этот класс является обработчиком практически всех событий, которые могут происходить с сокетами. В нем и происходит основная магия &#8211; это мост между логикой сервера и Netty. В нашем примере мы переопределим 2 события:</p>
<ol>
<li>Событие получения сообщения: messageReceived<br />
	В нем мы будем отправлять в канал клиента то, что получили от него.</li>
<li>Событие появления исключения: exceptionCaught<br />
	Будем записывать с лог все ошибки, которые будут генерироваться сервером.</li>
</ol>
<p>На самом деле это все делается элементарно:</p>
<pre class="brush: plain; title: ; notranslate">
public class GeneralChannelHandler extends SimpleChannelHandler {

	private static final Logger logger = Logger.getLogger(GeneralChannelHandler.class);

	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
		// Send back the received message to the remote peer.
		e.getChannel().write(e.getMessage());
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
		// Log the exception
		logger.error(&quot;Exception&quot;, e.getCause());
	}

}
</pre>
<p>Все — теперь у нас есть echo-сервер сервер. Можно подключиться по telnet и убедиться в его работе: любое передаваемое на сервер сообщение будет возвращаться обратно.</p>
<h1>Создаем swc-библиотеку.</h1>
<p>Для библиотеки я использовал следующую архитектуру, которая мне показалась уместной (JSS &#8211; Java Soket Server):<br />
JSSApi &#8211; основной класс для работы с нашим java-сервером. Сейчас он просто создает экземпляр класса соединения и делегирует основную работу JSSConnection. Сейчас в этом нет никакого смысла но нейрон, отвечающий за программирование говорит, что должна быть разница между &laquo;Соединением&raquo; и &laquo;Api&raquo;.</p>
<pre class="brush: plain; title: ; notranslate">
public class JSSApi extends EventDispatcher{

	private var _connection:JSSConnection;

	public function JSSApi(debug:Boolean = false) {
		_connection = new JSSConnection(this, debug);
	}

	/*---------------------------- Delegated methods ------------------------*/
	...

}
</pre>
<p>JSSConnection &#8211; класс, который будет заниматься низкоуровневой работой с сокетами. Код приведен не полностью: я обращу Ваше внимание на метод соединения, отправку и получения данных. Полные исходники можно будет скачать по ссылке в конце статьи. </p>
<pre class="brush: plain; title: ; notranslate">
public class JSSConnection {

	public function JSSConnection(dispatcher:IEventDispatcher, debug:Boolean = false) {
		_dispatcher = dispatcher;
		_debug = debug;
		createSocketAndAddHandlers();
	}

	...

	public function connect(host:String, port:int):void {
		_host = host;
		_port = port;

		try {
			log(&quot;Connect to &quot; + _host + &quot;:&quot; + _port);
			_socket.connect(_host, _port);
		} catch (error:SecurityError) {
			log(&quot;Security error: &quot; + error);
			_dispatcher.dispatchEvent(new JSSEvent(JSSEvent.SECURITY_ERROR, error.toString()));
		} catch (error:Error) {
			log(&quot;Connection error: &quot; + error);
			throw error;
		}
	}

	...

	public function sendRequest(request:String):void {
		if (_socket != null &amp;&amp; _socket.connected) {
			request += &quot;\n&quot;;

			try {
				_socket.writeUTFBytes(request);
				_socket.flush();
				log(&quot;Message sent: &quot; + request.toString());
			} catch(error:Error) {
				log(&quot;Error sending data: &quot; + error);
			}

		} else {
			if (_isConnected) {
				dispatchConnectionLost(ClientDisconnectionReason.SOCKED_CONNECTED_FAIL);
			} else {
				throw new Error(&quot;Sending request without connection&quot;);
			}
		}
	}

	...

	private function handleSocketData(event:ProgressEvent):void {
		receiveData(_socket.readUTFBytes(_socket.bytesAvailable));
	}

	private function receiveData(msg:String):void {
		log(&quot;Message received: &quot; + msg);
		_dispatcher.dispatchEvent(new JSSEvent(JSSEvent.RECEIVE_DATA, msg));
	}

	...

}
</pre>
<p>Компилируем swc библиотеку для работы с сервером. Теперь осталось убедиться, что наш сервер работает. Для этого создадим тестовый клиент и добавить его в доверенные (добавить в <a href="http://www.google.com.ua/search?sourceid=chrome&#038;ie=UTF-8&#038;q=FlashPlayerTrust" title="FlashPlayerTrust" target="_blank">FlashPlayerTrust</a>):</p>
<pre class="brush: plain; title: ; notranslate">
public class Flash_client extends Sprite {
	private var _jss:JSSApi;

	public function Flash_client() {

		_jss = new JSSApi(true);
		_jss.addEventListener(JSSEvent.CONNECT_TO_SERVER_SOCKET, handleConnect)
		_jss.addEventListener(JSSEvent.RECEIVE_DATA, handleReceiveData)

		trace(&quot;Connecting...&quot;);
		_jss.connect(&quot;localhost&quot;, 9777);

	}

	private function handleConnect(event:JSSEvent):void {
		trace(&quot;Connected&quot;);
		var messageToServer:String = &quot;Hello!&quot;;
		trace(&quot;Sending Data: &quot; + messageToServer);
		_jss.sendRequest(messageToServer);

	}

	private function handleReceiveData(event:JSSEvent):void {
		var messageFromServer:String = String(event.data);
		trace(&quot;Received: &quot; + messageFromServer);
	}
}
</pre>
<p>В результате в консоли клиента мы увидим успешно отработанный сценарий (строки с временем &#8211; это служебный trace сгенерированный классом JSSConnection):</p>
<pre class="brush: plain; title: ; notranslate">
[trace] Connecting...
[trace] 23:28:08.691 Connect to localhost:9777
[trace] 23:28:08.865 Connected: [Event type=&quot;connect&quot; bubbles=false cancelable=false eventPhase=2]
[trace] Connected
[trace] Sending Data: Hello!
[trace] 23:28:08.869 Message sent: Hello!
[trace] 23:28:08.874 Message received: Hello!
[trace] Received: Hello!
</pre>
<p>Это, конечно, ещё незавершенная версия даже для такой небольшой функциональности нужно сделать ряд дополнений. Но уже сейчас видна основная структура работы сервера. Если у Вас возникнут сложности &#8211; готов помочь и дополнить статью необходимыми данными.</p>
<h4>Исходный код.</h4>
<p>Полный код проекта всегда можно будет взять из <a href="http://code.google.com/p/java-soket-server/">репозитория на Google code</a>. Коммит с приведенной выше версией находится <a href="http://code.google.com/p/java-soket-server/source/browse/?r=bd67dfb29dd4c4a3c3a0a3a5f9708993944b2902">тут</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/java-socket-server-pervyj-kontakt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание своего Java Socket Server. Создание заготовки. Код в студию!</title>
		<link>http://www.regul-flash.com/java-socket-server-template/</link>
		<comments>http://www.regul-flash.com/java-socket-server-template/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 20:08:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Soket-server]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=340</guid>
		<description><![CDATA[Написание сервера работа довольно объемная, поэтому описание функций я планирую делать методом добавления новой функциональности в демо-версию сервера. Начнем с небольшой заготовки, которая будет содержать: логгер считывание параметров Тут все предельно просто: 1. в методе initLogger() мы инициализируем логгер. Сами методы логера спрятаны в классе BaseJavaServerLoggedClass, чтобы не отвлекать от основного 2. в методе loadProperties() [...]]]></description>
			<content:encoded><![CDATA[<p>Написание сервера работа довольно объемная, поэтому описание функций я планирую делать методом добавления новой функциональности в демо-версию сервера.</p>
<p><span id="more-340"></span>Начнем с небольшой заготовки, которая будет содержать:</p>
<ul>
<li>логгер</li>
<li>считывание параметров</li>
</ul>
<pre class="brush: plain; title: ; notranslate">
public class JavaServer extends BaseJavaServerLoggedClass {

	public static JavaServerProperties properties;

	public static void main(String[] args) {
		prepare();
		info(&quot;String server...&quot;);
	}

	private static void prepare() {
		try {
			loadProperties();
			initLogger();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			System.exit(-1);
		}
	}

	private static void loadProperties() throws Exception {
		properties = new JavaServerProperties();
		properties.loadProperties();
	}

	private static void initLogger() {
		org.apache.log4j.PropertyConfigurator.configure(properties.getProperty(&quot;log4j.propertyFileName&quot;));
	}
}
</pre>
<p>Тут все предельно просто:<br />
1. в методе initLogger() мы инициализируем логгер. Сами методы логера спрятаны в классе BaseJavaServerLoggedClass, чтобы не отвлекать от основного</p>
<pre class="brush: plain; title: ; notranslate">
public class BaseJavaServerLoggedClass {

	protected static final Logger logger = Logger.getLogger(JavaServer.class);

	protected static void info(String msg) {
		if (logger != null) {
			logger.info(msg);
		}
	}

	protected static void exception(String msg, Throwable t) {
		if (logger != null) {
			String message = &quot;\n:::::::::::::::::::::::::::::::::::::::::::::::::::\n&quot; + msg;
			logger.error(message, t);
		}
	}
}
</pre>
<p>2. в методе loadProperties() мы загружаем настройки сервера из файла config.xml при помощи класса JavaServerProperties. В дальнейшем мы будем считывать оттуда различные параметры сервера:</p>
<pre class="brush: plain; title: ; notranslate">
public class JavaServerProperties {

	private Properties properties;

	public void loadProperties() throws Exception {
		properties = readPropertiesFromFile();
	}

	public Properties readPropertiesFromFile() throws Exception {
		Properties properties = new Properties();
		FileInputStream fis = new FileInputStream(&quot;./config/config.xml&quot;);
		properties.loadFromXML(fis);
		return properties;
	}

	public String getProperty(String key) {
		return properties.getProperty(key);
	}

	public boolean getBoolen(String key) {
		String property = getProperty(key);
		return property.equals(&quot;true&quot;);
	}

	public int getInt(String key) {
		return Integer.parseInt(getProperty(key));
	}

	public long getLong(String key) {
		return Long.parseLong(getProperty(key));
	}

	public float getFloat(String key) {
		return Float.parseFloat(getProperty(key));
	}
}
</pre>
<p>В config.xml, к примеру считываем расположения файла настроек логгера в BaseJavaServerLoggedClass.initLogger():</p>
<pre class="brush: plain; title: ; notranslate">properties.getProperty(&quot;log4j.propertyFileName&quot;)</pre>
<p>config.xml выглядит примерно так:</p>
<pre class="brush: plain; title: ; notranslate">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE properties SYSTEM &quot;http://java.sun.com/dtd/properties.dtd&quot;&gt;
&lt;properties&gt;
        &lt;comment&gt;Demo Java Soket Server Configuration&lt;/comment&gt;

        &lt;!--General Configuration--&gt;
        &lt;entry key=&quot;general.isDebugMode&quot;&gt;true&lt;/entry&gt;
        &lt;entry key=&quot;log4j.propertyFileName&quot;&gt;./config/log4j.properties&lt;/entry&gt;

        &lt;!--Server--&gt;
        &lt;entry key=&quot;server.port&quot;&gt;9777&lt;/entry&gt;
        &lt;entry key=&quot;server.policyPort&quot;&gt;9778&lt;/entry&gt;
        &lt;entry key=&quot;server.statPort&quot;&gt;8083&lt;/entry&gt;

&lt;/properties&gt;
</pre>
<p>Настройки log4j.properties можно найти в документации в этой библиотеке.</p>
<p>Теперь, написав этот нехитрый код и запустив его, мы подготовили заготовку для нашего сервера.<br />
В результате работы этого кода будет создана папка logs с файлом лога и записью типа</p>
<pre class="brush: plain; title: ; notranslate">02 сен 2011 22:59:18,070 INFO  [main] demo.server.JavaServer     - String server...</pre>
<p>И после приложение завершит свою работу.<br />
На самом деле это ещё не сервер. Но терпение &#8211; все будет.</p>
<h4>Исходный код.</h4>
<p>Полный код проекта всегда можно будет взять из <a href="http://code.google.com/p/java-soket-server/">репозитория на Google code</a>. Коммит с приведенной выше версией находится <a href="http://code.google.com/p/java-soket-server/source/browse/?r=b19b7acc48c506a750758e8a279146f5b6dacbe8">тут</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/java-socket-server-template/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Создание своего Java Socket Server. Теория. Из ActionScript3 в Java.</title>
		<link>http://www.regul-flash.com/java-socket-server/</link>
		<comments>http://www.regul-flash.com/java-socket-server/#comments</comments>
		<pubDate>Sat, 13 Aug 2011 11:48:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Soket-server]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=259</guid>
		<description><![CDATA[Некоторое время я сомневался стоит ли писать статью подобного типа. Во-первых, флеш-программистам она будет не очень полезна, т.к. она больше про яву, а опытные ява-программисты, мне кажется, знают все то, о чем я собираюсь написать. Но тем не менее это опыт, которым я хочу поделиться. Надеюсь, кому-то это будет полезным. Также, в этой части будет [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторое время я сомневался стоит ли писать статью подобного типа. Во-первых, флеш-программистам она будет не очень полезна, т.к. она больше про яву, а опытные ява-программисты, мне кажется, знают все то, о чем я собираюсь написать. Но тем не менее это опыт, которым я хочу поделиться. Надеюсь, кому-то это будет полезным. Также, в этой части будет только теоретическое изложение советов и не будет самого кода сервера.  Данная статья является лишь теоретической и не содержит в себе код, но тем не менее содержит много букв.</p>
<p>Я флеш-программист, и мой опыт работы с явой исчисляется где-то месяцем. Эта статья типа «написание Java Socket сервера глазами флеш-программиста».</p>
<p><span id="more-259"></span></p>
<h1>Предыстория.</h1>
<p>До того, как мы написали свой сервер в нашем проекте <a href="http://doomforge.com">Doom Forge Game</a> мы использовали готовое решение для мультиплеерных игр — <a href="http://www.smartfoxserver.com/">Smart Fox Server</a>. Сервер сделан хорошо, в нем много возможностей, но нам пришлось столкнуться с некоторыми проблемами в его работе, которые решались тяжелым общением с безинициативной службой поддержки и решение проблемы могло занимать не меньше месяца (если проблема вообще решалась). Так что опыт использования Smart Fox Server у меня был печальный.</p>
<h1>Из ActionScript3 в Java</h1>
<p>На самом деле, перейти из флеша на яву было очень просто. В java и флеше есть несколько отличий, которые запомнились лично мне (конечно, это не все отличия), но в общем они очень схожи.</p>
<h4>Отличие 1. Переменные. Java — сначала тип, потом имя.</h4>
<p style="padding-bottom: 0px;">AS3:</p>
<pre class="brush: plain; title: ; notranslate">var str:String = “Hello”;</pre>
<p style="padding-bottom: 0px;">Java:</p>
<pre class="brush: plain; title: ; notranslate">String str =  “Hello”;</pre>
<h4>Отличие 2. В Java есть перегрузка методов, а во флеше нет.</h4>
<p style="padding-bottom: 0px;">В Java можно сделать так (и это круто):</p>
<pre class="brush: plain; title: ; notranslate">&lt;br /&gt;
public class MyClass{&lt;br /&gt;
	public void find(int id){…};&lt;br /&gt;
	public void find(String name){…};&lt;br /&gt;
}&lt;br /&gt;
</pre>
<p style="padding-bottom: 0px;">В AS3 приходится делать приблизительно так:</p>
<pre class="brush: plain; title: ; notranslate">&lt;br /&gt;
public class MyClass{&lt;br /&gt;
	public function findById(int id):void{…};&lt;br /&gt;
	public function findByName(String name):void{…};&lt;br /&gt;
}&lt;br /&gt;
</pre>
<h4>Отличие 3. В Java нельзя сделать ссылку на функцию, а в AS3 можно.</h4>
<p style="padding-bottom: 0px;">В AS3 мы пишем так (и это круто):</p>
<pre class="brush: plain; title: ; notranslate">&lt;br /&gt;
public function connect():void{&lt;br /&gt;
	target.addEventListener(Event.CONNECT, handleConnect)&lt;br /&gt;
}&lt;br /&gt;
public function handleConnect(event:Event):void {&lt;br /&gt;
	…&lt;br /&gt;
}&lt;br /&gt;
</pre>
<p style="padding-bottom: 0px;">В java приходится для каждого слушателя создавать отдельный класс:</p>
<pre class="brush: plain; title: ; notranslate">&lt;br /&gt;
IRequestHandler handler = new Handler();&lt;br /&gt;
addRequestHandler(Request.PUBLIC_MESSAGE, handler);&lt;br /&gt;
</pre>
<p style="padding-bottom: 0px;">А dispatcher, зная интерфейс хенжлера, знает какую функцию нужно вызвать и что в неё передать:</p>
<pre class="brush: plain; title: ; notranslate">&lt;br /&gt;
public interface IRequestHandler {&lt;br /&gt;
	void handleRequest(String command, Object data, Session session);&lt;br /&gt;
}&lt;br /&gt;
</pre>
<h4>Отличие 4. В Java можно указать какое исключение может сгенерировать метод:</h4>
<pre class="brush: plain; title: ; notranslate">void handleRequest(String command, Object data, Session session) throws Exception;</pre>
<p>И нам прийдется обязательно обработать это исключение. И это круто. В AS3 мыможем либо прочитать документацию/asdoc либо только догадываться о наличии исключения.</p>
<h4>Отличие 5. Многопоточность.</h4>
<p>Конечно, вписывать это отличие в один ряд с предыдущими отличиями равносильно списку дел</p>
<p>«1) подписать контракт слияния компаний. 2) купить корм для рыбок».</p>
<p>На самом деле, это Огромное отличие. Суть его очень проста. Это выполнение кода в несколько параллельных потоков. Представьте, дорогие флешеры, что у вас в памяти не одна несколько запущенных флешек, только отисовуют они одну флешку и память у них общая. Т.е. в тот момент, пока в одном потоке вы перебираете список соперников, другой поток в это время добавляет или удаляет что-то из этого списка.</p>
<p>Если ещё проще – это как несколько людей в одной комнате(где люди это потоки, а предметы &#8211; это данные): пока Лена считает яблоки на столе, Ира в это время съедает парочку, и к моменту когда Лена досчитает яблоки, полученное значение не будет соответствовать реальности. Есть масса методов избежать проблем в подобных ситуациях — запретить Ире есть яблоки, пока они считаются; сделать так, чтобы яблоки, которые считает Лена и яблоки, которые есть Ира – это были разные яблоки и так далее. Также это может поразить кучу других проблем, к примеру deadlock: Ира ждет пока Лена досчитает яблоки, а Лена ждет пока Ира наестся в конце-то концов — и получается, что они блокируют друг-друга и никто ничего не делают. Но это очень обширная тема и её нужно изучать отдельно.</p>
<h1>Начнем.</h1>
<p>Итак, нам нужно сделать socket-сервер для чата. Первым делом я начал искать в просторах интернета и натолкнулся на ряд старей:</p>
<p><a href="http://www.broculos.net/en/article/how-make-multi-client-flash-java-server">http://www.broculos.net/en/article/how-make-multi-client-flash-java-server</a></p>
<p><a href="http://habrahabr.ru/blogs/java/69136/">http://habrahabr.ru/blogs/java/69136/</a></p>
<p>— Супер! Как все просто! Это то что нужно, — подумал я и внедрил это в жизнь. Вроде все предельно просто. Эти статьи полезно изучить для того чтобы знать основы. Делаем. Все работает, работает отлично&#8230; до тех пор пока вы живете в мире без ошибок сети, без зла и насилия, и у вас только 2 подключенных пользователея. Как я понял позже, это пример сфирического коня в вакууме&#8230;</p>
<h1>Что взять в дорогу. Мой выбор библиотек.</h1>
<h2>NIO</h2>
<p>Первое, что я понял для себя &#8211; не стоит напрямую работать с сокетами. Если использовать готовое решение для работы с сокетами можно избежать кучи проблем с многопоточностью, deadlock, избавит от необходимости писать уже давно написанные вещи. Я выбрал <a href="http://www.jboss.org/netty">Netty</a> по рекомендации одного хорошего java-программиста, но не берусь утверждать, что это самый лучший вариант.</p>
<h2>Логирование</h2>
<p>Для логирования я использовал готовое и распространенное решение  - <a href="http://logging.apache.org/log4j/index.html">loj4g</a>.</p>
<h2>База данных</h2>
<p>Работа с базой данных является тривиальной задачей для явы. Хотелось бы лишь посоветовать использовать пул соединений. Я использовал <a href="http://commons.apache.org/dbcp/">DBCP</a>.</p>
<h2>Протокол</h2>
<p>Для простоты будем использовать <a href="http://code.google.com/p/json-simple/">JSON</a> формат.</p>
<h2>Статистика сервера</h2>
<p><a href="http://code.google.com/p/rrd4j/">RRD4j</a> — это простая библиотека для работы с <a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8C%D1%86%D0%B5%D0%B2%D0%B0%D1%8F_%D0%B1%D0%B0%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85">rrd</a>-базой.</p>
<p><span class="Apple-style-span" style="font-size: 26px; font-weight: bold;">Суть работы с сокетами — элементарное объяснение (вдруг кто не знает).</span></p>
<p>Итак, что такое сокеты. Я думаю, тут можно применить метафору телефонных разговоров. Клиент &laquo;звонит&raquo; по номеру (ip) серверу. Между ними устанавливается связь и они могут обмениваться информацией. Но все что они могут передавать друг-другу это звук (В случае компьютера — текст, а точнее нолики и единички). По &laquo;телефону&raquo; может говорить как клиент так и сервер и каждый будет слышать другого. Если кто-то положит трубку или связь оборвется где-то на линии &#8211; столько не кричи — твой собеседник тебя не услышит. Сокеты работают точно также.</p>
<p>В чем отличие от http-протокола? На самом деле, когда вы открываете веб-страницу ваш браузер создает сокет-соединение и посылает серверу команду &laquo;дай мне такую-то страницу&raquo; (Делает он это в http формате). Сервер в ответ посылает текст страницы и по окончании закрывает соединение (&laquo;кладет трубку&raquo;). Что увидеть это воочию можно открыть telnet, подсоединиться к любому сайту и послать комманду &laquo;GET /&raquo; . Именно так и работает ваш браузер.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/java-socket-server/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>StarSeeker</title>
		<link>http://www.regul-flash.com/starseeker/</link>
		<comments>http://www.regul-flash.com/starseeker/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 18:20:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Star Seeker]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=126</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><span id="more-126"></span></p>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="640" height="480" align="center">
      <param name="movie" value="http://www.regul-flash.com/wp-content/uploads/2010/10/GameStarSeeker2swc.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://www.regul-flash.com/wp-content/uploads/2010/10/GameStarSeeker2swc.swf" width="640" height="480" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/starseeker/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Через тернии к звездам. Оптимизация кода ActionScript3.</title>
		<link>http://www.regul-flash.com/cherez-ternii-k-zvezdam-optimizaciya-koda/</link>
		<comments>http://www.regul-flash.com/cherez-ternii-k-zvezdam-optimizaciya-koda/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 22:33:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=135</guid>
		<description><![CDATA[Эта статья посвящена оптимизации ActionScript3 на примере создания эффекта «полета сквозь звезды»(на подобии старого скринсейвера Windows). Мне этот эффект необходим был для игры. Эффект должен был служить фоном и поэтому требовалось чтобы он был как можно менее ресурсоемким. Я не изобретаю никакие новые приемы оптимизации, я лишь приведу пример их применения на практике. Для начала я [...]]]></description>
			<content:encoded><![CDATA[<p>Эта статья посвящена оптимизации ActionScript3 на примере создания эффекта «полета сквозь звезды»(на подобии старого скринсейвера Windows). Мне этот эффект необходим был для игры. Эффект должен был служить фоном и поэтому требовалось чтобы он был как можно менее ресурсоемким.</p>
<p><span id="more-135"></span></p>
<p>Я не изобретаю никакие новые приемы оптимизации, я лишь приведу пример их применения на практике. Для начала я поискал в интернете готовые решения и наткнулся на решение, которое визуально меня устраивало: <a href="http://www.lemlinh.com/flash-source-starfield-generator/">http://www.lemlinh.com/flash-source-starfield-generator/</a>. Открыв код мы обнаружим, что эти Звездочки — это MovieClip&#8217;ы (крик ужаса за кадром). Каждый флеш-разработчик понимает, что кроме отображения «точки» на каждую «Звездочку-MovieClip» вешается куча свойств и методов класса MovieClip. И чем больше звезд &#8211; тем хуже. Я ничего не хочу сказать об авторе — просто для нам требуется другое.</p>
<p>Ясно, что в такой ситуации прийдется сделать все с самому и с нуля. Ничего гениального в нашей реализации нет:</p>
<ol>
<li>создать массив точек stars:Array</li>
<li>в каждом кадре:</li>
</ol>
<ul>
<li>&#8230;просчитать новое положение каждой точке по суперсложной математической формуле (умножение).</li>
<li>&#8230;нарисовать каждую точку на экране.</li>
</ul>
<p>Сразу оговорюсь, я использую собственный метод получения случайного значения в классе <a href="http://www.regul-flash.com/as/acticles/code_optim/Utils.as">Tools.Utils.as</a>:</p>
<pre class="brush: plain; title: ; notranslate">
public static function rand(lowValue:Number, hightValue:Number, round:Number = 1):Number{
	return lowValue + Math.floor(Math.random() * (hightValue-lowValue)*round)/round;
}
</pre>
<p>Реализуем наш нехитрый алгоритм и получаем класс <a href="http://www.regul-flash.com/as/acticles/code_optim/StarFieldBad.as">StarFieldBad.as</a>. Код нам не важен. Но именно такой код я написал бы до того, как начал закомиться с методами оптимизации когда.</p>
<p>Звезд у нас будет меньше чем на небе, создадим их всего 2000 (реально их хватит 100-200, но нам для теста нужно побольше):</p>
<pre class="brush: plain; title: ; notranslate">
background = new StarFieldBad(_game.STAGE.stageWidth, _game.STAGE.stageHeight, 2000);
addChild(background);
</pre>
<p>Выполнение инициализации не является критическим параметром, т.к. создание объекта делается не часто. Но все же среднее время создания:<strong> 7,42ms</strong>.</p>
<p>Критическим показателем в нашем случае является время выполнения кадра: <strong>9,1095ms</strong>.</p>
<p>Вроде бы и подход не самый страшный, и звезды не создаются каждый раз, но на самом деле это все не верх совершенства. Итак, пойдем по порядку.</p>
<h2>bitmapData.lock()</h2>
<p>В коде не хватает использования метода lock() и unlock(). Добавляем их. (Подробнее «<a href="http://help.adobe.com/ru_RU/as3/mobile/WS4bebcd66a74275c3a0f5f19124318fc87b-7ffd.html">Работа с пикселами</a>» на сайте Adobe.)</p>
<p>В итоге время выполнения стало: <strong>8,9753ms</strong>. (Печально, маленький прирост)</p>
<h2>Цикл FOR</h2>
<pre class="brush: plain; title: ; notranslate">...for (var i:int = 0; i &amp;lt; stars.length; i++) // Проходимся по всем звездам...</pre>
<p>Цикл при каждом проходе обращается к объекту и его свойству. Заодно заменяем цикл for на цикл while:</p>
<pre class="brush: plain; title: ; notranslate">
var i:uint = starsCount;// Итератор звезд
while ( --i &amp;gt; -1)// Проходимся по всем звездам
...
</pre>
<p>Время выполнения: <strong>7,5379ms</strong>. (Удивительно большой прирост)</p>
<h2>По возможности избегайте использования оператора квадратной скобки</h2>
<p>Например у нас внутри циклов происходят подобные операции:</p>
<pre class="brush: plain; title: ; notranslate">
stars[i].x += (stars[i].x - fieldWidth/2) * 0.01;
...
</pre>
<p>Заменяем оператор квадратные скобки на ссылку в локальной переменной (имеет смысл, если мы обращаемся к переменной много раз):</p>
<pre class="brush: plain; title: ; notranslate">
var star:Point;// Ссылка на мат. модель звезды
while ( --i &amp;gt; -1)// Проходимся по всем звездам
{
	star = stars[i];
	star.x += (star.x - halfWidth) * 0.01;
	...
</pre>
<p>Время выполнения: <strong>4.4279ms</strong>. (Невероятно большой прирост. Видимо, ещё сказывается большой объем массива)</p>
<h2>По возможности используйте класс Vector вместо класса Array</h2>
<p>Заменяем Array на Vector.&lt;Point&gt;. «В проигрыватель Flash Player 10 добавлен класс Vector, который обеспечивает более быстрый доступ для чтения и записи, чем класс Array.» (<a href="http://help.adobe.com/ru_RU/as3/mobile/WS4bebcd66a74275c3a0f5f19124318fc87b-7fff.html">источник</a>)</p>
<pre class="brush: plain; title: ; notranslate">stars = new Vector.&amp;lt;Point&amp;gt;(starsCount, true);</pre>
<p>Время выполнения: <strong>3.0963ms</strong>.</p>
<h2>Избавляем Flash от ненужных повторяющихся вычислений</h2>
<p>Можно заранее просчтитать значения таких выражений как «fieldWidth / 2» на «halfWidth» или «fieldHeight+offset» на «fieldWidthWithOffset» и сохранить их в переменные, тем самым избавив флеш от ~20000 лишних операций деления и сложения(это в нашем примере) за кадр:</p>
<pre class="brush: plain; title: ; notranslate">
public function StarField(width:int, height:int, count:uint)
{
	fieldWidthWithOffset = fieldWidth = width;
	fieldHeightWithOffset = fieldHeight = height;

	fieldWidthWithOffset += offset;
	fieldHeightWithOffset += offset;

	halfWidth = fieldWidth / 2;
	halfHeight = fieldHeight / 2;
	...
</pre>
<p>Время выполнения: <strong>2.9642ms</strong>. (ну, большого прироста никто и не обещал)</p>
<h2>Другие приемы оптимизации</h2>
<p>Далее я опущу описание других методов, которые мало сказались на производительности (но это не значит, что нужно ими пренебрегать!):</p>
<ul>
<li>Определение переменных вне цикла.</li>
<li>Встраивание кода для уменьшения числа вызовов функций в коде.</li>
</ul>
<p>В итоге время выполнения скрипта было уменьшено с <strong>9,7753ms</strong> до <strong>2.9405ms</strong>. А это более чем в 3 раза! И время инициализации сократилось в 2 раза — с <strong>7,42ms</strong> до <strong>3,26ms</strong>.</p>
<p>Файл <a href="http://www.regul-flash.com/as/acticles/code_optim/Utils.as">Tools.Utils.as</a>.</p>
<p>Исходный файл <a href="http://www.regul-flash.com/as/acticles/code_optim/StarFieldBad.as">StarFieldBad.as</a>.</p>
<p>Итоговый файл <a href="http://www.regul-flash.com/as/acticles/code_optim/StarField.as">StarField.as</a></p>
<p>Эти и подобные методы оптимизации следует научится использовать сразу, чтобы в последующем не пришлось проводить оптимизацию кода. Всем творческих успехов!</p>
<p>Пару ссылок по теме:</p>
<p><a href="http://help.adobe.com/ru_RU/as3/mobile/index.html">Оптимизация производительности для платформы Flash Platform</a></p>
<p><a href="http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/">http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/</a></p>
<p>И конечно, <a href="http://www.google.com.ua/search?hl=ru&amp;q=as3+optimization&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=&amp;gs_rfai=">Google</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/cherez-ternii-k-zvezdam-optimizaciya-koda/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Оптимизация производительности для платформы Flash Platform</title>
		<link>http://www.regul-flash.com/optimizaciya-proizvoditelnosti-dlya-platformy-flash-platform/</link>
		<comments>http://www.regul-flash.com/optimizaciya-proizvoditelnosti-dlya-platformy-flash-platform/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 14:46:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=115</guid>
		<description><![CDATA[Советы по оптимизации производительности Flash платформы: http://help.adobe.com/ru_RU/as3/mobile/index.html Всем Flash&#8217;ерам и AS3 программистам читать обязательно! Никогда не думал что справка может быть такой содержательной.]]></description>
			<content:encoded><![CDATA[<p>Советы по оптимизации производительности Flash платформы:</p>
<p><a href="http://help.adobe.com/ru_RU/as3/mobile/index.html">http://help.adobe.com/ru_RU/as3/mobile/index.html</a></p>
<p><a href="http://help.adobe.com/ru_RU/as3/mobile/index.html"></a>Всем Flash&#8217;ерам и AS3 программистам читать обязательно! Никогда не думал что справка может быть такой содержательной.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/optimizaciya-proizvoditelnosti-dlya-platformy-flash-platform/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Компилируйте код в Flash Develop, а графику в Flash IDE</title>
		<link>http://www.regul-flash.com/kompilirujte-kod-v-flash-develop-a-grafiku-v-flash-ide/</link>
		<comments>http://www.regul-flash.com/kompilirujte-kod-v-flash-develop-a-grafiku-v-flash-ide/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 17:32:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=80</guid>
		<description><![CDATA[Хочу поделиться навыками организации работы с flash, которые я получил на свой недолгий опыт flash-разработчика. Я думаю, эти рекомендации прежде всего будут полезны новичкам. Статья касается прежде всего разработки flash-игр. Говорить я буду о работе с Flash IDE, Flash Develop(AS3) и GIT. Flash IDE &#8211; используйте для работы с графикой. FlashDevelop &#8211; для кода. GIT [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу поделиться навыками организации работы с flash, которые я получил на свой недолгий опыт flash-разработчика. Я думаю, эти рекомендации прежде всего будут полезны новичкам. Статья касается прежде всего разработки flash-игр.</p>
<p>Говорить я буду о работе с Flash IDE, Flash Develop(AS3) и GIT.</p>
<p>Flash IDE &#8211; используйте для работы с графикой.</p>
<p>FlashDevelop &#8211; для кода.</p>
<p>GIT &#8211; для контроля версий.</p>
<p><span id="more-80"></span></p>
<h2>Статья 1. Компилируйте код в Flash Develop, а графику в Flash IDE.</h2>
<p>Если вы разрабатываете более-менее сложную по коду игру, вам много приходится работать с кодом. Если вы правите as-файлы в Flash Develop, а потом компилируете игру в Flash IDE &#8211; это ваша первая ошибка. Я раньше тоже так делал. Теперь я делаю графику в Flash IDE и экспортирую её в swc-файл. Потом редактирую код в Flash Develop и компилирую его через Flex.</p>
<p>Этот подход дает следующие преимущества:</p>
<ul>
<li><strong>Компилируется в разы быстрее</strong>. Компиляция происходит значительно быстрее, за счет того, что графика уже «готова к употреблению».</li>
<li>Flash Develop <strong>подхватывает классы</strong> из SWC. В коде доступны классы из библиотеки. Не скажу, что это больше преимущество, но это плюс.</li>
<li><strong>Работает debug</strong>. Удивительная вещь! Раньше у меня отладка сводилась к применению trace, а теперь можно делать полноценную отладку! В случаях ошибки также Flash Develop переключается на отладку и останавливает работу на строке с ошибкой.</li>
</ul>
<h3>Пример.</h3>
<ul>
<li>Если у вас стоит старая версия FlashDevelop &#8211; смело удалите все пользовательские файлы(Tools-&gt;Application files) приложения и перезапустите программу.</li>
<li>Ещё понадобится Java, .NET2-3.</li>
</ul>
<p>Всем своим сердцем я надеюсь, что у вас уже установлен Flex SDK.  Если нет — устанавливаем (<a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4" target="_blank">Скачать Flex 4</a>). Установленным должен быть и FlashDevelop (<a href="http://www.flashdevelop.org/" target="_blank">Скачать FlashDevelop</a>). Там же есть <a href="http://www.flashdevelop.org/wikidocs/index.php?title=Configuration#ActionScript_3_configuration" target="_blank">инструкция по настройке</a>.</p>
<p>Открываем FlashDevelop. Выбираем Project-&gt;New Project&#8230; и создаем проект «AS3 Project».</p>
<p><img class="aligncenter size-full wp-image-86" title="Создание нового проекта" src="http://www.regul-flash.com/wp-content/uploads/2010/08/fd_new_project.jpg" alt="" width="546" height="478" /></p>
<p>После этого должен получится примерно такой состав проекта:</p>
<p><img class="aligncenter size-full wp-image-87" title="Состав проекта" src="http://www.regul-flash.com/wp-content/uploads/2010/08/fd_new_project_files.jpg" alt="" width="211" height="218" /></p>
<p>Компилируем его (Enter+Ctrl). Если появилось пустое окно Flash Player &#8211; значит все работает правильно. Если нет, внимательно читайте окошко Output(там может быть намек на ошибку), и пишите в комментариях.</p>
<p><strong>Настраиваем Flash IDE</strong>. Создаем новый AS3 проект. Создаем для проверки Символ в библиотеке.</p>
<p><img class="aligncenter size-full wp-image-95" title="Создание Символа в Библиотеке" src="http://www.regul-flash.com/wp-content/uploads/2010/08/create_library.jpg" alt="" width="741" height="645" /></p>
<p>Файл сохраняем в  проекте, в папке «lib». Заходим в Flash IDE-&gt;Файл(File)-&gt;Параметры публикации(Public settings)-&gt;Вкладка «Flash»-&gt;Ставим галку «Экспортировать SWC-файл». Публикуем проект(Alt+Shift+F12). В папке lib должен появится файл swc:</p>
<p><img class="aligncenter size-full wp-image-91" title="Файл swc" src="http://www.regul-flash.com/wp-content/uploads/2010/08/graphics_swc.jpg" alt="" width="216" height="252" />Как мы видим, в проекте FlashDevelop появился файл swc с списком классов в нем. Теперь необходимо его подключить: Project-&gt;Properties-&gt;Compiter Options-&gt;Добавляем в SWC Libraries наш swc файл.</p>
<p><img class="aligncenter size-full wp-image-93" title="Включение swc файла в проект" src="http://www.regul-flash.com/wp-content/uploads/2010/08/inc_graphics_swc.jpg" alt="" width="404" height="463" /></p>
<p>Для проверки попробуем использовать класс из swc-файла в нашем коде (Main.as):</p>
<pre class="brush: jscript; title: ; notranslate">
private function init(e:Event = null):void {
...
addChild( new myMovieClipClass());
}
</pre>
<p>Компилируем, и видим, что все получилось:</p>
<p><a href="http://www.regul-flash.com/wp-content/uploads/2010/08/swf.jpg"><img class="aligncenter size-full wp-image-97" title="Результат компиляции" src="http://www.regul-flash.com/wp-content/uploads/2010/08/swf.jpg" alt="" width="243" height="195" /></a></p>
<p>Да, конечно такой вид работы потребует от Вас изменения стиля разработки игр, если вы делали их по-другому. Лично у меня переход игры на такой стиль потребовал пару часов. Кое-какие привычные вещи придется сделать кодом. Но поверье, все это окупится теми плюсами, которыми обладает данный метод работы.</p>
<p>Продолжение следует.</p>
<h2>P.S.</h2>
<blockquote><p>Решил переделать то, что начал делать, под этот метод. Раньше в библиотеке был мувиклип button, для него был прописан и создан класс (ui.MyButton) с определенной функциональностью. Вот вкомпилил я этот мувиклип в swc. Ну не получается у меня создать экземпляр этого символа из библиотеки, и чтобы у него был весь этот функционал. Создается я так понял просто экземпляр класса ui.MyButton. Направь на правильный путь плиз.
</p></blockquote>
<p>Весь вопрос в том, что получается ты вкладываешь функциональную часть в swc файл(логику в графику), а потом опять эту графику опять вкладываешь в логику. Это не правильно с точки зрения похода. Я понимаю, что это накладывает некоторые ограничения на процесс разработки, но тебе нужно добавлять ui.MyButton уже непосредственно в коде, программно задавая им позиции.<br />
К примеру, у меня есть MovieClip mcLevelMapLightClass, а функциональность я уже добавляю в FlashDevelop:</p>
<pre class="brush: jscript; title: ; notranslate">public class LevelMapLight extends mcLevelMapLightClass</pre>
<p>Дальше я знаю 2 варианта:<br />
1. Считывать положения конкретных MovieClip на сцене и заменять их уже функциональными с соотв. положением.<br />
2. Сделать конфигурацию (я сделал в XML) положений элементов и добавлять их в соотв. с этой конфигурацией.<br />
Конечно, проще накидать элементы в Flash IDE. А тут приходится это делать кодом. Сначала непривычно. Но в большинстве случаев это занимает не так много работы, как кажется.</p>
<p><b>Пример:</b></p>
<pre class="brush: jscript; title: ; notranslate">

// Создаем положения для кнопок
var btnConf:XML = &lt;root&gt;
	&lt;item x=&quot;63&quot; y=&quot;267&quot; /&gt;
	&lt;item x=&quot;150&quot; y=&quot;267&quot; /&gt;
	&lt;item x=&quot;195&quot; y=&quot;249&quot; /&gt;
	&lt;item x=&quot;195&quot; y=&quot;288&quot; /&gt;
	&lt;item x=&quot;232&quot; y=&quot;288&quot; /&gt;
	&lt;item x=&quot;232&quot; y=&quot;249&quot; /&gt;
	&lt;item x=&quot;269&quot; y=&quot;267&quot; /&gt;
	&lt;item x=&quot;360&quot; y=&quot;267&quot; /&gt;
	&lt;item x=&quot;360&quot; y=&quot;222&quot; /&gt;
	&lt;item x=&quot;415&quot; y=&quot;210&quot; /&gt;
	&lt;item x=&quot;415&quot; y=&quot;325&quot; /&gt;
	&lt;item x=&quot;475&quot; y=&quot;325&quot; /&gt;
	&lt;item x=&quot;535&quot; y=&quot;325&quot; /&gt;
	&lt;item x=&quot;535&quot; y=&quot;210&quot; /&gt;
	&lt;item x=&quot;475&quot; y=&quot;210&quot; /&gt;
	&lt;item x=&quot;475&quot; y=&quot;265&quot; type=&quot;big&quot; /&gt;
&lt;/root&gt;

// Создаем кнопки согласно конфига
for (var i:int = btnConf.item.length() - 1; i &gt;= 0 ; i-- ) {
	// Создаем экземпляр кнопки
	var newButton:LevelMapLight = new LevelMapLight();

	// Присваиваем ей имя
	newButton.name = &quot;mcBtn&quot; + Math.round(i+1);

	// Устанавливаем положение
	newButton.x = btnConf.item[i].@x;
	newButton.y = btnConf.item[i].@y;

	// Сохраняем кое-какие данные
	newButton.userData = i + 1;

	// Добавляем обработчик, который вызовется по нажатию
	newButton.click_hendler = function(e:MouseEvent):void {
		Game.instance.currentLevelNumber = e.currentTarget.userData;
		startGame();
	}

	//Добавляем на сцену
	addChild(newButton);
}
</pre>
<p><br class="spacer_" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/kompilirujte-kod-v-flash-develop-a-grafiku-v-flash-ide/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FLash CS4. Select Similar (Выделить подобное) by JSFL</title>
		<link>http://www.regul-flash.com/flash-cs4-select-similar-vydelit-podobnoe-by-jsfl/</link>
		<comments>http://www.regul-flash.com/flash-cs4-select-similar-vydelit-podobnoe-by-jsfl/#comments</comments>
		<pubDate>Tue, 18 May 2010 12:39:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=20</guid>
		<description><![CDATA[Задача: на сцене присутствует большое количество объектов. Нам нужно выделить все объекты определенного типа. Если выделять их по одному, в лучшем случае просто начнет нервно дергаться глаз. В 3Ds Max есть замечательная команда «Select Similar» (Выделить подобные), но в Flash подобной команды нет. Для решения этой задачи я решил воспользоваться JSFL (язык для написания макросов, [...]]]></description>
			<content:encoded><![CDATA[<p>Задача: на сцене присутствует большое количество объектов. Нам нужно выделить все объекты определенного типа. Если выделять их по одному, в лучшем случае просто начнет нервно дергаться глаз.<br />
<span id="more-20"></span><br />
В 3Ds Max есть замечательная команда «Select Similar» (Выделить подобные), но в Flash подобной команды нет. Для решения этой задачи я решил воспользоваться JSFL (язык для написания макросов, сценариев под Flash IDE).</p>
<p>Итак, качаем Api: <a href="http://download.macromedia.com/pub/documentation/en/flash/mx2004/jsapi.zip">JSFL API</a> или смотрим <a href="http://dynamicflash.com/jsfl/">онлайн</a>.</p>
<p>Создаем файл «Select Similar.jsfl»</p>
<p>Чтобы было вообще круто, помещаем его в «C:\Documents and Settings\<em><strong>User</strong></em>\Local Settings\Application Data\Adobe\Flash CS4\en\Configuration\Commands\Select similar.jsfl»</p>
<p>Перегружаем/Загружаем Flash и теперь в меню «Commands» появилась команда «Select Similar»</p>
<p>Теперь сам скрипт:</p>
<pre class="brush: jscript; title: ; notranslate">

//Текущий документ
doc = fl.getDocumentDOM();

//Открыт ли какой-нибудь документ вообще?
if(doc != null)
{
	// Проверяем, выделен ли хоть один объект
	if(doc.selection.length){
		// Запоминаем имя класса выделенного объекта.
		var targetClassName = doc.selection[0].libraryItem.name;

		/*
		может можно и по-другому получить список объектов сцены, но я беглым
		взглядом не нашел другого способа получения всех объектов документа
		*/

		//Выделяем все объекты на сцене
		doc.selectAll();

		//Получаем список объектов
		childList = doc.selection;

		//Проходимся по всем объектам сцены
		for(n = 0; n &lt; childList.length; n++)
			//Если объект вообще имеет класс в библиотеке
			if(childList[n].libraryItem)
				//Если объект имеет название класса отличное от искомого - снимаем выделение
				if(childList[n].libraryItem.name!=targetClassName)
					childList[n].selected = false;
	}

}
</pre>
<p>Все элементарно. Задача решена.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/flash-cs4-select-similar-vydelit-podobnoe-by-jsfl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash-ficha #1</title>
		<link>http://www.regul-flash.com/flash-ficha-1/</link>
		<comments>http://www.regul-flash.com/flash-ficha-1/#comments</comments>
		<pubDate>Tue, 18 May 2010 12:32:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.regul-flash.com/?p=14</guid>
		<description><![CDATA[Обнаружил очередную Фичу: скажем, у Вас на сцене есть myMC:MovieClip , внутри которого Button. Помещаем на первый frame, где создается MovieClip, ActionScript (скажем, поменять текст в Button) Так вот, если у Вас в Button есть MovieClip (допустим, фон вы сделали), то вышеупомянутый ActionScript не увидит myMC. Для наглядности: Но на самом деле все еще круче [...]]]></description>
			<content:encoded><![CDATA[<p>Обнаружил очередную Фичу:<br />
скажем, у Вас на сцене есть myMC:MovieClip , внутри которого Button.<br />
Помещаем на первый frame, где создается MovieClip, ActionScript (скажем, поменять текст в Button)<br />
Так вот, если у Вас в Button есть MovieClip (допустим, фон вы сделали), то вышеупомянутый ActionScript не увидит myMC.<br />
<span id="more-14"></span><br />
Для наглядности:<br />
<img class="aligncenter size-full wp-image-91" title="ficha-01" src="http://blog.regul-flash.com/wp-content/uploads/2010/03/ficha-01.png" alt="" width="400" height="500" /></p>
<p>Но на самом деле все еще круче &#8211; событие CLICK перестает работать.</p>
<p>Вывод: лучше использовать MovieClip и вручную сделать всякие OVER и CLICK.</p>
<p>Ссылка по теме: <a href="http://forums.creativecow.net/thread/190/863982">http://forums.creativecow.net/thread/190/863982</a></p>
<p>Мое решение &#8211; создал свой класс MovieClipButton:</p>
<pre class="brush: jscript; title: ; notranslate">
package Controls
{
	import flash.display.MovieClip;
	import flash.events.MouseEvent;

	/**
	* @author Dmitriy
	*/

	public class MovieClipButton extends MovieClip  {

		public function MovieClipButton()     {
			stop();

			//Делаем курсор пальчиком
			mouseChildren = false;
			buttonMode = true;
			useHandCursor = true;

			addEventListener(MouseEvent.MOUSE_OUT, out);
			addEventListener(MouseEvent.MOUSE_OVER, over);
			addEventListener(MouseEvent.CLICK,click);

		}

		private function click(e:MouseEvent):void {
			this.gotoAndStop(3);
		}

		private function over(e:MouseEvent):void {
			this.gotoAndStop(2);
		}

		private function out(e:MouseEvent):void {
			this.gotoAndStop(1);
		}

		public function disable() {

			buttonMode = false;
			useHandCursor = false;

			removeEventListener(MouseEvent.MOUSE_OUT, out);
			removeEventListener(MouseEvent.MOUSE_OVER, over);
			removeEventListener(MouseEvent.CLICK, click);

			gotoAndStop(4);
		}
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.regul-flash.com/flash-ficha-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

