Visual c++ 2008: Компиляция проекта для запуска на любом компьютере
Проект — Свойства — Свойства конфигурации — С/С++ — Создание кода — Библиотека времени выполнения:
Для Degug: /MTd
Для Release: /MT
Проект — Свойства — Свойства конфигурации — С/С++ — Создание кода — Библиотека времени выполнения:
Для Degug: /MTd
Для Release: /MT
FlashDevelop принято хвалить. Считается, что это лучшая на сегодня среда для разработки flash-приложений. На самом же деле серьезных причин перехода всего полторы:
1. Бесплатность. Если лицензия на CS3 принадлежит не вам, а предприятию, на котором вы работаете, или же вовсе вам не принадлежит: бесплатность — весомый довод в пользу перехода.
2. Вроде бы (догнав проект на CS3 до 300+ классов я еще не сталкивался с этой проблемой) компилятор CS3 не любит больших проектов, сбоит, ссылаясь на недостаток памяти.
На этом все. Все остальные причины, которые обычно превозносят (автокомплит, автоимпорт, подстветка, переходы по классам), охватывает одно определение: личное удобство. Все перечисленное — это удобство набивания кода. Обычно же в любом проекте 90% времени занимает не долбление по клавишам, а отладка, поиск ошибок и мучительные размышления «ЧЯДНТ?».
Мое личное мнение: если вы не столкнулись с проблемой платности среды или недостатка памяти компилятора, и вас все устраивает в работе в CS3 — заморачиваться с переходом на FlashDevelop не стоит.
Если же вы столкнулись с двумя перечисленными причинами, или просто хотите улучшить удобство работы с кодом, практические заметки о переносе рабочего проекта с CS3 на FlashDevelop:
В последних версиях Flash-плеера Adobe внес какие-то изменения в отображение системных шрифтов, в следствие которых, шрифтом по-умолчанию стал Arial (до этого был Times). Это бы еще ничего, но для системных шрифтов теперь постоянно включен режим сглаживания, из-за которого текст небольшой высоты (10-12) выглядит сильно смазанным.
Добиться приемлемой четкости шрифта через AntiAliasType.ADVANCED мне не удалось. Поэтому выход остался один — встроить шрифт в flash-приложение.
Проинспектировав «гугл» на предмет встраивания шрифтов, можно получить множество ссылок на встраивание шрифтов и абсолютно во всех это предлагается делать посредством [EMBED …]
Помучавшись некоторое время, я убедился, что в Adobe Flash этот метод не работает и директива [EMBED] им преспокойно игнорируется. Выходит, этот метод подходит для Flex-разработчиков,но никак не годится для работающих в Adobe Flash.
Однако метод встраивания шрифта в Adobe Flash достаточно прост. Шрифт нужно включить в библиотеку проекта и залинковать для использования в приложении.
1 |
(Packet.Class["MethodName"] as Function)(); |
Как реализовано движение объекта:
Есть алгоритм, вычисляющий положение объекта в зависимости от параметров и времени. Т.е. в любой момент времени, а точнее — каждую итерацию игрового цикла, положение объекта пересчитывается. Результата возвращается в глобальной системе координат (мировая система).
Соответственно, каждую итерацию игрового цикла происходит вызов процедуры перемещения объекта из координат предыдущей итерации в координаты итерации текущей.
Т.к. скорости движения отдельных объектов невелики, блоками происходит «пустой» вызов процедуры перемещения (когда координаты объекта в предыдущей итерации цикла равны координатам объекта в текущей итерации). Не оптимально, но разговор сейчас не об этом.
А о том, что в принципе перемещение из точки в туже самую точку не должно вызывать фактического перемещения. Процедура перемещения генерирует единичную матрицу, единичная матрица, умноженная на матрицу трансформации объекта, матрицу трансформации не меняет. Но…
В отличие от компонентов из пакета flash.*, которые подключатся в проект одной строчкой import, чтобы подключить компонент из пакета fl.* этого не достаточно.
Чтобы подключить компонент из пакета fl.*, например fl.controls.CheckBox нужно:
— Открыть головной *.fla файл проекта
— Открыть окно с компонентами: Меню — Window — Components
— Открыть окно с библиотеками проекта: Меню — Window — Library
— Перетащить нужный компонент (в примере CheckBox) из окна компонентов в окно библиотек
— Сохранить *.fla файл.
Теперь в проекте можно использовать компонент CheckBox обычным способом:
1 2 3 4 5 6 7 |
import fl.controls.CheckBox; var c:CheckBox = new CheckBox(); c.x = 100; c.y = 100; c.label = "Text"; addChild(c); |
Простейший пример, который показывает, что concatenatedmatrix у спрайта, который не имеет parent’а, не является единичной:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package Tmp { import flash.display.Sprite; public class Tmp extends Sprite { private var a:Sprite; public function Tmp() { a = new Sprite(); trace(transform.matrix.toString()); trace(transform.concatenatedMatrix.toString()); trace(a.transform.matrix.toString()); vtrace(a.transform.concatenatedMatrix.toString()); } } } |
Если набор объектов в сцене описывается в XML-формате, а затем динамически генерируется в приложении — в общем случае описание сцены будет выглядеть, как нечто подобное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<SectorMain> <Object1 id="1" desc="Объект №1"> <id>1</id> <sub_id>0</sub_id> <center_x>48</center_x> <center_y>48</center_y> <name>17</name> <img_path>graphic</img_path> <img_name>img1</img_name> <img_ext>png</img_ext> </Object1> <...> <...>...</...> </...> </SectorMain> |
XML-файл загружается в сцену через URLLoader и парсится стандартным обходом всего дерева:
Собственно классическое решение задачи поворота спрайта на заданный угол вокруг произвольной точки (чаще всего его центра) путем матричных преобразований описана в куче литературы и интернет-источниках и звучит следующим образом: перенос спрайта таким образом, чтобы точка совпадал с точкой 0.0,0.0 , поворот на заданный угол, перенос обратно.
Функция RotateAroundAxis представляет реализацию данного метода (Axis — ось или точка, вокруг которой будет повернут спрайт, Angle — угол поворота):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
private function RotateAroundAxis(Axis:Vector2,Angle:Number):void { // Перенос в 0,0,0 var MoveVector:Vector2 = new Vector2(); Vector2.Vec2Subtract(Axis,new Vector2(0.0,0.0),MoveVector); var matrix:Matrix = new Matrix(); matrix.identity(); matrix.translate(MoveVector.x,MoveVector.y); CountWorldMatrix(matrix); // Поворот var RotAngle:Number = Angle*Math.PI/180.0; // Получить матрицу вращения var Rot:Matrix = new Matrix(); Rot.identity(); Rot.rotate(RotAngle); CountWorldMatrix(Rot); // Вернутся обратно matrix.identity(); matrix.translate(Axis.x,Axis.y); CountWorldMatrix(matrix); } |
Задание параметров в коде страницы *.html
1 |
<script param1="value1" param2="value2" type="text/javascript" src="js_script.js"></script> |
Получение параметров в коде внешнего подключенного файла javascrip *.js
1 2 3 4 5 |
var params = document.getElementsByTagName('script'); var param1 = params[params.length-1].getAttribute("param1"); var param2 = params[params.length-1].getAttribute("param2"); alert('param1 = '+param1); // param1 = value1 alert('param2 = '+param2); // param2 = value2 |