<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Frontend.pl</title>
	
	<link>http://frontend.pl</link>
	<description>Wszystko na wierzchu</description>
	<lastBuildDate>Sat, 21 Apr 2012 09:27:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Frontendpl" /><feedburner:info uri="frontendpl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Błąd w JS SDK Facebook</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/7z1ajeme58w/</link>
		<comments>http://frontend.pl/2012/04/blad-w-js-sdk-facebook/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 08:40:00 +0000</pubDate>
		<dc:creator>luq</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[js sdk]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1418</guid>
		<description><![CDATA[Od kilkunastu minut ładując w aplikacji FB plik z ich JS SDK spod linka: Dostajemy w 57 kodu błąd: Co ciekawe ładując SDK po http:// lub też wersje angielską po https:// wszystko działa. Przykład aplikacji która nie działa z powodu tego buga (spróbuj kliknąć na button [zaproś] w prawym górnym rogu): https://www.facebook.com/ZabezpieczamSie/app_299888393406047 Aktualizacja Problem już [...]]]></description>
			<content:encoded><![CDATA[<p>Od kilkunastu minut ładując w aplikacji FB plik z ich JS SDK spod linka:</p>
<pre class="brush: plain; title: ; notranslate">

https://connect.facebook.net/pl_PL/all.js
</pre>
<p>Dostajemy w 57 kodu błąd:</p>
<pre class="brush: plain; title: ; notranslate">
Uncaught SyntaxError: Unexpected identifier
</pre>
<p><a href="http://content.screencast.com/users/luq10/folders/Jing/media/257f488c-2c08-4a9b-8e67-a4d1dec75b7a/2012-04-21_1036.png" target="_blank"><img alt="" src="http://content.screencast.com/users/luq10/folders/Jing/media/257f488c-2c08-4a9b-8e67-a4d1dec75b7a/2012-04-21_1036.png" title="FB SDK bug" class="aligncenter" width="600" /></a></p>
<p>Co ciekawe ładując SDK po http:// </p>
<pre class="brush: plain; title: ; notranslate">

http://connect.facebook.net/pl_PL/all.js
</pre>
<p>lub też wersje angielską po https://</p>
<pre class="brush: plain; title: ; notranslate">

https://connect.facebook.net/en_GB/all.js
</pre>
<p>wszystko działa.</p>
<p>Przykład aplikacji która nie działa z powodu tego buga (spróbuj kliknąć na button [zaproś] w prawym górnym rogu): <a href="https://www.facebook.com/ZabezpieczamSie/app_299888393406047" title="https://www.facebook.com/ZabezpieczamSie/app_299888393406047" target="_blank">https://www.facebook.com/ZabezpieczamSie/app_299888393406047</a></p>
<p><strong>Aktualizacja<br />
Problem już nie występuje, najwyraźniej poprawiono <img src='http://frontend.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/7z1ajeme58w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/04/blad-w-js-sdk-facebook/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/04/blad-w-js-sdk-facebook/</feedburner:origLink></item>
		<item>
		<title>Mobile bind() bug</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/bQjts4iCt6A/</link>
		<comments>http://frontend.pl/2012/04/mobile-bind-bug/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 12:57:44 +0000</pubDate>
		<dc:creator>luq</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1376</guid>
		<description><![CDATA[Tematem tego wpisu jest bardzo dziwny błąd na którego natknęliśmy się podczas developowania naszych gier. &#160; Jako, że systemowe przeglądarki urządzeń mobilnych (Android, iOS) są oparte o WebKit to zdarza nam się część testów przeprowadzać na komputerze za pomocą Chrome. Generalnie jeśli coś na Chromie działa to na urządzeniu mobilnym też powinno (wyłączając niektóre przypadki [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="Bug" src="http://i1178.photobucket.com/albums/x365/stellalee92/jackie-chan-meme.png" title="Bug" class="alignright" width="320" height="160" /></p>
<p>Tematem tego wpisu jest bardzo dziwny błąd na którego natknęliśmy się podczas developowania naszych gier.</p>
<p>&nbsp;</p>
<p>Jako, że systemowe przeglądarki urządzeń mobilnych (Android, iOS) są oparte o WebKit to zdarza nam się część testów przeprowadzać na komputerze za pomocą Chrome. Generalnie jeśli coś na Chromie działa to na urządzeniu mobilnym też powinno (wyłączając niektóre przypadki np. brak zaimpelemtowania mechanizmu localStorage na starszych wersjach Androida). W tym przypadku niestety jest inaczej&#8230;</p>
<p>&nbsp;<br />
<span id="more-1376"></span></p>
<p>Problem pojawia się podczas użycia funkcji <strong>bind()</strong> znanaj z Mootools (w jQuery funkcja bind robi zupełne coś innego), która umożliwia przekazanie kontekstu this wraz z parametrami do funkcji. Patrz:</p>
<p><a href="http://mootools.net/docs/core/Types/Function#Function:bind" title="http://mootools.net/docs/core/Types/Function#Function:bind">http://mootools.net/docs/core/Types/Function#Function:bind</a><br />
&nbsp;</p>
<p>A więc załączając poniższy kod:</p>
<pre class="brush: jscript; title: ; notranslate">
if (!Function.prototype.bind) {
  Function.prototype.bind = function(bind) {
    var self = this,
        args = (arguments.length &gt; 1) ? Array.prototype.slice.call(arguments, 1) : [];

    return function() {
      if (arguments.length &gt; 0) {
        args = args.concat(Array.prototype.slice.call(arguments));
      }
      return self.apply(bind, args);
    };
  }
}
</pre>
<p>możemy napisać:</p>
<pre class="brush: jscript; title: ; notranslate">
var Foo = function(){
  this.a = function(){
    setTimeout(this.b.bind(this, 123), 100);

    // bez uzycia bind() musilibysmy napisac tak
    //
    // var that = this;
    // setTimeout(function(){
    //  that.b(123);
    // }, 100);
  };

  this.b = function(param){
    console.log(this, param); // Foo, 123
  };
}

var oFoo = new Foo();
oFoo.a();
</pre>
<p>&nbsp;</p>
<p>Funkcja ta jest bardzo fajna, i po poznaniu Mootoolsów jest jedna z rzeczy której mi brakuje w jQuery. </p>
<p>Zmierzając do sedna sprawy. Problem pojawia się na przeglądarkach mobilnych kiedy użyjemy bind w połączeniu ze słuchaczem eventa. Przykład dostępny jest <a href="http://clearmind.pl/luq/bind/" title="http://clearmind.pl/luq/bind/" target="_blank">TUTAJ</a></p>
<p>W przykładowym kodzie załączamy 2 corowe pliki:</p>
<ul>
<li>
w Core.js znajduje się prototyp funkcji bind() jak i funkcja inherit() odpowiedzialna za dziedziczenie
</li>
<li>
EventEmitter.js to klasa umożliwiająca rzucanie i słuchanie zdarzeń przez nasze klasy. Wystarczy że taka klasa będzie dziedziczyła po EventEmitter.
</li>
</ul>
<p>Nasza przykładowa klasa wygląda tak:</p>
<pre class="brush: jscript; title: ; notranslate">
var Example = (function(){
  var exampleClass = function(){
    this.initialize();
  };

  exampleClass.prototype = {
    initialize: function(){
      // to nie dziala prawidlowo
      this.addListener('meEvent', this.listener.bind(this));

      // a to juz dziala prawidlowo
      var that = this;
      this.addListener('meEvent', function(e, param){
        that.listener(e, param);
      });

      // tak tez bedzie dzialac prawidlowo
      // this.addListener('meEvent', this.listener);
    },

    listener: function(e, param){
      alert('this.listener: ' + param);
    },

    fireEvent: function(param){
      this.fire('meEvent', param);
    }
  };

  inherit(EventEmitter, exampleClass, exampleClass.prototype);

  return exampleClass
}());
</pre>
<p>Natomiast używamy tego w ten sposób:</p>
<pre class="brush: jscript; title: ; notranslate">
var ex = new Example();

ex.fireEvent(1);
ex.fireEvent(2);
ex.fireEvent(3);
</pre>
<p>Czyli co tutaj robimy:</p>
<ul>
<li>przy stworzeniu obiektu klasy Example tworzone są 2 funkcje nasłuchujące zdarzenia meEvent, jedna z użyciem bind druga bez jego użycia</li>
<li>podczas wywołania metody fireEvent() jest rzucane zdarzenie z parametrem podanym w tej metodzie</li>
</ul>
<p>Na PCowym Chromie, wynikiem tego jest 6 alertów (pierwsza kolumna przedstawia słuchacza zdefiniowanego za pomocą bind, druga bez niego), kolejno:</p>
<p>1, 1<br />
2, 2<br />
3, 3</p>
<p>Jeśli odpalimy to na przeglądarce moblinej, otrzymamy:</p>
<p>1, 1<br />
1, 2<br />
1, 3</p>
<p><a href="http://clearmind.pl/luq/bind/" title="http://clearmind.pl/luq/bind/" target="_blank">Zobacz ten przykład</a></p>
<p>Uogólniając &#8211; jeśli użyjemy bind() to na przeglądarkach mobilnych do każdego słuchacza zdarzenia zostaje przekazany parametr taki sam jaki został wywołany przy pierwszym rzuceniu tego zdarzenia.</p>
<p>&nbsp;</p>
<p>Błąd najprawdopodobniej pojawia się także pomijając zdarzenia, jednak nie umiem odtworzyć takiej sytuacji. Generalnie, jeśli używamy tak zdefiniowaną funkcje bind() na urządzeniach mobilnych to czasami przekazywanie przez nie parametry nie są tymi których oczekujemy. Natomiast nie zaobserwowaliśmy błędów jeśli chodzi o przekazywanie kontekstu this. </p>
<p>&nbsp;</p>
<p>Jeśli ktoś spotkał się z tym błędem lub zna inne różnice implementacyjne między Chromem a przeglądarkami mobilnymi zapraszam do dzielenia się w komentarzach.</p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/bQjts4iCt6A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/04/mobile-bind-bug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/04/mobile-bind-bug/</feedburner:origLink></item>
		<item>
		<title>Ringmark – test dla przeglądarek mobilnych</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/3mqR7Bc5X_0/</link>
		<comments>http://frontend.pl/2012/04/ringmark-test-dla-przegladarek-mobilnych/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 06:08:27 +0000</pubDate>
		<dc:creator>Piotr Gawle</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1343</guid>
		<description><![CDATA[Facebook zdaje sobie sprawę z ważności segmentu mobilnego dla swojego rozwoju i coraz bardziej inwestuje w rozwój związanych z tym technologii. Ostatnim udostępnionym przez Facebooka narzędziem jest Ringmark. Jest to zbiór testów, które mają w łatwy sposób zidentyfikować jakie możliwości ma dana wersja mobilnej przeglądarki. Dzięki temu chcą walczyć z fragmentaryzacją i pomóc programistom lepiej [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://frontend.pl/wp-content/uploads/2012/04/ringmark.png"><img src="http://frontend.pl/wp-content/uploads/2012/04/ringmark.png" alt="" title="ringmark" width="337" height="499" class="alignright size-full wp-image-1347" /></a>Facebook zdaje sobie sprawę z ważności segmentu mobilnego dla swojego rozwoju i coraz bardziej inwestuje w rozwój związanych z tym technologii. Ostatnim udostępnionym przez Facebooka narzędziem jest <a href="http://rng.io/" target="_blank" >Ringmark</a>. </p>
<p>Jest to zbiór testów, które mają w łatwy sposób zidentyfikować jakie możliwości ma dana wersja mobilnej przeglądarki. Dzięki temu chcą walczyć z fragmentaryzacją i pomóc programistom lepiej wykorzystać dostępne możliwości.</p>
<p>W tym momencie test jest podzielony na trzy pierścienie (rings). </p>
<p><b>Ring 0</b> reprezentuje podstawowe funkcjonalności. Zbiór możliwości dostępnych obecnie na największej ilości urządzeń (w tym momencie jest to iOS5 i Android 2.2 Froyo). </p>
<p><b>Ring 1</b> reprezentuje funkcjonalności potrzebne to tworzenia takich gier jak Angry Birds, Where is My Wather, aplikacji Facebooka, Twittera czy Instagram. Sprawdza między innymi:  </p>
<p>- Akceleracje obiekty Canvas<br />
- DRM (wideo i audio)<br />
- element audio, kodek mp3, możliwość odgrywania więcej niż jednego źródła dźwięku w tym samym czasie<br />
- aparat<br />
- blokadę zmiany położenia ekranu i zdarzenia zmiany tego położenia<br />
- multi-touch<br />
- podstawowe funkcjonalności web workerów<br />
- funkcjonalności pierścienia 0 bez wykorzystania prefiksów<br />
- WOFF<br />
- IndexedDB</p>
<p><b>Ring 3</b> reprezentuje funkcjonalności, które staną się powszechne w kolejnych latach. Takie, które umożliwią tworzenie np. gier 3D albo zaawansowanych gier wieloosobowych. Sprawdza między innymi: </p>
<p>- WebGL<br />
- Web notifications<br />
- Audio API<br />
- WebSockets<br />
- SVG</p>
<p>Rozwój tego zestawu nie jest skończony i w przyszłości pojawią się kolejne pierścienie. Cały pakiet został opublikowany jako Open Source, więc wy możecie także się przyłączyć i go rozwijać. Twórcy mają nadzieje wspomóc za jego pomocą <a href="http://www.w3.org/community/coremob/" target="_blank">Core Mobile Web Platform Community Group</a> w ich staraniach standaryzujących. </p>
<p>Sprawdźcie sami jak testy się sprawują: <a href="http://rng.io/" target="_blank">http://rng.io/</a></p>
<p>Żródła:<br />
<a href="https://github.com/coremob/" target="_blank">Ringmark na Github-e</a><br />
<a href="https://developers.facebook.com/html5/blog/post/2012/02/27/announcing-ringmark--a-mobile-browser-test-suite/" target="_blank">announcing ringmark a mobile browser test suite</a><br />
<a href="https://developers.facebook.com/html5/blog/post/2012/04/03/Ringmark-is-now-open-source/" target="_blank">ringmark is now open source</a><br />
<a href="https://developers.facebook.com/html5/blog/post/2012/04/04/the-methodology-behind-ringmark/" target="_blank">The methodology behind ringmark<a><br />
<a href="http://www.w3.org/community/coremob/" target="_blank">Core Mobile Web Platform Community Group</a></p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/3mqR7Bc5X_0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/04/ringmark-test-dla-przegladarek-mobilnych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/04/ringmark-test-dla-przegladarek-mobilnych/</feedburner:origLink></item>
		<item>
		<title>HTML5 Experience Proggresbar</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/goBIv6k7b-U/</link>
		<comments>http://frontend.pl/2012/04/html5-experience-proggresbar/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 10:42:27 +0000</pubDate>
		<dc:creator>luq</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[CSS Transforms]]></category>
		<category><![CDATA[level]]></category>
		<category><![CDATA[progressbar]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1325</guid>
		<description><![CDATA[&#160; W erze gier takich jak World of Warcraft czy Farmville zjawisko &#8220;levelowania&#8221; i &#8220;nabijania expa&#8221; jest dość popularnym zjawiskiem. Mechanizm ten na pewno napędza rozgrywkę i sprawia że użytkownik chce grać widząc swój postęp. &#160; Dzisiaj udostępniam gotowy kod realizujący taki feature, całość jest pisana z zamysłem urządzeń mobilnych (brak wymaganych bibliotek, wykorzystanie CSS [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignright" style="width: 260px"><img alt="progressbar" src="http://static-www.ec.popcap.com/support.popcap.com/sites/support.popcap.com/files/screenshots/ss_progressbar.jpg" title="progressbar" width="250" height="250" /><p class="wp-caption-text">Zuma Blitz level progressbar</p></div>
<p>&nbsp;</p>
<p>W erze gier takich jak World of Warcraft czy Farmville zjawisko &#8220;levelowania&#8221; i &#8220;nabijania expa&#8221; jest dość popularnym zjawiskiem. Mechanizm ten na pewno napędza rozgrywkę i sprawia że użytkownik chce grać widząc swój postęp. </p>
<p>&nbsp;</p>
<p>Dzisiaj udostępniam gotowy kod realizujący taki feature, całość jest pisana z zamysłem urządzeń mobilnych (brak wymaganych bibliotek, wykorzystanie CSS Transforms).</p>
<p>&nbsp;</p>
<p><a style="display: block; width: 320px; border: 1px #000 dashed; text-align: center; font-size: 16px;" href="http://frontend.pl/demos/progressbar/" title="TUTAJ" target="_blank">ZOBACZ DEMO</a></p>
<p>&nbsp;</p>
<p>Niestety kompletnie w tym wszystkim zapomniałem o tagu &lt;progress/&gt; w HTML5  <a href="http://www.w3schools.com/html5/tag_progress.asp" title="http://www.w3schools.com/html5/tag_progress.asp" target="_blank">http://www.w3schools.com/html5/tag_progress.asp</a> i niestety mój kod wykorzystuje divy, mimo że nowy tag pasuje tutaj idealnie. Nie sprawdzałem tego ale wydaje mi się że poza semantycznym kodem (i wcale nie mówię że to nie jest ważne) żadnych innych zysków nie będziemy mieli np. w postaci większej wydajności.</p>
<p>&nbsp;<br />
Całość realizuje kilka podstawowych funkcji:</p>
<ul>
<li>możemy dowolnie konfigurować doświadczenie wymagane na dany level</li>
<li>pasek przy przejściu na następny level jest dopełniany do końca a następnie zerowany (nie ma efekty zmniejszania paska)</li>
<li>możliwość podpięcia callbacka na dowolną funkcje przy przejściu na kolejny level</li>
<li>całość jest napisana z myślą o urządzeniach moblinych</li>
</ul>
<p>&nbsp;</p>
<p>Kod może nie piorunuje <img src='http://frontend.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ale radzi sobie całkiem nieźle a samo użycie jest bardzo proste:</p>
<pre class="brush: jscript; title: ; notranslate">
var oBar = new pBar({
  elems: {
    bar: document.getElementById('pBar'),
    proc: document.getElementById('pBarProc'),
    value: document.getElementById('pBarValue'),
    max: document.getElementById('pBarMax'),
    level: document.getElementById('pBarLevel')
  },
  levels: [
    {n: 1, max: 400},
    {n: 2, max: 900},
    {n: 3, max: 1500},
    {n: 4, max: 2200},
    {n: 5, max: 3400},
    {n: 6, max: 5000},
    {n: 7, max: 7000}
  ],
  value: 0,
  duration: 500,
  freq: 40,
  onNextLevel: fOnNextLevel,
  isAnimate: true,
  isAnimateValues: false
});
</pre>
<p>&nbsp;</p>
<p>Z myślą o wydajności, klasa pBar nie generuje HTMLa i należy napisać go samemu, w moim przykładnie jest to:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div class=&quot;pBarContainer&quot;&gt;
  &lt;div id=&quot;pBar&quot; class=&quot;pBar&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;text&quot;&gt;
      &lt;span&gt;
        &lt;span id=&quot;pBarValue&quot;&gt;x&lt;/span&gt; / &lt;span id=&quot;pBarMax&quot;&gt;x&lt;/span&gt;
      &lt;/span&gt;
      &lt;span class=&quot;procContainer&quot;&gt;
        &lt;span class=&quot;proc&quot; id=&quot;pBarProc&quot;&gt;&lt;/span&gt; %
      &lt;/span&gt;
      &lt;span class=&quot;level&quot;&gt;
        Level &lt;span id=&quot;pBarLevel&quot;&gt;1&lt;/span&gt;
      &lt;/span&gt;
    &lt;/div&gt;
    &lt;div id=&quot;stars&quot;&gt;
      &lt;div id=&quot;star1&quot; class=&quot;star hidden&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
 &lt;/div&gt;
</pre>
<p>&nbsp;</p>
<p>Ze spraw technicznych chciałby zwrócić uwagę tylko na jeden szczegół. Jeśli używamy CSS Transforms na urządzeniach mobilnych to <strong>zawszę, ale to zawszę</strong>, dodajemy do animowanego elementu:</p>
<pre class="brush: css; title: ; notranslate">
translate3d(0, 0, 0);
</pre>
<p>&nbsp;</p>
<p>Dzięki temu zyskujemy na wydajności poprzez włączenie hardware-owej akcelaracji animacji. Różnice można zobaczyć na tym filmiku: </p>
<div style="margin: 0 auto">
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/IKl78ZgJzm4?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
</div>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/goBIv6k7b-U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/04/html5-experience-proggresbar/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/04/html5-experience-proggresbar/</feedburner:origLink></item>
		<item>
		<title>CORS – czyli XHR bez same origin policy.</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/WOzEZYP0_yQ/</link>
		<comments>http://frontend.pl/2012/03/cors-czyli-xhr-bez-same-origin-policy/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 09:47:38 +0000</pubDate>
		<dc:creator>Skowron</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1309</guid>
		<description><![CDATA[Większość pewnie wie, że jednym z ograniczeń obiektu XMLHttpRequest jest możliwość komunikacji tylko z serwerami leżącymi w tej samej domenie (same origin policy). Nie wszyscy zdają sobie sprawę, że możemy skorzystać z Cross-Origin Resource Sharing (CORS) i z powodzeniem odwoływać się do zasobów z poza naszej domeny. W tym celu potrzebujemy 2 rzeczy: Browsera ze [...]]]></description>
			<content:encoded><![CDATA[<p>Większość pewnie wie, że jednym z ograniczeń obiektu XMLHttpRequest jest możliwość komunikacji tylko z serwerami leżącymi w tej samej domenie (<a href="http://en.wikipedia.org/wiki/Same_origin_policy">same origin policy</a>). Nie wszyscy zdają sobie sprawę, że możemy skorzystać z Cross-Origin Resource Sharing (CORS) i z powodzeniem odwoływać się do zasobów z poza naszej domeny. W tym celu potrzebujemy 2 rzeczy:</p>
<ul>
<li>Browsera ze wsparciem dla XMLHttpRequest Level 2 &#8211; co nie jest w obecnej chwili dużym problemem. Wszystkie popularne przeglądarki (poza IE) implementują już ten standard. Dotyczy to również systemowych przeglądarek w systemach Android i iOS. Jeżeli zaś chodzi o IE, to od wersji 8, możemy skorzystać z odpowiednika XDomainRequest. </li>
<li>Ustawienia odpowiednich nagłówków odpowiedzi po stronie serwera. Sprawa jest banalna. Omówimy ją sobie na przykładzie aplikacji PHP.</li>
</ul>
<p>Na początek stwórz kod po stronie klienta:</p>
<pre class="brush: jscript; title: ; notranslate">
      var method = 'POST', // równie dobrze request możemy wysłać GETem
          url = 'http://cors.bushidoit.com/sample1.php'; // tutaj wpisz swoją domenę

      var xhr = new XMLHttpRequest();
      xhr.onerror = function(){
        alert('error')
      };
      xhr.onreadystatechange = function(){
        if (4 === xhr.readyState &amp;&amp; 200 === xhr.status) {
          alert(xhr.responseText)
        }
      }

      xhr.open(method, url, true);
      // Jeżeli wysyłamy dane POSTem, to musimy ustawić jeszcze dodatkowy nagłówek
      if('POST' === method){
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      }

      xhr.send('msg=Foo');
</pre>
<p>Po stronie serwera kod jest jeszcze prostszy:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Domena która jest dopuszczona do wykonywania zapytania - możemy użyć widlcarda (*)
header('Access-Control-Allow-Origin: *');
// Lista dozwolonych metod zapytania
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');

echo $_POST['msg'];
?&gt;
</pre>
<p>Wszystko działa ładnie, do czasu kiedy zechcemy wysyłać / odbierać ciasteczka. Choćby na potrzeby urzymywania sesji. Do takich zapytań musimy dołożyć jeszcze jeden parametr:</p>
<pre class="brush: jscript; title: ; notranslate">
      xhr.withCredentials = &quot;true&quot;;
</pre>
<p>a po stronie serwera:</p>
<pre class="brush: php; title: ; notranslate">
header('Access-Control-Allow-Credentials: true');
</pre>
<p>w takim przypadku, <b>musimy</b> również dokładnie określić domenę z której przychodzi request. Nie mamy możliwości skorzystania z wildcarda *.<br />
Tutaj możecie zobaczyć działające <a href='http://frontend.pl/wp-content/uploads/2012/03/CORS.html'>Demo bez ciasteczek</a> oraz <a href='http://frontend.pl/wp-content/uploads/2012/03/CORSWithCredentials.html'>Demo z ciasteczkami</a>.</p>
<p>Dla uproszczenia, nasz przykład nie działa w IE. Tutaj znajdziecie <a href="http://msdn.microsoft.com/en-us/library/cc288060%28VS.85%29.aspx">przykładową implementację z wykorzystaniem XDomainRequest.</a></p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/WOzEZYP0_yQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/03/cors-czyli-xhr-bez-same-origin-policy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/03/cors-czyli-xhr-bez-same-origin-policy/</feedburner:origLink></item>
		<item>
		<title>Inwestorzy wierzą w gry HTML5? 12 milionów dla Game Closure</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/6-ksnFuB-uA/</link>
		<comments>http://frontend.pl/2012/03/inwestorzy-wierza-w-gry-html5-12-milionow-dla-game-closure/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 13:05:49 +0000</pubDate>
		<dc:creator>Piotr Gawle</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1292</guid>
		<description><![CDATA[Firma Game Closure autorzy SKD do tworzenia multi-platformowych gier w HTML5 uzyskała właśnie 12 milionów dolarów na rozwój swojego biznesu. Sami właściciele chwalą się, że dzięki ich narzędziom uda się w przyszłości zmniejszyć czas tworzenia gier na wiele systemów z 12 miesięcy do 6 tygodni. Firmie udało się zdobyć dofinansowanie po stworzeniu gry Pop Star [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="gameclosure team" src="http://gameclosure.com/wp-content/uploads/2011/06/GC.png" alt="" width="480" height="318" />
</p>
<p>Firma <a href="http://gameclosure.com/">Game Closure</a> autorzy SKD do tworzenia multi-platformowych gier w HTML5 uzyskała właśnie 12 milionów dolarów na rozwój swojego biznesu. Sami właściciele chwalą się, że dzięki ich narzędziom uda się w przyszłości zmniejszyć czas tworzenia gier na wiele systemów z 12 miesięcy do 6 tygodni. Firmie udało się zdobyć dofinansowanie po stworzeniu gry <a href="http://www.popstardefense.com/">Pop Star Defence</a>, która pokazywała możliwości ich SDK.</p>
<p>Sami możecie sprawdzić ją wpisując jako kod &#8220;popstarhtml5&#8243;.<br />
Gra zadziałała mi tylko w Chromie. Ipad i Samsung GalaxyS poległy i nic nie udało się wyświetlić.</p>
<p>Mimo to bardzo się cieszę, że inwestorzy wierzą w gry w HTML5 pomimo niedawnego bankructwa firmy Moblyng(zdobyli 7.5 miliona dolarów z pomysłem na biznes bardzo podobnym z tym który prezentują Game Closure). Mam wątpliwości co prawda czy model technologiczny wielo-platformowego silnika do gier się sprawdzi. Szczególnie na urządzeniach mobilnych, gdzie waga Twojego kodu ma duże znaczenie a i &#8220;przeglądarkowe piekło&#8221; jeszcze bardzo mocno daje się we znaki. Dodatkowo te 6 tygodni wystarczające na stworzenie gry można włożyć między bajki. Ale oczywiście trzymam kciuki za Game Closure i że wspomoże to rozwój rynku gier HTML5. </p>
<p>Żródła:<br />
<a href="http://gameclosure.com/">Game Closure</a><br />
<a href="http://venturebeat.com/2012/02/23/game-closure-raises-12m-for-html5-cross-platform-games/">Artykuł o dofinansowaniu z Venture Beat</a><br />
<a href="http://www.popstardefense.com/">Gra Pop Star Defence</a><br />
<a href="">Game Closure</a></p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/6-ksnFuB-uA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/03/inwestorzy-wierza-w-gry-html5-12-milionow-dla-game-closure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/03/inwestorzy-wierza-w-gry-html5-12-milionow-dla-game-closure/</feedburner:origLink></item>
		<item>
		<title>Trójkąty W CSS</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/FM9_ouKYAMY/</link>
		<comments>http://frontend.pl/2012/02/trojkaty-w-css/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 19:40:13 +0000</pubDate>
		<dc:creator>luq</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[trójkąt]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1279</guid>
		<description><![CDATA[W samym CSSie można zrobić całkiem sporo, a dobrym przykładem tego może być Nyan cat stworzony przez Michała Budzyńskiego . Wystarczy tylko poznać kilka sztuczek i możemy zbudować coś całkiem fajnego. Jedną z takich sztuczek jest właśnie tworzenie trójkątów za pomocą samego CSS`a. &#160; Całość jest banalnie prosta a opiera się o właściwe wykorzystanie atrybutu [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="triangle" src="http://i.zdnet.com/blogs/five-tips-from-inside-the-devils-triangle.jpg" title="triangle" class="alignright" width="240" /></p>
<p>W samym CSSie można zrobić całkiem sporo, a dobrym przykładem tego może być <a href="http://michalbe.github.com/css-nyan-cat/" title="http://michalbe.github.com/css-nyan-cat/" target="_blank">Nyan cat</a> stworzony przez <a href="http://michalbe.blogspot.com/" title="http://michalbe.blogspot.com/" target="_blank">Michała Budzyńskiego </a>. Wystarczy tylko poznać kilka sztuczek i możemy zbudować coś całkiem fajnego. Jedną z takich sztuczek jest właśnie tworzenie trójkątów za pomocą samego CSS`a.</p>
<p>&nbsp;</p>
<p>Całość jest banalnie prosta a opiera się o właściwe wykorzystanie atrybutu border. Poszczególne obramowania kontenera (górne, prawe, dolne i boczne) przecinają się pod kątem 45* jeśli wielkość tych obramowań jest taka sama. Najlepiej zobrazuje to poniższy obrazek:</p>
<p><span id="more-1279"></span></p>
<p><img alt="" src="http://i.stack.imgur.com/hZefy.png" title="example" class="aligncenter" width="340" height="266" /></p>
<p>A więc żeby uzyskać trójkąt wystarczy stworzyć kontener o wymiarach 0x0px ustawiając odpowiednio dużą wielkość obramowania</p>
<p>&nbsp;</p>
<pre class="brush: css; title: ; notranslate">
div {
  width: 0;
  height: 0;
  border-width: 30px;
  border-style: solid;
}
</pre>
<p>&nbsp;</p>
<p>Teraz ustawmy sobie różne kolory dla kolejnych stron obramowania</p>
<p>&nbsp;</p>
<pre class="brush: css; title: ; notranslate">
div {
  (...)
  border-color: red blue green yellow;
}
</pre>
<p>&nbsp;</p>
<p><a href="http://jsfiddle.net/mA4Cu/189/" target="_blank">Tutaj możesz zobaczyć efekt</a></p>
<p>&nbsp;</p>
<p>Aby uzyskać efekt trójkąta należy jeszcze tylko ukryć 3 z 4 części obramowania za pomocą koloru <em>transparent</em></p>
<p>&nbsp;</p>
<pre class="brush: css; title: ; notranslate">
div {
  (...)
  border-color: red transparent transparent transparent;
}
</pre>
<p>&nbsp;</p>
<p>I w ten sposób <a href="http://jsfiddle.net/Q6pey/" target="_blank">otrzymaliśmy trójkąt</a> <img src='http://frontend.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Dodam tylko, że istnieje możliwość tworzenia różnokątnych figur, wystarczy zdefiniować różną szerokość dla kolejnych części obramowania:</p>
<p>&nbsp;</p>
<pre class="brush: css; title: ; notranslate">
div {
  width: 0;
  height: 0;
  border-width: 30px;
  border-left-width: 10px;
  border-right-width: 80px;
  border-style: solid;
  border-color: red transparent transparent transparent;
}
​</pre>
<p>&nbsp;</p>
<p>Całość działa na wszystkich testowanych przeglądarkach, z tym że na IE7 należy pamiętać o definicji <em>height: 0;</em>, podczas jej braku przeglądarka ustawia wysokość na <del datetime="2012-02-28T21:32:44+00:00">jakąś dziwną defaultową wartość</del> font-size z tego kontenera.</p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/FM9_ouKYAMY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/02/trojkaty-w-css/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/02/trojkaty-w-css/</feedburner:origLink></item>
		<item>
		<title>Animacje w CSS3 – część pierwsza</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/5UAeBq9H22E/</link>
		<comments>http://frontend.pl/2012/02/animacje-w-css3-czesc-pierwsza/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 13:04:56 +0000</pubDate>
		<dc:creator>Tomek</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1255</guid>
		<description><![CDATA[CSS3 jest jedną z tych rzeczy, na które czekają tłumy, a która nadchodzi bardzo powoli i wielkich bólach. Dużo winy ponoszą twórcy przeglądarek, którym niezbyt śpieszy się z implementacją kolejnych rozwiązań. Na szczęście – niektóre z nich są i radzą sobie świetnie. Animacje jeszcze do niedawna były zastrzeżone dla JavaScriptu. Co rusz pojawiały się demonstracje [...]]]></description>
			<content:encoded><![CDATA[<p>CSS3 jest jedną z tych rzeczy, na które czekają tłumy, a która nadchodzi bardzo powoli i wielkich bólach. Dużo winy ponoszą twórcy przeglądarek, którym niezbyt śpieszy się z implementacją kolejnych rozwiązań. Na szczęście – niektóre z nich są i radzą sobie świetnie.</p>
<p>Animacje jeszcze do niedawna były zastrzeżone dla JavaScriptu. Co rusz pojawiały się demonstracje oparte na jQuery i MooTools, przedstawiające wydumane przejścia tekstów czy kontenerów, a czasem i niewielkie filmiki.</p>
<p>Teraz to CSS3 chce odebrać palmę pierwszeństwa skryptom. I idzie mu całkiem nieźle! Największym minusem animacji w stylach jest brak wsparcia w Internet Explorer’rze (na chwilę obecną IE9 nie wspiera praktycznie niczego transformacjami 2D). Opera nie jest wiele lepsza, również nie obsługując większości nowych opcji. Dlatego właśnie animacje w CSS3 są świetnym rozwiązaniem dla aplikacji mobilnych uruchamianych przez przeglądarkę – WebKit obecny w iOS i na Androidzie obsługuje wszystkie te „fanaberie” poza transformacjami 3D. Niestety, należy – dla pełnej zgodności – dopisywać suffix <code>–webkit</code> (dla Mozilli jest to <code>-moz</code>, ale skoro kładę nacisk na telefony, pomijam to w przykładach).</p>
<p>Ale przejdźmy do najważniejszego – do kodu.</p>
<p>Najpierw stwórzmy sobie prosty kontener #box, będący niewielkim, czarnym kwadratem:</p>
<pre class="brush: css; title: ; notranslate">#box {
  background: #000;
  color: #fff;
  width: 200px;
  height: 200px;
  text-align: center;
  margin: 100px;
  padding: 10px;
  font: 12px/200px Arial, sans-serif;
  position: absolute;
}</pre>
<p>„Klatkowanie” w CSS3 robi się dwustopniowo. Najpierw należy zdefiniować klatki i nazwać swoją animację, dalej opisać jej kroki w procentach. Następnie, już w elemencie, na który ma oddziaływać, zastosować ją. Ważne jest to, że taka definicja może zawierać w sobie dwa kroki, może zawierać ich sto – są definiowane w procentach. Przykład:</p>
<pre class="brush: css; title: ; notranslate">@-webkit-keyframes blink {
  0% {
    background: #000;
    color: #fff;
  }
  100% {
    padding: 50px;
    background: #fff;
    color: #000;
    line-height: 150px;
  }
}</pre>
<p>Ważne, żeby korzystać z klatek rozsądnie. Zdefiniowane dużej ilości w momencie, gdy chcemy osiągnąć płynne przejście będzie błędem. Wyobraźcie sobie to na zasadzie biegu ze sztafetą – przy przekazaniu drugiemu zawodnikowi, następuje minimalne zwolnienie – tak samo tutaj, przy przejściu z, powiedzmy, 20% do 40%, nastąpi lekkie spowolnienie. Robiąc animację od 0% do 100%, takiej przerwy nie będzie.</p>
<p>Naturalnie, jeżeli chcemy więcej efektów, dodanie przejść staje się konieczne. Powiedzmy, że od połowy animacji chcemy poruszać kontenerem, ale tak, by na końcu animacji wrócił na stare miejsce. Rozbudujmy zatem kod.</p>
<pre class="brush: css; title: ; notranslate">
@-webkit-keyframes blink {
  0% {
    background: #000;
    color: #fff;
    top: 0;
    left: 0;
  }
  50% {
    top: 100px;
    left: 100px
  }
  75% {
    top: 150px;
    left: 500px
  }
  100% {
    padding: 50px;
    background: #fff;
    color: #000;
    line-height: 200px;
    top: 0;
    left: 0
  }
}
</pre>
<p>Jak widzicie, dodałem kolejną klatkę dopiero w 50%, dlatego połowę czasu trwania animacji zajmie kontenerowi #box dotarcie do wyznaczonej lokalizacji, potem przez kolejne trzy czwarte będzie szedł dalej, a potem ostatnią cząstkę wykorzysta na powrót do pozycji nominalnej.</p>
<p>No dobrze, pokazałem tu, jak definiować animacje. Ale jak je uruchamiać? To bardzo proste, przy czym należy pamiętać, że są dwa konieczne elementy do zdefiniowania. I kilka opcjonalnych.</p>
<p>Załóżmy, że uruchamiamy animację kiedy najedziemy na kontener myszą – czyli :hover. Definiujemy zatem</p>
<pre class="brush: css; title: ; notranslate">#box:hover {
  cursor: pointer;
  -webkit-animation-name: blink;
  -webkit-animation-duration: 5s;
}</pre>
<p>Oprócz zmiany kursora będącej czystą kosmetyką, dodałem dwie opcje – <code>animation-name</code> i <code>animation-duration</code>. Nazwy wydają się być jasne, ale dla formalności – pierwsza to nazwa, którą wcześniej definiowaliśmy, druga to czas trwania całości (czyli od 0 do 100%). Łatwo więc wyobrazić sobie, ile trwają teraz poszczególne przejścia.</p>
<p>Wspomniane wcześniej opcjonalne opcje dodają smaku animacjom, niekiedy naprawdę je ratując.</p>
<p>Ważne na pewno będzie powtarzanie animacji. Bez tego, ona przelatuje tylko raz, potem kończy „żywot”. Z pomocą przychodzi animation-iteration-count. Obsługuje dwie formy – tekst i liczbę. Można ustawić, by animacja powtarzała się sześć razy:</p>
<pre class="brush: css; title: ; notranslate">#box:hover {
  -webkit-animation-iteration-count: 6
}</pre>
<p>Ale można też tak, by krążyła w nieskończoność:</p>
<pre class="brush: css; title: ; notranslate">#box:hover {
  -webkit-animation-iteration-count: infinite
}</pre>
<p>Należy pamiętać, żeby w takim wypadku zerować ją, czyli w 100% ustawić takie same opcje, jak przy 0%. Polecam wtedy taką alternatywę:</p>
<pre class="brush: css; title: ; notranslate">95% {
  padding: 50px;
  background: #fff;
  color: #000;
  line-height: 200px;
  top: 0;
  left: 0
}
100% {
  background: #000;
  color: #fff;
  top: 0;
  left: 0;
}</pre>
<p>Następną ciekawą funkcją jest kierunek – animation-direction. Obsługuje tylko tekst – dwa słowa – normal i alternate. Pierwsza to opcja przypisana z góry, druga to odwrotność, czyli wracanie się animacji. Wykonuje wtedy kroki od tyłu.</p>
<pre class="brush: css; title: ; notranslate">#box:hover {
  -webkit-animation-direction: alternate;
}</pre>
<p>Dodatkowe funkcje można uzyskać dodając JavaScript, ale o tym kiedy indziej.</p>
<p>Teraz wystarczy wrzucić do pliku html wszystkie te elementy i uruchomić w Chrome lub przeglądarce na telefonie. Prosta animacja naszego autorstwa już działa. Warto pamiętać, że animacja nie musi działać na :hover, może być klasą dodawaną w jakimś wypadku czy nawet zwykłym elementem, tworzonym od razu lub po jakimś zdarzeniu.</p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/5UAeBq9H22E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/02/animacje-w-css3-czesc-pierwsza/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/02/animacje-w-css3-czesc-pierwsza/</feedburner:origLink></item>
		<item>
		<title>Gry HTML5 – Zynga pomaga twórcom</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/7V_qDsXlF5w/</link>
		<comments>http://frontend.pl/2012/02/gry-html5-zynga-pomaga-tworcom/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 11:38:50 +0000</pubDate>
		<dc:creator>Piotr Gawle</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1228</guid>
		<description><![CDATA[Zynga &#8211; firma stojąca za takimi hitami casualowej rozrywki jak Farmville, Cityville czy Mafia Wars coraz odważniej eksperymentuje z grami HTML5. W tej chwili na rynku obecne są ich trzy gry: &#8220;Zynga Poker&#8221;, &#8220;FarmVille Express&#8221;, and &#8220;Words With Friends&#8221;. Nie mam niestety danych czy osiągają w nich większe zyski niż w swoich natywnych produktach ale [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-1241 alignright" title="zyngahtml5" src="http://frontend.pl/wp-content/uploads/2012/02/zyngahtml5.png" alt="" width="200" height="200" />Zynga &#8211; firma stojąca za takimi hitami casualowej rozrywki jak Farmville, Cityville czy Mafia Wars coraz odważniej eksperymentuje z grami HTML5. W tej chwili na rynku obecne są ich trzy gry: &#8220;Zynga Poker&#8221;, &#8220;FarmVille Express&#8221;, and &#8220;Words With Friends&#8221;. Nie mam niestety danych czy osiągają w nich większe zyski niż w swoich natywnych produktach ale cieszę się, że duzi gracze także biorą się za HTML5. Szczególnie jeżeli chcą pomagać twórcom, którzy nie mają tak rozbudowanych działów R&amp;D.  A do tego momentu Zynga wypuściła już 3 opensource&#8217;owe mini projekty do rozwiązywania konkretnych problemów z obsługą mobilnych przeglądarek.</p>
<h1><a href="https://github.com/zynga/viewporter#readme" target="_blank">Zynga Vieporter</a></h1>
<p>Biblioteka ta stworzona przede wszystkim aby zautomatyzować wypełniania właściwości taga &#8220;vieport&#8221; i ustawianie rozmiarów ekranu. Dodatkowo umożliwia łatwiejsze osiągniecie trybu pełnoekranowego (kontrolki przeglądarki są ukryte) i pozycjonowania elementów.</p>
<p>To co nas najbardziej zainteresowało (w kontekście gier, które tworzymy) to pełen ekran i dodatkowo detekcja zmiany orientacji telefonu. Niestety w większości nasze gry umieszczane są na portalach w elemencie Iframe i tego niestety Vieporter póki co prawidłowo nie obsługuje. W innym przypadku jednak może być bardzo dobrym rozwiązaniem.</p>
<h1><a href="http://zynga.github.com/scroller/" target="_blank">Zynga Scroller</a></h1>
<p>Z kolei ta biblioteka ma ułatwić wewnętrzny scroll elementów(DOM i Canvas). W tej chwili niestety większość popularnych urządzeń mobilnych nie wspiera takiej opcji i jeżeli np. chcemy przesunąć tylko zawartość jednego elementu DIV to trzeba ostro się namęczyć aby działało to bezproblemowo na wszystkich urządzeniach.</p>
<p>Jest to moim zdaniem szczególnie ważne dla twórców gier bo łatwo sobie wyobrazić sytuację gdzie chcemy mieć jednolite nie przesuwalne tło a nad nim element z jakimiś informacjami albo bonusami.</p>
<p>Póki co sami nie mieliśmy okazji tego przetestować bo zawsze udawało nam się obejść te problemy na etapie gamedesignu, ale jeżeli chcecie sami sprawdzić jak to działa poniżej kilka dem stworzonych przez Zyngę.</p>
<ul>
<li><a href="http://zynga.github.com/scroller/demo/easyscroller.html" target="_blank">Easy Scroller</a></li>
<li><a href="http://zynga.github.com/scroller/demo/dom.html" target="_blank">DOM Demo</a></li>
<li><a href="http://zynga.github.com/scroller/demo/canvas.html" target="_blank">Canvas Demo</a></li>
<li><a href="http://zynga.github.com/scroller/demo/dom-paging-x.html" target="_blank">Paging X-Axis</a></li>
<li><a href="http://zynga.github.com/scroller/demo/dom-paging-y.html" target="_blank">Paging Y-Axis</a></li>
<li><a href="http://zynga.github.com/scroller/demo/dom-snapping.html" target="_blank">Snapping to Cells</a></li>
<li><a href="http://zynga.github.com/scroller/demo/dom-list.html" target="_blank">Pull-to-Refresh</a></li>
</ul>
<h1><a href="http://zynga.github.com/jukebox/" target="_blank">Zynga&#8217;s Jukebox</a></h1>
<p>W tej bibliotece Zynga stara się rozwiązać problem odtwarzania dźwięków. W tej chwili jest to możliwe ale działa to bardzo różnie. Do każdej przeglądarki trzeba podejść indywidualnie biorąc pod uwagę także system operacyjny, czy moc urządzenie.  Problem jest  bardzo złożony i czasami trzeba uciekać się do hacków.  Jukebox ma pomóc w rozwiązaniu tych wszystkich problemów(ze szczególnym uwzględnieniem wydajności na słabszych telefonach).</p>
<p>Dema możecie sprawdzić pod tymi linkami:</p>
<ul>
<li><a href="http://zynga.github.com/jukebox/demo/single.html" target="_blank">Single Playback Demo</a></li>
<li><a href="http://zynga.github.com/jukebox/demo/multi.html" target="_blank">Multi Playback Demo</a></li>
</ul>
<p>Jest także specjalne demo dla urządzeni z systemem IOS. Na tych telefonach i tabletach  można odtwarzać w przeglądarce tylko jeden dźwięk na raz. Czyli zrobienie np. muzyki w tle robi się bardzo problematyczne.  Testowałem rozwiązanie Zyngi na swoim starym iphonie i jako tako działa. Może nie perfekcyjnie ale daje rade. Możecie z resztą wypróbować sami.</p>
<ul>
<li><a href="http://zynga.github.com/jukebox/demo/ios.html" target="_blank">IOS demo</a></li>
</ul>
<p>Mam nadzieję, że te biblioteki pomogą Wam w tworzeniu gier i może komuś ułatwią życie.</p>
<p>Źródła:<br />
<a href="https://github.com/zynga/viewporter#readme" target="_blank">Zynga Vieporter</a><br />
<a href="http://zynga.github.com/scroller/" target="_blank">Zynga Scroller</a><br />
<a href="http://zynga.github.com/jukebox/" target="_blank">Zynga&#8217;s Jukebox</a></p>
<p>Dla ciekawskich:<br />
<a href="http://code.zynga.com/" target="_blank">Blog techniczny Zyngi</a></p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/7V_qDsXlF5w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/02/gry-html5-zynga-pomaga-tworcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/02/gry-html5-zynga-pomaga-tworcom/</feedburner:origLink></item>
		<item>
		<title>Display: box – czyli elastyczne dostosowywanie elementów na stronie</title>
		<link>http://feedproxy.google.com/~r/Frontendpl/~3/-RRX_1vSXqo/</link>
		<comments>http://frontend.pl/2012/02/display-box-czyli-elastyczne-dostosowywanie-elementow-na-stronie/#comments</comments>
		<pubDate>Sun, 19 Feb 2012 09:50:47 +0000</pubDate>
		<dc:creator>Skowron</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://frontend.pl/?p=1214</guid>
		<description><![CDATA[CSS3 udostępnia nowe wartości dla właściwości display. Jedną z nich jest box. Umożliwia ona w prosty i jasny sposób przygotowanie layoutu strony, który będzie zależny od wielkości okna, a w przypadku zmiany rozmiarów, płynnie dostosuje się do nowych wartości. Jest to szczególnie przydatne podczas tworzenia stron, czy aplikacji, których docelową platformą są urządzenia mobilne. Działa [...]]]></description>
			<content:encoded><![CDATA[<p>CSS3 udostępnia nowe wartości dla właściwości display. Jedną z nich jest <a href="http://www.w3.org/TR/2009/WD-css3-flexbox-20090723/">box</a>. Umożliwia ona w prosty i jasny sposób przygotowanie layoutu strony, który będzie zależny od wielkości okna, a w przypadku zmiany rozmiarów, płynnie dostosuje się do nowych wartości. Jest to szczególnie przydatne podczas tworzenia stron, czy aplikacji, których docelową platformą są urządzenia mobilne. Działa ona na bardzo podobnych zasadach, jak budowanie elementów interfejsu w XULu i w końcu doczekaliśmy się przeniesienia tego mechanizmu do CSS.</p>
<p>Spróbujmy stworzyć więc prostą stronę, która składa się z nagłówka treści i stopki:</p>
<pre class="brush: xml; title: ; notranslate">
  &lt;div class=&quot;wrapper&quot;&gt;
    &lt;header&gt;display: box example&lt;/header&gt;
    &lt;div class=&quot;content&quot;&gt;
      &lt;div class=&quot;left&quot;&gt;&lt;/div&gt;
      &lt;div class=&quot;center&quot;&gt;&lt;/div&gt;
      &lt;div class=&quot;right&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;footer&gt;frontend.pl&lt;/footer&gt;
  &lt;/div&gt;
</pre>
<p>Chcemy by stopka miała stała wysokość, natomiast nagłówek i treść będą rozszerzały się zależnie od rozmiaru okna. Ponadto w treść zostanie podzielona na 3 kolumny, które też odpowiednio będą zmieniać swój rozmiar.</p>
<p>Przykładowy CSS będzie wyglądał na ten sposób:</p>
<pre class="brush: css; title: ; notranslate">

    /* Na poczatek resetujemy domyślne wartości dla dokumentu */
    html,
    body{
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
      font-family: Tahoma, Arial;
    }

    /* element wrapujący, wymagany by strona rozciągała się na cała wysokość */
    .wrapper{
      width: 100%;
      height: 100%;

      /* chcemy by dzieci tego elementu dostosowywały się do rozmiaru okna */
      display: -webkit-box;
     	display: -moz-box;
     	display: box;

      /* oraz były wyświetlone jeden pod drugim */
      -webkit-box-orient: vertical;
     	-moz-box-orient: vertical;
     	box-orient: vertical;

    }

    .content,
    header,
    footer{
      background: #599908;
      width: 100%;
    }

    footer{
      /* Stopka ma mieć stała wysokość 50px */
      height: 50px;
    }

    header{
      /* Przy pomocy box-flex ustalamy proporcje rozmiarów elementów znajdujących
         się wewnątrz kontenera z display: box, które mają płynnie dostosowywać
         się do jego wielkości. Ustawiona tuatj wartość spowoduje że nagłówek
         będzie zajmowaj 1/6 wysokości - 50px przeznaczonych na stopkę strony */
      -webkit-box-flex: 1;
     	-moz-box-flex: 1;
     	box-flex: 1;
    }

    .content{
      background: #fff;
      /* Treść strony będzie zajmowała 5/6 wysokości, również pomijając stopkę */
      -webkit-box-flex: 5;
     	-moz-box-flex: 5;
     	box-flex: 5;

      /* Ponadto chcemy, by w tresci strony znajdowały się 3 kolumny,
         również dynamicznie dostosowujac się do rozmiaru, tym razem w poziomie */
      display: -webkit-box;
     	display: -moz-box;
     	display: box;
    }

    .left,
    .right{
      background: #99397d;
      /* Boczne kolumny zajmują 2/10 szerokości strony */
      -webkit-box-flex: 1;
     	-moz-box-flex: 1;
     	box-flex: 1;
    }
    .center{
      /* A główna 8/10 */
      -webkit-box-flex: 8;
     	-moz-box-flex: 8;
     	box-flex: 8;
    }
</pre>
<p>Wynik powyższego kodu można podejrzeć <a href="http://frontend.pl/wp-content/uploads/2012/02/index.html">na tym demie</a>.</p>
<p>W powyższym przykładzie skorzystaliśmy z box-orient. Oto co jeszcze mamy do dyspozycji:</p>
<ul>
<li>box-orient &#8211; definiuje orientację elementów wewnątrz kontenera,</li>
<li>box-align i box-pack- umożliwiają pozycjonowanie dzieci,</li>
<li>box-direction &#8211; pozwala odwrócić kolejność elementów,</li>
<li>box-flex &#8211; użylismy go już wyżej, służy określeniu proporcji rozmiarów.</li>
</ul>
<p>Obecnie właściwość tę wspierają Firefox, Chrome, IE od wersji 10, oraz przeglądarki na Adroidach i iOSach. Co ciekawe Opera na chwilę obecną jeszcze nie zaimplementowała tego rozwiązania. Możemy jednak skorzystać z biblioteki <a href="http://flexiejs.com">Flexiejs</a>, która doda nam obsługę display: box w przeglądarkach, w których wciąż brakuje natywnej implementacji (oczywiście kosztem wydajności). Ponadto na <a href="http://flexiejs.com/playground/">stronie biblioteki można pobawić się wszystkimi opisanymi wyżej wartościami &#8220;na żywo&#8221;</a>.</p>
<img src="http://feeds.feedburner.com/~r/Frontendpl/~4/-RRX_1vSXqo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://frontend.pl/2012/02/display-box-czyli-elastyczne-dostosowywanie-elementow-na-stronie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://frontend.pl/2012/02/display-box-czyli-elastyczne-dostosowywanie-elementow-na-stronie/</feedburner:origLink></item>
	</channel>
</rss><!-- This Quick Cache file was built for (  frontend.pl/feed/ ) in 0.46120 seconds, on May 8th, 2012 at 2:48 pm UTC. --><!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 8th, 2012 at 3:48 pm UTC --><!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --><!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  frontend.pl/feed/ ) in 0.00024 seconds, on May 8th, 2012 at 3:22 pm UTC. -->

