<?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 &#187; Objective-C</title>
	<atom:link href="http://www.rogerboesch.com/tag/objective-c/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>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>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>
	</channel>
</rss>

