Перекур.
Все таки perlinNoise – многофункциональная субстанция.
С его помощью можно имитровать все земные материи.
- Воздух (в виде облаков или дыма)
- Воду.
- Огонь.
- Землю. Если траву им шевелить.
Popularity: 1% [?]
2 комментария декабря 7, 2007
Все таки perlinNoise – многофункциональная субстанция.
С его помощью можно имитровать все земные материи.
Popularity: 1% [?]
2 комментария декабря 7, 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% [?]
2 комментария декабря 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: 8% [?]
Один комментарий декабря 6, 2007
Flashvars долго казались мне самой безобидной субстанцией.
Однако и у них есть пара опасных моментов.
А вывод прост: следим за именами переменных, откуда бы они не приходили. Потому как и во вложенном клипе можно убить доступ к пакету, просто объявив в нем переменную
var flash:Boolean = false;
Popularity: 3% [?]
3 комментария декабря 5, 2007