<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.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/" version="2.0">

<channel>
	<title>gergonzalez</title>
	
	<link>http://www.gergonzalez.com</link>
	<description>descubiendo la magia del iPhone SDK</description>
	<lastBuildDate>Tue, 24 Nov 2009 17:29:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/gergonzalez" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="gergonzalez" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">gergonzalez</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.feedness.com/alta/http://feeds.feedburner.com/gergonzalez" src="http://www.feedness.com/ayuda/wp-content/square_b_sh_feed.gif">Subscribe with Feedness</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/gergonzalez" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fgergonzalez" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Nuestro primer videojuego para iPhone – III</title>
		<link>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-iii/</link>
		<comments>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-iii/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 17:29:23 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Casos de Estudio]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.com/?p=369</guid>
		<description><![CDATA[Llevamos ya dos posts y todavía no hemos conseguido que nuestro videojuego sea medianamente jugable. Hoy nos proponemos acabar con esa situación mediante la implementación de la detección de colisiones y la inteligencia artificial de nuestro oponente. Detección de colisiones Llamamos detección de colisiones a la lógica que nos permite detectar cuando dos o más [...]]]></description>
			<content:encoded><![CDATA[<p>Llevamos ya dos posts y todavía no hemos conseguido que nuestro videojuego sea medianamente jugable. Hoy nos proponemos acabar con esa situación mediante la implementación de la detección de colisiones y la inteligencia artificial de nuestro oponente.</p>
<p><a href="http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-iii"><img alt="" src="http://farm3.static.flickr.com/2746/4131323382_95bd737713_o.jpg" class="alignnone" width="618" height="250" /></a></p>
<p><span id="more-369"></span></p>
<h4>Detección de colisiones</h4>
<p>Llamamos detección de colisiones a la lógica que nos permite detectar cuando dos o más sprites, en nuestro caso vistas, chocan entre ellos y en función a esas colisiones actuar en consecuencia.</p>
<p>Para nuestro juego tendremos que detectar cuando la pelota choca con cualquiera de las paletas o en los límites de pantalla, y en cuyo caso producir un cambio en su velocidad con el fin de que se cumpla la<strong> tercera Ley de Newton</strong> o de acción y reacción. No profundizaremos más en el tema, se deja a gusto del lector hacer el juego un poco más divertido con cambios en relación al punto de impacto de la pelota con la raqueta.</p>
<p>Pues vamos a ello, primeramente tendremos que volver a modificar nuestra cabecera <strong>iPingPongViewController.h</strong> declarando nuevas variables instanciadas y un método:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> iPingPongViewController <span style="color: #002200;">:</span> UIViewController <span style="color: #002200;">&#123;</span>
&nbsp;
	UIView <span style="color: #002200;">*</span>player1;
	UIView <span style="color: #002200;">*</span>player2;
&nbsp;
	UIView <span style="color: #002200;">*</span>ball;
&nbsp;
	UILabel <span style="color: #002200;">*</span>player1Score;
	UILabel <span style="color: #002200;">*</span>player2Score;
&nbsp;
	UILabel <span style="color: #002200;">*</span>startLabel;
&nbsp;
	CGPoint ballVelocity;
&nbsp;
	<span style="color: #a61390;">BOOL</span> gameRunning;
&nbsp;
	NSInteger player1ScoreValue;<span style="color: #11740a; font-style: italic;">//New</span>
	NSInteger player2ScoreValue;<span style="color: #11740a; font-style: italic;">//New</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>ball;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>player1;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>player2;
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>player1Score;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>player2Score;
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>startLabel;
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic<span style="color: #002200;">&#41;</span> CGPoint ballVelocity;
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic<span style="color: #002200;">&#41;</span> NSInteger player1ScoreValue;<span style="color: #11740a; font-style: italic;">//New</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic<span style="color: #002200;">&#41;</span> NSInteger player2ScoreValue;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>playAgain<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> newGame;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>No creo que nadie a estas alturas albergue dudas ante el código anterior, simplemente declaramos dos variables instanciadas de tipo NSInteger que almacenarán el tanteo que luego será mostrado por las etiquetas player1Score. Además nos hemos declarado un método que usaremos para controlar quien es el jugador ganador.</p>
<p>Sin más dilación, abrimos <strong>iPingPongViewController.m</strong> e introducimos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#define kBallSpeedX 3</span>
<span style="color: #6e371a;">#define kBallSpeedY 2</span>
&nbsp;
<span style="color: #6e371a;">#define kFPS 0.01</span>
<span style="color: #11740a; font-style: italic;">//New</span>
<span style="color: #6e371a;">#define kScoreToWin 5</span>
&nbsp;
<span style="color: #6e371a;">#import &quot;iPingPongViewController.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> iPingPongViewController
&nbsp;
<span style="color: #a61390;">@synthesize</span> ball, player1, player2, player1Score, player2Score; 
<span style="color: #a61390;">@synthesize</span> startLabel, ballVelocity;
<span style="color: #a61390;">@synthesize</span> player1ScoreValue, player2ScoreValue;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
...
&nbsp;
	<span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTimer</span> scheduledTimerWithTimeInterval<span style="color: #002200;">:</span>kFPS target<span style="color: #002200;">:</span>self 
                      selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>gameLoop<span style="color: #002200;">&#41;</span> userInfo<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> repeats<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>gameLoop<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>gameRunning<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		ball.center <span style="color: #002200;">=</span> 
CGPointMake<span style="color: #002200;">&#40;</span>ball.center.x <span style="color: #002200;">+</span> ballVelocity.x, ball.center.y <span style="color: #002200;">+</span> ballVelocity.y<span style="color: #002200;">&#41;</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Collision Detection</span>
		<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ball.center.x&gt;self.view.bounds.size.width || ball.center.x &lt; <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
&nbsp;
			ballVelocity.x <span style="color: #002200;">=</span> <span style="color: #002200;">-</span>ballVelocity.x;	
		<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ball.center.y&gt;self.view.bounds.size.height || ball.center.y &lt; <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
&nbsp;
			ballVelocity.y <span style="color: #002200;">=</span> <span style="color: #002200;">-</span>ballVelocity.y;
		<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>CGRectIntersectsRect <span style="color: #002200;">&#40;</span>ball.frame, player1.frame<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
			<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>ball.center.y &lt; player1.center.y<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
				ballVelocity.y <span style="color: #002200;">=</span> <span style="color: #002200;">-</span>ballVelocity.y<span style="color: #002200;">-</span><span style="color: #2400d9;">0.1</span>;
			<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>CGRectIntersectsRect <span style="color: #002200;">&#40;</span>ball.frame, player2.frame<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
			<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>ball.center.y &lt; player2.center.y<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
				ballVelocity.y <span style="color: #002200;">=</span> <span style="color: #002200;">-</span>ballVelocity.y<span style="color: #002200;">+</span><span style="color: #2400d9;">0.1</span>;
			<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #002200;">&#125;</span>	
&nbsp;
		<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ball.center.y &lt;<span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
			player1ScoreValue<span style="color: #002200;">++</span>;
			ballVelocity <span style="color: #002200;">=</span> CGPointMake<span style="color: #002200;">&#40;</span>kBallSpeedX, kBallSpeedY<span style="color: #002200;">&#41;</span>;
			<span style="color: #002200;">&#91;</span>self playAgain<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>player1ScoreValue &gt;<span style="color: #002200;">=</span> kScoreToWin<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ball.center.y &gt; self.view.bounds.size.height<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
			player2ScoreValue<span style="color: #002200;">++</span>;
			ballVelocity <span style="color: #002200;">=</span> CGPointMake<span style="color: #002200;">&#40;</span>kBallSpeedX, kBallSpeedY<span style="color: #002200;">&#41;</span>;
			<span style="color: #002200;">&#91;</span>self playAgain<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>player2ScoreValue &gt;<span style="color: #002200;">=</span> kScoreToWin<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
&nbsp;
			<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>startLabel.hidden<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
				startLabel.hidden <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;
			<span style="color: #002200;">&#125;</span>
&nbsp;
		<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>playAgain<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> newGame <span style="color: #002200;">&#123;</span>
	gameRunning <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;
	ball.center <span style="color: #002200;">=</span> self.view.center;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>newGame<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>player2ScoreValue &gt; player1ScoreValue<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
			startLabel.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;PLAYER 2 WINS!&quot;</span>;
		<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
			startLabel.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;PLAYER 1 WINS!&quot;</span>;
		<span style="color: #002200;">&#125;</span>
&nbsp;
		player2ScoreValue <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
		player1ScoreValue <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		startLabel.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;TAP TO START GAME&quot;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	player1Score.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%d&quot;</span>,player1ScoreValue<span style="color: #002200;">&#93;</span>;
	player2Score.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%d&quot;</span>,player2ScoreValue<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
...</pre></td></tr></table></div>

<p>Al igual que en posts anteriores hacemos uso de constantes, en este caso para representar el número de puntos necesarios para ganar. Ya en nuestro método <strong>gameloop</strong> vemos como para la implementación de la detección de colisiones simplemente utilizamos cláusulas condicionales if para testear si la pelota se encuentra o tocando los bordes de la pantalla en cuyo caso cambia su velocidad con respecto al eje x, o interseccionando con la paleta, modificando entonces su velocidad en el eje y, y añadiéndole un factor para que la velocidad vaya aumentando en función a los golpes devueltos. Para evitar el molesto efecto que se produce a veces de que la pelota queda atrapada en nuestra paleta hemos introducido un if más que chequea esta problemática.</p>
<p>Lo siguiente que hacemos es comprobar cuando la pelota toca los bordes inferior y superior de nuestra pantalla y que suponen que un jugador ha logrado un punto, por lo tanto se aumenta la variable habilitada para tal fin y se llama al método que acabamos de declarar <strong>playAgain</strong>, el cual comprueba si hemos alcanzado el número de puntos necesarios para ganar, mostrando el mensaje correspondiente. También desde este método se actualizan las etiquetas que utilizamos como marcador.</p>
<p>Si simulamos ahora veremos como la pelota ya no desaparece de nuestra pantalla, ya que al llegar a una pared esta choca y cambia su dirección manteniéndose en la pantalla, lo mismo ocurre al colisionar con cualquiera de las dos paletas. Nuestro problema reside ahora en que nuestro oponente nos observa impertérrito y no hace ni ademán de devolvernos la pelota&#8230;</p>
<h4>IA</h4>
<p>Una vez implementada la detección de colisiones tenemos que hacer que la vista player2 interactúe con nosotros y nos intente devolver la pelota o lo que es lo mismo, asignarle una ia. Debido al carácter de nuestro caso de estudio, no vamos a profundizar en complejos sistemas para simular inteligencias artificiales, algo completamente fuera del alcance de este caso de estudio.</p>
<p>Por lo tanto vamos a crear una sencilla ia, para ello nuestro competidor empezará su movimiento en el momento en que la pelota sobrepase la red, y su movimiento consistirá en que a partir de este momento seguirá la dirección de la pelota, una constante que llamaremos kPlayer2Speed será el que controlará la velocidad de nuestro competidor y determinará el nivel de dificultad de este.</p>
<p>Pues vamos a ello, esta vez no necesitamos reescribir nuestro header, por eso en <strong>iPingPongViewController.m</strong> declararemos la constante antes nombrada y la lógica de comportamiento de nuestro oponente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#define kBallSpeedX 3</span>
<span style="color: #6e371a;">#define kBallSpeedY 2</span>
&nbsp;
<span style="color: #6e371a;">#define kFPS 0.01</span>
<span style="color: #6e371a;">#define kScoreToWin 5</span>
<span style="color: #11740a; font-style: italic;">//New</span>
<span style="color: #6e371a;">#define kPlayer2Speed 3</span>
&nbsp;
...
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>gameLoop<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>gameRunning<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>	
...		
               <span style="color: #11740a; font-style: italic;">//AI</span>
		<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ball.center.y &lt;<span style="color: #002200;">=</span> self.view.center.y<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
			<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ball.center.x &lt; player2.center.x<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
				player2.center <span style="color: #002200;">=</span> 
        CGPointMake<span style="color: #002200;">&#40;</span>player2.center.x <span style="color: #002200;">-</span> kPlayer2Speed, player2.center.y<span style="color: #002200;">&#41;</span>;
			<span style="color: #002200;">&#125;</span>
&nbsp;
			<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ball.center.x &gt; player2.center.x<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
				player2.center <span style="color: #002200;">=</span> 
         CGPointMake<span style="color: #002200;">&#40;</span>player2.center.x <span style="color: #002200;">+</span> kPlayer2Speed, player2.center.y<span style="color: #002200;">&#41;</span>;
			<span style="color: #002200;">&#125;</span>
		<span style="color: #002200;">&#125;</span>
&nbsp;
...</pre></td></tr></table></div>

<p>Como vemos nuestra lógica consiste en lo anteriormente explicado, comprobamos que la pelota sobrepasa la red y entonces nuestra vista player2 cambiará sus coordenadas con respecto a x en la misma dirección en la que se mueve la pelota con una velocidad determinada por la constante kPlayer2Speed. Tan simple como eso.</p>
<p>Pues ya está, ahora ya podemos simular y ver nuestro juego en acción, muy limitado y poco trabajado, pero ahora es cosa de cada uno mejorarlo a partir de las premisas dadas. Buena Suerte. En próximos post ya terminaremos este caso de estudio, mediante la introducción de un menú y sonidos. Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-iii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nuestro primer videojuego para iPhone – II</title>
		<link>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-ii/</link>
		<comments>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-ii/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 12:16:07 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Casos de Estudio]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.com/?p=349</guid>
		<description><![CDATA[Ya estamos de vuelta con nuestro caso de estudio sobre la creación de un videojuego, después de implementar la interfaz gráfica en el post anterior, hoy vamos a ver como darle un poco de vida mediante la implementación del Game Loop y de la interacción con el usuario. Game Loop El Game Loop, o bucle [...]]]></description>
			<content:encoded><![CDATA[<p>Ya estamos de vuelta con nuestro caso de estudio sobre la creación de un videojuego, después de implementar la interfaz gráfica en el post anterior, hoy vamos a ver como darle un poco de vida mediante la implementación del Game Loop y de la interacción con el usuario.</p>
<p><a href="http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-ii/"><img alt="" src="http://farm3.static.flickr.com/2712/4127150103_b984414d43_o.jpg" class="alignnone" width="618" height="250" /></a></p>
<p><span id="more-349"></span></p>
<h4>Game Loop</h4>
<p>El Game Loop, o bucle de juego (¡qué difícil es adaptar términos al castellano!), es una de las partes más importantes de un videojuego, se podría decir que es el corazón de nuestro juego, siendo cada iteración del bucle como un latido, y al igual que a nosotros nos es imposible vivir sin un corazón, a un videojuego le sería imposible existir sin su Game Loop.</p>
<p>Hay infinidad de técnicas para implementar el Game Loop, queda en manos del programador y de las características de la plataforma en la que se trabaja la elección de este. Para este ejemplo no hemos entrado a analizar el grado de optimización de los recursos de nuestro iPhone, simplemente nos hemos limitado a que fuera sencillo y funcional.</p>
<p>Bueno, pues vamos a ir completando nuestro código anterior con el fin de implementar nuestro Game Loop, para ello en el header de nuestra clase <strong>iPingPongViewController.h</strong> declararemos una nueva variable instanciada que llamaremos <strong>ballVelocity</strong>, la cual no es más que una estructura del tipo CGPoint que contendrá un par de coordenadas que usaremos para definir la velocidad de nuestra pelota durante la ejecución, y también una variable del tipo BOOL y una etiqueta que usaremos para evitar que el juego empiece a ejecutarse nada más cargarse:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> iPingPongViewController <span style="color: #002200;">:</span> UIViewController <span style="color: #002200;">&#123;</span>
&nbsp;
	UIView <span style="color: #002200;">*</span>player1;
	UIView <span style="color: #002200;">*</span>player2;
	UIView <span style="color: #002200;">*</span>ball;
&nbsp;
	UILabel <span style="color: #002200;">*</span>player1Score;
	UILabel <span style="color: #002200;">*</span>player2Score;
        UILabel <span style="color: #002200;">*</span>startLabel;<span style="color: #11740a; font-style: italic;">//New	</span>
&nbsp;
	CGPoint ballVelocity;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
	<span style="color: #a61390;">BOOL</span> gameRunning;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>ball;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>player1;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>player2;
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>player1Score;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>player2Score;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>startLabel;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic<span style="color: #002200;">&#41;</span> CGPoint ballVelocity;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>El siguiente paso consistirá en abrir <strong>iPingPongViewController.m</strong> y, al igual que para implementar nuestra interfaz, sobrecargaremos el método <strong>loadView</strong> para inicializar nuestras nuevas variables y crearemos una instancia de <strong>NSTimer</strong> que llamará a nuestro evento <strong>gameLoop</strong>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//New</span>
<span style="color: #6e371a;">#define kBallSpeedX 3</span>
<span style="color: #6e371a;">#define kBallSpeedY 2</span>
&nbsp;
<span style="color: #6e371a;">#define kFPS 0.01</span>
&nbsp;
<span style="color: #6e371a;">#import &quot;iPingPongViewController.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> iPingPongViewController
&nbsp;
<span style="color: #a61390;">@synthesize</span> ball, player1, player2, player1Score, player2Score;
<span style="color: #a61390;">@synthesize</span> startLabel, ballVelocity;<span style="color: #11740a; font-style: italic;">//New</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Implement loadView to create a view hierarchy programmatically,</span>
<span style="color: #11740a; font-style: italic;">// without using a nib.</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>loadView <span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Create the main view and assign a black color to background</span>
	CGRect backgroundFrame <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIScreen mainScreen<span style="color: #002200;">&#93;</span> applicationFrame<span style="color: #002200;">&#93;</span>;
        ...	
&nbsp;
	<span style="color: #11740a; font-style: italic;">//New</span>
	<span style="color: #11740a; font-style: italic;">//Tap to Start Label</span>
	startLabel <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UILabel alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
                             CGRectMake<span style="color: #002200;">&#40;</span>self.view.center.x<span style="color: #002200;">-</span><span style="color: #2400d9;">50</span>, <span style="color: #2400d9;">200</span>, <span style="color: #2400d9;">100</span>, <span style="color: #2400d9;">15</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	startLabel.font <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIFont fontWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Helvetica&quot;</span> size<span style="color: #002200;">:</span><span style="color: #2400d9;">12</span><span style="color: #002200;">&#93;</span>;
	startLabel.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;TAP TO START GAME&quot;</span>;
	startLabel.textColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor whiteColor<span style="color: #002200;">&#93;</span>;
	startLabel.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor blackColor<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>startLabel<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Game start Paused</span>
	gameRunning <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;
&nbsp;
	ballVelocity <span style="color: #002200;">=</span> CGPointMake<span style="color: #002200;">&#40;</span>kBallSpeedX, kBallSpeedY<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTimer</span> scheduledTimerWithTimeInterval<span style="color: #002200;">:</span>kFPS target<span style="color: #002200;">:</span>self 
selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>gameLoop<span style="color: #002200;">&#41;</span> userInfo<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> repeats<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>gameLoop<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>gameRunning<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
	ball.center <span style="color: #002200;">=</span> 
CGPointMake<span style="color: #002200;">&#40;</span>ball.center.x <span style="color: #002200;">+</span> ballVelocity.x, ball.center.y <span style="color: #002200;">+</span> ballVelocity.y<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
&nbsp;
		<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>startLabel.hidden<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
			startLabel.hidden <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;
		<span style="color: #002200;">&#125;</span>			
         <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
...
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>player1 release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>player2 release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>ball release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>player1Score release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>player2Score release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>startLabel release<span style="color: #002200;">&#93;</span>;<span style="color: #11740a; font-style: italic;">//New</span>
        <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>En el código superior vemos como primeramente nos hemos definido una serie de constantes que representan la velocidad de la pelota y la cantidad de frames por segundo (FPS), o lo que es lo mismo, el tiempo en milisegundos que nuestro timer tardará en llamar al Game Loop. Ya en <strong>loadView</strong> hemos inicializado la nueva etiqueta, el estado del juego, la velocidad de la pelota y, como hemos dicho antes, hemos creado una instancia de NSTimer que ejecutará nuestro Game Loop cada x tiempo en función a la constante kFPS que hayamos elegido.</p>
<p>Después hemos creado un nuevo método llamado <strong>gameLoop</strong> en el cual, por ahora, simplemente comprobamos el estado del juego mediante gameRunning y en caso de ser positivo cambiamos la posición de la variable ball sumándole la velocidad de la pelota en la coodenada correspondiente, de esta manera implementamos el movimiento de la pelota en función del tiempo.</p>
<p>Si simulamos no pasa nada, veremos nuestra interfaz anterior más una etiqueta que nos incita a tocar la pantalla, pero al hacerlo no ocurre nada, vamos a solucionarlo.</p>
<h4>Control</h4>
<p>Una de principales características del dispositivo iPhone es la carencia de un teclado físico, esta carencia es suplida por una interfaz táctil que nos permite registrar cada uno de los toques que se producen en la pantalla del terminal. Con estas características decidimos que la mejor manera de implementar nuestra interacción con el usuario es mediante el movimiento de nuestra paleta a la par que nuestro dedo, sin perder su posición con respecto al eje y, pero sí en x.</p>
<p>Entonces, para implementar un control como el descrito, abrimos de nuevo <strong>iPingPongViewController.m</strong> y copiamos en el lugar correspondiente los siguientes métodos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">...
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>didReceiveMemoryWarning <span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">// Releases the view if it doesn't have a superview.</span>
    <span style="color: #002200;">&#91;</span>super didReceiveMemoryWarning<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//New</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>touchesBegan<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSSet</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>touches withEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIEvent <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>event <span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>gameRunning<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		startLabel.hidden <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;
		gameRunning <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>gameRunning<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>self touchesMoved<span style="color: #002200;">:</span>touches withEvent<span style="color: #002200;">:</span>event<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>	
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>touchesMoved<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSSet</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>touches withEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIEvent <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>event<span style="color: #002200;">&#123;</span>
&nbsp;
	UITouch <span style="color: #002200;">*</span>touch <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>event allTouches<span style="color: #002200;">&#93;</span> anyObject<span style="color: #002200;">&#93;</span>;
	CGPoint location <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>touch locationInView<span style="color: #002200;">:</span>self.view<span style="color: #002200;">&#93;</span>;
	player1.center <span style="color: #002200;">=</span> CGPointMake<span style="color: #002200;">&#40;</span>location.x, player1.center.y<span style="color: #002200;">&#41;</span>;;
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
...</pre></td></tr></table></div>

<p>Como se observa, hemos sobrecargado touchesBegan para hacer que el juego empiece cuando se pulse por primera vez la pantalla, para ello simplemente testeamos el estado del juego y en caso de estar pausado lo ponemos en estado de ejecución y ocultamos la etiqueta <strong>startLabel</strong>. </p>
<p>En lo que se refiere al control del juego propiamente dicho, hemos decidido hacerlo lo más sencillo posible, simplemente con la sobrecarga de <strong>touchesMoved</strong> asignamos a la vista <strong>player1</strong> las coordenadas en x que obtenemos del toque del dedo en la vista principal, manteniendo constante la coordenada con respecto a y.</p>
<p>En esta ocasión, al simular, veremos como nuestra pelota se mueve hasta desaparecer de pantalla, es normal, no hay límites que produzcan un cambio en su dirección y velocidad. Lo que si observaremos es como si movemos el dedo por la pantalla nuestra raqueta se mueve por el eje x al igual que nuestro dedo.</p>
<p>Pues por hoy ya es suficiente, más adelante implementaremos la detección de colisiones y una sencilla inteligencia artificial para nuestro oponente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nuestro primer videojuego para iPhone – I</title>
		<link>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-i/</link>
		<comments>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-i/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 09:44:17 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Casos de Estudio]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.com/?p=315</guid>
		<description><![CDATA[Nuevo diseño y nuevo enfoque más orientado al mundo de los videojuegos, por ello, durante este post y sucesivos nos dedicaremos a programar cierto clásico imperecedero que emulaba el tenis de mesa. El juego original Creado en 1972 por Atari, pong es uno de los primeros videojuegos de la historia y como tal forma parte [...]]]></description>
			<content:encoded><![CDATA[<p>Nuevo diseño y nuevo enfoque más orientado al mundo de los videojuegos, por ello, durante este post y sucesivos nos dedicaremos a programar cierto clásico imperecedero que emulaba el tenis de mesa.<br />
<a href="http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-i/"><img alt="" src="http://farm3.static.flickr.com/2747/4118782737_b88354e83e_o.jpg" class="alignnone" width="618" height="250" /></a><br />
<span id="more-315"></span></p>
<h4>El juego original</h4>
<p>Creado en 1972 por Atari, pong es uno de los primeros videojuegos de la historia y como tal forma parte de nuestro legado y recuerdo. Considerado un videojuego perteneciente al género deportivo, pong simulaba, con mucha imaginación eso sí, el tenis de mesa o ping-pong. </p>
<p>La mecánica de juego era realmente sencilla, un jugador controlaba una pala, normalmente la de la parte izquierda, mientras que la otra era controlada por la máquina o por otro jugador. El objetivo consistía en que uno de los jugadores consiguiera más puntos que el oponente, obteniendo esos puntos cuando el jugador adversario fallaba al devolver la pelota.</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/LPkUvfL8T1I&#038;hl=es_ES&#038;fs=1&#038;iv_load_policy=3&#038;rel=0&#038;color1=0x006699&#038;color2=0x54abd6"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/LPkUvfL8T1I&#038;hl=es_ES&#038;fs=1&#038;iv_load_policy=3&#038;rel=0&#038;color1=0x006699&#038;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<h4>Empezando</h4>
<p>Para empezar lo primero que debemos hacer es ejecutar <strong>Xcode</strong> y crear un nuevo proyecto, <strong>File &gt; New Project</strong> o <strong>⌘⇧N</strong>, elegimos el template <strong>View-Based Application</strong>, pulsamos <strong>choose&#8230;</strong> le ponemos de nombre <strong>iPingPong</strong> y aceptamos.</p>
<h4>Interfaz gráfica</h4>
<p>Nuestra intención es lograr la interfaz original que se muestra en la imagen inferior. Para ello debemos identificar que variables instanciadas vamos a declarar en nuestra clase <strong>iPingPongViewController</strong>, a simple vista observamos tres vistas para las palas <strong>(player1, player2)</strong> y la pelota <strong>(ball)</strong>, y dos etiquetas para el marcador <strong>(player1Score, player2Score)</strong>, para la red no es necesario declarar ninguna variable, ya que es un mero elemento decorativo y no cambiará su valor durante la ejecución de nuestro juego.</p>
<p style="text-align:center;"><img src="http://www.gergonzalez.com/wp-content/uploads/2009/11/iPingPong.jpg" alt="iPingPong" title="iPingPong" width="323" height="600" class="aligncenter size-full wp-image-331" style="border:none;"/></p>
<p>Una vez claras las variables, abrimos <strong>iPingPongViewController.h</strong> e introducimos el siguiente código para declararlas:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> iPingPongViewController <span style="color: #002200;">:</span> UIViewController <span style="color: #002200;">&#123;</span>
&nbsp;
	UIView <span style="color: #002200;">*</span>player1;
	UIView <span style="color: #002200;">*</span>player2;	
	UIView <span style="color: #002200;">*</span>ball;
&nbsp;
	UILabel <span style="color: #002200;">*</span>player1Score;
	UILabel <span style="color: #002200;">*</span>player2Score;	
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>ball;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>player1;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIView <span style="color: #002200;">*</span>player2;
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>player1Score;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>player2Score;
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Antes de seguir ocultaremos el status bar que nos hace perder 20px de superficie de juego, abrimos <strong>iPingPong-info.plist</strong>, añadimos &#8220;<strong>status bar is initially hidden&#8221;</strong> y activamos el checkbutton.</p>
<p><img src="http://www.gergonzalez.com/wp-content/uploads/2009/11/statusbar1.jpg" alt="statusbar" title="statusbar" width="618" height="355" class="aligncenter size-full wp-image-335" /></p>
<p>Lo siguiente será inicializar nuestras variables instanciadas haciendo uso del método loadView() con los valores necesarios para obtener nuestro interfaz, para ello vamos a <strong>iPingPongViewController.m</strong> y copiamos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;iPingPongViewController.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> iPingPongViewController
&nbsp;
<span style="color: #a61390;">@synthesize</span> ball, player1, player2, player1Score, player2Score;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Implement loadView to create a view hierarchy programmatically,</span>
<span style="color: #11740a; font-style: italic;">// without using a nib.</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>loadView <span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Create the main view and assign a black color to background</span>
	CGRect backgroundFrame <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIScreen mainScreen<span style="color: #002200;">&#93;</span> applicationFrame<span style="color: #002200;">&#93;</span>;
	UIView <span style="color: #002200;">*</span>view <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>backgroundFrame<span style="color: #002200;">&#93;</span>;
	view.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor blackColor<span style="color: #002200;">&#93;</span>;
	self.view <span style="color: #002200;">=</span> view;
	<span style="color: #002200;">&#91;</span>view release<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Create the net</span>
	<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> i<span style="color: #002200;">=</span><span style="color: #2400d9;">0</span>; i&lt;<span style="color: #2400d9;">20</span>; i<span style="color: #002200;">++</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		UIView <span style="color: #002200;">*</span>net <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
                           CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">16</span><span style="color: #002200;">*</span>i, self.view.center.y<span style="color: #002200;">-</span><span style="color: #2400d9;">2</span>, <span style="color: #2400d9;">8</span>, <span style="color: #2400d9;">4</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
		net.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor lightGrayColor<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>net<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>net release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Create the Score</span>
	player1Score <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UILabel alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
			         CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">10</span>, <span style="color: #2400d9;">190</span>, <span style="color: #2400d9;">30</span>, <span style="color: #2400d9;">30</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	player1Score.font <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIFont fontWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Helvetica&quot;</span> size<span style="color: #002200;">:</span><span style="color: #2400d9;">30</span><span style="color: #002200;">&#93;</span>;
	player1Score.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;0&quot;</span>;
	player1Score.textColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor whiteColor<span style="color: #002200;">&#93;</span>;
	player1Score.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor blackColor<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>player1Score<span style="color: #002200;">&#93;</span>;
&nbsp;
	player2Score <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UILabel alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
				 CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">10</span>, <span style="color: #2400d9;">260</span>, <span style="color: #2400d9;">30</span>, <span style="color: #2400d9;">30</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	player2Score.font <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIFont fontWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Helvetica&quot;</span> size<span style="color: #002200;">:</span><span style="color: #2400d9;">30</span><span style="color: #002200;">&#93;</span>;
	player2Score.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;0&quot;</span>;
	player2Score.textColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor whiteColor<span style="color: #002200;">&#93;</span>;
	player2Score.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor blackColor<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>player2Score<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Create our elements</span>
	player1 <span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
			  CGRectMake<span style="color: #002200;">&#40;</span>self.view.center.x<span style="color: #002200;">-</span><span style="color: #2400d9;">25</span>, <span style="color: #2400d9;">420</span>, <span style="color: #2400d9;">50</span>, <span style="color: #2400d9;">10</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	player1.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor whiteColor<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>player1<span style="color: #002200;">&#93;</span>;
&nbsp;
	player2 <span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
			  CGRectMake<span style="color: #002200;">&#40;</span>self.view.center.x<span style="color: #002200;">-</span><span style="color: #2400d9;">25</span>, <span style="color: #2400d9;">50</span>, <span style="color: #2400d9;">50</span>, <span style="color: #2400d9;">10</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	player2.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor whiteColor<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>player2<span style="color: #002200;">&#93;</span>;
&nbsp;
	ball <span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
		   CGRectMake<span style="color: #002200;">&#40;</span>self.view.center.x<span style="color: #002200;">-</span><span style="color: #2400d9;">4</span>, self.view.center.y<span style="color: #002200;">-</span><span style="color: #2400d9;">4</span>, <span style="color: #2400d9;">8</span>, <span style="color: #2400d9;">8</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	ball.backgroundColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIColor whiteColor<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>ball<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>didReceiveMemoryWarning <span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">// Releases the view if it doesn't have a superview.</span>
    <span style="color: #002200;">&#91;</span>super didReceiveMemoryWarning<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>player1 release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>player2 release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>ball release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>player1Score release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>player2Score release<span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>En el código podemos observar como todas las vistas se inicializan con un color, tamaño y coordenadas y se asignan a la vista principal. Igual ocurre con las etiquetas, pero asignándoles un tamaño y tipo de letra. Para la red utilizamos un bucle for para instanciar las UIViews (vistas) que la formarán. Y ya para acabar, no debemos olvidar el uso del método <strong>dealloc()</strong> para limpiar los recursos alojados.</p>
<p>Ahora sólo nos queda <strong>simular</strong> para poder disfrutar de nuestra interfaz gráfica. </p>
<p>Y esto es todo, ya en sucesivos posts se le otorgará interactividad y movimiento. Si encontráis algún error o tenéis alguna duda o pregunta no dudéis en comentar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/casos-de-estudio/nuestro-primer-videojuego-para-iphone-i/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Videojuegos &amp; Arte – I</title>
		<link>http://www.gergonzalez.com/especiales/videojuegos-arte-i/</link>
		<comments>http://www.gergonzalez.com/especiales/videojuegos-arte-i/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 20:08:02 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Especiales]]></category>
		<category><![CDATA[cultura]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.com/?p=188</guid>
		<description><![CDATA[Como ya comenté en el post de introducción, cuando me propuse comenzar este blog pretendía también hablar sobre videojuegos, pero no de la manera habitual, sino mediante una serie de posts intentando demostrar que los videojuegos no son sólo una inocua diversión sino que también son arte, cultura y es necesario tratarlos como tales. Por [...]]]></description>
			<content:encoded><![CDATA[<p>Como ya comenté en el <a href="http://www.gergonzalez.com/sobre-mi/introduccion/">post de introducción</a>, cuando me propuse comenzar este blog pretendía también hablar sobre videojuegos, pero no de la manera habitual, sino mediante una serie de posts intentando demostrar que los videojuegos no son sólo una inocua diversión sino que también son arte, cultura y es necesario tratarlos como tales. Por eso, como primer post dedicado a esta temática, el que para la subjetiva visión de un servidor es el mejor videojuego de todos los tiempos, <a href="http://www.youtube.com/watch?v=EHzHoMT5eRg">por ahora&#8230;</a><br />
<a href="http://www.gergonzalez.com/analisis/videojuegos-arte-i/"><img class="alignnone" title="Pulse para leer más" src="http://farm3.static.flickr.com/2522/4111819593_afd270da09_o.jpg" alt="Post V" width="618" height="300" /></a><br />
<span id="more-188"></span></p>
<h4>El juego</h4>
<p>Shadow of the Colossus fue lanzado en Europa en 2006 para la plataforma <strong>SONY PS2</strong> y desarrollado por el <strong>TEAM ICO</strong>, cuyo máximo responsable es un genio de nombre <strong><a href="http://en.wikipedia.org/wiki/Fumito_Ueda">Fumito Ueda</a></strong>. Perteneciente al género de acción-aventura, en general tuvo una buena acogida, aunque nunca fue reconocido en su conjunto por una gran parte tanto de crítica como de público, que lo tacharon de corto, repetitivo e incluso, por momentos, incontrolable.</p>
<h4>La historia</h4>
<p>La historia de Shadow of the Colossus es la épica historia de un solitario héroe, Wander, que junto a la inestimable ayuda de su fiel compañero el caballo Agro atravesó peligrosos acantilados, frondosos bosques y parajes inhóspitos para llegar a una tierra prohibida para los humanos, lugar donde habitaba el ser de nombre Dormin, capaz de devolver la vida de su bella amada Momo, asesinada por injustos motivos.</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/1sS_rHO6Vjc&#038;hl=es_ES&#038;fs=1&#038;rel=0&#038;color1=0x006699&#038;color2=0x54abd6"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/1sS_rHO6Vjc&#038;hl=es_ES&#038;fs=1&#038;rel=0&#038;color1=0x006699&#038;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
<p>Para lograr el ansiado fin, Dormin encomendará a Wander la dificil tarea de dar muerte a todos los colosos que habitan este mágico mundo, aún a riesgo de perder su vida, ya que según Wander va dando muerte a los colosos, este va sufriendo un progresivo debilitamiento, que lo van llevando cada vez más hacia un mundo de oscuridad y padecimiento&#8230;</p>
<h4>Excelencia técnica</h4>
<p>El apartado técnico de Shadow of the Colossus es sencillamente genial:</p>
<ul>
<li> Un apartado gráfico alucinante que recrea un mundo con aroma medival casi Tolkieniano que es el sello distintivo de todos los juegos de Ueda. En lo puramente técnico hace uso de un motion blur y de un sistema de partículas espectacular durante los enfrentamientos, así como de un inmersivo uso de la luz.</li>
<li>La música es escasa, sólo durante los enfrentamientos y en las cinemáticas, pero de una belleza suma, como puede escucharse en la intro. El resto del tiempo predominan sonidos de la naturaleza que no hacen más que acrecentar la sensación de soledad del héroe.</li>
<li>La inteligencia artificial es otro de los puntos fuertes del juego, tanto los colosos como el fiel caballo agro responden de manera realista a las acciones de Wander, no son meras comparsas de eventos repetivos.</li>
<li> Y por último las animaciones, tanto del personaje principal como del caballo o los colosos, que recrean de manera excepcional los movientos de estos.</li>
</ul>
<p>Realmente el único fallo a nivel técnico que se le puede achacar es un descenso de frame rate durante las batallas contra los colosos, si bien es notorio en algunos momentos, no es tan molesto como se criticó y bien puede ser achacable a que la PS2 no estaba preparada a nivel hardware para esta maravilla gráfica.<br />
<img src="http://www.gergonzalez.com/wp-content/uploads/2009/09/Shadow_of_the_Colossus_playstation.jpg" alt="Shadow_of_the_Colossus" title="Shadow_of_the_Colossus" width="618" height="464" class="aligncenter size-full wp-image-247" /></p>
<h4>¿Qué hace de Shadow of the Colossus una obra maestra?</h4>
<p>Pues no es dificil llegar a la conclusión después de mi enfervorizado analisis anterior. Una historia épica y romántica que culmina de manera magistral y que nos hace soltar una lagrimita al acabar, un apartado técnico fuera de serie, y sobretodo una capacidad de inmersión e implicación que hacen que recorras la inhóspita y solitaria tierra prohibida compartiendo la carga del protagonista y la hagas tuya propia.</p>
<p>Por eso, Shadow of the Colossus no se juega, se siente.</p>
<p>Como ya he comentado en más de una ocasión, es magia en estado puro&#8230; o mejor dicho, <a href="http://es.wikipedia.org/wiki/Arte" target="_blank">ARTE</a>.</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/especiales/videojuegos-arte-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuestra primera App</title>
		<link>http://www.gergonzalez.com/tutoriales/nuestra-primera-app/</link>
		<comments>http://www.gergonzalez.com/tutoriales/nuestra-primera-app/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 22:04:29 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.com/?p=166</guid>
		<description><![CDATA[Ya van tres post y todavía no he mostrado ni una sola línea de código, que tal si hoy realizamos nuestro bautismo de fuego realizando, en 4 sencillos pasos, el sempiterno &#8220;Hello World&#8221;. Paso 1 Lo primero es ejecutar Xcode, este se encuentra en la ruta HD&#62;Developer&#62;Aplications, es recomendable ponerlo en el Dock si se [...]]]></description>
			<content:encoded><![CDATA[<p>Ya van tres post y todavía no he mostrado ni una sola línea de código, que tal si hoy realizamos nuestro bautismo de fuego realizando, en<strong> 4 sencillos pasos</strong>, el sempiterno <strong>&#8220;Hello World&#8221;</strong>.</p>
<p><a href="http://www.gergonzalez.com/tutoriales/nuestra-primera-app/"><img class=" alignnone" title="Pulse la imagen para leer más" src="http://farm3.static.flickr.com/2607/4112829118_3386062dbb_o.jpg" alt="" width="618" height="200" /></a></p>
<p><span id="more-166"></span></p>
<h4>Paso 1</h4>
<p>Lo primero es ejecutar <strong>Xcode</strong>, este se encuentra en la ruta <strong>HD&gt;Developer&gt;Aplications</strong>, es recomendable ponerlo en el Dock si se tiene intención de usarlo más a menudo,<em> productividad, chicos, productividad</em>.</p>
<p>Si es la primera vez que se ejecuta Xcode se mostrará una ventana de bienvenida con diversos contenidos de ayuda, se cierra y si se quiere se puede desmarcar la opción &#8220;Show at launch&#8221; para evitar que nos vuelva a aparecer.</p>
<p><img class="aligncenter size-full wp-image-253" title="new_project" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/new_project.jpg" alt="new_project" width="618" height="400" /><br />
Lo siguiente es crear un nuevo proyecto, para ello, en la barra de menú seleccionamos <strong>File &gt; New Project</strong>, o mediante el atajo de teclado <strong>⌘⇧N</strong>. Esta acción nos mostrará la ventana de asistente de nuevo proyecto, en esta ventana se observa que el panel izquierdo se divide en dos secciones, <em>iPhone y Mac OS X</em>, y cada una de ellas en distintas subsecciones o categorías, como nuestra intención es crear una app para iPhone elegimos <strong>la sección iPhone y la categoría Application</strong>, lo cual nos descubre en el panel derecho una serie de templates, elegimos la opción <strong>View-Based Application</strong>, pulsamos en <strong>Choose&#8230;</strong>, le asignamos el nombre <em>HelloWorld</em> y pulsamos <strong>Save</strong>.</p>
<h4>Paso 2</h4>
<p>Nuestra primera ventana de proyecto de Xcode, como ya tendremos tiempo de explicar lo que significa cada cosa, nos centramos en nuestro objetivo. Por ello, si observamos en el panel izquierdo se muestran una serie de carpetas, expandimos la <strong>carpeta Resources</strong> y hacemos doble click en <strong>HelloWorldViewController.xib</strong>.</p>
<p><img class="aligncenter size-full wp-image-255" title="xcode" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/xcode.jpg" alt="xcode" width="618" height="400" /></p>
<h4>Paso 3</h4>
<p>La acción anterior nos abre automáticamente otra parte fundamental del SDK, el llamado Interface Builder, que nos permitirá crear la apariencia gráfica de nuestras aplicaciones de manera sencilla y visual.</p>
<p><img class="aligncenter size-full wp-image-252" title="ib" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/ib.jpg" alt="ib" width="618" height="400" /></p>
<p>Si es la primera vez que utilizamos Interface Builder, nos aparecerá una pantalla parecida a la de la imagen superior, si no os aparece ninguna paleta se pueden mostrar mediante la barra de menú <em>Tools &gt; Library</em> y <em>Tools &gt; Inspector</em>.</p>
<p>Nuestro siguiente paso será ir a la paleta <strong>Library</strong> y en <strong>Cocoa Touch &gt; Inputs &amp; Values</strong> arrastrar el objeto <strong>Label</strong> a nuestra vista, la cual podemos hacer aparecer en caso de estar oculta haciendo doble click en <em>View</em> de la ventana <em>HelloWorldViewController.xib</em>. A partir de aquí ya es cosa vuestra modificar tanto la vista como la etiqueta mediante el Inspector. Guardamos los cambios realizados mediante <strong>File&gt; Save</strong> o <strong>⌘S</strong>, <strong>cerramos Interface Builder</strong> y volvemos a Xcode.</p>
<h4>Paso 4</h4>
<p>Y ya por último, de vuelta en Xcode, <strong>Build&gt;Build and Run</strong>, o en el icono del martillo con el símbolo de play que se encuentra en la parte superior central de la ventana de Xcode.<br />
<img class="aligncenter size-full wp-image-254" title="simulator" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/simulator.jpg" alt="simulator" width="618" height="400" /><br />
Esto es todo, sin escribir una sola línea de código, esta es la magia del SDK, nuestra primera App, una aplicación que lo único que hace es mostrar Hello World en nuestros flamantes iPhones e iPod Touchs, no muy diferente de la mítica <a href="http://www.applesfera.com/ipod/i-am-rich-la-mas-exclusiva-estupida-de-la-app-store">iamrich</a>, pero más barata.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/tutoriales/nuestra-primera-app/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Es sólo Rock&amp;Roll…</title>
		<link>http://www.gergonzalez.com/noticias/its-only-rock-roll/</link>
		<comments>http://www.gergonzalez.com/noticias/its-only-rock-roll/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 22:32:36 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Opinión]]></category>
		<category><![CDATA[iPod]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[Keynote]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.com/?p=130</guid>
		<description><![CDATA[&#8230;con Steve Jobs. Como cada Septiembre desde hace ya varios años Apple realiza un evento para renovar toda la gama de su producto estrella, el iPod. Pero, ¿qué impresiones nos ha dejado este año?. Hagamos un rápido repaso del evento y veamos que conclusiones sacamos de esta keynote. It&#8217;s only Rock &#38; Roll, but we [...]]]></description>
			<content:encoded><![CDATA[<p><strong>&#8230;con Steve Jobs</strong>. Como cada Septiembre desde hace ya varios años Apple realiza un evento para renovar toda la gama de su producto estrella, el iPod. Pero, ¿qué impresiones nos ha dejado este año?. Hagamos un rápido repaso del evento y veamos que conclusiones sacamos de esta keynote.</p>
<p><a href="http://www.gergonzalez.com/noticias/its-only-rock-roll/"><img class="aligncenter size-full wp-image-260" title="only" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/only2.jpg" alt="only" width="618" height="200" /></a><br />
<span id="more-130"></span><br />
<strong>It&#8217;s only Rock &amp; Roll, but we like it</strong>, con esta frase &#8220;casualmente&#8221; sacada de una canción de sus satánicas majestades se invitaba a este nuevo evento y como cada año mucho se <a href="http://es.appleweblog.com/34706" target="_blank">especulaba</a> las semanas antes, con las típicas filtraciones, fakes y comentarios de los analistas de turno. Esta vez, y sin que sirva de precedente, se cumplieron la gran mayoría de predicciones:</p>
<ul>
<li>La renovación de la gama <strong>iPod</strong> era un secreto a voces, cada año utilizan este evento para hacerlo, así que este no iba a ser diferente. Si bien no fue un cambio radical, ya que se conservaron los diseños de las carcasas, todos tuvieron pequeñas mejoras y rebajas de precios, salvo el nano que vio incrementadas sus capacidades con la opción de grabar vídeo y la incomprensible, aunque bienvenida por muchos, inclusión de una radio FM.</li>
<li>El lanzamiento del nuevo<strong> iTunes 9</strong> con varias novedades en su función genius y sobretodo en la sincronización de los dispositivos de la casa. También se presentaron los nuevos iTunes LP, el proyecto antiguamente conocido con el nombre en clave Cocktail.</li>
<li><strong>iPhone OS 3.1 y Ringtones</strong>.</li>
</ul>
<p>La verdad es que no pensaba extenderme más, en los enlaces del blogroll podréis encontrar más y mejor información sobre cada una de las novedades, no es mi intención tratar esos temas. Además para todos aquellos que tengan tiempo la <a href="http://events.apple.com.edgesuite.net/0909oijasdv/event/index.html?internal=ijalrmacu" target="_blank">Keynote se puede ver entera y en HD</a>.</p>
<p>Pero lo realmente importante de este evento, que hábilmente he omitido de la lista anterior, han sido dos cosas:</p>
<p><img class="aligncenter size-full wp-image-263" title="keynote" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/keynote1.jpg" alt="keynote" width="618" height="360" /></p>
<ol>
<li> La vuelta de <strong>Steve Jobs</strong>, era una de las incógnitas, y tal vez, viendo lo presentado, esta keynote se programó sólo para comunicar la vuelta del gran jefe, demostrar que sigue en forma aunque bastante delgado y así de paso tranquilizar a los inversores y a los miles de fans.</li>
<li>La confirmación del<strong> iPod Touch</strong> e <strong>iPhone</strong> como plataformas de juego portátiles que entran en lucha directa con Nintendo DS y la Sony PSP. Esto no es que suponga un cambio de estrategia por parte de Apple, pero por fin parece que busca la competencia directa. Recordemos que no es la primera vez que <a href="http://es.wikipedia.org/wiki/Apple_Pippin" target="_blank">Apple intenta la incursión en este sector</a>, aunque parece que esta vez dispone de una base sólida para poder triunfar. Veremos que ocurre en los próximos meses.</li>
</ol>
<p>Esto fue todo, como conclusión este evento me dejó con cierto sabor agridulce, agrio por las pocas novedades pero tremendamente dulce debido a la vuelta de Steve Jobs, lo que sólo puede augurar un feliz futuro para la marca de la manzana.</p>
<p>Por cierto, ¿alguién más cree qué la elección de la fecha y el nombre del evento tiene algo que ver con la ausencia del catálogo de los Beatles en iTunes?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/noticias/its-only-rock-roll/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Qué necesitamos para programar en el Iphone?</title>
		<link>http://www.gergonzalez.com/tutoriales/que-necesitamos-para-programar-en-el-iphone/</link>
		<comments>http://www.gergonzalez.com/tutoriales/que-necesitamos-para-programar-en-el-iphone/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 11:20:06 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[Iphone Developer Program]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.com/?p=30</guid>
		<description><![CDATA[Y que mejor manera para empezar un blog de esta naturaleza que haciendo un recorrido por todo aquello que necesitamos para comenzar a programar para el iPhone, haciendo especial hincapié en el coste. Un Mac Precio: Variable € Es el principal requerimiento. Necesitamos disponer de un Macintosh con arquitectura Intel corriendo Leopard o Snow Leopard, [...]]]></description>
			<content:encoded><![CDATA[<p>Y que mejor manera para empezar un blog de esta naturaleza que haciendo un recorrido por todo aquello que necesitamos para comenzar a programar para el iPhone, haciendo especial hincapié en el coste.</p>
<p><a href="http://www.gergonzalez.com/tutoriales/que-necesitamos-para-programar-en-el-iphone/"><img class="aligncenter size-full wp-image-273" title="programming" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/programming.jpg" alt="programming" width="618" height="200" /></a><br />
<span id="more-30"></span></p>
<h4>Un Mac</h4>
<p>Precio: Variable €</p>
<p>Es el principal requerimiento. Necesitamos disponer de un Macintosh con arquitectura Intel corriendo Leopard o Snow Leopard, o lo que es lo mismo, un Mac con menos de 4 años. Si es tu caso, enhorabuena, ya estás casi en disposición de empezar a programar.</p>
<p>Si no disponemos de uno tendremos que hacer frente a un fuerte desembolso económico, y tal vez este sea el principal escollo a la hora de desarrollar para el iPhone. <a href="http://store.apple.com/es">La familia de Macs</a> se encuentra disponible en una terna de precios que van desde los 579€, de un Mac Mini, hasta los casi 20.000€ que puede costar un Mac Pro hipervitaminado. No entraré a valorar las bondades del sistema Mac, creo que está todo dicho ya, lo que cada persona debe ser capaz es de discernir cuanto está dispuesto a pagar por un sistema de estas características.</p>
<p><img class="aligncenter size-full wp-image-271" title="macs" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/macs1.jpg" alt="macs" width="618" height="200" /></p>
<p>Para el desarrollo de aplicaciones, la mínima configuración hardware del Mac nos es suficiente para trabajar con soltura, es más, yo utilizo mi MacBook Pro de más de 3 años y no tengo problemas de rendimiento. También es cierto que cualquier ampliación de RAM siempre es bienvenida, aunque no imprescindible.</p>
<p><strong>Recomendación</strong>: Hacerse con un MacBook, por un precio alrededor de los 1000€ dispondrás del mejor portátil de la actualidad. Si no se dispone de ese dinero, un Mac Mini es una opción más que suficiente. Otra opción, es intentar su financiación por la línea de crédito de<a href="http://www.planavanza.es/"> ICO-PLAN AVANZA</a>, sólo disponible en España.</p>
<h4>El iPhone SDK</h4>
<p>Precio: Gratis €</p>
<p>Para poder empezar a programar necesitamos hacernos con el SDK, hay dos formas para poder instalarlo en nuestros Macs. Una, mediante nuestra copia del sistema operativo, y la otra mediante la descarga, después del pertinente registro, en el <a href="http://developer.apple.com/iphone/">iPhone Dev Center</a>.</p>
<p><img class="aligncenter size-full wp-image-265" title="dev" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/dev.jpg" alt="dev" width="618" height="200" /></p>
<p>El iPhone SDK está compuesto por el conjuto de herramientas que te permitirán empezar a programar para el iPhone e iPod Touch. Incluye Xcode, el iPhone Simulator y una suite de herramientas adicionales para diversas funciones que van desde la gestión de los recursos del dispositivo durante la ejecución hasta la creación de la interfaz gráfica.</p>
<p>Y ya está, una vez instalado el Sdk podemos empezar a programar, pero claro, la experiencia no será completa, ya que nuestras aplicaciones sólo podrán ser instaladas en el simulador, con las limitaciones que este nos impone.</p>
<p><strong> Recomendación</strong>: Es mejor descargar el SDK de la página de Apple, obtendrás la versión más actualizada.</p>
<h4>Una licencia del iPhone Developer Program</h4>
<p>Precio Licencia Individual: 79 €/año</p>
<p>Pagar la licencia del iPhone Developer Program nos dará la posibilidad de instalar nuestras aplicaciones en el iPod Touch e iPhone, además de tener derecho a distribuirlas en la Appstore después de la pertiente aprobación por parte de Apple.</p>
<p>El proceso de alta es bastante laborioso, especialmete a la hora de rellenar toda la parafernalia legal para poder distribuir aplicaciones de pago. También resulta complicado todo el proceso de certificados y claves para poder instalar aplicaciones de manera local en nuestros dispositivos.</p>
<p>En sucesivos posts narraré detallamente todos los pasos a seguir para poder instalar las aplicaciones y distribuir aplicaciones en la Appstore tanto si son gratuitas como de pago.</p>
<p><strong> Recomendación</strong>: Darse de Alta en el momento que se pueda empezar a desarrollar, aunque la licencia es barata, un año pasa rápido y tendrás que volver a renovarla.</p>
<h4>Un iPhone o un iPod Touch</h4>
<p>Precio: Varaiable €</p>
<p>Aunque pueda parecer una contradicción, no es imperiosamente necesario disponer de un iPhone o un iPod Touch para programar para ellos ya que el simulador nos permite testear aplicaciones sencillas.</p>
<p><img class="aligncenter size-full wp-image-269" title="ipods" src="http://www.gergonzalez.com/wp-content/uploads/2009/09/ipods.jpg" alt="ipods" width="618" height="200" /><br />
Evidentemente, no disponer de ninguno de estos dispositivos es un gran handicap ya que el comportamiento del dispositivo es mucho más variable. Igualmente que hay diferencia entre el simulador y los dispositivos, también las hay entre el iPod y el iPhone, así que la decisión de uno u otro también resulta importante.</p>
<p>El precio de estos oscila entre los 219 € del iPod Touch más barato y el variable precio que quiera imponernos el operador con los derechos del iPhone.</p>
<p><strong>Recomendación</strong>: En función del gasto de tu factura telefónica puede resultarte rentable comprar un iPhone, además podrás testear toda la API.</p>
<h4>¿Cuánto nos puede costar empezar?</h4>
<p>Pues <strong>depende</strong>, si nuestra intención es probar y disponemos de un Mac y un iPod Touch o un iPhone, como mucho 79€ de la licencia. Otro caso bien distinto, en pasar de un sistema PC a Mac, con la consiguiente compra de equipos, licencia y dispositivos. Entonces si que puede resultar no tan barato.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/tutoriales/que-necesitamos-para-programar-en-el-iphone/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducción</title>
		<link>http://www.gergonzalez.com/sobre-mi/introduccion/</link>
		<comments>http://www.gergonzalez.com/sobre-mi/introduccion/#comments</comments>
		<pubDate>Mon, 25 May 2009 21:27:15 +0000</pubDate>
		<dc:creator>gergonzalez</dc:creator>
				<category><![CDATA[Sobre Mí]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.gergonzalez.es/?p=1</guid>
		<description><![CDATA[¿Cómo empezar un blog?, ¿os lo habéis preguntado alguna vez?, yo sí, y la verdad es que me costaba encontrar un modo. Después de darle una y mil vueltas pensé, ¿qué mejor manera de hacerlo que presentándome y exponiendo las motivaciones y metas que me llevan a comenzar esta andadura?, voy a ello]]></description>
			<content:encoded><![CDATA[<p>¿Cómo empezar un blog?, ¿os lo habéis preguntado alguna vez?, yo sí, y la verdad es que me costaba encontrar un modo. Después de darle una y mil vueltas pensé, ¿qué mejor manera de hacerlo que presentándome y exponiendo las motivaciones y metas que me llevan a comenzar esta andadura?, voy a ello.<br />
<img class="aligncenter" title="Recuerdos" src="http://farm4.static.flickr.com/3573/3636174949_b91416252f_o.jpg" alt="" width="510" height="350" /><br />
<span id="more-1"></span><br />
<strong>Presentación</strong></p>
<p>Me llamo Germán González Rodríguez, a día de hoy, soy un &#8220;<em>estudiante</em>&#8221; de Ingeniería Superior de Telecomunicaciones y me encuentro realizando mi PFC. No creo necesario extenderme más, en los perfiles públicos de las redes sociales en las que participo o en la <a title="Sobre Mí" href="http://www.gergonzalez.es/about/" target="_blank">sección correspondiente del blog</a> encontraréis más información.</p>
<p><strong>Motivaciones</strong></p>
<p>Mi motivación principal es la de contar mis experiencias como desarrollador para el Iphone Development Program y futuro emprendedor, y exponer los problemas, resultados y conclusiones que de mis acciones se deriven.</p>
<p>Resumido en 4 puntos, voy a tratar:</p>
<ol>
<li>El desarrollo para los dispositivos de Apple, Iphone e Ipod Touch. Con especial atención en el lenguaje Objective-C, Cocoa Touch, Xcode&#8230;</li>
<li>El mundo empresarial-emprendedor. Desde el punto de vista de un ingeniero, más práctico que teórico.</li>
<li>El mundo Apple. Información, novedades, análisis y sobretodo opinión.</li>
<li>El mundo de los videojuegos, pero desde un punto de vista &#8220;<em>diferente</em>&#8220;.</li>
</ol>
<p>De los cuatro puntos, los dos primeros serán tratados con asiduidad, sin embargo, los otros dos serán tratados de manera &#8220;<em>diferente</em>&#8221; y sin periodicidad fija.</p>
<p><strong>Metas</strong></p>
<p>Por ahora no me pongo ninguna, no prentendo sentar cátedra, sólo quiero que esta bitácora sea un diario de mis experiencias, por si pueden ser de ayuda para alguien y un punto de encuentro para quienes busquen información, invitando a la participación y al debate, aunque siempre con respeto hacia las opiniones de los demás.</p>
<p>Sin más, me despido hasta el siguiente post, nos vemos&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gergonzalez.com/sobre-mi/introduccion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

