Archive for декабря 6, 2007
Над проблемой загрузки внешних библиотек шрифтов не трудился, наверное, только ленивый.
Вариантов решения проблемы много. Коммерческие, не коммерческие, рабочие, не рабочие, удобные и неудобные.
Вашему вниманию мой класс SmartFont.
На сайте поддержки описаны все телодвижения, здесь же упомяну только общий ход использования:
1
2
3
4
5
6
| var my_font:SmartFont = new SmartFont();
my_font.load("someFont.swf");
my_font.onLoad = function():Void
{
trace("Шрифт: "+this._font+" готов к использованию");
} |
Popularity: 1% [?]
декабря 6, 2007
На волнах фриланса частенько попадаются жадные купцы.
Денежку пожалеют, и разработчику не заплатят.
Особенно озадачивает разработчика сей факт, когда он, наивный, отдал результат работы в жадные купцовы руки.
Лучшая защита – работать только с теми, кто у вас в local-trust )))
Но вот еще небольшая подмога. Класс Permission.
Для работы с ним, конечно понадобиться свой родной домен, на который вы сможете положить скромный crossdomain.xml. В нем укажите доступ для того домена, на котором будет лежать результат вашей работы. Ну а если не знаете где именно, будет лежать разрешайте доступ всем. Хуже не будет.
Далее. Кладем у себя мальнький текстовый файл, в котором будут записаны две переменных allow=1 и message=ЗАПЛАТИ ДЕНЕГ!!!
Пока allow=1 флешка будет работать как положено.
Но как только вам покажется, что денег больше не видать – меняйте allow=0.
Теперь все будут поверх флешки периодически читать ваш душещипательный message.
Конечно, по завершении работ, в случае благополучной оплаты – лучше убрать эту мышеловку из кода, и отправить финальный , стерильный вариант.
Использование:
Просто заводим новый экземпляр Permission и передаем в конструкторе путь к текстовому файлу.
var my_permission:Permission = new Permission("my_domain.net/my_permission.txt");
Код классa: ru.decafe.utils.Permission
/**
* class ru.decafe.utils.Permission
* @author Mikhail Ivanchuk
* @version 0.1
*/
import ru.decafe.utils.Cache;
class ru.decafe.utils.Permission {
private var theURL:String = "";
private var accessor:LoadVars;
private var blinker:Number;
private var alert_mc:MovieClip;
private var message:String = "";
public function Permission(url:String) {
theURL = url;
accessor = new LoadVars();
}
public function loadAccess():Void {
var refer:Permission = this;
var _key:String = theURL.indexOf("?")==-1?"?":"&";
accessor.load(theURL+Cache.disable(_key+"nocache="));
accessor.onLoad = function (success:Boolean) {
var mode:String = "demo";
if (success && this.allow == "1") {
mode = "allow";
}
trace("mode: "+mode+"\n"+this.message);
if (mode=="demo") {
refer.message = this.message;
refer.blinker = setInterval(refer,"alert",10000);
}
}
}
private function alert():Void {
alert_mc = _level0.createEmptyMovieClip("alrt",_level0.getNextHighestDepth());
var txt:TextField = alert_mc.createTextField("txt",0,0,0,150,60);
txt.background = true;
txt.multiline = true;
txt.wordWrap = true;
txt.backgroundColor = 0xDEDEDE;
txt.border = true;
txt.borderColor = 0;
txt.html = true;
txt.condenseWhite = true;
txt.htmlText = "
<span style="font-family: Arial;">"+message+"
";
alert_mc.counter = 100;
alert_mc.onEnterFrame = function () {
this.counter--;
if (this.counter<0) this.removeMovieClip();
}
}
}
</span>
+ Cache.as, который необходим для работы класса Permission: ru.decafe.utils.Cache
Popularity: 8% [?]
декабря 6, 2007
Мало мальски серьезное приложение обязательно грузит в себя некие внешние данные.
В случае работы на просторах сети эти данные попадают в кеш.
Иногда эта особенность сильно мешает. К примеру мы делаем галерею которая постоянно пополняется. Адреса изображений заносятся в XML файл, который мы и грузим первым делом в нашу галерею. Единожды загрузившись – этот файл надолго попадает в кеш и наша галерея ничего и знать не знает об обновлениях.
Сценарий 2:
Мы пишем клиентскую часть игры для он-лайн казино. Все процессы связанные с логикой игры происходят на жутко засекреченном сервере, наш клиент только отображает красиво все эти процессы. В определенный момент отправляет серверу данные о действиях игрока, в ответ получая XML с состоянием дел: Баланс игрока, комбинацию карт (или символов, если это слот-машина) ну и много всего разного.
Несмотря на то что мы не запрашиваем реально существующий XML, все равно результат заносится в кеш, и по следующему подобному запросу мы получим старые данные. В итоге – игрок выиграл 100000, но не знает, что это случилось.
Самый простой способ это приклеить Math.random() к запросу. Тогда браузер воспримет такой запрос как абсолютно новый и радостно вернет нам нужные данные в самом свежем виде. Но, полагаться на Math.random() всегда я бы не стал.
И я не стал. Как раз когда мне довелось писать кучу игр для казино, возник вопрос о железной защите от кеша. В итоге родился шизофренический метод, который позже я перелопатил в класс с одним единственным статичным методом. Базируется он на самой непостоянной субстанции – времени.
Однако на этом мы успокаиваться не будем. Иногда нам нужно чтобы свежие данные приходили не так часто. Допустим у меня есть сайт-портфолио, состоящий из нескольких html-страниц. На каждой имеется флеш-галерея работ. Если я буду отключать кеш для каждой загрузки – то мой посетитель будет упорно грузить свежие данные при каждом возвращении на страницу. Выход – обновляться скажем только каждый час, или день.
В общем хватит слов. Класс элементарный – и все будет ясно из его кода.
Метод один Cache.disable(key:String, level:Number);
key – это строка, которую нужно приклеить к запросу. Или банальный «?» («&» если в запросе уже есть пары имя=значение), или что-то сокровенное вроде «?nocache=».
level – уровень защиты от кеша. Передаем одну из констант:
Cache.MONTH, Cache.DAY, Cache.HOUR, Cache.MINUTE, Cache.FULL
код класса:
/**
* class Cache
* @author Mikhail Ivanchuk
* @version 0.1
*/
class ru.decafe.utils.Cache {
public static var MONTH:Number = 1;
public static var DAY:Number = 2;
public static var HOUR:Number = 3;
public static var MINUTE:Number = 4;
public static var FULL:Number = 5;
public static function disable(key:String, level:Number):String {
if (level == undefined) level = Cache.FULL;
var browser:Boolean = (_level0._url.substr(0,4) == "http");
// timestamp
var timestamp:Date = new Date();
var timestampY:Number = timestamp.getYear();
var timestampMN:Number = timestamp.getMonth();
var timestampD:Number = timestamp.getDate();
var timestampH:Number = timestamp.getHours();
var timestampM:Number = timestamp.getMinutes();
var timestampS:Number = timestamp.getSeconds();
var timestampMS:Number = timestamp.getMilliseconds();
var timestampMT:Number = Date.UTC(timestampY,timestampMN,timestampD,timestampH,timestampM,timestampS,timestampMS);
//date string
var dateString:String = timestampY.toString(16) +timestampMN.toString(16);
if (level <= Cache.MONTH) return (browser?(key+dateString):"");
dateString += timestampD.toString(16);
if (level <= Cache.DAY) return (browser?(key+dateString):"");
dateString += timestampH.toString(16);
if (level <= Cache.HOUR) return (browser?(key+dateString):"");
dateString += timestampM.toString(16);
if (level <= Cache.MINUTE) return (browser?(key+dateString):"");
dateString += timestampS.toString(16)+timestampMS.toString(16)+timestampMT.toString(16);
// random
var addition:String = (Math.floor(Math.random()*1024)).toString(16);
return (browser?(key+dateString+addition):"");
}
}
Popularity: 11% [?]
декабря 6, 2007