<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Shai Raiten&amp;#39;s Blog : Development</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx</link><description>Tags: Development</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>מפגש קבוצת ALM בנושא אוטומציה ב–Visual Studio 2012</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/05/20/alm-visual-studio-2012.aspx</link><pubDate>Mon, 20 May 2013 06:06:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:2053737</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=2053737</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/05/20/alm-visual-studio-2012.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/05/20/alm-visual-studio-2012.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p dir="rtl"&gt;בשנתיים האחרונות שאני שומע רק על Coded UI&amp;#160; ב – Visual Studio אבל יש עוד כ”כ הרבה מעבר, במפגש הקרוב אני אדבר על כל יכולות האוטומציה ב – Visual Studio 2012 עבור מפתחים ואנשי אוטומציה.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div&gt;נדבר על Unit Test ויכולת ה – Fakes החדשה שמגיעה עם Visual Studio 2012 (מחליף את Pex &amp;amp; Moles)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;ממשק Web Test Manager שמגיע עם Update 2, אשר מאפשר עבודה עם בדיקות ללא MTM.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;חידושים ודרכים יעילות לכתיבת Coded UI ועבודה עם דפדפנים שונים כגון FireFox ו – Chrome.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;Web Performance Test&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;Load Testing&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p dir="rtl"&gt;בנוסף לא כדאי להפסיד הרצאה של ליאור פרידמן שידבר על ניהול פרוייקטי Agile.&lt;/p&gt;  &lt;p dir="rtl"&gt;&lt;strong&gt;פרטים נוספים ורישום בלינק זה:&lt;/strong&gt; &lt;/p&gt;  &lt;p dir="rtl"&gt;&lt;a href="http://www.eventbrite.com/event/6729031715"&gt;http://www.eventbrite.com/event/6729031715&lt;/a&gt;&lt;/p&gt;  &lt;p dir="rtl"&gt;אשמח לראותכם במפגש!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=2053737" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TDD/default.aspx">TDD</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Testing/default.aspx">Testing</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Load/default.aspx">Load</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Load+Test/default.aspx">Load Test</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Unit+Test/default.aspx">Unit Test</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Google+Chrome/default.aspx">Google Chrome</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/WebTest/default.aspx">WebTest</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Web+Access/default.aspx">Web Access</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/User+Group/default.aspx">User Group</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Coded+UI+Test/default.aspx">Coded UI Test</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Quality+Center+2+Team+System+2010/default.aspx">Quality Center 2 Team System 2010</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/HTML+5/default.aspx">HTML 5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Native/default.aspx">Native</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/ALM/default.aspx">ALM</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/NUnit/default.aspx">NUnit</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Microsoft+Test+Manager+2012/default.aspx">Microsoft Test Manager 2012</category></item><item><title>SignalR Isn’t Working on Samsung Galaxy 3</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/05/14/signalr-isn-t-working-on-samsung-galaxy-3.aspx</link><pubDate>Tue, 14 May 2013 06:16:21 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:2030287</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=2030287</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/05/14/signalr-isn-t-working-on-samsung-galaxy-3.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/05/14/signalr-isn-t-working-on-samsung-galaxy-3.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;I know you think the title is wired, because what is the relation between &lt;strong&gt;&lt;a href="http://signalr.net/" target="_blank"&gt;SignalR&lt;/a&gt;&lt;/strong&gt; (WebSockets) and a specific device such as Samsung Galaxy 3?&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ASP.NET SignalR is a new library for ASP.NET developers that makes it incredibly simple to add real-time web functionality to your applications. What is &amp;quot;real-time web&amp;quot; functionality? It&amp;#39;s the ability to have your server-side code push content to the connected clients as it happens, in real-time.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;While working on a project working with &lt;strong&gt;&lt;a href="http://signalr.net/" target="_blank"&gt;SignalR&lt;/a&gt;&lt;/strong&gt; we faced a problem, the following code start the connection with the hub but the following code isn’t working, neither &lt;u&gt;success&lt;/u&gt; or &lt;u&gt;failed&lt;/u&gt; message appear. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;$.connection.hub.start().done(function () {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; alert(&amp;quot;Connection Working!&amp;quot;);      &lt;br /&gt;}).fail(function (e) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; alert(&amp;quot;Connection Isn&amp;#39;t Working... :-(&amp;quot;);      &lt;br /&gt;});&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Tried to debug the code I didn’t understand why the &lt;strong&gt;fail &lt;/strong&gt;function isn’t invoked… I tired to change the transport layer to polling as part of the testing and it works……&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;connection.start({ transport: &amp;#39;longPolling&amp;#39;]})&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I said to my self this is strange, After all Galaxy 3 supports should &lt;u&gt;WebSockets &lt;/u&gt;and beside that this what SignalR should do if the browser isn’t supporting a specific transport layer.&lt;/p&gt;  &lt;p&gt;From this part of I’ve understand the problem related to SignalR but still didn’t understand why that same code works on Nexus 4 and some other Android devices.&lt;/p&gt;  &lt;p&gt;So I made the following test, I’ve open the Galaxy 3 browser and navigate to “&lt;a href="http://www.websocket.org/echo.html"&gt;http://www.websocket.org/echo.html&lt;/a&gt;” to check support for &lt;u&gt;WebSockets &lt;/u&gt;, and surprise something isn’t working as it should – The log field didn’t showed anything (Again on different devices this works just fine).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_688F187B.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_3F83B7D8.png" width="538" height="198" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So first thing I’ve modified &lt;strong&gt;jquery.signalR.js&lt;/strong&gt; file, I’ve added a &lt;strong&gt;time out&lt;/strong&gt; around the WebSockets connection, this solved the problem…&lt;/p&gt;  &lt;p&gt;Then after a short search I found this &lt;a href="https://github.com/SignalR/SignalR/issues/1653" target="_blank"&gt;Bug: Persistent Connection fails with IIS8 on Android Stock Browser&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And this guy add his fix for the problem here - &lt;a href="https://github.com/SignalR/SignalR/commit/6d892a3cdeb94099ed06b978ba66ec13fce521ae"&gt;https://github.com/SignalR/SignalR/commit/6d892a3cdeb94099ed06b978ba66ec13fce521ae&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can download the fix and implementing your own timeout around the connection start.&lt;/p&gt;  &lt;p&gt;Enjoy&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=2030287" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/PhoneGap/default.aspx">PhoneGap</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/SignalR/default.aspx">SignalR</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Cordova/default.aspx">Cordova</category></item><item><title>Fifth Year as Microsoft MVP - 2013</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/04/01/fifth-year-as-microsoft-mvp-2013.aspx</link><pubDate>Mon, 01 Apr 2013 17:12:40 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1848040</guid><dc:creator>shair</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1848040</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/04/01/fifth-year-as-microsoft-mvp-2013.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/04/01/fifth-year-as-microsoft-mvp-2013.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;This is my fifth time as VS ALM MVP and still excited like it’s the first time I got this email:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Congratulations! We are pleased to present you with the 2013 Microsoft® MVP Award!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;To be a Microsoft MVP is a great honor and I’ll keep work hard for the community: Talking and Writing about new technologies and more.&lt;/p&gt;  &lt;p&gt;I also would like to say many thanks to my company &lt;a href="http://www.selagroup.com/"&gt;Sela&lt;/a&gt;, my boss David Bassa and Caro Segal and Ishai Ram who pushed me forward in the technical community, promote many tools we built for the ALM community and helping me keep the MVP Award for another Year!&lt;/p&gt;  &lt;p&gt;And I’ll also like to thank &lt;strong&gt;You&lt;/strong&gt;, yes &lt;strong&gt;You&lt;/strong&gt;! reading my blog is big part of my contribution for the community and I hope you keep reading my blog and hopefully enjoy it.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;My MVP Profile - &lt;/strong&gt;&lt;/u&gt;&lt;a href="https://mvp.support.microsoft.com/profile/Shai.Raiten"&gt;&lt;strong&gt;https://mvp.support.microsoft.com/profile/Shai.Raiten&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1848040" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/MVP/default.aspx">MVP</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Sela+Group/default.aspx">Sela Group</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/ALM/default.aspx">ALM</category></item><item><title>פיתוח משחקים ב JavaScript - מבוסס על משחק סופר 8 - חלק 5</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/24/javascript-8-5.aspx</link><pubDate>Sun, 24 Mar 2013 10:56:42 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1823673</guid><dc:creator>shair</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1823673</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/24/javascript-8-5.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/24/javascript-8-5.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p style="direction:rtl;"&gt;זהו החלק האחרון בנושא סופר 8 , אני אמשיך להרחיב בנושא JavaScript ופיתוח מחשקים בכללי אבל היום אני רוצה לסגור את הדברים הבסיסיים בפיתוח משחק סופר 8.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;בחלק הקודם &lt;a href="http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/17/javascript-8-4.aspx"&gt;פיתוח משחקים ב JavaScript - מבוסס על משחק סופר 8 - חלק 4&lt;/a&gt; דיברנו על איך להפוך את המשחק ליותר אינטרקטיבי ע”י הוספת רקעים ואלמנטים נוספים למשחק,&amp;#160; ראינו איך אפשר בצורה קלה ונוחה לטעון את כל הגרפיקה (ועוד) בעזרת ספריית PreloadJS ולהתחיל את המשחק כאשר קיבלנו את כל הדברים בנחוצים למשחק.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;בפוסט היום נראה איך אפשר לבצע קפיצה של המשתמש (לא רק אנימציה) וכמובן אחר הנושאים החשובים ביותר- התנגשות עם אובייקטים – Collision.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_27468327.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_1DE9FC4C.png" width="635" height="322" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;&lt;a href="http://1lastletter.com/super8demo/index.html" target="_blank"&gt;לדוגמא המלאה&lt;/a&gt;&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;בהמשך מהפוסט הקודם נוסיף את הקוד הבא תחת פונקציית &lt;strong&gt;handleComplete &lt;/strong&gt;על מנת לטעון אבן למשחק שלנו:&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_5D276442.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_0F0EDF00.png" width="53" height="50" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;rock&amp;quot;&lt;/span&gt;:
    &lt;span class="kwrd"&gt;var&lt;/span&gt; g = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Graphics()
    g.beginBitmapFill(result);
    g.drawRect(0, 0, 45, 44)
    rock = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Shape(g);
    rock.y = h - 119;
    rock.x = w;
    rock.height = 44;
    rock.width = 45;
    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;כעת נשאר להוסיף אותה לאובייקט Stage על מנת שתופיע במשחק:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;stage.addChild(sky, ground, hill, sun, player, &lt;font style="background-color:#ffff00;"&gt;rock&lt;/font&gt;);&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;עכשיו שיש אבן במשחק בואו נכניס אפשרות תלקפוץ מעליה, על מנת לבצע זאת נירשם ל – &lt;strong&gt;stagemousedown&lt;/strong&gt; על מנת לתפוס לחיצה של העכבר של המשחק, כאשר נקבל פעולה זאת ננגן את פעולה הקפיצה ונשנה את הערך של isJumping ל – true.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;נוסיף את הקוד הבא תחת פונקציית handleComplete לפני הפעלת הטיימר – setFPS.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;stage.addEventListener(&lt;span class="str"&gt;&amp;quot;stagemousedown&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;function&lt;/span&gt; () {
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (isJumping) &lt;span class="kwrd"&gt;return&lt;/span&gt;;
    play(&lt;span class="str"&gt;&amp;quot;jump_h&amp;quot;&lt;/span&gt;);
    gameOver = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
    isJumping = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
});&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;כעת נוסיף את הקוד שישנה את מיקום הדמות על ציר &lt;strong&gt;Y&lt;/strong&gt; כך שנוכל לקפוץ מעל האבן, הקוד הבא אינו הפתרון הנכון יותר אבל לדוגמא שלנו הוא פשוט ועובד, בעיקרון אפשר להוסיף הרבה קוד נוסף לביצוע פעולה זאת על ידי טיימר או מיקום הדמות אבל בשבילנו זה מספיק כרגע.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;הקוד בודק שהדמות לא נמצאת באוויר (אין קפיצה כפולה), ומפעיל טיימר של שניה אחת, לאחר אותה שניה הטיימר יחזיר את הדמות לקרקע, אבל לפני זה המאפיין ה – &lt;strong&gt;y&lt;/strong&gt; של השחקן יעלה ב – 4 פיקסלים כלפי מעלה עד לגובה מקסימלי, כאשר הדמות תגיע לגובה מקסימלי הדמות תתחיל בירידה כלפי מטה.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; handleJump() {
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (isJumping) {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (onTheAir == &lt;span class="kwrd"&gt;null&lt;/span&gt;) {
            onTheAir = setTimeout(&lt;span class="kwrd"&gt;function&lt;/span&gt; () {
                isJumping = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                player.y = playerBaseY;
                onTheAir = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                goingDown = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                top = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            }, 1000);
        }

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (goingDown &amp;amp;&amp;amp; player.y &amp;lt;= playerBaseY) {
            player.y += 4;
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt; {
            player.y -= 4;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (player.y &amp;lt;= maxJumpHeight)
                goingDown = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;על מנת לבצע את הקוד נוסיף קריאה לפונקציית handleJump תחת tick:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;function tick() {
    &lt;font style="background-color:#ffff00;"&gt;handleJump();&lt;/font&gt;
    ...
}&lt;/pre&gt;

&lt;p style="direction:rtl;"&gt;כעת נוכל לבצע קפיצה בעזרת לחיצה על מקש שמאלי על המשחק.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;דבר אחרון שנשאר לנו הוא להתמודד עם התנגשות של שני אובייקטים במשחק, כלומר עם השחקן יתנגש באבן אז הדמות תיפול.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;ממליץ לכם לקרוא - &lt;a href="http://www.realtimerendering.com/intersections.html" target="_blank"&gt;Object/Object Intersection&lt;/a&gt;, ולהתעניין קצת יותר בנושא כי הוא בהחלט קצת מורכב, הרעיון המרכזי הוא לדעת מתי הדמות או אבן מתנגשות אחת בשניה, יש נוסחאות שונות לחשב את זה (תלוי גם עם הדמות מרובעות או מעגליות).&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&amp;#160;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; checkRectIntersection(r1, r2) {
    &lt;span class="kwrd"&gt;var&lt;/span&gt; deltax = r1.x - r2.x;
    &lt;span class="kwrd"&gt;var&lt;/span&gt; deltay = r1.y - r2.y;
    &lt;span class="kwrd"&gt;var&lt;/span&gt; dist = 25;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (Math.abs(deltax) &amp;lt; dist &amp;amp;&amp;amp; Math.abs(deltay) &amp;lt; dist) {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Math.sqrt(deltax * deltax + deltay * deltay) &amp;lt; dist) {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        }
    }
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;עכשיו לחלק הקוד האחרון של המשחק, פונקציית HandleCollision אשר תקרא מתוך פונקציית tick:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; HandleCollisions() {
    &lt;span class="kwrd"&gt;var&lt;/span&gt; a = getCollideableItemBounds(player);
    &lt;span class="kwrd"&gt;var&lt;/span&gt; b = getCollideableItemBounds(rock);

    &lt;span class="kwrd"&gt;var&lt;/span&gt; oppss = checkRectIntersection(a, b);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (oppss &amp;amp;&amp;amp; !gameOver) {
        console.log(oppss);
        gameOver = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        play(&lt;span class="str"&gt;&amp;quot;fall_h&amp;quot;&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p style="direction:rtl;"&gt;וסיימנו…. כעת כאשר הדמות תגיע למרחב של האבן המשחק יעצר ודמות תיפול לרצפה, לחיצה על קפיצה תמשיך את המשחק.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://1lastletter.com/super8demo/index.html" target="_blank"&gt;לדוגמא המלאה&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1823673" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/HTML+5/default.aspx">HTML 5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Games/default.aspx">Games</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category></item><item><title>פיתוח משחקים ב JavaScript - מבוסס על משחק סופר 8 - חלק 4</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/17/javascript-8-4.aspx</link><pubDate>Sun, 17 Mar 2013 08:51:20 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1805645</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1805645</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/17/javascript-8-4.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/17/javascript-8-4.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p style="direction:rtl;"&gt;בפוסט הקודם &lt;a href="http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/14/javascript-8-3.aspx" target="_blank"&gt;חלק 3 – פיתוח משחקים ב – JavaScript&lt;/a&gt; דיברנו על איך להזיז את הדמות במרחב המשחק ואיך לשנות את כיון התמונה שתתאים לכיון שהדמות הולכת אליו.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;בפוסט הזה נדבר על יצירת אווירה (רקע ואלמנטים נוספים) למשחק, לא סתם איך להוסיף תמונות רקע נדבר על איך לגרום לרקע לנוע יחד עם הדמות עלל מנת ליצור תחושה של תנועה מתמשכת.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_7F99794E.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_4F02A93E.png" width="329" height="166" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_2C8AC82B.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_5187C6FD.png" width="329" height="166" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_23E65BA0.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_423050EF.png" width="329" height="165" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p style="direction:rtl;"&gt;בפוסט זה נשתמש בספריה נוספת שנקראת – &lt;a href="http://www.createjs.com/Docs/PreloadJS/modules/PreloadJS.html" target="_blank"&gt;PreloadJS&lt;/a&gt;&lt;strong&gt;, &lt;/strong&gt;שגם שייכת לסט הספריות של Create&lt;strong&gt;JS. &lt;/strong&gt;(עד עכשיו השתמשנו ב – EASE&lt;strong&gt;JS &lt;/strong&gt;שגם משתייכת לשם)&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;ספריית Preload&lt;strong&gt;JS, &lt;/strong&gt;מאפשרת טעינה של קבצי מוסיקה, תמונות ברקע ומאפשרת לנו לשלוט מתי כל חלקי המשחק נטענו בהצלחה.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;נוסיף לדף שלנו את הקריאה הבאה, אשר תאפשר לנו להשתמש ביכולות הטעינה של PreloadJS.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt; &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/preloadjs-0.3.0.min.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;כעת נוסיף פונקצייה חדשה בשם &lt;strong&gt;start&lt;/strong&gt; ונוסיף אליה את הקוד הבא:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; start() {           
    manifest = [
        { src: &lt;span class="str"&gt;&amp;quot;assets/sky.png&amp;quot;&lt;/span&gt;, id: &lt;span class="str"&gt;&amp;quot;sky&amp;quot;&lt;/span&gt; },
        { src: &lt;span class="str"&gt;&amp;quot;assets/ground.png&amp;quot;&lt;/span&gt;, id: &lt;span class="str"&gt;&amp;quot;ground&amp;quot;&lt;/span&gt; },
        { src: &lt;span class="str"&gt;&amp;quot;assets/logo.png&amp;quot;&lt;/span&gt;, id: &lt;span class="str"&gt;&amp;quot;sun&amp;quot;&lt;/span&gt; },
        { src: &lt;span class="str"&gt;&amp;quot;assets/hill.png&amp;quot;&lt;/span&gt;, id: &lt;span class="str"&gt;&amp;quot;hill&amp;quot;&lt;/span&gt; }
    ];

    loader = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.LoadQueue(&lt;span class="kwrd"&gt;false&lt;/span&gt;);
    loader.onFileLoad = handleFileLoad;
    loader.onComplete = handleComplete;
    loader.loadManifest(manifest);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;עפי שניתן לראות בדוגמא מעלה, אנחנו מגדירים קובץ manifest (כמובן זה לא חייב להיות השם), בו אנחנו מגדירים את כל התכנים שאנו מעוניינים לטעון עבור המשחק.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;כאשר ההורדה תסתיים נעבור לפונקציית handleComplete, עבור כל תוכן שנטען בהצלחה נגיע ל – handleFileLoad ובה נוסיף את התוכן החדש למערך התמונות שלנו.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; assets = [];
&lt;span class="kwrd"&gt;function&lt;/span&gt; handleFileLoad(&lt;span class="kwrd"&gt;event&lt;/span&gt;) {
    assets.push(&lt;span class="kwrd"&gt;event&lt;/span&gt;.item);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;לפני שנמשיך לאיך מציגים את התמונות הנוספות אציג את הרקעים שנשתמש בהם:&lt;/p&gt;

&lt;table style="direction:rtl;" cellspacing="0" cellpadding="2"&gt;
    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;strong&gt;רצפה&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_34A9F24F.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_00C1B064.png" width="85" height="83" /&gt;&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;כפי שניתן לראות מהתמונה מדובר על חלק קטן של הריצפה – אנחנו נראה איך לשכפל אותו בצורה קלה על מנת ליצור רצפה רצופה לאורך המשחק.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;strong&gt;הרים &lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/SNAGHTML99495bb_2C522EC6.png"&gt;&lt;img title="SNAGHTML99495bb" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="SNAGHTML99495bb" src="http://blogs.microsoft.co.il/blogs/shair/SNAGHTML99495bb_thumb_147AABC6.png" width="244" height="74" /&gt;&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;&amp;#160;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;strong&gt;שמש&lt;/strong&gt; (לוגו של Super 8)&lt;/td&gt;

      &lt;td valign="top"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_2B19A7B5.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_3284CB88.png" width="135" height="132" /&gt;&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;&amp;#160;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;strong&gt;שמיים&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;p style="direction:rtl;"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_20E7E319.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_0A917C2D.png" width="244" height="84" /&gt;&lt;/a&gt;&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top"&gt;&amp;#160;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p style="direction:rtl;"&gt;אחרי שכל הקבצים נטענו והוכנסו למערך&amp;#160; &lt;strong&gt;assets, &lt;/strong&gt;אשר להתחיל למקם אותם על המסך.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;נוסיף את פונקציית &lt;strong&gt;handleComplete,&lt;/strong&gt; ונרוץ על כל האובייקטים שהוכנסו ל – &lt;strong&gt;assets, &lt;/strong&gt;ספריית PreloadJS לא רק טענה את התמונות ברקע אלא גם שייכה אותם לקבוצות לפי סוג הקובץ וכל אובייקט שנטען קיבל מאפיין ייחודי (id), בשורות הראשונות אנחנו נוציא את מאפיין ה – id של כל אובייקט שנטען ונשתמש בפונקציית getResult על מנת לקבל את האובייקט. &lt;/p&gt;

&lt;p style="direction:rtl;"&gt;כאשר נגיע לאובייקט – &lt;strong&gt;ground, &lt;/strong&gt;אנחנו רוצים לצייר רצפה לאורך כל אורך המשחק שלנו, אז ראשית ניצור אובייקט חדש מסוג – Shape ונצייר עליו את התמונה, שימו לב שאורך התמונה ה – w שמציין את אורך המשחק (Canvas), התוצאה שאנחנו נראה לא תהיה מריחה של התמונה ל – 600 פיקסלים אלא שיכפול של התמונה לאורך זה.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;לבסוף נוסיף את אובייקט ה – ground ל – stage (כפי שעשינו בפוסטים קודמים) ונתחיל את שעון המשחק.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://1lastletter.com/super8demo/Demo4_1.html" target="_blank"&gt;דוגמא 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; handleComplete() {
    buildPlayerSprite();

    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; i = 0; i &amp;lt; assets.length; i++) {
        &lt;span class="kwrd"&gt;var&lt;/span&gt; item = assets[i];
        &lt;span class="kwrd"&gt;var&lt;/span&gt; _id = item.id;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; result = loader.getResult(_id);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.type == createjs.LoadQueue.IMAGE) {
            &lt;span class="kwrd"&gt;var&lt;/span&gt; bmp = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Bitmap(result);
        }

        &lt;span class="kwrd"&gt;switch&lt;/span&gt; (_id) {          
            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;ground&amp;quot;&lt;/span&gt;:
                ground = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Shape();
                &lt;span class="kwrd"&gt;var&lt;/span&gt; g = ground.graphics;
                g.beginBitmapFill(result);
                g.drawRect(0, 0, w, 79);
                ground.y = h - 79;
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;          
        }
    }

    stage.addChild(ground, player);

    player.gotoAndPlay(&lt;span class="str"&gt;&amp;quot;walk_h&amp;quot;&lt;/span&gt;);
    
    &lt;span class="kwrd"&gt;var&lt;/span&gt; fieldValue = id(&lt;span class="str"&gt;&amp;quot;fps&amp;quot;&lt;/span&gt;);
    &lt;span class="kwrd"&gt;var&lt;/span&gt; fps = parseInt(fieldValue.value);

    createjs.Ticker.setFPS(fps);
    createjs.Ticker.useRAF = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    createjs.Ticker.addEventListener(&lt;span class="str"&gt;&amp;quot;tick&amp;quot;&lt;/span&gt;, tick);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://1lastletter.com/super8demo/Demo4_1.html" target="_blank"&gt;דוגמא 1&lt;/a&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_7D775081.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_2907CEE4.png" width="582" height="163" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;הבעיה כרגע אין לי תחושה של התקדמות, השחקן מתקדם אבל הרצפה לא, על מנת לעשת זאת נצטרך להזיז את הרצפה יחד עם הדמות על מנת ליצור את האפקט.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;בתוך פונקציית &lt;strong&gt;tick, &lt;/strong&gt;נוסיף את השורה הבאה – אשר תזיז את הרצפה 10 פיקסלים לאחור.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; tick() {
          &lt;span class="kwrd"&gt;var&lt;/span&gt; outside = w + 20;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; position = player.x + player.vX;

        player.x = (position &amp;gt;= outside) ? -200 : position;
        &lt;font style="background-color:#ffff00;"&gt;ground.x = (ground.x - 10);&lt;/font&gt;

    }
    stage.update();
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://1lastletter.com/super8demo/Demo4_2.html" target="_blank"&gt;דוגמא – 2&lt;/a&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;עכשיו אפשר לראות את הרצפה מתקדמת יחד עם תזוזת הדמות אבל היא חתוכה בהתחלה שלה, מה שצריך לעשות הוא להגדיל את רוחב הרצפה בצורה הבאה:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;ground&amp;quot;&lt;/span&gt;:
    ground = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Shape();
    &lt;span class="kwrd"&gt;var&lt;/span&gt; g = ground.graphics;
    g.beginBitmapFill(result);
    g.drawRect(0, 0, &lt;font style="background-color:#ffff00;"&gt;w+330&lt;/font&gt;, 79);
    ground.y = h - 79;
    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;פשוט הוספתי עוד 330 פיקסלים לרוחב התמונה, אבל גם זה לא פתור את הבעיה, אחרי הכל הרצפה עדיין תעלם מהמסך, נוסיף את השורה הבא תחת פונקציית &lt;strong&gt;tick &lt;/strong&gt;ובעזרת מודולו של תוספת הרוחב שהוספנו נדאג שה – x לעולם לא יצא מגבולות המסך.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;ground.x = (ground.x - 10) &lt;font style="background-color:#ffff00;"&gt;% 330&lt;/font&gt;;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://1lastletter.com/super8demo/Demo4_3.html" target="_blank"&gt;דוגמא - 3&lt;/a&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;כעת שהבנו את הדוגמא הבסיסית נוסיף את שאר האובייקט למשחק:&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;* &lt;/strong&gt;&lt;/font&gt;שימו לב שנרשמתי ל - &lt;strong&gt;stage.addEventListener(&lt;/strong&gt;&lt;span class="str"&gt;&lt;strong&gt;&amp;quot;stagemousedown,&lt;/strong&gt;&amp;#160; אשר יאפשר לנו לדעת מתי לחצו על ב – Canvas ונוכל לבצע פעולות קפיצה.&lt;/span&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; handleComplete() {
    buildPlayerSprite();

    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; i = 0; i &amp;lt; assets.length; i++) {
        &lt;span class="kwrd"&gt;var&lt;/span&gt; item = assets[i];
        &lt;span class="kwrd"&gt;var&lt;/span&gt; _id = item.id;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; result = loader.getResult(_id);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.type == createjs.LoadQueue.IMAGE) {
            &lt;span class="kwrd"&gt;var&lt;/span&gt; bmp = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Bitmap(result);
        }

        &lt;span class="kwrd"&gt;switch&lt;/span&gt; (_id) {
            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;sky&amp;quot;&lt;/span&gt;:
                &lt;span class="kwrd"&gt;var&lt;/span&gt; g = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Graphics()
                g.beginBitmapFill(result);
                g.drawRect(0, 0, w * 2, h)
                sky = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Shape(g);
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;ground&amp;quot;&lt;/span&gt;:
                ground = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Shape();
                &lt;span class="kwrd"&gt;var&lt;/span&gt; g = ground.graphics;
                g.beginBitmapFill(result);
                g.drawRect(0, 0, w + 330, 79);
                ground.y = h - 79;
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;hill&amp;quot;&lt;/span&gt;:
                hill = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Shape(&lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Graphics().beginBitmapFill(result).drawRect(0, 0, w, 159));
                hill.x = 0;
                hill.scaleX = 3;
                hill.y = 163;
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;sun&amp;quot;&lt;/span&gt;:
                &lt;span class="kwrd"&gt;var&lt;/span&gt; g = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Graphics();
                g.beginBitmapFill(result);
                g.drawRect(0, 0, 129, 129);
                sun = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Shape(g);
                sun.x = w;
                sun.y = 37;
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        }
    }

    stage.addChild(sky, ground, hill, sun, player);

    player.gotoAndPlay(&lt;span class="str"&gt;&amp;quot;walk_h&amp;quot;&lt;/span&gt;);
    stage.addEventListener(&lt;span class="str"&gt;&amp;quot;stagemousedown&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;function&lt;/span&gt; () {
        play(&lt;span class="str"&gt;&amp;quot;jump_h&amp;quot;&lt;/span&gt;);
    });

    &lt;span class="kwrd"&gt;var&lt;/span&gt; fieldValue = id(&lt;span class="str"&gt;&amp;quot;fps&amp;quot;&lt;/span&gt;);
    &lt;span class="kwrd"&gt;var&lt;/span&gt; fps = parseInt(fieldValue.value);

    createjs.Ticker.setFPS(fps);
    createjs.Ticker.useRAF = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    createjs.Ticker.addEventListener(&lt;span class="str"&gt;&amp;quot;tick&amp;quot;&lt;/span&gt;, tick);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;לבסוף נשנה את פונקציית &lt;strong&gt;tick, &lt;/strong&gt;שתזיז את שאר האובייקטים במשחק.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;ב – tick יש חישוב של &lt;strong&gt;outside , &lt;/strong&gt;כלומר מתי האובייקט נמצא מחוץ למסך, כאשר נראה שאובייקט יצא החוצה נוכל להחזיר אותו ע”י שינוי מאפיין - &lt;strong&gt;x&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; tick() {
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (_action.indexOf(&lt;span class="str"&gt;&amp;quot;walk&amp;quot;&lt;/span&gt;) != -1 || _action.indexOf(&lt;span class="str"&gt;&amp;quot;jump&amp;quot;&lt;/span&gt;) != -1) {

        &lt;span class="kwrd"&gt;var&lt;/span&gt; outside = w + 20;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; position = player.x + player.vX;

        player.x = (position &amp;gt;= outside) ? -200 : position;

        sky.x = (sky.x - 5) % w;
        hill.x = (hill.x - 2) % w;
        ground.x = (ground.x - 10) % 330;

        sun.x = (sun.x - 1);
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (sun.x &amp;lt;= -135) { sun.x = outside + 50; }

    }
    stage.update();
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://1lastletter.com/super8demo/Demo4.html" target="_blank"&gt;לדוגמא המלאה&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1805645" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/HTML+5/default.aspx">HTML 5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Games/default.aspx">Games</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/JavaScript/default.aspx">JavaScript</category></item><item><title>פיתוח משחקים ב JavaScript - מבוסס על משחק סופר 8 - חלק 3</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/14/javascript-8-3.aspx</link><pubDate>Thu, 14 Mar 2013 07:14:10 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1799113</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1799113</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/14/javascript-8-3.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/14/javascript-8-3.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p style="direction:rtl;"&gt;בפוסט הקודם &lt;a href="http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/10/javascript-8-2.aspx" target="_blank"&gt;חלק 2 בפיתוח משחקים ב – JavaScript&lt;/a&gt; דיברנו על מה זה&amp;#160; &lt;strong&gt;Sprite&lt;/strong&gt; ואיך בעזרת ספרייה EASE&lt;strong&gt;JS &lt;/strong&gt;להציג רצף תמונות מאותו מקבץ תמונות על מנת להציג אנימציה למשתמש.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;בפוסט הזה נדבר על איך להזיז את הדמות במרחב על פי הפעולה שהדמות מבצעת.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;המשימה הראשונה שלנו היא להזיז את הדמות במרחב המשחק, על מנת לבצע זאת נשנה את פונקציית &lt;strong&gt;tick &lt;/strong&gt;באופן הבא:&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;ראשית, נגדיר תחום משחק – תחום המשחק ימנע מהדמות שלנו לבצע מגבולות המשחק.&lt;/p&gt;  &lt;p style="direction:rtl;"&gt;בתוך פונקציית tick נוסיף את הקוד הבא:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (player.x &amp;gt;= id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;).width - playerWH) {
    &lt;span class="rem"&gt;// You reached the end -  We need to walk left&lt;/span&gt;
}

&lt;span class="kwrd"&gt;if&lt;/span&gt; (player.x &amp;lt; playerWH) {
    &lt;span class="rem"&gt;// You reached the end -  We need to walk right&lt;/span&gt;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;הקוד הנ”ל יבוצע כאשר מאפיין ה – x של הדמות שלנו (player) גדול מרוחב אובייקט ה – gameCanvas, וכאשר מאפיין ה – x של הדמות קטן מרוחב הדמות.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;עכשיו נזיז את הדמות במרחב לפי תנאים אלו:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (player.x &amp;gt;= id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;).width - playerWH) {
    &lt;span class="rem"&gt;// You reached the end -  We need to walk left&lt;/span&gt;
    &lt;font style="background-color:#ffff00;"&gt;player.direction = -90;&lt;/font&gt;
}

&lt;span class="kwrd"&gt;if&lt;/span&gt; (player.x &amp;lt; playerWH) {
    &lt;span class="rem"&gt;// You reached the end -  We need to walk right&lt;/span&gt;
    &lt;font style="background-color:#ffff00;"&gt;player.direction = 90;&lt;/font&gt;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;הקוד הנ”ל משנה את כיון הדמות ל – 90 מעלות או&amp;#160; 90- מעלות לפי כיון ההליכה של הדמות.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;מה שנשאר לנו עכשיו זה להזיז את הדמות ע”י שינוי מאפיין ה – x של אובייקט player, נוסיף את הקוד הבא לאחר לפי הקריאה ל – &lt;strong&gt;stage.update, &lt;/strong&gt;הקוד אחראי על שינוי מאפיין ה – x בהתאם לכיון הדמות.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;vX – תאוצה על ציר – x , ניתן לשינוי וישפיע את התקדמות הדמות במרחב.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;player.direction == 90 ? player.x += player.vX : player.x -= player.vX;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;עכשיו עומדת לפנינו בעיה, כאשר הדמות זזה לכיון ימין של המסך היא לא מתהפכת.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/SNAGHTML20add10_4B02D8B5.png"&gt;&lt;img title="SNAGHTML20add10" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="SNAGHTML20add10" src="http://blogs.microsoft.co.il/blogs/shair/SNAGHTML20add10_thumb_4015D1A0.png" width="454" height="392" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://tinyurl.com/Super8-Demo3" target="_blank"&gt;דוגמא באתר&lt;/a&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;אפשר ליצור גרפיקה תואמת לכיוונים השונים אבל זה לא פתרון יעיל, גם שימוש ב – &lt;strong&gt;scaleX&lt;/strong&gt; ישפיע באופן רע על ביצועי המשחק, על מנת להפוך את הדמות נשתמש בפונקציית &lt;strong&gt;addFlippedFrames&lt;/strong&gt; שכל מטרתה היא הפיכת הדמות בצורה אופקית ו\או אנכית.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;נוסיף את השורה הבאה לפני קריאה ל - &lt;strong&gt;player = new createjs.BitmapAnimation.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;//( spriteSheet  horizontal  vertical  both ) &lt;/span&gt;
createjs.SpriteSheetUtils.addFlippedFrames(playerSprite, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p style="direction:rtl;"&gt;פונקציית &lt;strong&gt;addFlippedFrames &lt;/strong&gt;תשכפל את כל התמונות ב – &lt;strong&gt;Sprite &lt;/strong&gt;ותהפוך אותם בצורה אופקית ו\או בצורה אנכית.&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;כעת בקריאה לפעולה של הדמות (Jump, Walk וכו) נוכל לראות שכל הפעולות של הדמות (animations) שוכפלו ונוסף לשום הפעולה – &lt;strong&gt;h_.&lt;/strong&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;על מנת לבצע הליכה שמאלה נקרא לפונקציית &lt;strong&gt;gotoAndPlay&lt;/strong&gt; ונעביר את הפעולה עם סיומת &lt;strong&gt;h_&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; tick() {
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (_action.indexOf(&lt;span class="str"&gt;&amp;quot;walk&amp;quot;&lt;/span&gt;) != -1) {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (player.x &amp;gt;= id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;).width - playerWH) {
            &lt;span class="rem"&gt;// You reached the end -  We need to walk left&lt;/span&gt;
            player.direction = -90;
            &lt;font style="background-color:#ffff00;"&gt;pla&lt;/font&gt;&lt;font style="background-color:#ffff00;"&gt;yer.gotoAndPlay(&lt;span class="str"&gt;&amp;quot;walk&amp;quot;&lt;/span&gt;)
&lt;/font&gt;        }

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (player.x &amp;lt; playerWH) {
            &lt;span class="rem"&gt;// You reached the end -  We need to walk right&lt;/span&gt;
            player.direction = 90;
            &lt;font style="background-color:#ffff00;"&gt;player.gotoAndPlay(&lt;span class="str"&gt;&amp;quot;walk_h&amp;quot;&lt;/span&gt;);&lt;/font&gt;
        }

        &lt;span class="rem"&gt;// Moving the sprite based on the direction &amp;amp; the speed&lt;/span&gt;
        player.direction == 90 ? player.x += player.vX : player.x -= player.vX;

    }
    stage.update();
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_6BE6258F.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_02C4F70C.png" width="604" height="509" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p style="direction:rtl;"&gt;&lt;a href="http://tinyurl.com/Super8-Demo3" target="_blank"&gt;דוגמא באתר&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1799113" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/HTML+5/default.aspx">HTML 5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Games/default.aspx">Games</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category></item><item><title>פיתוח משחקים ב JavaScript - מבוסס על משחק סופר 8 - חלק 2</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/10/javascript-8-2.aspx</link><pubDate>Sun, 10 Mar 2013 12:22:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1790864</guid><dc:creator>shair</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1790864</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/10/javascript-8-2.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/10/javascript-8-2.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p dir="rtl"&gt;בפוסט הקודם &lt;a href="http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/07/javascript-8-1.aspx" target="_blank"&gt;חלק 1 – פיתוח משחקים ב – JavaScript&lt;/a&gt; דיברנו על פיתוח משחקים ב – JavaScript בעזרת ספרית EASE&lt;strong&gt;JS, &lt;/strong&gt;ספריה המאפשרת לנו לעבוד עם אוביקט Canvas של HTML 5 בצורה קלה ונוחה.&lt;/p&gt;  &lt;p dir="rtl"&gt;בפוסט הקודם הדגמתי איך בצורה קלה נוכל להשתמש באוביקט &lt;strong&gt;Stage&lt;/strong&gt; על מנת להכיל את כל האלמנטים של המשחק ושימוש ב – &lt;strong&gt;Ticker&lt;/strong&gt; על מנת לעדכן את האלמנטים בתוך לולאת המשחק.&lt;/p&gt;  &lt;p dir="rtl"&gt;הפוסט הזה ירחיב את הנושא ונתקדם למימוש פעולות של השחקן עד ידי הפעלת אנימציה ספציפית לכל פעולה.&lt;/p&gt;  &lt;p dir="rtl"&gt;לפני שאנחנו נכנסים לקוד צריך להבין להכיר אוביקט חשוב שנקרא – &lt;strong&gt;Sprite:&lt;/strong&gt;&lt;/p&gt;  &lt;p dir="rtl"&gt;&lt;strong&gt;Sprite &lt;/strong&gt;הוא תמונה דו מימדית המכילה מקבץ של תמונות (כל מקבץ תמונות מתאר פעולה של השחקן – בדוגמא מטה) שנמצאות בשימוש ולשלב אותם לתמונה אחת גדולה שהיא מעין מפה של כל התמונות בייחד. כך התמונה הגדולה נטענת פעם אחת בלבד בעת העליה והצגת התמונות מתבצעת על ידי הצגת חלק מסויים בלבד של אותה תמונה גדולה לפי מיקום על הציר הרוחבי והאופקי. &lt;/p&gt;  &lt;p dir="rtl"&gt;בעזרת &lt;strong&gt;Sprite&lt;/strong&gt; נוכל ליצור אנימציה בצורה קלה על ידי איור של המצבים השונים שהמשתמש הולך לראות במשחק, השאלה הגדולה איך הופכים את ה – &lt;strong&gt;Sprite&lt;/strong&gt; למשהו שקל לעבוד איתו במשחק שלנו?&lt;/p&gt;  &lt;p dir="rtl"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_1B2E53A5.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_682E9D70.png" width="1079" height="367" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p dir="rtl"&gt;ראשית נתחיל בטעינת התמונה, כאשר טעינת התמונה הסתיימה נקרא לפונקציית &lt;strong&gt;start.&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; stage, player, playerImage, _action;
&lt;span class="kwrd"&gt;var&lt;/span&gt; playerWH = 64;
&lt;span class="kwrd"&gt;var&lt;/span&gt; frequency = 4;

&lt;span class="kwrd"&gt;function&lt;/span&gt; init() {
    playerImage = &lt;span class="kwrd"&gt;new&lt;/span&gt; Image();
    playerImage.src = &lt;span class="str"&gt;&amp;quot;assets/Player.png&amp;quot;&lt;/span&gt;;
    playerImage.onload = start;
}
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p dir="rtl"&gt;חשוב לבצע טעינה לפני התחלת האנימציה, כפי שאנחנו יודעים &lt;strong&gt;Sprite&lt;/strong&gt; יכול להכיל המון המון תמונות ועל כך משקל התמונה יכול להיות גדול, לכן חשוב לוודא שטעינת התמונה הסתיימה לפני שממשיכים לאנימציה.&lt;/p&gt;

&lt;p dir="rtl"&gt;בפוסט הקודם השתמשנו ב – &lt;strong&gt;Bitmap&lt;/strong&gt; לטעינת התמונה, אבל עכשיו אנחנו לא מעוניינים להוסיף למשחק את כל התמונה אלא רק חלקים ממנה. על מנת לעשות זאת נשתמש באובייקט &lt;strong&gt;SpriteSheet &lt;/strong&gt;שמגיע כחלק מ – EASE&lt;strong&gt;JS &lt;/strong&gt;וכל מטרתו היא טעינה של &lt;strong&gt;Sprite.&lt;/strong&gt;&lt;/p&gt;

&lt;p dir="rtl"&gt;כפי שניתן לראות מהדוגמא מטה, אנחנו מתחילים ביצירת Stage שיאכלס את האובייקט שלנו, לאחר מכן אנחנו יוצרים אובייקט &lt;strong&gt;SpriteSheet&lt;/strong&gt; ומגדירים את &lt;strong&gt;images&lt;/strong&gt; לתמונה של השחקן, תחת אובייקט &lt;strong&gt;frames&lt;/strong&gt; נגדיר את גודל הדמות (במקרה שלנו 64x64 פיקסלים), ולבסוף והחשוב ביותר וכאן נראה את הכח של &lt;strong&gt;SpriteSheet&lt;/strong&gt; היא הגדרת המצבים של הדמות.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; start() {
    stage = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Stage(id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;));

    &lt;span class="kwrd"&gt;var&lt;/span&gt; playerSprite = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.SpriteSheet({
        animations:
        {
            &lt;span class="str"&gt;&amp;quot;walk&amp;quot;&lt;/span&gt;: [0, 9, &lt;span class="kwrd"&gt;null&lt;/span&gt;],
            &lt;span class="str"&gt;&amp;quot;fall&amp;quot;&lt;/span&gt;: [10, 21, &lt;span class="kwrd"&gt;null&lt;/span&gt;],
            &lt;span class="str"&gt;&amp;quot;jump&amp;quot;&lt;/span&gt;: [22, 32, &lt;span class="kwrd"&gt;null&lt;/span&gt;],
            &lt;span class="str"&gt;&amp;quot;gamgam&amp;quot;&lt;/span&gt;: [34, 64, &lt;span class="kwrd"&gt;null&lt;/span&gt;],
            &lt;span class="str"&gt;&amp;quot;stand&amp;quot;&lt;/span&gt;: [44, 44, &lt;span class="kwrd"&gt;null&lt;/span&gt;],
            &lt;span class="str"&gt;&amp;quot;special_combo&amp;quot;&lt;/span&gt;: [22, 32, &lt;span class="str"&gt;&amp;quot;gamgam&amp;quot;&lt;/span&gt;]
        },
        images: [playerImage],
        frames:
            {
                height: playerWH,
                width: playerWH,
                regX: 0,
                regY: 0,
            }
    });
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p dir="rtl"&gt;בדוגמאת הקוד מעלה נוכל לראות הגדרת מצבים של השחקן (קפיצה, נפילה, עמידה וכו) על ידי ציון התחלת רצף התמונות וסופו.&lt;/p&gt;

&lt;p dir="rtl"&gt;כפי שניתן לראות בתמונה מטה פעולת “הליכה” מתחילה מתמונה מספר 0 עד תמונה 9.&lt;/p&gt;

&lt;p dir="rtl"&gt;לאחר שהגדרנו את המצבים השונים נוכל פשוט לקרוא לפעולה בשמה, כלומר – נגן &lt;strong&gt;walk&lt;/strong&gt; או אם נגמר הזמן נגן &lt;strong&gt;fall&lt;/strong&gt;.&lt;/p&gt;

&lt;p dir="rtl"&gt;&lt;u&gt;&lt;strong&gt;“שם הפעולה” : [מיקום תמונת ראשונה,&amp;#160; מיקום תמונה אחרונה, פעולה הבאה, תדירות]&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p dir="rtl"&gt;&lt;u&gt;ראו דוגמא ל – &lt;strong&gt;special_combo&lt;/strong&gt;, אשר מבצע רצף תמונות של קפיצה ולאחר מכן ממשיך עם פעולת &lt;strong&gt;gamgam&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p dir="rtl"&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/SNAGHTML68789ba_205CEEBC.png"&gt;&lt;img title="SNAGHTML68789ba" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="SNAGHTML68789ba" src="http://blogs.microsoft.co.il/blogs/shair/SNAGHTML68789ba_thumb_592722BC.png" width="814" height="392" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p dir="rtl"&gt;&lt;a href="http://tinyurl.com/Super8-Demo2" target="_blank"&gt;דוגמאת קוד באתר&lt;/a&gt;&lt;/p&gt;

&lt;p dir="rtl"&gt;לבסוף על מנת שנוכל לנגן את הפעולות נשתמש באובייקט נוסף בשם &lt;strong&gt;BitmapAnimation, &lt;/strong&gt;אובייקט זה יודע לקבל &lt;strong&gt;SpriteSheet&lt;/strong&gt; ומאפשר קריאה לאנימציות בעזרת פונקציית &lt;strong&gt;gotoAndPlay.&lt;/strong&gt;&lt;/p&gt;

&lt;p dir="rtl"&gt;תחת הקוד הקודם נוסיף יצירה של BitmapAnimation, נגדיר נקודת התחלה של הדמות, נוכל גם לקבוע מאיזה תמונה להתחיל (currentFrame), ולבסוף נקרא לפונקציית &lt;strong&gt;gotoAndPlay&lt;/strong&gt; ונעביר את שם הפעולה שאנחנו מעוניינים לנגן. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;player = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.BitmapAnimation(playerSprite);
player.x = id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;).width / 2;
player.y = id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;).height - playerWH;
&lt;span class="rem"&gt;//player.currentFrame = 2;&lt;/span&gt;
player.gotoAndPlay(&lt;span class="str"&gt;&amp;quot;walk&amp;quot;&lt;/span&gt;);

stage.addChild(player);

createjs.Ticker.setFPS(60);
createjs.Ticker.addEventListener(&lt;span class="str"&gt;&amp;quot;tick&amp;quot;&lt;/span&gt;, tick);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_5FAA7C7F.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_727F0029.png" width="819" height="541" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p dir="rtl"&gt;בדוגמא שבאתר תוכלו לשנות הקצב הריענון, תדירות ואת התאוצה של הדמות.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;switch&lt;/span&gt; (_id) {
    &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;fps&amp;quot;&lt;/span&gt;:
        createjs.Ticker.setFPS(parseInt(value));
        &lt;span class="kwrd"&gt;break&lt;/span&gt;;
    &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;velocity&amp;quot;&lt;/span&gt;:
        player.vX = parseInt(value);
        &lt;span class="kwrd"&gt;break&lt;/span&gt;;
    &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;frequency&amp;quot;&lt;/span&gt;:
        frequency = parseInt(value);
        start();
        &lt;span class="kwrd"&gt;break&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p dir="rtl"&gt;&lt;a href="http://tinyurl.com/Super8-Demo2" target="_blank"&gt;דוגמאת קוד באתר&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1790864" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/HTML+5/default.aspx">HTML 5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Games/default.aspx">Games</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category></item><item><title>פיתוח משחקים ב JavaScript - מבוסס על משחק סופר 8 - חלק 1</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/07/javascript-8-1.aspx</link><pubDate>Thu, 07 Mar 2013 13:33:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1784309</guid><dc:creator>shair</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1784309</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/07/javascript-8-1.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/03/07/javascript-8-1.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p dir="rtl"&gt;פיתוח משחקים בשבילי זה תחביב ואולי אפילו קצת יותר, אין לי דרך יותר טובה לנסח את זה – זה פשוט מגניב!!! &lt;/p&gt; &lt;p dir="rtl"&gt;פיתוח משחקים כמעט תמיד הופך למשימה מאוד מורכבת, ככל שרוצים להגיע לרמה גבוה יותר של משחק, אבל בשביל דברים פשוטים אפשר בקלות להתחיל לפתח משחקים לבד ובכל שפה שתרגישו נוח לפתח,&amp;nbsp; אני חושב שלא קיימת שפה שבה לא נוכל לפתח משחקים (חלק אולי פחות מרשימים – אבל בהחלט אפשרי).&lt;/p&gt; &lt;p dir="rtl"&gt;אין מחקר שמוכיח זאת אבל היום השפה הפופולרית ביותר היא כנראה JavaScript, כמובן בגלל האינטרנט וכניסתו של HTML 5 כתקן עולמי וכמובן זה יכול לרוץ על מחשבים, טלפונים מחשבי יד וכמעט כל מכשיר שתומך HTML 5 (זה מתחיל להיות הרבה).&lt;/p&gt; &lt;p dir="rtl"&gt;המשחק שפותח עבור מיקרוסופט ישראל – &lt;a href="https://www.facebook.com/msdnisrael/app_547345328631959" target="_blank"&gt;סופר 8&lt;/a&gt; , הינו משחק מבוסס HTML 5 + JavaScript ואני הולך לדבר קצת על איך מתחילים לפתח משחק עם JavaScript ואתה תראו שפיתוח משחקים לא צריך להיות כ”כ מפחיד.&lt;/p&gt; &lt;p dir="rtl"&gt;&lt;h3 style="direction:rtl;"&gt;אז איך מתחילים?&lt;/h3&gt; &lt;ol style="direction:rtl;"&gt; &lt;li&gt; &lt;div&gt;&lt;strong&gt;סוג המשחק – &lt;/strong&gt;איזה משחק אתם רוצים לפתח? יש המון קטגוריות של משחקים – אני אצמצם את הרשימה בשבילכם – משחקי שולחן או משחקי וידאו.&lt;/div&gt; &lt;ol&gt; &lt;li&gt; &lt;div&gt;&lt;u&gt;משחקי שולחן&lt;/u&gt; – לדוגמא איקס עיגול, פאזל, פוקר הינם משחקים אשר המצב של המשחק נשאר סטטי עד לפעולה מצד המשתמש, המשחק לא משתנה עד שבוצעה פעולה ע”י שחקן אחר או על ידי עצמך.&lt;/div&gt; &lt;li&gt; &lt;div&gt;&lt;u&gt;משחקי וידאו&lt;/u&gt; – לדוגמא – &lt;a href="https://www.facebook.com/msdnisrael/app_547345328631959" target="_blank"&gt;סופר 8&lt;/a&gt; פאקמן, Bubbels או כל משחק שמשתנה גם בפעולה משתמש וגם לפי זמן. עוד דוגמא זה משחק יריות – גם אם לא תזוז עדיין יגיעו אליך מפלצות והעולם (המשחק) ימשיך לנוע.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;li&gt; &lt;div&gt;&lt;strong&gt;שליטה בשפה – &lt;/strong&gt;נכון אמרתי שזה אל חייב להיות כ”כ מסובך לפתח משחק אבל בשביל לפתח משחק צריך שליטה טובה בשפה שבחרתם.&lt;/div&gt; &lt;li&gt; &lt;div&gt;&lt;strong&gt;כלי עזר – &lt;/strong&gt;אחד הדברים שאני ממליץ הוא לא לכתוב הכל בעצמכם, כל המשחקים הגדולים משתמשים בתשתיות לפיתוח משחקים (כאלו שפותחו על ידם או נקנו), אתה יכול לכתוב אבל פשוט חבל על הזמן שלך לבצע דברים שכבר בוצעו אין ספור פעמים ע”י אחרים, לדוגמא – אם אתה רוצה לממש פיזיקה במשחק על מנת להשפיע על אובייקטים שונים – זה ידרוש לא מעט זמן כתיבה או שתוכל להשתמש בספריה קיימת.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;/p&gt;&lt;h3 style="direction:rtl;"&gt;לולאת משחק&lt;/h3&gt; &lt;p style="direction:rtl;"&gt;&lt;img style="float:right;display:inline;" align="right" src="http://rbwhitaker.wdfiles.com/local--files/the-game-loop/GameLoop.png" width="158" height="267" alt="" /&gt;&lt;/p&gt; &lt;p style="direction:rtl;"&gt;אחד המרכיבים החשובים ביותר בפיתוח משחקים נקרא לולאת משחק (Game Loop), לולאת המשחק אחראית על ביסוס לוגיקת המשחק ע”י ציור הגרפיקה במשחק. לולאת המשחק מאפשרת למשחק להמשיך להתקדם גם בלי קבלת פעולות חדשות מהמשתמש.&lt;/p&gt; &lt;p dir="rtl"&gt;תחשבו על Notepad, כאשר אנחנו פותחים אותו ולא כותבים&amp;nbsp; Notepad לא עושה שום דבר. &lt;br /&gt;עכשיו נפתח Outlook.com או Gmail.com ולא נכתוב דבר – ברקע עדיין מתרחשים דברים – נכו שמדובר על Ajax וזה לא קשור למשחק אבל הרעיון שיש תהליכים שרצים ברקע ולא &lt;u&gt;רק&lt;/u&gt; מחכים לפעולה של המשתמש.&lt;/p&gt; &lt;p dir="rtl"&gt;אז איך יוצרים לולאת משחק?, הדוגמא לפניכם הוא הדבר הראשון שהרבה מפתחים חושבים עליו ישר אבל הוא כנראה לא הדבר הכי יעיל:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; (!MyGame.stopped) { 
  MyGame.update(); 
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="rtl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="rtl"&gt;אחד הדברים המרכזיים שלולאת המשחק מבצעת היא קריאה לפונקציית &lt;strong&gt;update, &lt;/strong&gt;שאחראית על עדכון המשחק –&lt;u&gt; עדכון נתונים&lt;/u&gt;, &lt;u&gt;עדכון נקודות&lt;/u&gt; &lt;u&gt;הזזת אוביקטים&lt;/u&gt; &lt;u&gt;במשחק&lt;/u&gt; ועוד).&lt;/p&gt;
&lt;p dir="rtl"&gt;אם נשתמש ב – While בשביל לקרוא לפעולות &lt;strong&gt;update&lt;/strong&gt;&amp;nbsp; (אנחנו מדברים על JavaScript), הדפדפדן כנראה יחסום את הפונקציה וגם לא נהיה הכי יעילים כי אין לנו אפשרות לשלוט במהירות המשחק או במילים אחרות כל כמה זמן אנחנו רוצים לעדכן את האובייקטים במשחק – FPS – Frames Per Second.&lt;/p&gt;
&lt;p dir="rtl"&gt;פתרון נוסף שנוכל לבצע הוא שימוש ב – setInterval, ואז בצורה קלה מאוד נוכל להגדיר לולאת שתרוץ על פי קצב ריענון הגיוני.&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;MyGame.fps = 60;

MyGame.update = &lt;span class="kwrd"&gt;function&lt;/span&gt; () {
    &lt;span class="rem"&gt;// Move game parts&lt;/span&gt;
};

&lt;span class="rem"&gt;// Start the game loop&lt;/span&gt;
MyGame._intervalId = setInterval(Game.update, 1000 / Game.fps);

&lt;span class="rem"&gt;// To stop the game, use the following:&lt;/span&gt;
clearInterval(MyGame._intervalId);&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="rtl"&gt;FPS – כדי שהעין שלנו תראה “אנימציה” בעצם צריך להזיז רצף תמונות במהירות מסוימת, אם התמונות יזוז לאט מידי נוכל לראות שזה לא אנימציה. המינימום FPS שצריך על מנת ליצור את התחושה שמדובר באנימציה הוא – 17 FPS.&lt;/p&gt;
&lt;p dir="rtl"&gt;למרות שיצירת לולאת משחק יכול להיראות פשוט מאוד עדיין אני הולך לדבר על ספריה בשם EASE&lt;strong&gt;JS&lt;/strong&gt;, ספריית EASE&lt;strong&gt;JS &lt;/strong&gt;נותנת תמיכה בעבודה עם Canvas ב – HTML 5 ועוזרת בצורה משמעותית לפיתוח משחקים, והיא מכילה אובייקט בשם – &lt;strong&gt;Ticker&lt;/strong&gt; שישמש אותנו כלולאת המשחק.&lt;/p&gt;
&lt;p dir="rtl"&gt;ראשית נוריד את - &lt;a title="http://www.createjs.com/#!/EaselJS" href="http://www.createjs.com/#!/EaselJS"&gt;http://www.createjs.com/#!/EaselJS&lt;/a&gt; ונפתח דף HTML חדש, נוסיף קישור אל הקבצים שהורדנו.&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/geom/Matrix2D.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/geom/Rectangle.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/events/EventDispatcher.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/utils/UID.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/utils/Ticker.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/utils/SpriteSheetUtils.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/DisplayObject.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/Container.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/Stage.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/SpriteSheet.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/BitmapAnimation.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/Graphics.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/Bitmap.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;js/easeljs/display/Text.js&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="rtl"&gt;נוסיף ל – Body את אובייקט ה – &lt;strong&gt;Canvas&lt;/strong&gt; ונקרא לו – &lt;strong&gt;gameCanvas&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;canvas&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;gameCanvas&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;600&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;canvas&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="rtl"&gt;כעת בואו נתחיל לעבוד עם ספריית EASE&lt;strong&gt;JS, &lt;/strong&gt;דבר ראשון שנחנו צריכים הוא ליצור אובייקט חדש מסוג – &lt;strong&gt;Stage&lt;/strong&gt;. &lt;br /&gt;&lt;strong&gt;Stage&lt;/strong&gt; יחזיק את אובייקט ה – &lt;strong&gt;Canvas&lt;/strong&gt; של המשחק וכל פעם שלולאת המשחק תבוצע ה – &lt;strong&gt;Stage&lt;/strong&gt; יעדכן את האובייקטים תחתיו.&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;stage = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Stage(id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;));&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="rtl"&gt;כעת מה שנשאר לעשות הוא להוסיף תמונה למשחק שלכם, בעזרת שימוש בפונקציית Bitmap אשר מקבל נתיב לתמונה, נוסיף את התמונה לתוך ה – &lt;strong&gt;Stage&lt;/strong&gt; בעזרת קריאה ל – &lt;strong&gt;stage.addChild&lt;/strong&gt; ונעביר אליו את התמונה שלנו.&lt;/p&gt;
&lt;p dir="rtl"&gt;לאחר מכן נגדיר את קצב הרענון של המשחק על 30 FPS , בעזרת קריאה ל – &lt;strong&gt;(createjs.Ticker.setFPS(30.&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="rtl"&gt;ודבר אחרון הוא להירשם לאירוע (Event) בשם – &lt;strong&gt;tick, &lt;/strong&gt;פונקציית tick תופעל כל 33.33 מאיות השניה (1000/30).&lt;/p&gt;
&lt;p dir="rtl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; stage, image, fpstext;
&lt;span class="kwrd"&gt;function&lt;/span&gt; init() {
    stage = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Stage(id(&lt;span class="str"&gt;&amp;quot;gameCanvas&amp;quot;&lt;/span&gt;));
    image = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Bitmap(&lt;span class="str"&gt;&amp;quot;assets/Player.png&amp;quot;&lt;/span&gt;);

    stage.addChild(image);

    createjs.Ticker.setFPS(30);
    createjs.Ticker.addEventListener(&lt;span class="str"&gt;&amp;quot;tick&amp;quot;&lt;/span&gt;, tick);
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="rtl"&gt;כעת כל מה שנשאר לנו הוא לעדכן את המשחק ברגע שפונקציית &lt;strong&gt;tick&lt;/strong&gt; מבוצעת, בשלב הנוכחי אני מזיז את התמונה 10 פיקסלים ימינה , במידה והתמונה הגיעה ל – 600 פיקסלים (קצה תחום משחק) אני מחזיר את התמונה ל – 0. לאחר שביצענו את השינויים נקרא ל – &lt;strong&gt;stage.update &lt;/strong&gt;על מנת לעדכן את ה – Canvas בהתאם לשינויים שביצענו.&lt;/p&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; tick() {
    image.x += 10;

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (image.x &amp;gt; 600)
        image.x = 0;

    stage.update();
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_6788DE6F.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_3A27489F.png" width="779" height="450" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p dir="rtl"&gt;&lt;a href="http://tinyurl.com/Super8-Demo1" target="_blank"&gt;כניסה לדוגמא&lt;/a&gt;&lt;/p&gt;
&lt;p dir="rtl"&gt;עכשיו נוסיף למשחק שלנו שורה טקסט בעזרת שימוש באובייקט – &lt;strong&gt;Text&lt;/strong&gt;, עוד דוגמא לשימוש הקל בעבודה עם &lt;strong&gt;Canvas&lt;/strong&gt; בעזרת EASE&lt;strong&gt;JS.&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="rtl"&gt;האובייקט טקסט שנוסיף יציג את מהירות ה – FPS של המשחק, נוסיף את הקוד הבא תחת פונקציית ה - &lt;strong&gt;init&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;fpstext = &lt;span class="kwrd"&gt;new&lt;/span&gt; createjs.Text(&lt;span class="str"&gt;&amp;quot;fps:&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;20px Arial&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;#7a1567&amp;quot;&lt;/span&gt;);
fpstext.x = 0;
fpstext.y = 20;
stage.addChild(fpstext);&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="rtl"&gt;ולסיום תחת פונקציית &lt;strong&gt;tick&lt;/strong&gt; נוסיף את השורה הבאה&lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;fpstext.text = Math.round(createjs.Ticker.getMeasuredFPS()) + &lt;span class="str"&gt;&amp;quot; fps&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="rtl"&gt;וזאת התוצאה שנקבל:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_620A47FE.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_38B30000.png" width="776" height="448" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p dir="rtl"&gt;&lt;a href="http://tinyurl.com/Super8-Demo1" target="_blank"&gt;כניסה לדוגמא&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1784309" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Sela+Group/default.aspx">Sela Group</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Games/default.aspx">Games</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/EASEJS/default.aspx">EASEJS</category></item><item><title>TFS API Part 49 – Delete Team Project</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/20/tfs-api-part-49-delete-team-project.aspx</link><pubDate>Wed, 20 Feb 2013 19:08:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1757008</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1757008</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/20/tfs-api-part-49-delete-team-project.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/21/tfs-api-part-49-delete-team-project.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;There are many improvements in TFS API for 2012 version, in my previous post I’ve talked about &lt;a href="http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/20/tfs-api-part-48-workitemcontrol-and-bypass-work-item-rules.aspx" target="_blank"&gt;TFS API Part 48 – WorkItemControl And Bypass Work Item Rules&lt;/a&gt; that allow work item creation with &lt;strong&gt;bypass&lt;/strong&gt; rule mode in WorkItemStore that allow you to create and change any field value without applying the WorkItem template rules.&lt;/p&gt;  &lt;p&gt;in this post I’ll show how to delete Team Project using TFS API, be aware Delete Team Project is unrecoverable!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_028946EC.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_32337746.png" width="449" height="554" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1756990/download.aspx" target="_blank"&gt;Download Demo Project&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Step 1: Connect TFS and Getting Team Projects&lt;/h2&gt;  &lt;p&gt;Create WPF Application, and add the basic code for connecting TFS and collecting all Team Projects under that collection.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; TfsTeamProjectCollection _tfs;
&lt;span class="kwrd"&gt;private&lt;/span&gt; WorkItemStore _store;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnConnect_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    var tpp = &lt;span class="kwrd"&gt;new&lt;/span&gt; TeamProjectPicker(TeamProjectPickerMode.NoProject, &lt;span class="kwrd"&gt;false&lt;/span&gt;);
    tpp.ShowDialog();

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (tpp.SelectedTeamProjectCollection != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        _tfs = tpp.SelectedTeamProjectCollection;
        _store = &lt;span class="kwrd"&gt;new&lt;/span&gt; WorkItemStore(_tfs);
        GetTeamProjects();
    }
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetTeamProjects()
{
    projectsList.ItemsSource = _store.Projects;
}&lt;/pre&gt;
&lt;/blockquote&gt;



&lt;h2&gt;Step 2: Using TeamProjectDeleter&lt;/h2&gt;

&lt;p&gt;To delete Team Project we need to use a new API called – &lt;strong&gt;TeamProjectDeleter, &lt;/strong&gt;you can find this dll here - &lt;em&gt;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v4.5\Microsoft.TeamFoundation.DeleteTeamProject.dll..&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;First create new &lt;strong&gt;TeamProjectDeleter&lt;/strong&gt; object and pass the &lt;strong&gt;TfsCollection&lt;/strong&gt;, &lt;strong&gt;Team Project name&lt;/strong&gt; and &lt;strong&gt;force&lt;/strong&gt; property.&lt;/p&gt;

&lt;p&gt;You can also specify if you want to delete the Team Project WSS and finally calling the delete method to perform the Team Project delete operation.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnDelete_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (projectsList.SelectedItem == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;

    var project = (Project)projectsList.SelectedItem;

    var force = chxForce.IsChecked == &lt;span class="kwrd"&gt;true&lt;/span&gt; ? &lt;span class="kwrd"&gt;true&lt;/span&gt; : &lt;span class="kwrd"&gt;false&lt;/span&gt;;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        var deleter = &lt;span class="kwrd"&gt;new&lt;/span&gt; TeamProjectDeleter(_tfs, project.Name, force);
        deleter.StatusEvent += deleter_StatusEvent;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (deleter.HasWssToDelete)
            deleter.ExcludeWss = chxExcludeWss.IsChecked == &lt;span class="kwrd"&gt;true&lt;/span&gt; ? &lt;span class="kwrd"&gt;true&lt;/span&gt; : &lt;span class="kwrd"&gt;false&lt;/span&gt;;

        var result = MessageBox.Show(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;You are about to delete \&amp;quot;{0}\&amp;quot; project, are you sure you want to continue?&amp;quot;&lt;/span&gt;,
            project.Name), &lt;span class="str"&gt;&amp;quot;Delete Team Project&amp;quot;&lt;/span&gt;, MessageBoxButton.OKCancel, MessageBoxImage.Warning);
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (result == MessageBoxResult.OK)
        {
            var t = &lt;span class="kwrd"&gt;new&lt;/span&gt; Thread(&lt;span class="kwrd"&gt;new&lt;/span&gt; ThreadStart(deleter.Delete));
            t.Start();
        }
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

&lt;span class="kwrd"&gt;void&lt;/span&gt; deleter_StatusEvent(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, TeamProjectDeleter.StatusEventArgs e)
{
    Execute ex = &lt;span class="kwrd"&gt;delegate&lt;/span&gt;()
    {
        txtLog.Text = e.message + Environment.NewLine + txtLog.Text;
    };
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.Dispatcher.Invoke(ex);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1756990/download.aspx" target="_blank"&gt;Download Demo Project&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1757008" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+Administration/default.aspx">TFS Administration</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+Utilities/default.aspx">TFS Utilities</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+API/default.aspx">TFS API</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+2012/default.aspx">TFS 2012</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category></item><item><title>TFS API Part 48 – WorkItemControl And Bypass Work Item Rules</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/20/tfs-api-part-48-workitemcontrol-and-bypass-work-item-rules.aspx</link><pubDate>Wed, 20 Feb 2013 17:28:30 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1756712</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1756712</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/20/tfs-api-part-48-workitemcontrol-and-bypass-work-item-rules.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/20/tfs-api-part-48-workitemcontrol-and-bypass-work-item-rules.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;It’s been a while since I wrote about TFS API, not because there is no more about it is because I worked on Windows Store for the past couple of months so I didn’t had the time.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+API/default.aspx" target="_blank"&gt;More About TFS API&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So today post will be about two changes in TFS 2012, the first one is &lt;strong&gt;&lt;u&gt;WorkItemControl &lt;/u&gt;&lt;/strong&gt;based on WPF that replaced the &lt;strong&gt;WorkItemFormControl &lt;/strong&gt;based on WinForms, the second will be about &lt;strong&gt;WorkItemStore&lt;/strong&gt; bypass rule – Allowing you to save and change work item values without obeying the work item rules.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_53BD4600.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_3757B615.png" width="1112" height="346" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1756707/download.aspx" target="_blank"&gt;Download Demo Project&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Step 1: Connect TFS&lt;/h2&gt;  &lt;p&gt;First create WPF application using Visual Studio 2012 and connect TFS using &lt;strong&gt;TeamProjectPicker&lt;/strong&gt; API.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnConnect_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    var pick = &lt;span class="kwrd"&gt;new&lt;/span&gt; TeamProjectPicker(TeamProjectPickerMode.NoProject, &lt;span class="kwrd"&gt;false&lt;/span&gt;);
    pick.AcceptButtonText = &lt;span class="str"&gt;&amp;quot;I want this Team Project!&amp;quot;&lt;/span&gt;;
    pick.ShowDialog();

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (pick.SelectedTeamProjectCollection != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        _tfs = pick.SelectedTeamProjectCollection;
        &lt;span class="rem"&gt;//WorkItemStoreFlags - Enum used to determine behavior of work item store object&lt;/span&gt;
        _store = &lt;span class="kwrd"&gt;new&lt;/span&gt; WorkItemStore(_tfs, WorkItemStoreFlags.BypassRules);
        btnShowWits.IsEnabled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        MessageBox.Show(&lt;span class="str"&gt;&amp;quot;Please select Team Project&amp;quot;&lt;/span&gt;);
    }
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;

&lt;h2&gt;Step 2: Query Work Items&lt;/h2&gt;

&lt;p&gt;No just for demo purpose I using the Store object to query all items in the collection.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnShowWits_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    var workItems = _store.Query(&lt;span class="str"&gt;&amp;quot;SELECT [System.Id] FROM WorkItems&amp;quot;&lt;/span&gt;);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (workItems.Count &amp;gt; 0)
    {
        btnShowWit.IsEnabled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        workItemsList.ItemsSource = workItems;
    }
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Step 3: Bypass WorkItemStore Rules&lt;/h2&gt;

&lt;p&gt;The interesting part in TFS 2012 that you can create the &lt;strong&gt;WorkItemStore&lt;/strong&gt; object and specify if you want to work in &lt;strong&gt;BypassRule &lt;/strong&gt;mode.&lt;/p&gt;

&lt;p&gt;The Bypass Rule allow you to modify the work item fields without any restrictions, for example you can change “&lt;strong&gt;Created Date&lt;/strong&gt;”, or “&lt;strong&gt;Created By&lt;/strong&gt;” – that normally are blocked for changes.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; chxBypassRules_Checked(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (_tfs == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;
    _store = &lt;span class="kwrd"&gt;new&lt;/span&gt; WorkItemStore(_tfs, WorkItemStoreFlags.BypassRules);
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; chxBypassRules_Unchecked(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (_tfs == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;
    _store = &lt;span class="kwrd"&gt;new&lt;/span&gt; WorkItemStore(_tfs, WorkItemStoreFlags.None);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Step 4: Show Work Item Control&lt;/h2&gt;

&lt;p&gt;After we specify the WorkItemStore mode we want to work with and have selected a Work Item from the list we want to display him outside Visual Studio using &lt;strong&gt;WorkItemControl.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;WorkItemControl &lt;/strong&gt;needs the Item property set to the work item you want to display (or new work item), then create new Window object and set the &lt;strong&gt;WorkItemControl &lt;/strong&gt;as the new Windows Content.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnShowWit_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (workItemsList.SelectedItem == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;

    _witControl = &lt;span class="kwrd"&gt;new&lt;/span&gt; WorkItemControl();
    _witControl.Item = (WorkItem)workItemsList.SelectedItem;


    _container = &lt;span class="kwrd"&gt;new&lt;/span&gt; Window();
    _container.Content = _witControl;

    _container.Show();

    btnShowErrors.IsEnabled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnShowErrors_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    _witControl.ShowAllFieldErrors(&lt;span class="str"&gt;&amp;quot;Error Title&amp;quot;&lt;/span&gt;, 99);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;pre class="csharpcode"&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1756707/download.aspx" target="_blank"&gt;&lt;font size="3" face="Arial"&gt;Download Demo Project&lt;/font&gt;&lt;/a&gt;&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;font face="Arial"&gt;Enjoy&lt;/font&gt;&lt;/pre&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1756712" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+Administration/default.aspx">TFS Administration</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/WorkItem+Tracking/default.aspx">WorkItem Tracking</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Work+Items/default.aspx">Work Items</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+API/default.aspx">TFS API</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+2012/default.aspx">TFS 2012</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category></item><item><title>Run Windows Store Apps From Desktop</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/07/run-windows-store-apps-from-desktop.aspx</link><pubDate>Thu, 07 Feb 2013 14:09:49 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1736848</guid><dc:creator>shair</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1736848</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/07/run-windows-store-apps-from-desktop.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/07/run-windows-store-apps-from-desktop.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;When customers ask me how they can run Windows Store app from Desktop usually the answer is – &lt;strong&gt;You Can’t, &lt;/strong&gt;but if you really want there is a way to do that.&lt;/p&gt;  &lt;p&gt;The reason I usually answer is You Can’t is because – In order to run Windows Store app from Desktop you need to install &lt;a href="http://msdn.microsoft.com/en-US/windows/apps/jj572486" target="_blank"&gt;Windows App Certification Kit&lt;/a&gt;, this pack contains “&lt;strong&gt;microsoft.windows.softwarelogo.appxlauncher.exe&lt;/strong&gt;” file that can run a Windows Store app by his application model id.&lt;/p&gt;  &lt;p&gt;So if you plan on publishing your app you can’t assume the ACK is installed on the client machine.&lt;/p&gt;  &lt;p&gt;Again, if you really want… Let me show you.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_11119BD1.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_75C91D02.png" width="907" height="538" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1736841/download.aspx" target="_blank"&gt;Download Demo Project&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Step 1: Getting Started&lt;/h2&gt;  &lt;p&gt;First create a WPF project and add the following reference:&lt;/p&gt;  &lt;p&gt;“C:\Program Files (x86)\Windows Kits\8.0\App Certification Kit\microsoft.windows.softwarelogo.shared.dll”&lt;/p&gt;  &lt;h2&gt;Step 2: Getting Windows App List&lt;/h2&gt;  &lt;p&gt;The reason you need to add reference to “Microsoft.Windows.Softwarelogo.Shared.dll” so we can receive the program inventory xml file, this file contains the complete list of all installed Windows Store apps.&lt;/p&gt;  &lt;p&gt;Under my PC here is the file location - &lt;u&gt;&amp;quot;C:\\Users\\Shai\\AppData\\Local\\Microsoft\\AppCertKit\\programinventory_e25bb752-e7cf-4fb2-8194-874ba9b91c7b.xml&amp;quot;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;As I said this file contains all Windows Store app installed on you machine, each Program element under that file will show all the information regarding that specific app.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_70B6B986.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_268B88D4.png" width="924" height="357" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So, how do you get the file location?&lt;/p&gt;  &lt;p&gt;It’s very simple, using &lt;strong&gt;GlobaldataAccessor&lt;/strong&gt; method from &lt;strong&gt;softwarelogo.shared.dll&lt;/strong&gt; you can get the Program Inventory Location string.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; itemValue = GlobalDataAccessor.GetItemValue(&lt;span class="str"&gt;&amp;quot;ProgramInventoryLocation&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;PRE_PROCESS&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you got this file all you need is parsing the XML and create a collection on Apps.&lt;/p&gt;

&lt;p&gt;I’ve create a &lt;strong&gt;ProductInfo&lt;/strong&gt; class that will represent each Program in the file, as you can see from the code below I simply taking the attributes and elements from the Program element.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ProductInfo : INotifyPropertyChanged
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NotifyPropertyChanged(String propertyName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));
            }
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _Status;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Status
        {
            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _Status; }
            set
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; != &lt;span class="kwrd"&gt;this&lt;/span&gt;._Status)
                {
                    &lt;span class="kwrd"&gt;this&lt;/span&gt;._Status = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
                    NotifyPropertyChanged(&lt;span class="str"&gt;&amp;quot;Status&amp;quot;&lt;/span&gt;);
                }
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; LogoUrl { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ProductName { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ProductVendor { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ProductLanguage { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ProductVersion { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; RootDirPath { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PackageFullName { get; set; }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; ProductInfo(XmlNode xNode)
        {
            var attrib = xNode.Attributes[&lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (attrib != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(attrib.Value)) ProductName = attrib.Value;

            attrib = xNode.Attributes[&lt;span class="str"&gt;&amp;quot;Version&amp;quot;&lt;/span&gt;];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (attrib != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(attrib.Value)) ProductVersion = attrib.Value;

            attrib = xNode.Attributes[&lt;span class="str"&gt;&amp;quot;Language&amp;quot;&lt;/span&gt;];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (attrib != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(attrib.Value)) ProductLanguage = attrib.Value;

            attrib = xNode.Attributes[&lt;span class="str"&gt;&amp;quot;Publisher&amp;quot;&lt;/span&gt;];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (attrib != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(attrib.Value)) ProductVendor = attrib.Value;

            attrib = xNode.Attributes[&lt;span class="str"&gt;&amp;quot;RootDirPath&amp;quot;&lt;/span&gt;];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (attrib != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(attrib.Value)) RootDirPath = attrib.Value;

            attrib = xNode.Attributes[&lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (attrib != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(attrib.Value)) Id = attrib.Value;

            var node = xNode.SelectSingleNode(&lt;span class="str"&gt;&amp;quot;/Log/ProgramList/Program[@Id=&amp;#39;&amp;quot;&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.Id + &lt;span class="str"&gt;&amp;quot;&amp;#39;]/Indicators/PackageManifestIndicator/Properties/Logo&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (node != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(node.InnerText))
            {
                var imgUrl = System.IO.Path.Combine(RootDirPath, node.InnerText);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (File.Exists(imgUrl))
                    LogoUrl = imgUrl;
            }

            node = xNode.SelectSingleNode(&lt;span class="str"&gt;&amp;quot;/Log/ProgramList/Program[@Id=&amp;#39;&amp;quot;&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.Id + &lt;span class="str"&gt;&amp;quot;&amp;#39;]/Indicators/PackageManifestIndicator/PackageManifest&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (node != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(node.Attributes[&lt;span class="str"&gt;&amp;quot;PackageFullName&amp;quot;&lt;/span&gt;].InnerText))
            {
                PackageFullName = node.Attributes[&lt;span class="str"&gt;&amp;quot;PackageFullName&amp;quot;&lt;/span&gt;].InnerText;
            }
        }
    }&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;And now, let’s connect the two part together, the first thing is getting the &lt;strong&gt;ProgramInventorylocation&lt;/strong&gt; and after that just load that Xml file and parse it to objects with the information you want.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BuildAppsList()
{
    &lt;span class="kwrd"&gt;string&lt;/span&gt; itemValue = GlobalDataAccessor.GetItemValue(&lt;span class="str"&gt;&amp;quot;ProgramInventoryLocation&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;PRE_PROCESS&amp;quot;&lt;/span&gt;);

    XmlNodeList list = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    var reportDoc = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();
    reportDoc.Load(itemValue);
    ProductList = &lt;span class="kwrd"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;ProductInfo&amp;gt;();

    list = reportDoc.GetElementsByTagName(&lt;span class="str"&gt;&amp;quot;Program&amp;quot;&lt;/span&gt;);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (list.Count &amp;lt; 1)
    {
        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlException();
    }
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (XmlNode node &lt;span class="kwrd"&gt;in&lt;/span&gt; list)
    {
        ProductInfo item = &lt;span class="kwrd"&gt;new&lt;/span&gt; ProductInfo(node);
        ProductList.Add(item);
    }

    dbTable.ItemsSource = ProductList;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Step 3: Get App User Model Id&lt;/h2&gt;

&lt;p&gt;Now after you got all Windows Store app installed on your machine it’s time to run them. In order to run a Windows Store app you’ll need to obtain the &lt;strong&gt;AppUserModelId,&lt;/strong&gt; the reason you need to &lt;strong&gt;AppUserModelId &lt;/strong&gt;is because the &lt;u&gt;appxlauncher.exe&lt;/u&gt; needs this value in order to launch the application. (Package Name is not enough).&lt;/p&gt;

&lt;p&gt;After completing Step 2 we got the App Package Full Name, we need to use this value to find the &lt;strong&gt;AppUserModelId&lt;/strong&gt; from registry.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;HKEY_CURRENT_USER\Software\Classes\ActivatableClasses\Package\**PackageFullName**\Server&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_0811221E.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_2F1BBB93.png" width="911" height="230" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So let’s add the following method, this method receive a &lt;strong&gt;packageFullName&lt;/strong&gt; string and perform a search in the registry for the &lt;strong&gt;AppUserModelId&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetAppUserModelId(&lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName)
{
    &lt;span class="kwrd"&gt;string&lt;/span&gt; str = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (RegistryKey key = Registry.CurrentUser.CreateSubKey(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;@&amp;quot;SOFTWARE\Classes\ActivatableClasses\Package\{0}\Server\&amp;quot;,&lt;br /&gt;                                                                               packageFullName)))
    {
        if (key == null) return str;

        var appKeys = from k in key.GetSubKeyNames()
                        where !k.StartsWith(&amp;quot;&lt;/span&gt;BackgroundTransferHost&lt;span class="str"&gt;&amp;quot;)
                        select k;

        foreach (var appKey in appKeys)
        {
            using (RegistryKey serverKey = key.OpenSubKey(appKey))
            {
                if (serverKey.GetValue(&amp;quot;&lt;/span&gt;AppUserModelId&lt;span class="str"&gt;&amp;quot;) != null)
                {
                    str = serverKey.GetValue(&amp;quot;&lt;/span&gt;AppUserModelId&amp;quot;).ToString();
                    serverKey.Close();
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                }
            }
        }
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; str;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Step 4: Running Windows Store App&lt;/h2&gt;

&lt;p&gt;After we have the &lt;strong&gt;AppUserModelId &lt;/strong&gt;string for a specific Windows Store app we can run it.&lt;/p&gt;

&lt;p&gt;You can test it by opening command line and write the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;C:\Program Files (x86)\Windows Kits\8.0\App Certification Kit\Microsoft.Windows.SoftwareLogo.AppxLauncher.exe &lt;strong&gt;&lt;u&gt;“AppUserModelId”&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Start App Button&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; StartApp_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    var product = ((System.Windows.Controls.Button)sender).Tag &lt;span class="kwrd"&gt;as&lt;/span&gt; ProductInfo;
    var appUserModelId = Helpers.GetAppUserModelId(product.PackageFullName);

    var exec = &lt;span class="str"&gt;@&amp;quot;C:\Program Files (x86)\Windows Kits\8.0\App Certification Kit\Microsoft.Windows.SoftwareLogo.AppxLauncher.exe&amp;quot;&lt;/span&gt;;

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!File.Exists(exec))
    {
        System.Windows.MessageBox.Show(&lt;span class="str"&gt;&amp;quot;Please install Windows App Certification Kit for Windows RT&amp;quot;&lt;/span&gt;);
    }

    var processInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; ProcessStartInfo()
    {
        Arguments = appUserModelId,
        UseShellExecute = &lt;span class="kwrd"&gt;false&lt;/span&gt;,
        CreateNoWindow = &lt;span class="kwrd"&gt;true&lt;/span&gt;,
        FileName = exec
    };

    Process.Start(processInfo);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Step 5: Get Application Status&lt;/h2&gt;

&lt;p&gt;The last thing you might want is to know the App execution state, in order to do that you need to use &lt;strong&gt;IPackageDebugSettings - &lt;/strong&gt;Enables debugger developers control over the lifecycle of a Windows Store app, such as when it is suspended or resumed. (&lt;a title="http://msdn.microsoft.com/en-us/library/hh438393(v=vs.85).aspx" href="http://msdn.microsoft.com/en-us/library/hh438393(v=vs.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/hh438393(v=vs.85).aspx&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt; for that create a &lt;strong&gt;PackageStatushelper&lt;/strong&gt; class with the following code:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PackageStatusHelper
{
    [ComImport, Guid(&lt;span class="str"&gt;&amp;quot;B1AEC16F-2383-4852-B0E9-8F0B1DC66B4D&amp;quot;&lt;/span&gt;)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PackageDebugSettings
    {
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; PACKAGE_EXECUTION_STATE
    {
        PES_UNKNOWN,
        PES_RUNNING,
        PES_SUSPENDING,
        PES_SUSPENDED,
        PES_TERMINATED
    }

    [ComImport, Guid(&lt;span class="str"&gt;&amp;quot;F27C3930-8029-4AD1-94E3-3DBA417810C1&amp;quot;&lt;/span&gt;), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IPackageDebugSettings
    {
        &lt;span class="kwrd"&gt;int&lt;/span&gt; EnableDebugging([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName, [MarshalAs(UnmanagedType.LPWStr)]&lt;br /&gt;                                                              &lt;span class="kwrd"&gt;string&lt;/span&gt; debuggerCommandLine, IntPtr environment);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; DisableDebugging([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; Suspend([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; Resume([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; TerminateAllProcesses([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; SetTargetSessionId(&lt;span class="kwrd"&gt;int&lt;/span&gt; sessionId);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; EnumerageBackgroundTasks([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName, &lt;br /&gt;                                                      &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; taskCount, &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; intPtr, [Out] &lt;span class="kwrd"&gt;string&lt;/span&gt;[] array);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; ActivateBackgroundTask(IntPtr something);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; StartServicing([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; StopServicing([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; StartSessionRedirection([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName, &lt;span class="kwrd"&gt;uint&lt;/span&gt; sessionId);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; StopSessionRedirection([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; GetPackageExecutionState([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName,&lt;br /&gt;                                            &lt;span class="kwrd"&gt;out&lt;/span&gt; PACKAGE_EXECUTION_STATE packageExecutionState);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; RegisterForPackageStateChanges([MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName, &lt;br /&gt;                               IntPtr pPackageExecutionStateChangeNotification, &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; pdwCookie);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; UnregisterForPackageStateChanges(&lt;span class="kwrd"&gt;uint&lt;/span&gt; dwCookie);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PACKAGE_EXECUTION_STATE GetPackageExecutionState(&lt;span class="kwrd"&gt;string&lt;/span&gt; packageFullName)
    {
        PACKAGE_EXECUTION_STATE packageExecutionState = PACKAGE_EXECUTION_STATE.PES_UNKNOWN;
        PackageDebugSettings settings = &lt;span class="kwrd"&gt;new&lt;/span&gt; PackageDebugSettings();
        IPackageDebugSettings settings2 = (IPackageDebugSettings)settings;
        &lt;span class="kwrd"&gt;try&lt;/span&gt;
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (settings2.GetPackageExecutionState(packageFullName, &lt;span class="kwrd"&gt;out&lt;/span&gt; packageExecutionState) != 0)
            {
                System.Windows.MessageBox.Show(&lt;span class="str"&gt;&amp;quot;Failed to get package execution state.&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;GetPackageExecutionState&amp;quot;&lt;/span&gt;);
            }
        }
        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message, &lt;span class="str"&gt;&amp;quot;GetPackageExecutionState&amp;quot;&lt;/span&gt;);
        }
        &lt;span class="kwrd"&gt;return&lt;/span&gt; packageExecutionState;
    }
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;And from the application you can just call the GetPackageExecutionState passing the Package Full Name&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetAppStatus_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    var btn = (System.Windows.Controls.Button)sender;
    var product = btn.Tag &lt;span class="kwrd"&gt;as&lt;/span&gt; ProductInfo;
    var status = PackageStatusHelper.GetPackageExecutionState(product.PackageFullName);

    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (status)
    {
        &lt;span class="kwrd"&gt;case&lt;/span&gt; PackageStatusHelper.PACKAGE_EXECUTION_STATE.PES_RUNNING:
            btn.Foreground = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Green);
            btn.Content = &lt;span class="str"&gt;&amp;quot;Running&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        &lt;span class="kwrd"&gt;case&lt;/span&gt; PackageStatusHelper.PACKAGE_EXECUTION_STATE.PES_SUSPENDED:
            btn.Foreground = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Orange);
            btn.Content = &lt;span class="str"&gt;&amp;quot;Suspended&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        &lt;span class="kwrd"&gt;case&lt;/span&gt; PackageStatusHelper.PACKAGE_EXECUTION_STATE.PES_TERMINATED:
            btn.Foreground = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Red);
            btn.Content = &lt;span class="str"&gt;&amp;quot;Terminated&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        &lt;span class="kwrd"&gt;default&lt;/span&gt;:
            btn.Foreground = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Gray);
            btn.Content = &lt;span class="str"&gt;&amp;quot;Unkown&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
    }
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1736841/download.aspx" target="_blank"&gt;Download Demo Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1736848" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/ITPRO/default.aspx">ITPRO</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET+4/default.aspx">.NET 4</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Metro+Style/default.aspx">Metro Style</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Metro/default.aspx">Metro</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Windows+Store/default.aspx">Windows Store</category></item><item><title>Windows App Cert Kit Failed - The bytecode generation test detected the following errors</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/07/windows-app-cert-kit-failed-the-bytecode-generation-test-detected-the-following-errors.aspx</link><pubDate>Thu, 07 Feb 2013 06:48:39 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1736181</guid><dc:creator>shair</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1736181</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/07/windows-app-cert-kit-failed-the-bytecode-generation-test-detected-the-following-errors.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/02/07/windows-app-cert-kit-failed-the-bytecode-generation-test-detected-the-following-errors.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;In the past couple of weeks I’ve worked on Cordova (PhoneGap) application for Windows 8, just before we intent to publish it to the store I’ve encountered a problem – &lt;strong&gt;“bytecode generation test detected“.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_66EC39E1.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_2856C66E.png" width="869" height="318" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To give your app the best chance of getting certified you should run the some tests, beside checking for bugs and making sure your application works as expected you should use the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=263703" target="_blank"&gt;App Cert Kit&lt;/a&gt; - Windows 8 apps must use the new Windows App Certification Kit to become certified and eligible for sale in the Windows Store&lt;/p&gt;  &lt;p&gt;“&lt;a href="http://go.microsoft.com/fwlink/?LinkID=263703" target="_blank"&gt;Windows 8 App Cert Kit&lt;/a&gt;” &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The Windows App Certification Kit (ACK) is used to validate compliance with certification requirements, and replaces the Windows Software Logo Kit (WSLK) used for validation in the Windows 7 Software Logo program. Desktop, desktop device, and Windows Store apps can be certified; however, plug-in, ActiveX, and other web apps cannot be certified. The Windows ACK is included in the Windows Software Development Kit (SDK) and the Windows SDK for Windows Store apps.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Looking at the &lt;strong&gt;How to fix &lt;/strong&gt;section didn’t help me to understand the problem, but after couple of minutes exploring this I found out that the main reason for those errors is not &lt;strong&gt;JavaScript Syntax Errors&lt;/strong&gt; but &lt;strong&gt;Encoding&lt;/strong&gt;. The reason I know this is not a &lt;strong&gt;JavaScript Syntax &lt;/strong&gt;problem is because some CSS files was also in that list and of course Visual Studio didn’t said anything about Syntax Errors.&lt;/p&gt;  &lt;p&gt;So just open the files maintained in the error report using notepad (or other editor support Save + Encoding)&lt;/p&gt;  &lt;p&gt;Click on &lt;strong&gt;Save As &lt;/strong&gt;and make sure to select &lt;strong&gt;“UTF-8”&lt;/strong&gt; in the encoding box.&lt;/p&gt;  &lt;p&gt;Once you finished going over all the problematic files rerun the App Cert Kit and those errors should disappear.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_6CB6B7AD.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_6DEB2ABF.png" width="955" height="496" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Enjoy&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1736181" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Metro/default.aspx">Metro</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Windows+Store/default.aspx">Windows Store</category></item><item><title>WinRT Toast Notification From Desktop Application</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/30/winrt-toast-notification-from-desktop-application.aspx</link><pubDate>Wed, 30 Jan 2013 18:33:04 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1715385</guid><dc:creator>shair</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1715385</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/30/winrt-toast-notification-from-desktop-application.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/30/winrt-toast-notification-from-desktop-application.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;The post title maintained &lt;strong&gt;Toast Notification&lt;/strong&gt; but after reading this post we&amp;#39;ll be able to perform API calls to &lt;strong&gt;WinRT&lt;/strong&gt; from your Desktop application.&lt;/p&gt;  &lt;p&gt;As you know WinRT exposing API’s for three developer languages: C#, C++ and JavaScript, this means that from each language you’ll be able to perform WinRT calls. The idea is based on &lt;u&gt;Windows Metadata File&lt;/u&gt; (winmd) that expose those APIs that can be consumed across a variety of technologies and languages.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_35625913.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_659907FC.png" width="640" height="322" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1715377/download.aspx" target="_blank"&gt;Download Demo Project&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So why not using those calls from a desktop application? for example one of the great features of Windows 8 is &lt;strong&gt;Toast Notifications&lt;/strong&gt;, Toast is a super cool replacement for Message box dialog that block your screen and can be very enjoying…&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;A toast notification is a transient message to the user that contains relevant, time-sensitive information and provides quick access to related content in an app. It can appear whether you are in another app, the Start screen, the lock screen, or on the desktop. Toasts should be viewed as an invitation to return to your app to follow up on something of interest. Toast notifications are an optional part of the app experience and are intended to be raised only when your app is not the active foreground app.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;let’s say that we want to send Toast from your Desktop application instead of displaying annoying message boxes, let’s see how you can do it.&lt;/p&gt;  &lt;h3&gt;Step 1: Getting Started With Windows.winmd&lt;/h3&gt;  &lt;p&gt;Let’s start with empty WPF application, let’s try to load &lt;strong&gt;Windows.winmd&lt;/strong&gt; file located here:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\Windows.winmd&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;You’ll receive below error message saying this file isn&amp;#39;t compatible with your current project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_798274C5.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_651CAF3A.png" width="638" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You need to edit your &lt;strong&gt;csproj &lt;/strong&gt;file and add &lt;span class="html"&gt;&lt;strong&gt;TargetPlatformVersion&lt;/strong&gt; element.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_4BF12F35.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_5812A95C.png" width="674" height="652" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Locate the &lt;strong&gt;PropertyGroup&lt;/strong&gt; and add additional element : &lt;font style="background-color:#ffff00;"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TargetPlatformVersion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;8.0&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TargetPlatformVersion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Project&lt;/span&gt; &lt;span class="attr"&gt;ToolsVersion&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DefaultTargets&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Build&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Import&lt;/span&gt; &lt;span class="attr"&gt;Project&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Exists(&amp;#39;$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props&amp;#39;)&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PropertyGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot; &amp;#39;$(Configuration)&amp;#39; == &amp;#39;&amp;#39; &amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Debug&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Platform&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot; &amp;#39;$(Platform)&amp;#39; == &amp;#39;&amp;#39; &amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;AnyCPU&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Platform&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ProjectGuid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;{20DAA4E0-DE45-4FB6-8650-44FFDBA78F25}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ProjectGuid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;OutputType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;WinExe&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;OutputType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;AppDesignerFolder&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Properties&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;AppDesignerFolder&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RootNamespace&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;DesktopAppNotificationDemo&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;RootNamespace&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;AssemblyName&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;DesktopAppNotificationDemo&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;AssemblyName&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TargetFrameworkVersion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;v4.5&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TargetFrameworkVersion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;font style="background-color:#ffff00;"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TargetPlatformVersion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;8.0&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TargetPlatformVersion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FileAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;512&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;FileAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ProjectTypeGuids&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ProjectTypeGuids&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;WarningLevel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;4&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;WarningLevel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PublishUrl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;publish\&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;PublishUrl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now if you try to load &lt;strong&gt;Windows.winmd&lt;/strong&gt; you’ll success, using the Object Browser you can explore the different API’s available in WinRT.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_0C8355D8.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_161B9E41.png" width="959" height="510" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 2: API Code Pack&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;In order to display toasts, a desktop application must have a shortcut on the Start menu. Also, an AppUserModelID must be set on that shortcut. 
    &lt;br /&gt;The shortcut should be created as part of the installer. The following code shows how to create a shortcut and assign an &lt;strong&gt;AppUserModelID&lt;/strong&gt; using Windows APIs.

    &lt;br /&gt; You must download and include the &lt;/em&gt;&lt;a href="http://archive.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;em&gt;Windows® API Code Pack for Microsoft® .NET Framework&lt;/em&gt;&lt;/a&gt;&lt;em&gt; to allow Toast Notification from desktop application.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Windows® API Code Pack for Microsoft® .NET Framework&lt;/b&gt; provides a source code library that can be used to access some features of Windows 7 and Windows Vista from managed code. These Windows features are not available to developers today in the .NET Framework.&lt;/p&gt;

&lt;p&gt;First thing after the application is loaded you need to make sure the application has a shortcut under Start menu referring to your desktop AppUserModelID.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; String APP_ID = &lt;span class="str"&gt;&amp;quot;Shai Raiten - DesktopAppNotificationDemo&amp;quot;&lt;/span&gt;;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsAppLinkExists()
{
    &lt;span class="kwrd"&gt;string&lt;/span&gt; defaultPath = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;@&amp;quot;{0}\Microsoft\Windows\Start Menu\Programs\{1}.lnk&amp;quot;&lt;/span&gt;,
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
        APP_ID);

    &lt;span class="kwrd"&gt;return&lt;/span&gt; File.Exists(defaultPath) == &lt;span class="kwrd"&gt;false&lt;/span&gt; ? CreateApplicationShortcut(defaultPath) : &lt;span class="kwrd"&gt;true&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;In case there is no shortcut you’ll need to create one:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CreateApplicationShortcut(&lt;span class="kwrd"&gt;string&lt;/span&gt; defaultPath)
{
    &lt;span class="kwrd"&gt;string&lt;/span&gt; exePath = Process.GetCurrentProcess().MainModule.FileName;
    var newShortcut = (IShellLinkW)&lt;span class="kwrd"&gt;new&lt;/span&gt; CShellLink();

    &lt;span class="rem"&gt;// Create a shortcut to the exe&lt;/span&gt;
    ShellHelpers.ErrorHelper.VerifySucceeded(newShortcut.SetPath(exePath));
    ShellHelpers.ErrorHelper.VerifySucceeded(newShortcut.SetArguments(&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;));

    &lt;span class="rem"&gt;// Open the shortcut property store, set the AppUserModelId property&lt;/span&gt;
    var newShortcutProperties = (IPropertyStore)newShortcut;

    &lt;span class="kwrd"&gt;using&lt;/span&gt; (PropVariant appId = &lt;span class="kwrd"&gt;new&lt;/span&gt; PropVariant(APP_ID))
    {
        ShellHelpers.ErrorHelper.VerifySucceeded(newShortcutProperties.SetValue(SystemProperties.System.AppUserModel.ID, appId));
        ShellHelpers.ErrorHelper.VerifySucceeded(newShortcutProperties.Commit());
    }

    &lt;span class="rem"&gt;// Commit the shortcut to disk&lt;/span&gt;
    var newShortcutSave = (IPersistFile)newShortcut;

    ShellHelpers.ErrorHelper.VerifySucceeded(newShortcutSave.Save(defaultPath, &lt;span class="kwrd"&gt;true&lt;/span&gt;));
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Step 3: Toast&lt;/h3&gt;

&lt;p&gt;If you not familiar with Toast under Windows 8 I’ll recommend you to read about the methods and events of &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.notifications.toastnotification.aspx" target="_blank"&gt;ToastNotification class (Windows)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;font style="font-weight:normal;"&gt;After completing all previous steps creating Toast is a simple task, all you need to do is create new Toast template using ToastNotificationManager and modify the Toast template xml with your data.&lt;/font&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnSend_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastImageAndText02);

    var textFields = toastXml.GetElementsByTagName(&lt;span class="str"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);
    textFields[0].AppendChild(toastXml.CreateTextNode(txtTitle.Text));
    textFields[1].AppendChild(toastXml.CreateTextNode(txtDescription.Text));

    String imagePath = &lt;span class="str"&gt;&amp;quot;file:///&amp;quot;&lt;/span&gt; + System.IO.Path.GetFullPath(&lt;span class="str"&gt;&amp;quot;me.png&amp;quot;&lt;/span&gt;);
    XmlNodeList imageElements = toastXml.GetElementsByTagName(&lt;span class="str"&gt;&amp;quot;image&amp;quot;&lt;/span&gt;);
    imageElements[0].Attributes.GetNamedItem(&lt;span class="str"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;).NodeValue = imagePath;

    ToastNotification toast = &lt;span class="kwrd"&gt;new&lt;/span&gt; ToastNotification(toastXml);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (cal.SelectedDate != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        toast.ExpirationTime = cal.SelectedDate;

    &lt;span class="rem"&gt;// You must specifiy AppUserModelId == APP_ID to send toast notification.&lt;/span&gt;
    ToastNotificationManager.CreateToastNotifier(APP_ID).Show(toast);

    lblStatus.Text = &lt;span class="str"&gt;&amp;quot;Toast Sent!&amp;quot;&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_2020199F.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_62438222.png" width="506" height="142" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 4: Toast Events&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Toast&lt;/strong&gt; as we already understand is more than just a MessageBox, you’ll be able to send information to your users and get their response, for example in this demo if the user click on the Toast I’ll like to open the browser to that specific Uri.&lt;/p&gt;

&lt;p&gt;All you need to do is register to the Toast events before sending the toast.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;toast.Activated += toast_Activated;
toast.Dismissed += toast_Dismissed;
toast.Failed += toast_Failed;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; toast_Failed(ToastNotification sender, ToastFailedEventArgs args)
{
    Dispatcher.Invoke(() =&amp;gt;
    {
        lblStatus.Text = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;Toast Failed - Error Code: {0}&amp;quot;&lt;/span&gt;, args.ErrorCode.Message);
    });
}

&lt;span class="kwrd"&gt;void&lt;/span&gt; toast_Dismissed(ToastNotification sender, ToastDismissedEventArgs args)
{
    Dispatcher.Invoke(() =&amp;gt;
    {
        lblStatus.Text = args.Reason.ToString();
    });
}

&lt;span class="kwrd"&gt;void&lt;/span&gt; toast_Activated(ToastNotification sender, &lt;span class="kwrd"&gt;object&lt;/span&gt; args)
{
    Dispatcher.Invoke(() =&amp;gt;
    {
        Activate();
        lblStatus.Text = &lt;span class="str"&gt;&amp;quot;Toast Activated&amp;quot;&lt;/span&gt;;
        Process.Start(&lt;span class="str"&gt;&amp;quot;http://tinyurl.com/shai-rai&amp;quot;&lt;/span&gt;);
    });
}&lt;/pre&gt;
&lt;/blockquote&gt;









&lt;h3&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Take Notice&lt;/font&gt; – You can use more WinRT API’s by adding Windows.winmd to your desktop application.&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/1715377/download.aspx" target="_blank"&gt;Download Demo Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1715385" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Questions/default.aspx">Questions</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/How+To/default.aspx">How To</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Native/default.aspx">Native</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Metro+Style/default.aspx">Metro Style</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Accelerometer/default.aspx">Accelerometer</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Metro/default.aspx">Metro</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Windows+Store/default.aspx">Windows Store</category></item><item><title>עבודה עם סיסמאות ב–Coded UI Test</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/23/coded-ui-test.aspx</link><pubDate>Wed, 23 Jan 2013 14:11:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1692372</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1692372</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/23/coded-ui-test.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/23/coded-ui-test.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p dir="rtl"&gt;קראתי היום כתבה של ערן רוסו – &lt;a href="http://blogs.microsoft.co.il/blogs/eranruso/archive/2013/01/21/Problem-When-Trying-To-Type-A-Password-With-Coded-UI-Test.aspx" target="_blank"&gt;בעיה בהזנה שדה סיסמה דרך Coded UI Test&lt;/a&gt; ורציתי לחדד את הנושא עבורכם:&lt;/p&gt;  &lt;p dir="rtl"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_4260901F.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_12B24BC6.png" width="466" height="391" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p dir="rtl"&gt;כאשר מקליטים בדיקה בעזרת Coded UI Test על אתר או אפליקציה שמשתמשת בפקד Password הסיסמה תישמר מוצפנת בקוד שנוצר.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; UIPasswordEditPassword = &lt;span class="str"&gt;&amp;quot;1U3nLUbO/llTew1#IBFZb1Vu6aDc/ggm&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

&lt;p dir="rtl"&gt;אם נתבונן בקוד שנוצא על ידי Coded UI Test נוכל לראות את ההשמה של הסיסמה השמורה לשדה Password:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RecordedMethod1()
{
    &lt;span class="preproc"&gt;#region&lt;/span&gt; Variable Declarations
    HtmlEdit uIUserNameEdit = &lt;span class="kwrd"&gt;this&lt;/span&gt;.UILoginWindowsInternetWindow.UILoginDocument.UIUserNameEdit;
    HtmlEdit uIPasswordEdit = &lt;span class="kwrd"&gt;this&lt;/span&gt;.UILoginWindowsInternetWindow.UILoginDocument.UIPasswordEdit;
    HtmlInputButton uILoginButton = &lt;span class="kwrd"&gt;this&lt;/span&gt;.UILoginWindowsInternetWindow.UILoginDocument.UIMainCustom.UILoginButton;
    &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

    &lt;span class="rem"&gt;// Type &amp;#39;admin&amp;#39; in &amp;#39;UserName&amp;#39; text box&lt;/span&gt;
    uIUserNameEdit.Text = &lt;span class="kwrd"&gt;this&lt;/span&gt;.RecordedMethod1Params.UIUserNameEditText;

    &lt;span class="rem"&gt;// Type &amp;#39;********&amp;#39; in &amp;#39;Password&amp;#39; text box&lt;/span&gt;
    &lt;font style="background-color:#ffff00;"&gt;uIPasswordEdit.Password = &lt;span class="kwrd"&gt;this&lt;/span&gt;.RecordedMethod1Params.UIPasswordEditPassword;&lt;/font&gt;

    &lt;span class="rem"&gt;// Click &amp;#39;Login&amp;#39; button&lt;/span&gt;
    Mouse.Click(uILoginButton, &lt;span class="kwrd"&gt;new&lt;/span&gt; Point(84, 20));
}&lt;/pre&gt;

&lt;p dir="rtl"&gt;הסיבה שהערך מוזן ישירות לשדה Password ולא לשדה Text היא על מנת לשמור על סודיות ולא לחשוף את הסיסמה למי שמריץ את הבדיקה וכמובן לשמור על הסיסמה בעוד מובנים של אבטחת מידע.&lt;/p&gt;

&lt;p dir="rtl"&gt;במידה ואנחנו מעוניינים לשנות את הסיסמה &lt;u&gt;&lt;strong&gt;אין סיבה להפוך את שדה Password לשדה Text&lt;/strong&gt;&lt;/u&gt; אלא להשתמש באובייקט &lt;strong&gt;Playback&lt;/strong&gt; שמאפשר הצפנה של הסיסמה ישירות לשדה Password.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;uIPasswordEdit.Password = &lt;font style="background-color:#ffff00;"&gt;Playback.EncryptText&lt;/font&gt;(&lt;span class="str"&gt;&amp;quot;Unencrypted Password&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;p dir="rtl"&gt;בברכה,&lt;/p&gt;
&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1692372" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Testing/default.aspx">Testing</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Coded+UI+Test/default.aspx">Coded UI Test</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category></item><item><title>SDP 2013 - קורס אוטומציה מתקדם עם Coded UI 2012</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/14/sdp-2013-coded-ui-2012.aspx</link><pubDate>Mon, 14 Jan 2013 16:18:34 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1661876</guid><dc:creator>shair</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=1661876</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/14/sdp-2013-coded-ui-2012.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/shair/archive/2013/01/14/sdp-2013-coded-ui-2012.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div dir="rtl"&gt;   &lt;p&gt;כנס &lt;a href="http://www.seladeveloperpractice.com/" target="_blank"&gt;SDP 2013&lt;/a&gt; של קבוצת סלע נפתח להרשמה, ואתם מוזמנים להירשם למגוון רחב של הרצאות בנושאים החמים ביותר בשוק!&lt;/p&gt;    &lt;p&gt;כנס SDP 2013 יתקיים לאורך חמישה ימים ובהם &lt;strong&gt;&lt;u&gt;76&lt;/u&gt;&lt;/strong&gt; הרצאות וסדנאות ממיטב המרצים בארץ ובחו”ל.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.seladeveloperpractice.com/" target="_blank"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_395E4F08.png" width="739" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;h3&gt;אחת הסדנאות שאעביר תדבר על - &lt;a href="http://www.seladeveloperpractice.com/sessions?selected=6"&gt;Advanced Coded UI Testing&lt;/a&gt;&lt;/h3&gt;    &lt;p align="right"&gt;הסדנא שאני הולך להעביר בכנס תדבר על Coded UI Testing ב – Visual Studio 2012, בסדנא זאת נלמד על השיטות והדרכים לבניית אוטומציה מתקדמת ולא נתעסק רק בסיס של איך מתחילים לעבוד עם Coded UI (את זה שמענו מספיק...).      &lt;br /&gt;פיתוח אוטומציה מתקדמת עם כל הכלים הקיימים תחת Coded UI.       &lt;br /&gt;נדבר על זיהוי אובייקטים דינאמי, עבודה עם כלי ההקלטה של Coded UI ובלעדיו, איך לכתוב אוטומציה בצורה איכותית על מנת לאפשר תחזוקה קלה ומהירה בעקבות שינויים אפליקטיביים, עבודה עם דפדפנים שונים כגון FireFox ו- Chrome ועוד הרבה דברים שיתנו לכם את היכולת להתחיל לכתוב תסריטי אוטומציה במהירות ובאיכות.&lt;/p&gt;    &lt;p&gt;נפגש בכנס!&lt;/p&gt;    &lt;p&gt;עוד על הכנס מפי &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2013/01/14/announcing-sela-developer-practice-may-5-9-2013.aspx" target="_blank"&gt;סשה גולדשטיין, CTO קבוצת סלע&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1661876" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Testing/default.aspx">Testing</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Coded+UI+Test/default.aspx">Coded UI Test</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/SDP/default.aspx">SDP</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Sela+Group/default.aspx">Sela Group</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category></item></channel></rss>