<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Roger Boesch</title>
	<atom:link href="http://www.rogerboesch.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rogerboesch.com</link>
	<description>iOS Warrior</description>
	<lastBuildDate>Mon, 22 Nov 2010 20:04:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Lightweight integration of Lua in Objective-C</title>
		<link>http://www.rogerboesch.com/2010/11/22/lightweight-integration-of-lua-in-objective-c/</link>
		<comments>http://www.rogerboesch.com/2010/11/22/lightweight-integration-of-lua-in-objective-c/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 19:44:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cocos2D]]></category>
		<category><![CDATA[LevelSVG]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=1123</guid>
		<description><![CDATA[Based on the great article about integrating Lua in your own iApp written by Robert Grzesek, I&#8217;ve written a lightweight wrapper in Objectice-C and will explain how it can be used to scripting games written with Cocos2D and LevelSVG. The attached example project itself contains none of those library for copyright reason&#8217;s, so uses UIView [...]]]></description>
			<content:encoded><![CDATA[<p>Based on the g<a title='Original Link: http://www.grzmobile.com/blog/2009/11/13/integrating-lua-into-an-iphone-app.html'  href="http://www.rogerboesch.com/?gZR5s_YT">reat article</a> about integrating Lua in your own iApp written by Robert Grzesek, I&#8217;ve written a lightweight wrapper in Objectice-C and will explain how it can be used to scripting games written with Cocos2D and LevelSVG. The attached <a href="http://www.rogerboesch.com/files/LuaTestApp.zip">example project</a> itself contains none of those library for copyright reason&#8217;s, so uses UIView only to show the approach. But anybody should be easy possible to extend it for his own game.</p>
<p>My personal version of RBLuaInterpreter class is supporting all node&#8217;s of LevelSVG  and can be directly attached to objects in xml. So no programming is needed at all. Now to the concepts behind, but before that please read Robert&#8217;s Blog where to downloaf Lua itself and how its integrated in your project. The C++ class written by him end&#8217;s with the standard mechanism how to call Lua and back to C, so that&#8217;s exactly the same here in my class. The &#8220;trick&#8221; is to add some scripting extensions where I can pass LevelSVG BodyNode objects to Lua and call then method&#8217;s out of Lua which change behavior in the calling object or other GameNode child objects.</p>
<p>In the example attached, it&#8217;s done with the help of a tag id, so it&#8217;s also easy to request an object from GameNode object and call them back.</p>
<p>Below is a sample Lua script, which give&#8217;s you an idea how it looks like in my game. Of course, Lua allow&#8217;s also a more OO approach, but for us it was not important to use the language in it&#8217;s best but to have a full scriptable engine. But some of the nice Lua feature&#8217;s like returning multiple parameters from a function are implemented of course.</p>
<p>So feel free to download the attached project, use the class and let me know what you&#8217;ve done based on that. Happy (game) coding!</p>
<p><a href="http://www.rogerboesch.com/wp-content/uploads/2010/11/LuaTest.png"><img class="alignnone size-medium wp-image-1124" title="LuaTest" src="http://www.rogerboesch.com/wp-content/uploads/2010/11/LuaTest-204x300.png" alt="" width="204" height="300" /></a></p>
<h5>Example Screenshot of LuaTest</h5>
<p><code>--<br />
-- Game object scripts are called with events<br />
--<br />
-- init: When level is created and before it starts<br />
-- exit: When game object is released<br />
-- contactbegin: When contact with other game object begins<br />
-- contactend: When contact with other game object ends<br />
-- bullettouches: When game object is touched by bullet<br />
-- herotouches: When game object is touched by hero<br />
--<br />
-- show balks (id 1,2) and hide balk (id 3,4)<br />
--<br />
print("BEGIN level1-13-showbalks.lua");<br />
objectId = arg[1];<br />
event = arg[2];<br />
--<br />
if (event == "bullettouches") then<br />
  balk1 = level.getObject(1);<br />
  object.setHidden(balk1, 0);<br />
  balk2 = level.getObject(2);<br />
  object.setHidden(balk2, 0);<br />
  balk3 = level.getObject(3);<br />
  object.setHidden(balk3, 1);<br />
  balk4 = level.getObject(4);<br />
  object.setHidden(balk4, 1);<br />
end<br />
--<br />
print("END level1-13-showbalks.lua");<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/11/22/lightweight-integration-of-lua-in-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I will continue my blog in english&#8230;</title>
		<link>http://www.rogerboesch.com/2010/11/16/i-will-continue-my-blog-in-english/</link>
		<comments>http://www.rogerboesch.com/2010/11/16/i-will-continue-my-blog-in-english/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 12:18:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=987</guid>
		<description><![CDATA[From now on the most of my blog entries will be written in english. It&#8217;s easier to share technical information&#8217;s in the community of iOS developer and enthusiast&#8217;s. Of course I will still write some more business/market related papers in german, so I hope this is a good mix then.]]></description>
			<content:encoded><![CDATA[<p>From now on the most of my blog entries will be written in english. It&#8217;s easier to share technical information&#8217;s in the community of iOS developer and enthusiast&#8217;s. Of course I will still write some more business/market related papers in german, so I hope this is a good mix then.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/11/16/i-will-continue-my-blog-in-english/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XCode Header Kommentar</title>
		<link>http://www.rogerboesch.com/2010/03/25/xcode-header-kommentar/</link>
		<comments>http://www.rogerboesch.com/2010/03/25/xcode-header-kommentar/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 12:28:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Tip of the week]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=944</guid>
		<description><![CDATA[Erstellt man in XCode neue Klassen, dann wird im Header automatisch ein Eintrag im Stil von Copyright (c) 2010 MyCompanyName. All rights reserved. erzeugt. Bis zur Version 3.2 war eine einfache Änderung dieses Firmennamens nicht möglich. In Version 3.2 von XCode findet sich nun aber endlich eine Funktion, um dies direkt aus der IDE heraus [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/comp1.png"><img class="alignright size-medium wp-image-945" title="comp1" src="http://www.rogerboesch.com/wp-content/uploads/2010/03/comp1-300x210.png" alt="" width="300" height="210" /></a>Erstellt man in XCode neue Klassen, dann wird im Header automatisch ein Eintrag im Stil von</p>
<p><em>Copyright (c) 2010 MyCompanyName. All rights reserved.</em></p>
<p>erzeugt. Bis zur Version 3.2 war eine einfache Änderung dieses Firmennamens nicht möglich. In Version 3.2 von XCode findet sich nun aber endlich eine Funktion, um dies direkt aus der IDE heraus zu änden. Interessant ist, dass man das pro Proekt ändern kann, was insbesondere ein nützliches Fetaure ist, wenn im Kundenauftrag arbeitet. Um das zu bewerkstelligen, einfach mit der rechten Maustaste den Projekteintrag selektieren, Get Info drücken und dann den Firmennamen unter General Settings wechseln.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/25/xcode-header-kommentar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Simulator und ABAdressBook</title>
		<link>http://www.rogerboesch.com/2010/03/17/iphone-simulator-und-abadressbook/</link>
		<comments>http://www.rogerboesch.com/2010/03/17/iphone-simulator-und-abadressbook/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 09:11:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[AdressBook]]></category>
		<category><![CDATA[Code snippet]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tip of the week]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=930</guid>
		<description><![CDATA[Die Integration des Adressbuchs in eigene Apps ist eine schöne Sache. Während der Entwicklung im Simulator stellt sich leider meistens heraus, dass das Adressbuch entweder ganz leer ist oder sich nur wenige Datensätze darin befinden. Hat man im Simulator einmal auf Reset gedrückt sind die Daten meistens ganz weg. Was liegt also näher, als die [...]]]></description>
			<content:encoded><![CDATA[<p>Die Integration des Adressbuchs in eigene Apps ist eine schöne Sache. Während der Entwicklung im Simulator stellt sich leider meistens heraus, dass das Adressbuch entweder ganz leer ist oder sich nur wenige Datensätze darin befinden. Hat man im Simulator einmal auf Reset gedrückt sind die Daten meistens ganz weg. Was liegt also näher, als die Daten des Adressbuchs vom eigenen iPhone auch für die Tests im Simulator zu nutzen, was gar nicht mal so kompliziert ist. Die nachfolgenden Schritte zeigen wie&#8217;s geht:</p>
<p>Wichtig ist natürlich, dass sich auf dem Mac auf dem die nachfolgenden Commands ausgeführt werden, auch wirklich ein Backup befindet&#8230;</p>
<ol>
<li><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/createdb.zip">Zip file</a> downloaden und im Home Verzeichnis entpacken</li>
<li>Terminal App öffnen</li>
<li>Setzen der Dateiattribute: <em>chmod u=x createdb</em></li>
<li>Ausfuhren der Datei mit: <em>./createdb</em></li>
<li>Fertig!</li>
</ol>
<p><strong>Anmerkung</strong>: Je nach SDK kann es jetzt noch sein, dass man im Finder die Datei <em>/Users/admin/Library/Application Support/iPhone Simulator/User/Library/AddressBook/AddressBook.sqlitedb</em> auch noch in die anderen Verzeichnisse (also z.B. <em>/Users/admin/Library/Application Support/iPhone  Simulator/3.1.3/Library/AddressBook/AddressBook.sqlitedb</em>) kopieren muss, was aber wieder im Finder geschehen kann.</p>
<h6><em>Btw.: Das Script habe ich übrigens nicht ganz selber geschrieben, sondern vor einiger Zeit mal irgendwo gefunden und angepasst. Wenn ich den Link wieder finde füge ich ihn noch an.</em></h6>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/17/iphone-simulator-und-abadressbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Games</title>
		<link>http://www.rogerboesch.com/2010/03/06/iphone-games/</link>
		<comments>http://www.rogerboesch.com/2010/03/06/iphone-games/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 17:36:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=880</guid>
		<description><![CDATA[Mobile Spiele sind Volkssport. In allen Altersgruppen, in allen Einkommensgruppen, in allen Bildungsschichten, in Single-, Mehrpersonen- und Familienhaushalten – überall wird gespielt. Dabei gibt es den typischen Spieler gemäss Studie nicht, denn Computerspiele werden in allen Altersschichten und &#8211; gruppen gespielt, wobei für unsere Betrachtung vorallem der sogenannte Freizeitspieler interessant ist. Mit 54% stellt er [...]]]></description>
			<content:encoded><![CDATA[<p>Mobile Spiele sind Volkssport. In allen Altersgruppen, in allen Einkommensgruppen, in allen Bildungsschichten, in Single-, Mehrpersonen- und Familienhaushalten – überall wird gespielt.<br />
Dabei gibt es den typischen Spieler gemäss Studie nicht, denn Computerspiele werden in allen Altersschichten und &#8211; gruppen gespielt, wobei für unsere Betrachtung vorallem der sogenannte Freizeitspieler interessant ist. Mit 54% stellt er auch die bei weitem grösste und mit<br />
Durchschnittsalter von 44 Jahren älteste Gruppe aller Videospieler dar. Angepasste Studien für mobile Spiele oder gar spezifische fürs iPhone gibt es erst Wenige, die angegebenen Zahlen dürften aber insbesondere auf dem iPhone nochmals deutlich höher ausfallen. Der Freizeitspieler ist überwiegend berufstätig und spielt nur gelegentlich. Zum Entspannen oder zum Zeitvertreib, wenn es seine vielfältigen anderen Freizeitaktivitäten, der Job oder die Familie gerade zulassen. Er ist in jeder Hinsicht gesetzt, sowohl beruflich als auch familiär. In seinem Haushalt ist ein mittleres bis gehobenes Nettoeinkommen verfügbar. Die Entscheidung zum Spielen fällt oft spontan: Auf dem Arbeitsweg, in der Mittagspause, nach dem Abendessen oder vor dem Schlafen gehen. Auch mit einem weiteren Vorurteil räumt der Freizeitspieler gründlich auf: Männer und Frauen sind in der Gruppe gleich stark vertreten. Seine bevorzugten Genres sind Fun-, Sport- oder Geschicklichkeitsspiele, nur selten greift er zu Actionspielen oder Strategie- und Fantasiespielen. Die Zeit, sich mit komplexen Spielszenarien auseinander zu setzen, hat er gar nicht. Deshalb ist es ihm wichtig, dass die Spiele eine einfache Bedienung haben und nicht zu viel geistige Anstrengung verlangen. Spiele sind für ihn ein entspannender Ausgleich zu den Herausforderungen im Berufsalltag, er geniesst die zeitvertreibende und zerstreuende Wirkung von Spielen. Spielen auf dem iPhone (iPod Touch)<br />
Der Einfluss des iPhone auf den mobilen Markt ist gewaltig. Es wurden Massen von neuen Nutzern angelockt und die Nutzung des mobilen Internets wurde erheblich erweitert. iPhone Besitzer nutzen ihr Mobiltelefon auf eine völlig andere Art und Weise als der durchschnittliche Mobilfunknutzer. Nutzungsmuster zeigen auf, dass das iPhone gern als Unterhaltungsgerät verwendet wird. Das iPhone Paket mit Browser, Nachrichtendiensten, Spielen, Musik und Filmen ist perfekt für die Zielgruppe. In den USA hat das iPhone den Markt für Handyspiele bereits umgekrempelt. Die Handys von Apple werden mit Abstand am häufigsten für den Download von Spielen genutzt. So haben im November 2009 über 70% der iPhone Nutzer schon mindestens ein Spiel heruntergeladen, während der Durchschnitt des Gesamtmarkts gerade einmal bei unglaublichen 5% liegt.</p>
<h2>Nutzen als Werbeplatform</h2>
<p>Die schwindende Wirkung von konventionellen Werbeformen verlangt nach neuen Wegen, über die Menschen effizient erreicht werden können. Werben mit Spielen ist einer dieser Wege. Games erhalten als Freizeitbeschäftigung in dreierlei Hinsicht Bedeutung für die Werbeindustrie: Aufgrund der demografischen Verbreitung, der aufmerksamkeitsstarken Wirkung und des intensiven Involvements des Spielers in die Handlung. Hinzu kommt eine hohe Aufmerksamkeit: Wer spielt, richtet seinen Fokus ausschliesslich auf die Spielhandlung. Dabei treffen Videospiele sogar den wichtigsten Werbeträger, das Fernsehen, an seiner empfindlichsten Stelle: Berufstätige spielen überwiegend zur Entspannung nach Feierabend, zur so genannten „Primetime“. Genau dann, wenn sie eigentlich für die Werbebotschaften erreichbar sein sollten. Wenn man diese Aufmerksamkeitzurückgewinnen will, kommt man also nicht umhin, mit den Werbe-Botschaften auch in Spielen und deren Umfeld präsent zu sein. Werben lässt sich dabei auf zwei unterschiedliche Weisen:</p>
<h2>Als Teil des Gameplay</h2>
<p>Wenn Marke oder Produkt zum Teil der Spielhandlung werden, ist das Involvement des Spielers am grössten. Die Wahrnehmung ist garantiert, der Spieler setzt sich intensiv mit der Marke auseinander und wird die im Spiel erlebten Emotionen mit der Marke in Verbindung bringen. Diese Werbeform ist nicht nur die effektivste, sie ist sicher auch die aufwendigste.</p>
<h2>Teil der Spieleszenerie</h2>
<p>Die Werbung, die Marke oder das Produkt tauchen im Szenario des Games auf, zum Beispiel als Bandenwerbung in einem Sportspiel. Oder aber als Getränkeautomat, Geschäftsfiliale oder einfach als Teil einer Kulisse. Spannend ist diese Werbeform vor allem, wenn sie dynamisch ins Spiel eingefügt wird und nicht statisch im Spiel integriert sein muss. So können Banden oder Billboards tagesaktuell und sogar mit regionalem Bezug platziert werden. Auf dem iPhone sind beide Arten problemlos möglich. Durch die perfekte Symbiose von grossem Display, guten Multimediainhalten und einfachem Onlinezugriff ist das iPhone schnell zum inbegriff des mobilen Spielens geworden, mit rasant wachsender Tendenz.</p>
<h2>Spielegenres, Umsetzung und Kosten</h2>
<p>Die bevorzugten Genres auf dem iPhone sind Fun-, und Geschicklichkeitsspiele, was durch den Typ des Freizeitspielers und des mobilen Nutzerverhaltens auch logisch erscheint. Hinzu kommen zwei wesentliuche Faktoren:</p>
<ul>
<li><strong>Ein schneller Einstieg: </strong>Es muss sofort erkennbar sein, um was es geht.</li>
<li><strong>Kurze Nutzungszeiten</strong>: Die durchschnittliche Spielezeit beträgt gerade einmal 5 Minuten. Unterschieden wird grundsätzlich zwischen 2D und 3D Spielen. Aus technischer Sicht ist auf dem iPhone prinzipiell beides möglich, es hat sich aber gezeigt, dass obige Bedingungen am Besten auf 2D Spiele zutreffen. Hinzu kommt, dass professionelle 3D Spiele und insbesondere die Erstellung der Assets problemlos fünfstellige Beträge erreichen können. Budgets die zumeist noch nicht zur Verfügung stehen im Bereich der mobilen Spiele. 2D Spiele haben zudem einen ganz speziellen Reiz und gehen auch besser mit den visuellen Einschräkungen und Limitation des Displays um. Hinzu kommt, dass sich viele der Spieler an Spiele aus der eigenen Kinder- und Jugendzeit erinnert fühlen. Wer kennt nicht Pac-Man, Donkey Kong, Super Mario und wie sie alle heissen&#8230;</li>
</ul>
<p>Denken auch Sie daran, ein iPhone Game zu realisieren? Dann lassen Sie uns darüber sprechen!</p>
<p><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/Scuba.png"><img class="alignnone size-medium wp-image-887" title="Scuba" src="http://www.rogerboesch.com/wp-content/uploads/2010/03/Scuba-300x162.png" alt="" width="300" height="162" /></a><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/MyIsland.png"><img class="alignnone size-medium wp-image-888" title="MyIsland" src="http://www.rogerboesch.com/wp-content/uploads/2010/03/MyIsland-300x162.png" alt="" width="300" height="162" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/06/iphone-games/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CoverFlow</title>
		<link>http://www.rogerboesch.com/2009/08/16/coverflow-programmieren/</link>
		<comments>http://www.rogerboesch.com/2009/08/16/coverflow-programmieren/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 16:05:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cover Flow]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=611</guid>
		<description><![CDATA[Bereits Anfang des Jahres habe ich einen Blog Beitrag zum Thema Cover Flow geschrieben. Ein Thema, zu dem mich seither immer wieder Mails und Anfragen erreicht haben. Insbesondere für Entwickler, die noch nicht so lange mit Objective-C und Cocoa entwickeln ist das Thema zugegebenermassen auch nicht ganz ohne. Möchte man einen Cover Flow in eine [...]]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/zSsns24bUPo&amp;hl=en&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/zSsns24bUPo&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
Bereits Anfang des Jahres habe ich einen Blog Beitrag zum Thema Cover Flow geschrieben. Ein Thema, zu dem mich seither immer wieder Mails und Anfragen erreicht haben. Insbesondere für Entwickler, die noch nicht so lange mit Objective-C und Cocoa entwickeln ist das Thema zugegebenermassen auch nicht ganz ohne.<br />
Möchte man einen Cover Flow in eine eigene App einbauen gibt es zunächst drei Möglichkeiten:</p>
<ul>
<li> Man benutzt den Cover Flow View aus den Private Frameworks von Apple (Keine gute Idee, wenn man die App später auch erfolgreich in den AppStore bringen möchte)</li>
<li> Man benutzt Core Animation und Layers</li>
<li> Man verwendet OpenGL</li>
</ul>
<p>Auf die erste Möglichkeit gehe ich aus verständlichen Gründen nicht weiter ein. Die zweite Variante mit Core Animation kam in einem meiner recht frühen Projekte zum Einsatz (Den Beispielcode erläutere ich nacholgend) und hat sich gut bewährt. Variante 3 setze ich aktuell in den Projekten ein, kann als Library gekauft werden und ist zudem im Video zu sehen.</p>
<p>Da das Core Animation Framework auf dem iPhone nicht ganz so mächtig wie unter MacOSX ist, muss man auf Filter verzichten, trotzdem sind schöne Ergebnisse zu erzielen. Doch nun zum Code.</p>
<pre lang="objc">#import
#import 

@protocol RBCoverFlowDelegate
- (int)numberOfItems;
- (UIImage*)coverImageForIndex:(int)index;
- (UIImage*)placeholderImage;
- (void)coverHasChangedToIndex:(int)index;
- (void)clickOnCoverWithIndex:(int)index;
@end

@interface RBCoverFlowView : UIView {
	CGPoint _startTouchPosition;
	float _centerPosition;
	float _sidePosition;
	CATransform3D _leftTransform;
	CATransform3D _rightTransform;

	CALayer* _contentLayer;

	id _delegate;
	int _itemCount;

	CGImageRef _placeholderImageRef;
	UIImage* _placeholderImage;
	CGImageRef _maskedPlaceholderImageRef;

	CGSize _imageSize;
	CGFloat _imageScaleX;
	CGFloat _imageScaleY;

	float _rowScaleFactor;
}

// Start the cover flow
- (void)start:(id)delegate;

@end
</pre>
<p>Der Cover Flow besteht zunächst aus einem &#8220;Hauptview&#8221;, der von UIView abgeleitet ist und in dem die Covers dargestellt werden. Dieser ist zudem für das Verarbeiten der Touches und der gesamten Animation zuständig.</p>
<p>Die Covers selber bestehen aus einzelnen Layern, bzw. genau drei Layern pro Cover. Der Layer mit dem Bild selber, ein Layer, der die Spiegelung (Reflection) darstellt und ein Rahmen-Layer, der das ganze Cover umschliesst.</p>
<pre lang="objc">- (CALayer *)addCoverLayer:(int)index {
	CALayer* containerLayer = [CALayer layer];
	containerLayer.name = [NSString stringWithFormat:@"%d", index];
	containerLayer.frame = CGRectMake(0.0f, 0.0f, [[self maxAvalibleImageWidth] floatValue], 1.5f * [[self maxAvalibleImageHeight] floatValue]);
	containerLayer.contentsGravity = kCAGravityResize;

	CALayer* holderLayer = [CALayer layer];
	holderLayer.name = [NSString stringWithFormat:@"Holder_%d", index];
	holderLayer.frame = CGRectMake(0.0f, 0.0f, [[self maxAvalibleImageWidth] floatValue], 1.5 * [[self maxAvalibleImageHeight] floatValue]);
	holderLayer.contentsGravity = kCAGravityResize;

	CALayer* imageLayer = [CALayer layer];
	imageLayer.name = [NSString stringWithFormat:@"Image_%d", index];
	imageLayer.contents = (id)_placeholderImageRef;
	imageLayer.frame = [self imageRect:(CGImageRef)imageLayer.contents];
	imageLayer.contentsGravity = kCAGravityResizeAspectFill;
	imageLayer.masksToBounds = YES;

	CALayer* reflectionLayer = [CALayer layer];
	reflectionLayer.name = [NSString stringWithFormat:@"Reflection_%d", index];
	reflectionLayer.contents = (id)_maskedPlaceholderImageRef;
	CGRect frame = [self imageRect:(CGImageRef)reflectionLayer.contents];
	frame.origin.y = imageLayer.frame.size.height + 2;
	reflectionLayer.frame = frame;
	reflectionLayer.contentsGravity = kCAGravityResize;
	reflectionLayer.masksToBounds = YES;
	reflectionLayer.transform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);
	reflectionLayer.opacity = 0.6;

	[containerLayer setValue:imageLayer forKey:kImageLayerKey];
	[containerLayer setValue:reflectionLayer forKey:kImageReflectionKey];
	[containerLayer setValue:holderLayer forKey:kImageHolderKey];

	[holderLayer addSublayer:imageLayer];
	[holderLayer addSublayer:reflectionLayer];
	[containerLayer addSublayer:holderLayer];

	return containerLayer;
}
</pre>
<p>Sind die Layer erstellt worden, müssen die einzelnen Cover nun entsprechend positioniert werden, damit das Aussehen dem Cover Flow der iPod App entspricht. Dies erreicht man, in dem man jeden einzelnen Layer im Raum positioniert, skaliert und leicht dreht.</p>
<pre lang="objc">- (void)layoutSublayer:(CALayer*)rootLayer number:(int)number {
	int selectedIndex = [[_contentLayer valueForKey:@"selectedIndex"] integerValue];

	rootLayer.frame = CGRectMake(0.0f, 0.0f, [[self maxAvalibleImageWidth] floatValue], 1.5f * [[self maxAvalibleImageHeight] floatValue]);

	CATransform3D layerTransform = CATransform3DIdentity;
	layerTransform.m34 = 1.0f / _sidePosition;

	CALayer* holder = [rootLayer valueForKey:kImageHolderKey];

	CGPoint pos = CGPointMake(CGRectGetMidX(_contentLayer.bounds), CGRectGetMidY(_contentLayer.bounds));

	if (number &lt; selectedIndex) {
		pos.x -= (selectedIndex - number) * _imageSize.width * _rowScaleFactor;
		holder.transform = _leftTransform;
		holder.zPosition = _sidePosition;
		rootLayer.zPosition = _sidePosition - 0.1f * (selectedIndex - number);
		rootLayer.sublayerTransform = layerTransform;
	} else if (number &gt; selectedIndex) {
		pos.x += (number - selectedIndex) * _imageSize.width * _rowScaleFactor;
		holder.transform = _rightTransform;
		holder.zPosition = _sidePosition;
		rootLayer.zPosition = _sidePosition - 0.1f * (number - selectedIndex);
		rootLayer.sublayerTransform = layerTransform;
	} else {
		pos.x = (self.bounds.size.width - _imageSize.width) / 2;
		holder.transform = CATransform3DIdentity;
		holder.zPosition = _centerPosition;
		holder.filters = nil;
		rootLayer.zPosition = _centerPosition;
		rootLayer.sublayerTransform = CATransform3DIdentity;
	}

	rootLayer.position = pos;
}
</pre>
<p>Die Animation ist in dem Code (Hier sind die kompletten <a href="http://www.rogerboesch.com/tutorials/CoverFlowSource.zip">Source Files</a>) bewusst recht einfach gehalten und unterstützt keine sogenannten Heartbeat Animationen, d.h. Animationen die sogleich beginnen, wenn der Finger aufgesetzt wird. Im käuflichen und auf OpenGL basierten Code ist dies selbstverständlich vorhanden und insbesondere das Laden und Aufbauen der Bilder noch stark optimiert. Aber als Einstieg und fürs bessere Verständnis hoffe ich, dass der Beispielcode hier erstmal weiterhilft. Wer mehr darüber erfahren möchte, dem möchte ich nochmals unsere <a href="http://www.rogerboesch.com/workshops/">Workshops</a> ans Herz legen, in denen wir wesentlich tiefer in die Materie einsteigen können. Also, viel Spass beim Cover Flow programmieren und nicht vergessen, auf mein Blog zu verlinken wenn Ihr die erste iApp mit Cover Flow in den Appstore bringt <img src='http://www.rogerboesch.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>Anfangs basierte dieser Code übrigens auf einem Beispiel Code von <a title='Original Link: http://bill.dudney.net/roller/objc/'  href="http://www.rogerboesch.com/?1haoVHxh">Bill Dudney</a>, der damals einen Artikel über die Programmierung eines Cover Flow unter MacOSX veröffenlichte und auch ein sehr gut geschriebenes Buch zum Thema Core Animation geschrieben hat.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/08/16/coverflow-programmieren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Objective-C</title>
		<link>http://www.rogerboesch.com/2009/08/01/objective-c/</link>
		<comments>http://www.rogerboesch.com/2009/08/01/objective-c/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 06:45:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Code snippet]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=538</guid>
		<description><![CDATA[Aufbauend auf den beiden ersten, ganz einfachen &#8220;Hello World&#8217;s&#8221; möchte ich nun ein wenig näher auf die Programmiersprache Objective-C eingehen. Das Schwergewicht werde ich dabei auf die Punkte legen, die für den Einstieg und das bessere Verständnis unbedingt notwendig sind. Die Notation verwirrt anfangs zwar ein wenig, wer sich jedoch damit beschäftigt und auf die [...]]]></description>
			<content:encoded><![CDATA[<p>Aufbauend auf den beiden ersten, ganz einfachen &#8220;Hello World&#8217;s&#8221; möchte ich nun ein wenig näher auf die Programmiersprache Objective-C eingehen. Das Schwergewicht werde ich dabei auf die Punkte legen, die für den Einstieg und das bessere Verständnis unbedingt notwendig sind. Die Notation verwirrt anfangs zwar ein wenig, wer sich jedoch damit beschäftigt und auf die Sprache einlässt, wird schnell merken wie leistungsfähig das Ganze ist. Insbesondere im Zusammenspiel mit dem dahinterstehenden Framework des iPhones: Cocoa Touch.</p>
<p>Wichtigstes Element: Die <strong>Klasse</strong></p>
<pre lang="objc">@interface Person : NSObject {
     // Das sind Instanz Variablen
     int alter;  // ... vom Typ int
     NSString* name;  // ...vom Typ NSString (Klasse)
     NSString* vorname;
}

// Das sind Messages:
// In Objective-C heissen Methoden Messages
- (void)initialisieren;
- (void)setAlter:(int)alter;
- (void)setPerson:(NSString*)name vorname:(NSString*)vorname;
- (int)getJahrgang;

@end

@implementation Person

- (void)setAlter:(int)alter {
    // Mach irgendetwas ...
}

...

@end</pre>
<p>Darin unterscheidet sich die Sprache noch nicht wesentlich von vielen Anderen, wie z.B. Java oder C#. Wie in C++ trennt man allerdings Klassen in deren Beschreibung (<em>@interface</em>) und deren Implementierung (<em>@implementation</em>).</p>
<p>Universeller Zugriff auf Klassen: <strong>id</strong><br />
Der Datentyp <em>id</em> ist eine einfache, aber wichtige Erweiterung in Objective-C. Um Klassen unabhägig vom Typ (Bsp. Person) ansprechen zu können, genügt es diese mit id zu deklarieren. Dies wird insbesondere bei der Kommunikation zwischen Interface Builder und Code (Messaging) intensiv genutzt.</p>
<pre lang="objc">id person = [Person new];
</pre>
<p>Der Aufruf von Klassen: <strong>Messages</strong><br />
Ein wenig ungewohnt sieht das Ganze aus, wenn man eine Nachricht (Message) einer Klasse aufrufen möchte. Obige Klasse wird beispielsweise wie folgt angesprochen:</p>
<pre lang="objc">Person* person = [Person new];
[person initialisieren];
</pre>
<p>und mit Parametern:</p>
<pre lang="objc">Person* person = [Person new];
[person setAlter:35];
[person setPerson:@"Muster" vorname:@"Peter"];
</pre>
<p>Vereinfachung durch <strong>Properties</strong> (@property)<br />
Properties gibt es seit Version 2.0 von Objective-C und erweitern Klassen um die Möglichkeit, einfacher auf Instanz Variablen zuzugreifen. Eine Fähigkeit, die es eigentlich in allen modernen objektorientieren Sprachen gibt. Damit kann der Codeumfang stark reduziert werden, da der Compiler selber das mühsame Schreiben der Getter und Setter Methoden übernimmt:</p>
<pre lang="objc">@interface Person : NSObject {
     int alter;
     NSString* name;
     NSString* vorname;
}

@property int alter;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSString* vorname;

@end

@implementation Person

@synthesize alter;
@synthesize name;
@synthesize vorname;</pre>
<p>Wobei die Vereinfachung genaugenommen erst beim Aufruf zum Tragen kommt, da nun folgendermassen auf die Instanz Variablen des Objekts zugegriffen werden kann:</p>
<pre lang="objc">Person* person = [Person new];
person.alter = 35;
person.name = @"Muster";
person.vorname = @"Peter";
int jahrgang = 2009-person.alter;
</pre>
<p>Die sieht natürlich vorallem für Entwickler, die von Java oder C# her kommen, sehr viel gewohnter aus und bietet zudem einige Vorteile bei der Speicherverwaltung. Wer sich noch näher mit Properties beschäftigen möchte, der findet auf den Apple Seiten alles Wichtige dazu, auch was es mit dem Keyword <em>@synthesize</em> und den Attributen <em>nonatomic</em> und <em>retain</em> auf sich hat.</p>
<p>There&#8217;s one more thing: <strong>IBOutlet</strong> und <strong>IBAction</strong><br />
Die beiden Keywords IBOutlet und IBAction gehören genaugenommen nicht zu Objective-C und dienen dazu, den Code für den Interface Builder zu markieren. So kann dieser erkennen, welche Message durch welches UI Element (Bsp. Button) aufgerufen werden soll (Action Target Prinzip) und welche Instanz Variable mit welchem UI Element (Bsp. Label) verknüpft wird. Die Anwendung ist dabei ganz einfach:</p>
<pre lang="objc">@interface Person : NSObject {
     UILabel* text;
}

// Dieses Textfeld kann in Interface Builder verknüpft werden
@property (nonatomic, retain) IBOutlet UILabel* text;

// Diese Message kann von Interface Builder aufgerufen werden
- (IBAction)aendereText:(id)sender;

@end
</pre>
<p>So, das soll es nun aber für den Moment auch schon sein, obwohl die Sprache natürlich noch viel mehr zu bieten hat. Für den Einstieg und erste einfache Programme genügt dies aber bereits udn wir werden dies in den kommenden Screencasts auch intensiv nutzen.<br />
Also, nur Mut! Der Einstieg ist ein wenig ungewohnt, aber man findet sich schnell zurecht und Spass macht es sowieso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/08/01/objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues (Screencast) Hello World</title>
		<link>http://www.rogerboesch.com/2009/07/30/neues-video-hello-world/</link>
		<comments>http://www.rogerboesch.com/2009/07/30/neues-video-hello-world/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 07:49:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=533</guid>
		<description><![CDATA[Nach gut einem Jahr seit Erscheinen des ersten &#8220;Hello Worlds&#8221; auf diesem Blog ist es nun an der Zeit, den Artikel auzupeppen und vorallem mit Screenflow aufzuzeichnen. Den Anfang machen nun Teil I und II, die sich mit dem Einstieg in die iPhone Entwicklung und dem Verknüpfen von Code und Benutzeroberfläche befassen. Sicher eine der [...]]]></description>
			<content:encoded><![CDATA[<p>Nach gut einem Jahr seit Erscheinen des ersten &#8220;Hello Worlds&#8221; auf diesem Blog ist es nun an der Zeit, den Artikel auzupeppen und vorallem mit Screenflow aufzuzeichnen. Den Anfang machen nun Teil I und II, die sich mit dem Einstieg in die iPhone Entwicklung und dem Verknüpfen von Code und Benutzeroberfläche befassen. Sicher eine der Eigenheiten, in denen sich die iPhone Programmierung am Meisten von der auf anderen Plattformen unterscheidet.<br />
In den weiteren Folgen befasse ich mich dann detaillierter mit Objective-C und weiteren Teilen von CocoaTouch, dem Framework, auf dem alle iApps aufbauen.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/p/D0D2C199D9D7BB5D&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/p/D0D2C199D9D7BB5D&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Und hier wie gewohnt, der <a href="http://www.rogerboesch.com/tutorials/HelloWorld.zip">Source Code</a> dazu. Viel Spass beim Auspropieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/30/neues-video-hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Screenshot programmieren</title>
		<link>http://www.rogerboesch.com/2009/07/28/screenshot-programmieren/</link>
		<comments>http://www.rogerboesch.com/2009/07/28/screenshot-programmieren/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 10:28:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Code snippet]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=527</guid>
		<description><![CDATA[Manchmal ist es nützlich, Screenshots zu machen. Jeder iPhone User kennt diese nützliche Tasten Kombination. Mit den folgenden Programzeilen, ist dies auch sehr einfach in eigenen Programmen integrierbar. Diese Zeilen einfach in einen View Controller einbauen und fertig: -(IBAction)captureScreen:(id)sender { UIGraphicsBeginImageContext(self.view.frame.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); }]]></description>
			<content:encoded><![CDATA[<p>Manchmal ist es nützlich, Screenshots zu machen. Jeder iPhone User kennt diese nützliche Tasten Kombination.<br />
Mit den folgenden Programzeilen, ist dies auch sehr einfach in eigenen Programmen integrierbar.<br />
Diese Zeilen einfach in einen View Controller einbauen und fertig:</p>
<pre lang="objc" line="1">
-(IBAction)captureScreen:(id)sender {
	UIGraphicsBeginImageContext(self.view.frame.size);
	[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
	UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
	UIGraphicsEndImageContext();
	UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/28/screenshot-programmieren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Neuer YouTube Channel</title>
		<link>http://www.rogerboesch.com/2009/07/24/neuer-youtube-channel/</link>
		<comments>http://www.rogerboesch.com/2009/07/24/neuer-youtube-channel/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 10:53:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Channel]]></category>
		<category><![CDATA[MapKit]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=453</guid>
		<description><![CDATA[Ab heute ist mein neuer YouTube Channel zum Thema iPhone Entwickung online. In regelmässiger Abfolge greife ich darin Themen rund um SDK 3.0 auf. Den Start macht dabei MapKit und Teil 1 ist direkt ab heute verfügbar. Viel Spass beim nachlesen, zusehen und vorallem selber ausprobieren! Wer Lust bekommen hat, mehr über die Programmierung des [...]]]></description>
			<content:encoded><![CDATA[<p>Ab heute ist mein neuer <a title='Original Link: http://www.youtube.com/user/rogerboesch'  href="http://www.rogerboesch.com/?qVzKMOrD" target="_blank">YouTube Channel</a> zum Thema iPhone Entwickung online. In regelmässiger Abfolge greife ich darin Themen rund um SDK 3.0 auf. Den Start macht dabei MapKit und <a href="http://www.rogerboesch.com/2009/07/24/sdk-3-0-mapkit/">Teil 1 </a>ist direkt ab heute verfügbar. Viel Spass beim nachlesen, zusehen und vorallem selber ausprobieren! Wer Lust bekommen hat, mehr über die Programmierung des iPhone zu erfahren, dem möchte ich zudem unsere <a href="http://www.rogerboesch.com/workshops/">Classroom Trainings</a> empfehlen, die einen idealen Schnelleinstieg in die professionelle iPhone Entwicklung ermöglichen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/24/neuer-youtube-channel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

