<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iPhoneGeek 爱疯极客 &#187; 游戏</title>
	<atom:link href="http://www.iphone-geek.cn/tag/%e6%b8%b8%e6%88%8f/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iphone-geek.cn</link>
	<description>iPhone 新闻，编程，技巧与提示，代码，教程</description>
	<lastBuildDate>Thu, 08 Dec 2011 01:18:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cocos2d实现简单动画</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos2d%e5%ae%9e%e7%8e%b0%e7%ae%80%e5%8d%95%e5%8a%a8%e7%94%bb</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos2d%e5%ae%9e%e7%8e%b0%e7%ae%80%e5%8d%95%e5%8a%a8%e7%94%bb#comments</comments>
		<pubDate>Fri, 15 Apr 2011 03:33:15 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[图形图像]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[OpenGL ES]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=1158</guid>
		<description><![CDATA[最近实在很忙，没有时间写整篇文章，就分享一下一些简单的实例吧。
首先介绍一篇博客文章：cocos2d HOWTO系列之：如何创建帧动画。我初学cocos2d时就发现这篇文章，不过里面的一些内容已经过时了，所以自己又写了一个动画的例子。
我把要点说一下：

制作动画需要的一系列动画图片（比如png文件）。要制作动画png，可根据上面介绍的文章使用Adobe Flash将fla转换为png。也可以使用一些免费软件，将swf转换为png。这里有一些软件：SpriteSheetCreator，SWFSheet，SWFToPNG。大家可以网上搜索一下。
生成png动画系列后，要将其整合成一个png（也就是所谓的sprite sheet）。这里使用的软件就是Zwoptex。使用此软件生成一个png和一个plist，plist记录了每个sprite的x，y，高，宽数据。Cocos2d支持Zwoptex生成的plist格式。不过遗憾的是最近Zwoptex开始收费了。这里提供以前的一个版本，也可以满足我们的要求。Zwoptex-0.4b10.app下载 。
我的程序就是播放一个电扇的动画，按一下就进行动画，再按一下动画就停止。我是修改了HelloWorld程序，添加了一个Object类进行动画处理。唯一要说明的是addSpriteFramesWithFile中要使用的路径是相对路径，我开始一直遇到问题就是因为使用了绝对路径。

源代码下载
]]></description>
			<content:encoded><![CDATA[<p>最近实在很忙，没有时间写整篇文章，就分享一下一些简单的实例吧。</p>
<p>首先介绍一篇博客文章：<a href="http://dualface.qeeplay.com/index.php/archives/406">cocos2d HOWTO系列之：如何创建帧动画</a>。我初学cocos2d时就发现这篇文章，不过里面的一些内容已经过时了，所以自己又写了一个动画的例子。</p>
<p>我把要点说一下：</p>
<ol>
<li>制作动画需要的一系列动画图片（比如png文件）。要制作动画png，可根据上面介绍的文章使用Adobe Flash将fla转换为png。也可以使用一些免费软件，将swf转换为png。这里有一些软件：SpriteSheetCreator，SWFSheet，SWFToPNG。大家可以网上搜索一下。</li>
<li>生成png动画系列后，要将其整合成一个png（也就是所谓的sprite sheet）。这里使用的软件就是Zwoptex。使用此软件生成一个png和一个plist，plist记录了每个sprite的x，y，高，宽数据。Cocos2d支持Zwoptex生成的plist格式。不过遗憾的是最近Zwoptex开始收费了。这里提供以前的一个版本，也可以满足我们的要求。<a href="http://www.iphone-geek.cn/wp-content/uploads/2011/04/Zwoptex-0.4b10.app.zip">Zwoptex-0.4b10.app下载</a> 。</li>
<li>我的程序就是播放一个电扇的动画，按一下就进行动画，再按一下动画就停止。我是修改了HelloWorld程序，添加了一个Object类进行动画处理。唯一要说明的是addSpriteFramesWithFile中要使用的路径是相对路径，我开始一直遇到问题就是因为使用了绝对路径。</li>
</ol>
<p><a href="http://www.iphone-geek.cn/wp-content/uploads/2011/04/animation.zip">源代码下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos2d%e5%ae%9e%e7%8e%b0%e7%ae%80%e5%8d%95%e5%8a%a8%e7%94%bb/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>cocos2d-iphone 0.99.5 Xcode 静态库模板</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos2d-iphone-0-99-5-xcode-%e9%9d%99%e6%80%81%e5%ba%93%e6%a8%a1%e6%9d%bf</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos2d-iphone-0-99-5-xcode-%e9%9d%99%e6%80%81%e5%ba%93%e6%a8%a1%e6%9d%bf#comments</comments>
		<pubDate>Sun, 27 Feb 2011 03:29:19 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[图形图像]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[OpenGL ES]]></category>
		<category><![CDATA[开源项目]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=1132</guid>
		<description><![CDATA[最近一个项目需要用到opengles，由于实在没有时间无法完成自己的引擎，因此开始对cocos2d-iphone引擎进行了研究。经过研究发现一个问题，其模板生成的项目每次都会把整个cocos2d的源代码拷贝进新项目中，这样每次cocos2d-iphone进行更新时都会带来麻烦，而且如果多个项目使用cocos2d-iphone，非常的不方便。我在网上搜索了一下，发现了了这个网站，介绍了怎样将cocos2d-iphone编译成静态库的方法，与我的想法不谋而合。不过该网站中的模板只适用于0.99.4，于是我修改了一下，让其可以运行于0.99.5。下面是主要步骤：
1. 下载cocos2d-iphone 0.99.5 template模板。
2. 解压到/$HOME/Library/Application Support/Developer/Shared/Xcode下
3. 下载cocos2d-iphone 0.99.5，解压到你想要的地方。
3. 在Xcode Preferences中找到Source Tree，输入新变量COCOS2D_SOURCE，让其指向cocos2d-iphone 0.99.5的源代码处。
这样，下次你打开Xcode，你就可以使用我的模板创建cocos2d项目了（注意不要安装随cocos2d-iphone下载的模板），以后每次cocos2d-iphone进行更新，你仅仅需要修改COCOS2D_SOURCE变量（当然前提是cocos2d-iphone的编程接口没有改变）。
]]></description>
			<content:encoded><![CDATA[<p>最近一个项目需要用到opengles，由于实在没有时间无法完成自己的引擎，因此开始对cocos2d-iphone引擎进行了研究。经过研究发现一个问题，其模板生成的项目每次都会把整个cocos2d的源代码拷贝进新项目中，这样每次cocos2d-iphone进行更新时都会带来麻烦，而且如果多个项目使用cocos2d-iphone，非常的不方便。我在网上搜索了一下，发现了了<a href="http://www.learn-cocos2d.com/">这个</a>网站，介绍了怎样将cocos2d-iphone编译成静态库的方法，与我的想法不谋而合。不过该网站中的模板只适用于0.99.4，于是我修改了一下，让其可以运行于0.99.5。下面是主要步骤：<br class="spacer_" /><br />
1. 下载<a href="http://www.iphone-geek.cn/wp-content/uploads/2011/02/cocos2d-iphone-0.99.5-template.zip">cocos2d-iphone 0.99.5 template</a>模板。</p>
<p>2. 解压到/$HOME/Library/Application Support/Developer/Shared/Xcode下</p>
<p>3. 下载cocos2d-iphone 0.99.5，解压到你想要的地方。</p>
<p>3. 在Xcode Preferences中找到Source Tree，输入新变量COCOS2D_SOURCE，让其指向cocos2d-iphone 0.99.5的源代码处。<br class="spacer_" /><br />
这样，下次你打开Xcode，你就可以使用我的模板创建cocos2d项目了（注意不要安装随cocos2d-iphone下载的模板），以后每次cocos2d-iphone进行更新，你仅仅需要修改COCOS2D_SOURCE变量（当然前提是cocos2d-iphone的编程接口没有改变）。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos2d-iphone-0-99-5-xcode-%e9%9d%99%e6%80%81%e5%ba%93%e6%a8%a1%e6%9d%bf/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cocos 2d基本概念</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos-2d%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos-2d%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5#comments</comments>
		<pubDate>Fri, 28 Jan 2011 08:10:26 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[图形图像]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[OpenGL ES]]></category>
		<category><![CDATA[开源项目]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=1119</guid>
		<description><![CDATA[开发cocos2d程序前有必要对一些基本概念进行介绍：


场景（Scenes）
主控器（Director）
层（Layers）
精灵（Sprites）




场景

场景（通过 CCScene 对象实现）是程序的工作流程中相对独立的部分。有些人可能喜欢称呼其为“屏幕”或“舞台”。你的应用程序可能具有许多场景，但在某刻只能有一个活动的场景。
例如，你的游戏中可能有下列场景：介绍，菜单，第一关，过场一，第二关，过场二，胜利过场，失败过场，高分记录等等。
你可以将每个场景定义成一个独立的程序; 你可以通过某种逻辑将这些场景联系起来（比如当介绍中断或者完成后，就进入菜单场景，第一关成功将进入过场一，而失败则进入失败过场，等等）。



CCScene 是由一个或者多个层（通过 CCLayer 对象实现）组成。场景的外观和行为是通过层来实现的。
CCScene 类家族中还包括一组称为“过渡” （通过 CCTransitionScene 对象实现），它允许你在两个场景之间进行生成一些特殊的过渡效果（比如淡入淡出，滑入效果等等）。
由于场景是 CCNode 的子类，因此可以使用“动作”对场景进行变换。

主控器
CCDirector 是一个负责控制场景变化的元件。
CCDirector 是一个单例对象。它知道当前哪个场景是活动的，它负责处理场景的控制，并允许进行“场景调用”之类的操作（比如在进入另一个场景时，暂停当前场景，并在适当时候返回原始场景）。在CCLayer 要求替换当前场景后，实际上是 CCDirector 进行的场景切换。
另外， CCDirector 还负责OpenGL ES的初始化。

层
CCLayer 拥有整个可进行绘制的区域，并且知道怎样对自身进行绘制。它还可以是半透明的（还可以在某些地方部分或者完全透明），这样可以看到层后的部分。层是对外观和行为进行定义的元件，所以大部分时间我们都说针对 CCLayer 及子类进行编程的。

CCLayer 还是进行事件处理的地方。事件是通过层进行传递直到某些层捕捉并进行处理。
尽管许多程序要求你定义自定义 CCLayer 类，但 cocos2d 提供了一些有用的预定义的层（比如简单的菜单层： CCMenu，颜色层： CCColorLayer， 其他层之间 的多路器：CCMultiplexLayer，等等）。
层还可以包括 CCSprite 对象， CCLabel 对象以及甚至是 CCLayer 对象。
由于层是 CCNode的子类，因此可以使用“动作”对场景进行变换。

精灵
Cocos2d 的精灵与其他程序库描述的精灵一样，是一个可以进行移动，旋转，大小变化，动画等操作的2D图像。
精灵（通过 CCSprite 类实现）可以拥有其它精灵作为其子成员。当一个父成员进行变换时，其所有子成员也将同时进行变换。
由于精灵是 CCNode的子类，因此可以使用“动作”对场景进行变换。
]]></description>
			<content:encoded><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">开发cocos2d程序前有必要对一些基本概念进行介绍：</p>
<p><br class="spacer_" /></p>
<ul>
<li>场景（Scenes）</li>
<li>主控器（Director）</li>
<li>层（Layers）</li>
<li>精灵（Sprites）</li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">
<p><br class="spacer_" /><br />
<span id="more-1119"></span></p>
<h2>场景</h2>
<p><br class="spacer_" /></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">场景（通过 <strong>CCScene </strong>对象实现）是程序的工作流程中相对独立的部分。有些人可能喜欢称呼其为“屏幕”或“舞台”。你的应用程序可能具有许多场景，但在某刻只能有一个活动的场景。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">例如，你的游戏中可能有下列场景：<strong>介绍，菜单，第一关，过场一，第二关，过场二，胜利过场，失败过场，高分记录</strong>等等。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">你可以将每个场景定义成一个独立的程序; 你可以通过某种逻辑将这些场景联系起来（比如当<strong>介绍</strong>中断或者完成后，就进入<strong>菜单</strong>场景，<strong>第一关</strong>成功将进入<strong>过场一</strong>，而失败则进入<strong>失败过场</strong>，等等）。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-align: center; "><a style="color: #0088cc; text-decoration: none; padding: 0px; margin: 0px;" title="prog_guide:scenes.png" href="http://www.cocos2d-iphone.org/wiki/lib/exe/detail.php/prog_guide:scenes.png?id=prog_guide%3Abasic_concepts"><img class="aligncenter" style="margin-top: 3px; margin-bottom: 3px; padding: 0px;" src="http://www.cocos2d-iphone.org/wiki/lib/exe/fetch.php/prog_guide:scenes.png" alt="" width="576" height="128" /></a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;"><strong>CCScene </strong>是由一个或者多个层（通过 <strong>CCLayer</strong> 对象实现）组成。场景的外观和行为是通过层来实现的。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">CCScene 类家族中还包括一组称为“过渡” （通过 CCTransitionScene 对象实现），它允许你在两个场景之间进行生成一些特殊的过渡效果（比如淡入淡出，滑入效果等等）。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">由于场景是 CCNode 的子类，因此可以使用“动作”对场景进行变换。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">
<h2>主控器</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">CCDirector 是一个负责控制场景变化的元件。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">CCDirector 是一个单例对象。它知道当前哪个场景是活动的，它负责处理场景的控制，并允许进行“场景调用”之类的操作（比如在进入另一个场景时，暂停当前场景，并在适当时候返回原始场景）。在CCLayer 要求替换当前场景后，实际上是 CCDirector 进行的场景切换。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">另外， CCDirector 还负责OpenGL ES的初始化。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">
<h2>层</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">CCLayer 拥有整个可进行绘制的区域，并且知道怎样对自身进行绘制。它还可以是半透明的（还可以在某些地方部分或者完全透明），这样可以看到层后的部分。层是对外观和行为进行定义的元件，所以大部分时间我们都说针对 CCLayer 及子类进行编程的。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;"><a style="color: #0088cc; text-decoration: none; padding: 0px; margin: 0px;" title="prog_guide:layers.png" href="http://www.cocos2d-iphone.org/wiki/lib/exe/detail.php/prog_guide:layers.png?id=prog_guide%3Abasic_concepts"><img style="padding: 0px; margin: 3px; border: 0px initial initial;" src="http://www.cocos2d-iphone.org/wiki/lib/exe/fetch.php/prog_guide:layers.png" alt="" /></a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">CCLayer 还是进行事件处理的地方。事件是通过层进行传递直到某些层捕捉并进行处理。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">尽管许多程序要求你定义自定义 <strong>CCLayer </strong>类，但 cocos2d 提供了一些有用的预定义的层（比如简单的菜单层： CCMenu，颜色层： CCColorLayer， 其他层之间 的多路器：CCMultiplexLayer，等等）。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">层还可以包括 CCSprite 对象， CCLabel 对象以及甚至是 <strong>CCLayer </strong>对象。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">由于层是 CCNode的子类，因此可以使用“动作”对场景进行变换。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">
<h2>精灵</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">Cocos2d 的精灵与其他程序库描述的精灵一样，是一个可以进行移动，旋转，大小变化，动画等操作的2D图像。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">精灵（通过 CCSprite 类实现）可以拥有其它精灵作为其子成员。当一个父成员进行变换时，其所有子成员也将同时进行变换。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1em; line-height: 1.5em; padding: 0px;">由于精灵是 CCNode的子类，因此可以使用“动作”对场景进行变换。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/cocos-2d%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>跨平台游戏引擎开发实录之一 &#8211; 设计文档</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e8%b7%a8%e5%b9%b3%e5%8f%b0%e6%b8%b8%e6%88%8f%e5%bc%95%e6%93%8e%e5%bc%80%e5%8f%91%e5%ae%9e%e5%bd%95%e4%b9%8b%e4%b8%80-%e8%ae%be%e8%ae%a1%e6%96%87%e6%a1%a3</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e8%b7%a8%e5%b9%b3%e5%8f%b0%e6%b8%b8%e6%88%8f%e5%bc%95%e6%93%8e%e5%bc%80%e5%8f%91%e5%ae%9e%e5%bd%95%e4%b9%8b%e4%b8%80-%e8%ae%be%e8%ae%a1%e6%96%87%e6%a1%a3#comments</comments>
		<pubDate>Mon, 18 Jan 2010 06:03:09 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[游戏]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[开源项目]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=797</guid>
		<description><![CDATA[我目前正在开发一个跨平台游戏引擎，我准备将整个开发过程通过博客记录下来。欢迎各位朋友提出宝贵意见。

下面是我的设计文档初稿。

项目名称
 
Portable Game Engine （PGE ）

目标

跨平台，希望能支持Windows，Linux，Mac OSX，iPhone，WinCE, Android, Blackberry, Symbian phone 等
简单，尽量简化编程接口
2D和3D
组件可选，以减小目标代码
支持Unicode


组件

核心：游戏主循环，线程，垃圾收集，插件等
图形系统（采用OpenGL或OpenGL ES）：图像（纹理），动画，字体
声音系统（采用OpenAL）：音效，音乐，乐器
资源管理器：压缩/解压，加密/解密
输入：键盘，鼠标及触摸屏（重力感应）
网络：Tcp/ip，Http, UDP
GUI（用户接口）：菜单，文本，按钮，列表框，下拉框，选择框
游戏AI
游戏Physics


开发按阶段进行。第一阶段开发Windows下的OpenGL 2D引擎，然后移植到iPhone下。
]]></description>
			<content:encoded><![CDATA[<p>我目前正在开发一个跨平台游戏引擎，我准备将整个开发过程通过博客记录下来。欢迎各位朋友提出宝贵意见。</p>
<p><br class="spacer_" /></p>
<p>下面是我的设计文档初稿。</p>
<p><br class="spacer_" /></p>
<h3>项目名称</h3>
<p><strong> </strong></p>
<p><strong>Portable Game Engine （PGE ）</strong></p>
<p><br class="spacer_" /></p>
<h3>目标</h3>
<ul>
<li>跨平台，希望能支持Windows，Linux，Mac OSX，iPhone，WinCE, Android, Blackberry, Symbian phone 等</li>
<li>简单，尽量简化编程接口</li>
<li>2D和3D</li>
<li>组件可选，以减小目标代码</li>
<li>支持Unicode</li>
</ul>
<p><br class="spacer_" /></p>
<h3>组件</h3>
<ul>
<li>核心：游戏主循环，线程，垃圾收集，插件等</li>
<li>图形系统（采用OpenGL或OpenGL ES）：图像（纹理），动画，字体</li>
<li>声音系统（采用OpenAL）：音效，音乐，乐器</li>
<li>资源管理器：压缩/解压，加密/解密</li>
<li>输入：键盘，鼠标及触摸屏（重力感应）</li>
<li>网络：Tcp/ip，Http, UDP</li>
<li>GUI（用户接口）：菜单，文本，按钮，列表框，下拉框，选择框</li>
<li>游戏AI</li>
<li>游戏Physics</li>
</ul>
<p><br class="spacer_" /></p>
<p>开发按阶段进行。第一阶段开发Windows下的OpenGL 2D引擎，然后移植到iPhone下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e8%b7%a8%e5%b9%b3%e5%8f%b0%e6%b8%b8%e6%88%8f%e5%bc%95%e6%93%8e%e5%bc%80%e5%8f%91%e5%ae%9e%e5%bd%95%e4%b9%8b%e4%b8%80-%e8%ae%be%e8%ae%a1%e6%96%87%e6%a1%a3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Flash游戏，iPhone用户准备好了吗？</title>
		<link>http://www.iphone-geek.cn/%e6%96%b0%e9%97%bb/flash%e6%b8%b8%e6%88%8f%ef%bc%8ciphone%e7%94%a8%e6%88%b7%e5%87%86%e5%a4%87%e5%a5%bd%e4%ba%86%e5%90%97%ef%bc%9f</link>
		<comments>http://www.iphone-geek.cn/%e6%96%b0%e9%97%bb/flash%e6%b8%b8%e6%88%8f%ef%bc%8ciphone%e7%94%a8%e6%88%b7%e5%87%86%e5%a4%87%e5%a5%bd%e4%ba%86%e5%90%97%ef%bc%9f#comments</comments>
		<pubDate>Mon, 21 Dec 2009 03:33:18 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=468</guid>
		<description><![CDATA[（译者批：本人并不看好此公司。因为Adobe即将推出最新beta版的flash cs5。谁愿意分一杯羹给别人呢？特别是这杯羹是如此之大 &#8211; 50%的净收入）
&#160;
iPhone引领的休闲游戏复兴的风潮似乎已经过热。感谢早些时候Adobe发布的新Flash开发软件beta版，一个新启动的公司OneAppAtATime允许开发者使用Flash开发iPhone程序。从本周开始，此公司为Flash游戏开发者打开了一道大门，他们提供将Flash游戏转换为iPhone游戏并使其获得App Store批准的服务，作为回报他们将收取35%的收入。（也就是说在Apple拿走30%后与开发者平分剩下的70%。）
&#160;
OneAppAtATime 是Evan “Rabble” Henshaw-Plath的杰作，他们以前曾为源于Yahoo Brickhouse的卫星服务公司Fire Eagle以及传播Twitter的播客公司Odeo工作。
&#160;
Henshaw-Plath，位于乌拉圭的蒙得维的亚，宣称希望每月生产“数十甚至数百个游戏“。他们的目标是许多Flash游戏的兼职开发者以及由于网上用户不希望付费过去有困难从他们的项目中赚到钱的开发者。
&#160;
但是在iPhone平台上，人们通常是需要付费的，Henshaw-Plath希望将这些游戏的价格定在$2.99。而且尽管Adobe宣布 计划在2009年底发布Flash专业CS5的公众beta版，OneAppAtATime在竞争中已经抢先一步。Henshaw-Plath宣称他通过乌拉圭大量的Flash开发者获得了先机。
&#160;
不像它的名称，OneAppAtATime希望成为一个工厂，能够大量生产出尽可能多的程序，但是，Henshaw-Plath特别希望能够改编利用了iPhone特性如重力计，GPS，罗盘和地址簿的程序。例如，一个公司的游戏利用Atari经典的Breakout游戏允许玩家通过前后移动设备来控制他们的摇杆。（由于这些程序还没有通过Apple的批准，你现在还不能玩这个游戏。）

&#160;
Henshaw-Plath通过其Ruby on Rails顾问公司Cubox注资。他希望通常需要“数百甚至数千美金”开发的每个Flash游戏只需花几天时间转换。
&#160;
OneAppAtATime正在释放一个怪物；目前已经有大约100,000 iPhone程序，而且有远超此数的Flash游戏存在。具有如此之多的竞争，维持生意并不是件容易的事情。Henshaw-Plath说他的程序将在与其他iPhone程序的竞争中胜出因为用户在购买之前可以通过Flash进行测试。而且他还并不具有对游戏的独家许可证，这样Flash开发者在认为他们可以做得更好时有权与OneAppAtATime竞争。并且公司保证为每个游戏提供大量的公共市场宣传和广告。
&#160;
原文见：iPhone Users, Get Ready for Flash Games
]]></description>
			<content:encoded><![CDATA[<p>（译者批：本人并不看好此公司。因为Adobe即将推出最新beta版的flash cs5。谁愿意分一杯羹给别人呢？特别是这杯羹是如此之大 &#8211; 50%的净收入）</p>
<p>&nbsp;</p>
<p>iPhone引领的休闲游戏复兴的风潮似乎已经过热。感谢早些时候Adobe发布的新Flash开发软件beta版，一个新启动的公司<a href="http://oneappatatime.com/">OneAppAtATime</a>允许开发者使用Flash开发iPhone程序。从本周开始，此公司为Flash游戏开发者打开了一道大门，他们提供将Flash游戏转换为iPhone游戏并使其获得App Store批准的服务，作为回报他们将收取35%的收入。（也就是说在Apple拿走30%后与开发者平分剩下的70%。）</p>
<p>&nbsp;</p>
<p>OneAppAtATime 是<a href="http://anarchogeek.com/">Evan “Rabble” Henshaw-Plath</a>的杰作，他们以前曾为源于Yahoo Brickhouse的卫星服务公司Fire Eagle以及传播Twitter的播客公司Odeo工作。</p>
<p>&nbsp;</p>
<p>Henshaw-Plath，位于乌拉圭的蒙得维的亚，宣称希望每月生产“数十甚至数百个游戏“。他们的目标是许多Flash游戏的兼职开发者以及由于网上用户不希望付费过去有困难从他们的项目中赚到钱的开发者。</p>
<p>&nbsp;</p>
<p>但是在iPhone平台上，人们通常是需要付费的，Henshaw-Plath希望将这些游戏的价格定在$2.99。而且尽管Adobe<a href="http://labs.adobe.com/technologies/flashcs5/appsfor_iphone/">宣布</a> 计划在2009年底发布Flash专业CS5的公众beta版，OneAppAtATime在竞争中已经抢先一步。Henshaw-Plath宣称他通过乌拉圭大量的Flash开发者获得了先机。</p>
<p>&nbsp;</p>
<p>不像它的名称，OneAppAtATime希望成为一个工厂，能够大量生产出尽可能多的程序，但是，Henshaw-Plath特别希望能够改编利用了iPhone特性如重力计，GPS，罗盘和地址簿的程序。例如，一个公司的游戏利用Atari经典的Breakout游戏允许玩家通过前后移动设备来控制他们的摇杆。（由于这些程序还没有通过Apple的批准，你现在还不能玩这个游戏。）</p>
<p><a rel="attachment wp-att-86326" href="http://www.iphone-geek.cn/?attachment_id=86326"><img title="Picture 8" src="http://gigaom.files.wordpress.com/2009/12/picture-8.png?w=349&amp;h=233" alt="" width="349" height="233" /></a></p>
<p>&nbsp;</p>
<p>Henshaw-Plath通过其Ruby on Rails顾问公司<a href="http://cuboxsa.com/">Cubox</a>注资。他希望通常需要“数百甚至数千美金”开发的每个Flash游戏只需花几天时间转换。</p>
<p>&nbsp;</p>
<p>OneAppAtATime正在释放一个怪物；目前已经有大约<a href="http://gigaom.com/2009/11/04/100000-apps/">100,000</a> iPhone程序，而且有远超此数的Flash游戏存在。具有如此之多的竞争，维持生意并不是件容易的事情。Henshaw-Plath说他的程序将在与其他iPhone程序的竞争中胜出因为用户在购买之前可以通过Flash进行测试。而且他还并不具有对游戏的独家许可证，这样Flash开发者在认为他们可以做得更好时有权与OneAppAtATime竞争。并且公司保证为每个游戏提供大量的公共市场宣传和广告。</p>
<p>&nbsp;</p>
<h5>原文见：<a href="http://gigaom.com/2009/12/15/iphone-users-get-ready-for-flash-games/">iPhone Users, Get Ready for Flash Games</a></h5>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e6%96%b0%e9%97%bb/flash%e6%b8%b8%e6%88%8f%ef%bc%8ciphone%e7%94%a8%e6%88%b7%e5%87%86%e5%a4%87%e5%a5%bd%e4%ba%86%e5%90%97%ef%bc%9f/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL ES 02 &#8211; 绘制基本图形2 &#8211; 正方形</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/opengl-es-02-%e7%bb%98%e5%88%b6%e5%9f%ba%e6%9c%ac%e5%9b%be%e5%bd%a22-%e6%ad%a3%e6%96%b9%e5%bd%a2</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/opengl-es-02-%e7%bb%98%e5%88%b6%e5%9f%ba%e6%9c%ac%e5%9b%be%e5%bd%a22-%e6%ad%a3%e6%96%b9%e5%bd%a2#comments</comments>
		<pubDate>Sun, 15 Nov 2009 10:11:43 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[图形图像]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[OpenGL ES]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=238</guid>
		<description><![CDATA[严格地说，正方形不是OpenGL ES的基元，但是它们确实是很基本的，而且渲染正方形像渲染三角形一样容易。本教程中，我们将把绘制三角形基元的代码转变成正方形的代码。我们仍将采用静态渲染，但我们会很简单地介绍一下变换（如移动）。当然，一旦我们绘制了正方形，我们就可以绘制正方体，然后甚至是带纹理映射的正方体&#8230;&#8230;
&#160;

简单概括一下本教程

&#160;
上一次教程，我们在一个“空白画布”Xcode项目上渲染了一个实体三角形。然后建立一个顶点数组，通过使用glVertexPointer()告诉OpenGL数据及其格式，再使用glDrawArrays()渲染出来。

&#160;
今天，我们将使用上次的代码，但把三角形变为正方形。我们仅需要改动其中几行代码。第一部分应该很明显，我们应为正方形指定4点而不是三角形的3点。然后我们通过传递给glDrawArrays()不同的参数告诉OpenGL以不同的方式绘画。

&#160;
我们开始吧。

&#160;
定义正方形顶点

&#160;
打开上次教程的Xcode项目并找到rawView 方法。为riangleVertices[] 常量加上注释-先不要删除，因为当我们讨论变换时会需要用到它们-加入下列代码：

12345678const GLfloat squareVertices&#91;&#93; = &#123;

        -1.0, 1.0, -6.0,            // Top left
        -1.0, -1.0, -6.0,           // Bottom left
        1.0, -1.0, -6.0,            // Bottom right
        1.0, 1.0, -6.0              // Top right

    &#125;;

&#160;
这定义了我们的正方形。注意反时针方向的正方形顶点（4个点）。

&#160;
然后我们在主体部分为绘制三角形代码加上注释，稍后我们也会用回这些代码的。为三个函数glVertexArray(), glEnableClientState()和glDrawArrays()加上注释并加入下列代码：

&#160;
12345    glVertexPointer&#40;3, GL_FLOAT, 0, squareVertices&#41;;

    glEnableClientState&#40;GL_VERTEX_ARRAY&#41;;

    glDrawArrays&#40;GL_TRIANGLE_FAN, 0, 4&#41;;

&#160;
这三个函数只有少许不同。

&#160;
1glVertexPointer&#40;3, GL_FLOAT, 0, squareVertices&#41;;

&#160;
这里唯一的变化是使用了不同的顶点数组，即正方形数组而不是三角形数组。

&#160;

glEnableClientState()仍然是通知OpenGL从顶点数组绘制（而不是绘制颜色数组或其它）。

&#160;
1glDrawArrays&#40;GL_TRIANGLE_FAN, 0, 4&#41;;

&#160;
最主要的变化就在这里了。上次的教程我们使用GL_TRIANGLES作为第一个参数，3为第三个参数。记住第二个参数代表数组开始位置的偏移量，因为我们的顶点数组只包括了正方形，所以它还是0。

&#160;
第一参数是OpenGL的绘图模式，你已经见过其中两种。就此机会我讨论一下各种不同的绘图模式。它们是：

&#160;
GL_POINTS
GL_LINES
GL_LINE_LOOP
GL_LINE_STRIP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN

&#160;
我们还没有讨论过点和线，所以我们先把重点放在后面三种与三角形有关的模式。在我开始讲解之前，我要提醒你们一个顶点数组可能包括不止一个三角形，所以虽然你只见过一个顶点数组包括一个对象，但并不限如此。

&#160;
GL_TRIANGLES  &#8211; 表示OpenGL将以是三个顶点一组来处理顶点数组。所以，第一组三个顶点代表三角形顶点1，2和3。然后再处理接下来的一组三个顶点，直到数组的尾部。

&#160;
GL_TRIANGLE_STRIP  &#8211; OpenGL将从前两个顶点开始，对于各个后续顶点，它将与前两个顶点一起构成三角形。也就是说，squareVertices[6~8]是与squareVerticies[0~2]和squareVerticies[3~5]一起构成三角形的。而squareVertices[9~11]是与squareVertices[3~5]和squareVertices[6~8]构成三角形的。如此这般，完成整个数组。

&#160;
注意：squareVertices[0~2]表示：

        squareVertices[0]  &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>严格地说，正方形不是OpenGL ES的基元，但是它们确实是很基本的，而且渲染正方形像渲染三角形一样容易。本教程中，我们将把绘制三角形基元的代码转变成正方形的代码。我们仍将采用静态渲染，但我们会很简单地介绍一下变换（如移动）。当然，一旦我们绘制了正方形，我们就可以绘制正方体，然后甚至是带纹理映射的正方体&#8230;&#8230;</p>
<p>&nbsp;</p>
<p><span id="more-238"></span></p>
<h2>简单概括一下本教程<br />
</h2>
<p>&nbsp;</p>
<p>上一次教程，我们在一个“空白画布”Xcode项目上渲染了一个实体三角形。然后建立一个顶点数组，通过使用glVertexPointer()告诉OpenGL数据及其格式，再使用glDrawArrays()渲染出来。
</p>
<p>&nbsp;</p>
<p>今天，我们将使用上次的代码，但把三角形变为正方形。我们仅需要改动其中几行代码。第一部分应该很明显，我们应为正方形指定4点而不是三角形的3点。然后我们通过传递给glDrawArrays()不同的参数告诉OpenGL以不同的方式绘画。
</p>
<p>&nbsp;</p>
<p>我们开始吧。
</p>
<p>&nbsp;</p>
<h2>定义正方形顶点<br />
</h2>
<p>&nbsp;</p>
<p>打开上次教程的Xcode项目并找到rawView 方法。为riangleVertices[] 常量加上注释-先不要删除，因为当我们讨论变换时会需要用到它们-加入下列代码：
</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">const</span> GLfloat squareVertices<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#123;</span><br />
<br />
        <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>,            <span style="color: #11740a; font-style: italic;">// Top left</span><br />
        <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>,           <span style="color: #11740a; font-style: italic;">// Bottom left</span><br />
        <span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>,            <span style="color: #11740a; font-style: italic;">// Bottom right</span><br />
        <span style="color: #2400d9;">1.0</span>, <span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>              <span style="color: #11740a; font-style: italic;">// Top right</span><br />
<br />
    <span style="color: #002200;">&#125;</span>;</div></td></tr></tbody></table></div>
</p>
<p>&nbsp;</p>
<p>这定义了我们的正方形。注意反时针方向的正方形顶点（4个点）。
</p>
<p>&nbsp;</p>
<p>然后我们在主体部分为绘制三角形代码加上注释，稍后我们也会用回这些代码的。为三个函数glVertexArray(), glEnableClientState()和glDrawArrays()加上注释并加入下列代码：
</p>
<p>&nbsp;</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">    glVertexPointer<span style="color: #002200;">&#40;</span>3, GL_FLOAT, 0, squareVertices<span style="color: #002200;">&#41;</span>;<br />
<br />
    glEnableClientState<span style="color: #002200;">&#40;</span>GL_VERTEX_ARRAY<span style="color: #002200;">&#41;</span>;<br />
<br />
    glDrawArrays<span style="color: #002200;">&#40;</span>GL_TRIANGLE_FAN, 0, 4<span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
</p>
<p>&nbsp;</p>
<p>这三个函数只有少许不同。
</p>
<p>&nbsp;</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">glVertexPointer<span style="color: #002200;">&#40;</span>3, GL_FLOAT, 0, squareVertices<span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
</p>
<p>&nbsp;</p>
<p>这里唯一的变化是使用了不同的顶点数组，即正方形数组而不是三角形数组。
</p>
<p>&nbsp;</p>
<p>
glEnableClientState()仍然是通知OpenGL从顶点数组绘制（而不是绘制颜色数组或其它）。
</p>
<p>&nbsp;</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">glDrawArrays<span style="color: #002200;">&#40;</span>GL_TRIANGLE_FAN, 0, 4<span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
</p>
<p>&nbsp;</p>
<p>最主要的变化就在这里了。上次的教程我们使用GL_TRIANGLES作为第一个参数，3为第三个参数。记住第二个参数代表数组开始位置的偏移量，因为我们的顶点数组只包括了正方形，所以它还是0。
</p>
<p>&nbsp;</p>
<p>第一参数是OpenGL的绘图模式，你已经见过其中两种。就此机会我讨论一下各种不同的绘图模式。它们是：
</p>
<p>&nbsp;</p>
<p>GL_POINTS<br />
GL_LINES<br />
GL_LINE_LOOP<br />
GL_LINE_STRIP<br />
GL_TRIANGLES<br />
GL_TRIANGLE_STRIP<br />
GL_TRIANGLE_FAN
</p>
<p>&nbsp;</p>
<p>我们还没有讨论过点和线，所以我们先把重点放在后面三种与三角形有关的模式。在我开始讲解之前，我要提醒你们一个顶点数组可能包括不止一个三角形，所以虽然你只见过一个顶点数组包括一个对象，但并不限如此。
</p>
<p>&nbsp;</p>
<p>GL_TRIANGLES  &#8211; 表示OpenGL将以是三个顶点一组来处理顶点数组。所以，第一组三个顶点代表三角形顶点1，2和3。然后再处理接下来的一组三个顶点，直到数组的尾部。
</p>
<p>&nbsp;</p>
<p>GL_TRIANGLE_STRIP  &#8211; OpenGL将从前两个顶点开始，对于各个后续顶点，它将与前两个顶点一起构成三角形。也就是说，squareVertices[6~8]是与squareVerticies[0~2]和squareVerticies[3~5]一起构成三角形的。而squareVertices[9~11]是与squareVertices[3~5]和squareVertices[6~8]构成三角形的。如此这般，完成整个数组。
</p>
<p>&nbsp;</p>
<p>注意：squareVertices[0~2]表示：
</p>
<p>        squareVertices[0]  &#8211; X 坐标
</p>
<p>        squareVertices[1] &#8211; Y 坐标
</p>
<p>        squareVertices[2] &#8211; Z 坐标
</p>
<p>&nbsp;</p>
<p>如果你还不明白，我将在随后的示例中进一步说明。
</p>
<p>&nbsp;</p>
<p>GL_TRIANGLE_FAN  &#8211; 对于最前面两个顶点之后的每个后续顶点，OpenGL将使用前一个顶点以及第一个顶点构成三角形。所以，对于squareVertices[6~8]，它是通过与squareVertices[3~5] （前一个顶点）和squareVertices[0~2] （第一个顶点）一起构成三角形的。
</p>
<p>&nbsp;</p>
<p>我们使用的是GL_TRIANGLES_FAN。按下“Build &amp; Go”后，你可以在屏幕上看到如下白色正方形：
</p>
<p>
</p>
<div>
<div>
<div><img src="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares_files/square.png" alt=""></div>
</p></div>
<p>
</div>
<p>回头看看顶点数组。想象一下三角形是这样被绘制从而构成正方形的。OpenGL是这样进行渲染的。
</p>
<p>&nbsp;</p>
<p>三角形顶点1: squareVertices[0~2]        &#8212; 正方形的左上角
</p>
<p>三角形顶点2: squareVertices[3~5]        &#8212; 正方形的左下角
</p>
<p>三角形顶点3: squareVertices[6~8]        &#8212; 正方形的右下角
</p>
<p>&nbsp;</p>
<p>OpenGL使用上叙三点绘制的三角形组成了正方形的左下部分。设想下按对角线从左上角开始到右下角将正方形分成两部分。注意两个三角形是怎样构成的？OpenGL只是画了正方形左下方一半。
</p>
<p>&nbsp;</p>
<p>注意：squareVertices[0~2]表示：
</p>
<p>        squareVertices[0] - X坐标
</p>
<p>        squareVertices[1] &#8211; Y坐标
</p>
<p>        squareVertices[2] &#8211; Z坐标
</p>
<p>&nbsp;</p>
<p>三角形顶点1: squareVertices[9~11]       &#8211; 正方形右上方顶点
</p>
<p>三角形顶点2: squareVertices[6~8]        &#8212; 前一个顶点，右下顶点
</p>
<p>三角形顶点3: squareVertices[0~2]        &#8212; 第一顶点，左上顶点
</p>
<p>&nbsp;</p>
<p>只要使用一个新点，OpenGL就能渲染三角形以完成整个正方形的渲染。
</p>
<p>&nbsp;</p>
<p>GL_TRIANGLE_STRIP
</p>
<p>回到代码将glDrawArrays()第一个参数从GL_TRIANGLE_FAN改为GL_TRIANGLE_STRIP：
</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">        glDrawArrays<span style="color: #002200;">&#40;</span>GL_TRIANGLE_STRIP, 0, 4<span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>按 “Build &amp; Go” ，你将看到下列图形：
</p>
<p>
</p>
<div>
<div>
<div><img src="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares_files/trianglesstrip.jpg" alt=""></div>
</p></div>
<p>
</div>
<p>&nbsp;</p>
<p>让我们分析下为什么在绘制方法中的一个变化就会导致我们得不到正方形的结果。OpenGL以以下方法处理顶点数组：
</p>
<p>&nbsp;</p>
<p>三角形顶点 1: squareVertices[0~2]        &#8212; 左上
</p>
<p>三角形顶点 2: squareVertices[3~5]        &#8212; 左下
</p>
<p>三角形顶点 3: squareVertices[6~8]        &#8212; 右下
</p>
<p>&nbsp;</p>
<p>OpenGL现在是使用最前面的三点渲染三角形，因此，正方形左下半部分三角形的渲染已前面例子的结果一样。
</p>
<p>&nbsp;</p>
<p>三角形顶点 1: squareVertices[9~11]       &#8211; 右上
</p>
<p>三角形顶点 2: squareVertices[6~8]        &#8212; 前一个顶点，右下
</p>
<p>三角形顶点 3: squareVertices[3~5]        &#8212; 再前一个顶点，左下
</p>
<p>&nbsp;</p>
<p>OpenGL现在是使用这三点来渲染三角形。在本例中，使渲染的三角形与构成正方形所需的三角形相比，正好翻转了90度。
</p>
<p>&nbsp;</p>
<p>如果我们用不同方式提供顶点数组，我们有可能像使用GL_TRIANGLE_STRIP获得正确正方形，就像使用GL_TRIANGLE_FAN一样。需要记住绘制方法必须与顶点数组一起考虑，否则有可能得到奇怪的结果，就像我们将FAN改为STRIP时一样。
</p>
<p>&nbsp;</p>
<p>注意：如果你以不同方式设定顶点数组，使用GL_TRIANGLE_STRIP你仍可以画出正确的正方形。例如：
</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">    <span style="color: #a61390;">const</span> GLfloat stripSquare<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#123;</span><br />
<br />
        <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>,               <span style="color: #11740a; font-style: italic;">// 左下</span><br />
        <span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>,                <span style="color: #11740a; font-style: italic;">// 右下</span><br />
        <span style="color: #002200;">-</span><span style="color: #2400d9;">1.0</span>, <span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>,                <span style="color: #11740a; font-style: italic;">// 左上</span><br />
        <span style="color: #2400d9;">1.0</span>, <span style="color: #2400d9;">1.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">6.0</span>                  <span style="color: #11740a; font-style: italic;">// 右上</span><br />
    <span style="color: #002200;">&#125;</span>;</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>使用上述三点，可以看到第一个三角形是通过前三个顶点构成的，获得的三角形如下：
</p>
<p>&nbsp;</p>
<div>
<div>
<div><img src="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares_files/gltrianglestrip1.png" alt=""></div>
</p></div>
<p>
</div>
<p>&nbsp;</p>
<p>现在，通过指定右上顶点（P4），与左上（P3）和右下的再前一个顶点（P2）可以构成一个新三角形。新顶点用橘红，绿色和红色表示如下：
</p>
<p>
</p>
<div>
<div>
<div><img src="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares_files/gltrianglestrip2.png" alt=""></div>
</p></div>
<p>
</div>
<p>&nbsp;</p>
<p>我们正确地绘制了一个正方形。最终的结果是一样的，但需要提醒你的是，指定的顶点数组必须与绘图方法匹配。
</p>
<p>&nbsp;</p>
<h2>结论<br />
</h2>
<p>&nbsp;</p>
<p>我们已经讨论了三角形和正方形。还剩下点和线部分。这两种基元都十分简单，将在下一篇教程中涉及。对于本次教程已经涉及的部分，下次我们将进行混色处理。
</p>
<p>&nbsp;</p>
<p>在完成了物体着色后，我们将移动和进行3D纹理映射。当然，它不会是Doom 3式的程序，不过我们可以由此开始建立3D物体。然后，我们就将进入3D世界了。
</p>
<p>&nbsp;</p>
<p>本教程的源代码：<a href="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares_files/AppleCoder-OpenGLES-02.zip" title="28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares_files/AppleCoder-OpenGLES-02.zip">AppleCoder-OpenGLES-02.zip</a>
</p>
<p>&nbsp;</p>
<h5>原文见：<a href="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares.html">OpenGL ES 02 &#8211; Drawing Primitives 2 &#8211; Squares</a>&nbsp;作者：Simon Maurice &nbsp;上一篇：<a href="编程/opengl-es-01-绘制基本图形1-三角形">opengl-es-01-绘制基本图形1-三角形</a></h5>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/opengl-es-02-%e7%bb%98%e5%88%b6%e5%9f%ba%e6%9c%ac%e5%9b%be%e5%bd%a22-%e6%ad%a3%e6%96%b9%e5%bd%a2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone游戏编程教程之四-游戏简单音频</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e6%95%99%e7%a8%8b%e4%b9%8b%e5%9b%9b-%e6%b8%b8%e6%88%8f%e7%ae%80%e5%8d%95%e9%9f%b3%e9%a2%91</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e6%95%99%e7%a8%8b%e4%b9%8b%e5%9b%9b-%e6%b8%b8%e6%88%8f%e7%ae%80%e5%8d%95%e9%9f%b3%e9%a2%91#comments</comments>
		<pubDate>Fri, 13 Nov 2009 10:42:33 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[游戏]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[音频]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=235</guid>
		<description><![CDATA[本教程系列的最后一讲将介绍怎样为你的游戏加上声音。由于这是针对初学者的教程，所以我不会讨论复杂的音频技术，如OpenGL和Audio Queue。今天的主题是播放一段短的声音（少于30秒）。如果你不要求任何背景音乐，这将是最容易的播放音频的方式了。这种方式的缺点是一次只能播放一个音频文件。好，我们开始吧&#8230;&#8230;先从上次教程的代码开始。我们今天将使用两种声音，一个是击打球的声音，另一个是得分的声音。

&#160;

下面是你需要下载的音频文件：

clapping-crowd-studio-01
tennis-volley-01

&#160;
注意文件的格式是.caf。你所有音频文件格式必须符合在iPhone上播放的要求。Apple提供了一个工具将音频转换成这种格式。这里是参考。很简单，打开终端输入：
&#160;
/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}
&#160;
 {INPUT}是输入音频文件路径，{OUTPUT} 是你想要存放的.caf文件路径。
&#160;
将音频文件添加到项目中
&#160;
将下载好的音频文件拖放到项目下的Resources文件夹。如果你还希望 安排得更为有序些的话，你还可以建立一个Audio子文件夹。请确定在“copy the  files into your project’s directory”检查框上打勾。

&#160;
添加AudioToolbox.framework到项目
&#160;
由于我们要用到此框架的一些函数，所以我们必须将此框架加入项目中。右击项目中的Frameworks文件夹选择Add -&#62; Existing Frameworks。在搜索框内输入AudioToolbox.framework 然后选择搜索结果中的框架。（请确定点取了Computer 以搜索整个电脑）。

&#160;
找到所需框架后，按Add。现在我们已经准备好写代码了&#8230;&#8230;
&#160;
头文件声明
&#160;
打开 iTennisViewController.h 加入下列代码：

&#160;
首先我们看到代码引入AudioServices.h，我们需要使用其中一些函数来播放音频。接下来定义了两个SystemSoundID。它们都是Integers（整数型，也可以使用int，但会引起许多警告信息）。然后打开iTennishViewController.m加入下面代码：

&#160;
现在我们来初始化声音对象。找到viewDidLoad方法加入下列代码：

&#160;
很简单吧。第一行是获取音频文件路径。下一行是将路径转换为CFURLRef。最后，加载音频文件并与指定soundID联系起来。注意我们传递的&#38;clappingFileID参数，  这是通过参考地址传递的，因此它允许AudioServicesCreateSystemSoundID方法对其进行修改。我们用同样方法处理击球声。下面，我们可以开始播放了。
&#160;
声音播放
&#160;
播放加载好的声音实际上很简单。只需将需要播放文件的soundID传递给AudioServicesPlaySystemSound方法即可。所以播放得分时的鼓掌声只需在reset方法中加入下列代码：

&#160;
请注意，我们传递的clappingFileID说明我们是要播放鼓掌声。加在gameLoop中加入下列代码将播放球拍击球的声音：

&#160;
很容易吧？按“Build and Go”试玩我们的游戏吧。源代码下载 。
&#160;
原文见：iPhone Game Programming Tutorial Part 4 – Basic Game Audio  
]]></description>
			<content:encoded><![CDATA[<p>本教程系列的最后一讲将介绍怎样为你的游戏加上声音。由于这是针对初学者的教程，所以我不会讨论复杂的音频技术，如OpenGL和Audio Queue。今天的主题是播放一段短的声音（少于30秒）。如果你不要求任何背景音乐，这将是最容易的播放音频的方式了。这种方式的缺点是一次只能播放一个音频文件。好，我们开始吧&#8230;&#8230;先从上次教程的代码开始。我们今天将使用两种声音，一个是击打球的声音，另一个是得分的声音。
</p>
<p>&nbsp;</p>
<p><span id="more-235"></span></p>
<p>下面是你需要下载的音频文件：</p>
<ul>
<li><a href="http://icodeblog.com/wp-content/uploads/2009/05/clapping-crowd-studio-01.caf">clapping-crowd-studio-01</a></li>
<li><a href="http://icodeblog.com/wp-content/uploads/2009/05/tennis-volley-01.caf">tennis-volley-01</a></li>
</ul>
<p>&nbsp;</p>
<p>注意文件的格式是.caf。你所有音频文件格式必须符合在iPhone上播放的要求。Apple提供了一个工具将音频转换成这种格式。这里是<a href="CONVERT_AN_AUDIO_FILE_TO_THE_PREFERRED_FORMAT_FOR_IPHONE_OS">参考</a>。很简单，打开终端输入：</p>
<p>&nbsp;</p>
<p><strong>/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}</strong></p>
<p>&nbsp;</p>
<p> {INPUT}是输入音频文件路径，{OUTPUT} 是你想要存放的.caf文件路径。</p>
<p>&nbsp;</p>
<h2>将音频文件添加到项目中</h2>
<p>&nbsp;</p>
<p>将下载好的音频文件拖放到项目下的Resources文件夹。如果你还希望 安排得更为有序些的话，你还可以建立一个Audio子文件夹。请确定在“copy the  files into your project’s directory”检查框上打勾。</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_01.png"><img title="screenshot_01" src="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_01.png" alt="screenshot_01" width="232" height="240"></a></p>
<p>&nbsp;</p>
<h2>添加AudioToolbox.framework到项目</h2>
<p>&nbsp;</p>
<p>由于我们要用到此框架的一些函数，所以我们必须将此框架加入项目中。右击项目中的<strong>Frameworks</strong>文件夹选择<strong>Add -&gt; Existing Frameworks</strong>。在搜索框内输入<strong>AudioToolbox.framework </strong>然后选择搜索结果中的框架。（请确定点取了<strong>Computer</strong> 以搜索整个电脑）。</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_02.png"><img title="screenshot_02" src="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_02.png" alt="screenshot_02" width="532" height="427"></a></p>
<p>&nbsp;</p>
<p>找到所需框架后，按<strong>Add</strong>。现在我们已经准备好写代码了&#8230;&#8230;</p>
<p>&nbsp;</p>
<h2>头文件声明</h2>
<p>&nbsp;</p>
<p>打开 <strong>iTennisViewController.h</strong> 加入下列代码：</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_11.png"><img title="screenshot_11" src="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_11.png" alt="screenshot_11" width="325" height="356"></a></p>
<p>&nbsp;</p>
<p>首先我们看到代码引入AudioServices.h，我们需要使用其中一些函数来播放音频。接下来定义了两个SystemSoundID。它们都是Integers（整数型，也可以使用int，但会引起许多警告信息）。然后打开<strong>iTennishViewController.m</strong>加入下面代码：</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_09.png"><img title="screenshot_09" src="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_09.png" alt="screenshot_09" width="258" height="27"></a></p>
<p>&nbsp;</p>
<p>现在我们来初始化声音对象。找到viewDidLoad方法加入下列代码：</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_12.png"><img title="screenshot_12" src="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_12.png" alt="screenshot_12" width="709" height="223"></a></p>
<p>&nbsp;</p>
<p>很简单吧。第一行是获取音频文件路径。下一行是将路径转换为CFURLRef。最后，加载音频文件并与指定soundID联系起来。注意我们传递的&amp;clappingFileID参数，  这是通过参考地址传递的，因此它允许AudioServicesCreateSystemSoundID方法对其进行修改。我们用同样方法处理击球声。下面，我们可以开始播放了。</p>
<p>&nbsp;</p>
<h2>声音播放</h2>
<p>&nbsp;</p>
<p>播放加载好的声音实际上很简单。只需将需要播放文件的soundID传递给AudioServicesPlaySystemSound方法即可。所以播放得分时的鼓掌声只需在reset方法中加入下列代码：</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_14.png"><img title="screenshot_14" src="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_14.png" alt="screenshot_14" width="322" height="52"></a></p>
<p>&nbsp;</p>
<p>请注意，我们传递的clappingFileID说明我们是要播放鼓掌声。加在gameLoop中加入下列代码将播放球拍击球的声音：</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_15.png"><img title="screenshot_15" src="http://icodeblog.com/wp-content/uploads/2009/05/screenshot_15.png" alt="screenshot_15" width="381" height="209"></a></p>
<p>&nbsp;</p>
<p>很容易吧？按“Build and Go”试玩我们的游戏吧。源代码<a href="http://icodeblog.com/wp-content/uploads/2009/05/itennis-4.zip">下载</a> 。</p>
<p>&nbsp;</p>
<h5>原文见：<a href="http://icodeblog.com/2009/05/04/iphone-game-programming-tutorial-part-4-basic-game-audio/" rel="bookmark" title="Permanent Link to iPhone Game Programming Tutorial Part 4 – Basic Game Audio">iPhone Game Programming Tutorial Part 4 – Basic Game Audio </a> </h5>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e6%95%99%e7%a8%8b%e4%b9%8b%e5%9b%9b-%e6%b8%b8%e6%88%8f%e7%ae%80%e5%8d%95%e9%9f%b3%e9%a2%91/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>一款App Store上架游戏的源代码</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e4%b8%80%e6%ac%beapp-store%e4%b8%8a%e6%9e%b6%e6%b8%b8%e6%88%8f%e7%9a%84%e6%ba%90%e4%bb%a3%e7%a0%81</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e4%b8%80%e6%ac%beapp-store%e4%b8%8a%e6%9e%b6%e6%b8%b8%e6%88%8f%e7%9a%84%e6%ba%90%e4%bb%a3%e7%a0%81#comments</comments>
		<pubDate>Fri, 13 Nov 2009 02:43:35 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[开源项目]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[源代码]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=223</guid>
		<description><![CDATA[发现一款App Store上架游戏的源代码，游戏名为Tweejump。它是以Cocos2D为引擎的。想学习开源Cocos2D引擎的朋友可以参考下。

源码下载地址在Github，直接按“Download&#8221;就可以下载了。
]]></description>
			<content:encoded><![CDATA[<p>发现一款App Store上架游戏的源代码，游戏名为<a href="http://iplayful.com/tweejump/">Tweejump</a>。它是以Cocos2D为引擎的。想学习开源Cocos2D引擎的朋友可以参考下。</p>
<p><img alt="" src="http://iplayful.com/tweejump/tweejump.jpg" title="tweejump" class="alignnone" width="318" height="459" /></p>
<p>源码下载地址在<a href="http://github.com/haqu/tweejump">Github</a>，直接按“Download&#8221;就可以下载了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e4%b8%80%e6%ac%beapp-store%e4%b8%8a%e6%9e%b6%e6%b8%b8%e6%88%8f%e7%9a%84%e6%ba%90%e4%bb%a3%e7%a0%81/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL ES系列之0 &#8211; 建立Xcode项目</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone-opengl-es%e7%b3%bb%e5%88%97%e4%b9%8b0-%e5%bb%ba%e7%ab%8bxcode%e9%a1%b9%e7%9b%ae</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone-opengl-es%e7%b3%bb%e5%88%97%e4%b9%8b0-%e5%bb%ba%e7%ab%8bxcode%e9%a1%b9%e7%9b%ae#comments</comments>
		<pubDate>Wed, 11 Nov 2009 10:53:03 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[图形图像]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[OpenGL ES]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=182</guid>
		<description><![CDATA[
为iPhone建立一个OpenGL ES的Xcode项目是很容易的事，特别是在苹果公司的SDK发布时引入了模板的概念后。我们所需要做的只是在适当的地方快速而简单的加入代码。这就是我们今天的主题。

&#160;
老实说，如果你只是想早点切入OpenGL 教程的主题，你尽可以忽略这一部分。而且这样做，你也不会错失什么，因为有关Xcode设定部分我并不准备过多涉猎。尽管进入教程的最后部分下载项目文件。
&#160;
启动Xcode并创建Xcode新项目。选择模板&#8220;OpenGL ES Application&#8221;（见图1），然后将项目存储在你认为方便的地方。&#160;
&#160;



&#160;&#160;
图1
&#160;
好，我们假定你肯能以前已经在哪看过这个模板或运行过用这个模板建立的项目。我们说要做的就是移除那个旋转的彩色正方形的有关代码并将其转换成使用深度缓冲的视图（即使其成为&#8220;真正的&#8221;3D）。
&#160;
3D空间的2D
  
&#160;
像Apple的模板一样，大部分OpenGL教程开始都忽略深度，通常都使用2维坐标系统（X,Y)而不是更复杂的3维坐标系统（X,Y,Z)。你可能已经注意到Apple模板中的正方形定点使用（X,Y)，这是因为他们没有使用深度。
&#160;
这叫做正交投影。本教程系列的目标是带你进入3D世界。所以我现在不会讨论正交投影；可能稍后的系列会有提及。现在我们直接向3D世界进发吧。
  
&#160;
允许Depth Buffer（深度缓存）
  
&#160;
我们要作的第一件事是允许深度缓存。Apple示例中的正方形只是一个2D物体，所以根本不需要深度缓存。由于我们需要深度，所以我们必须启用它。Apple已经提供了设定深度缓存的代码，我们正好可以使用。
  
&#160;
在编辑器中打开EAGLView.m找到下面代码:
  
1#define USE_DEPTH_BUFFER 0

不用多说，把0改为1。这将启用视图设定部分创建深度缓存的代码。代码在createFrameBuffer方法中。现在还不需要考虑太多这段代码。它是Apple写的，应该能正常工作。
  
&#160;
现在我们需要启用深度来测试OpenGL。我们要建立一个新方法，它只会被调用一次以使视图正常工作。首先，建立一个新方法setupView并将下面代码加入新方法中：  
1234567891011121314151617- &#40;void&#41;setupView &#123;
&#160; &#160; const GLfloat zNear = 0.1, zFar = 1000.0, fieldOfView = 60.0;
&#160; &#160; GLfloat size;
&#160; &#160; glEnable&#40;GL_DEPTH_TEST&#41;;

&#160; &#160; glMatrixMode&#40;GL_PROJECTION&#41;;

&#160; &#160; size = zNear * tanf&#40;DEGREES_TO_RADIANS&#40;fieldOfView&#41; / 2.0&#41;;

&#160; &#160; // This give [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>为iPhone建立一个OpenGL ES的Xcode项目是很容易的事，特别是在苹果公司的SDK发布时引入了模板的概念后。我们所需要做的只是在适当的地方快速而简单的加入代码。这就是我们今天的主题。</p>
<p><span id="more-182"></span></p>
<p>&nbsp;</p>
<p>老实说，如果你只是想早点切入OpenGL 教程的主题，你尽可以忽略这一部分。而且这样做，你也不会错失什么，因为有关Xcode设定部分我并不准备过多涉猎。尽管进入教程的最后部分下载项目文件。</p>
<p>&nbsp;</p>
<p>启动Xcode并创建Xcode新项目。选择模板&ldquo;OpenGL ES Application&rdquo;（见图1），然后将项目存储在你认为方便的地方。&nbsp;</p>
<p>&nbsp;</p>
<div>
<div><img alt="" src="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_00_-_Xcode_Project_Set_Up_files/figure01.png"></div>
</p></div>
<p>&nbsp;&nbsp;</p>
<h5>图1</h5>
<p>&nbsp;</p>
<p>好，我们假定你肯能以前已经在哪看过这个模板或运行过用这个模板建立的项目。我们说要做的就是移除那个旋转的彩色正方形的有关代码并将其转换成使用深度缓冲的视图（即使其成为&ldquo;真正的&rdquo;3D）。</p>
<p>&nbsp;</p>
<h2>3D空间的2D<br />
  </h2>
<p>&nbsp;</p>
<p>像Apple的模板一样，大部分OpenGL教程开始都忽略深度，通常都使用2维坐标系统（X,Y)而不是更复杂的3维坐标系统（X,Y,Z)。你可能已经注意到Apple模板中的正方形定点使用（X,Y)，这是因为他们没有使用深度。</p>
<p>&nbsp;</p>
<p>这叫做正交投影。本教程系列的目标是带你进入3D世界。所以我现在不会讨论正交投影；可能稍后的系列会有提及。现在我们直接向3D世界进发吧。
  </p>
<p>&nbsp;</p>
<p>允许Depth Buffer（深度缓存）
  </p>
<p>&nbsp;</p>
<p>我们要作的第一件事是允许深度缓存。Apple示例中的正方形只是一个2D物体，所以根本不需要深度缓存。由于我们需要深度，所以我们必须启用它。Apple已经提供了设定深度缓存的代码，我们正好可以使用。
  </p>
<p>&nbsp;</p>
<p>在编辑器中打开EAGLView.m找到下面代码:
  </p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6e371a;">#define USE_DEPTH_BUFFER 0</span></div></td></tr></tbody></table></div>
</p>
<p>不用多说，把0改为1。这将启用视图设定部分创建深度缓存的代码。代码在createFrameBuffer方法中。现在还不需要考虑太多这段代码。它是Apple写的，应该能正常工作。
  </p>
<p>&nbsp;</p>
<p>现在我们需要启用深度来测试OpenGL。我们要建立一个新方法，它只会被调用一次以使视图正常工作。首先，建立一个新方法setupView并将下面代码加入新方法中：  </p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setupView <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">const</span> GLfloat zNear <span style="color: #002200;">=</span> 0.1, zFar <span style="color: #002200;">=</span> 1000.0, fieldOfView <span style="color: #002200;">=</span> <span style="color: #2400d9;">60.0</span>;<br />
&nbsp; &nbsp; GLfloat size;<br />
&nbsp; &nbsp; glEnable<span style="color: #002200;">&#40;</span>GL_DEPTH_TEST<span style="color: #002200;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; glMatrixMode<span style="color: #002200;">&#40;</span>GL_PROJECTION<span style="color: #002200;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; size <span style="color: #002200;">=</span> zNear <span style="color: #002200;">*</span> tanf<span style="color: #002200;">&#40;</span>DEGREES_TO_RADIANS<span style="color: #002200;">&#40;</span>fieldOfView<span style="color: #002200;">&#41;</span> <span style="color: #002200;">/</span> 2.0<span style="color: #002200;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// This give us the size of the iPhone display</span><br />
&nbsp; &nbsp; CGRect rect <span style="color: #002200;">=</span> self.bounds;<br />
<br />
&nbsp; &nbsp; glFrustumf<span style="color: #002200;">&#40;</span><span style="color: #002200;">-</span>size, size, <span style="color: #002200;">-</span>size <span style="color: #002200;">/</span> <span style="color: #002200;">&#40;</span>rect.size.width <span style="color: #002200;">/</span> rect.size.height<span style="color: #002200;">&#41;</span>, size <span style="color: #002200;">/</span> <span style="color: #002200;">&#40;</span>rect.size.width <span style="color: #002200;">/</span> rect.size.height<span style="color: #002200;">&#41;</span>, zNear, zFar<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; glViewport<span style="color: #002200;">&#40;</span>0, 0, rect.size.width, rect.size.height<span style="color: #002200;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; glClearColor<span style="color: #002200;">&#40;</span>0.0f, 0.0f, 0.0f, 1.0f<span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>上述代码通过建立一个映射到世界显示的视区设定了OpenGL操作的环境。我将稍后详细说明，现在注意下面代码：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">glEnable<span style="color: #002200;">&#40;</span>GL_DEPTH_TEST<span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>此代码启用了OpenGL中的深度测试。你需要记住在OpenGL中一旦你启用了什么，你一定要记住在你不需要时要关闭它。由于我们启用深度测试并没有关闭，所以在视图设定中仍然有效。</p>
<p><div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">glClearColor(0.0f, 0.0f, 0.0f, 1.0f);</div></td></tr></tbody></table></div>
</p>
<p>&nbsp;</p>
<p>我们在此定义了清屏时所用的颜色。OpenGLES中所有颜色都必须是RGBA值（即红，绿，蓝和alpha），而不能像OpenGL一样采用RGB值。由于OpenGLES已经知道清屏时采用的颜色，所以清屏时使用定义的黑色。此设定一直保持到我们改变它。</p>
<p>&nbsp;</p>
<p>当使用浮点时，颜色值为0-&gt;1，而使用无符号字节类型时，可为0-&gt;255。数值越大，所代表颜色的密度越高。
  </p>
<p>&nbsp;</p>
<p>好，回到文件最开始我们先前改变的#define处。我们要在这定义一个宏，在我们刚插入的setupView方法中需要用到。</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #6e371a;">#define USE_DEPTH_BUFFER 1</span><br />
&nbsp; <br />
&nbsp; <span style="color: #6e371a;">#define DEGREES_TO_RADIANS(__ANGLE) ((__ANGLE) / 180.0 * M_PI)</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<h2>视图绘制 &#8211; 画图方法<br />
  </h2>
<p>&nbsp;</p>
<p>现在，找到drawView方法。这是本教程的重点。Apple已经提示我们这里是视图绘制的地方。</p>
<p>&nbsp;</p>
<p>首先，删除一切，加入下面代码：
  </p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>drawView <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>EAGLContext setCurrentContext<span style="color: #002200;">:</span>context<span style="color: #002200;">&#93;</span>;<span style="color: #002200;">&amp;</span>nbsp;<span style="color: #002200;">&amp;</span>nbsp;<span style="color: #002200;">&amp;</span>nbsp; <br />
&nbsp; &nbsp; glBindFramebufferOES<span style="color: #002200;">&#40;</span>GL_FRAMEBUFFER_OES, viewFramebuffer<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; glViewport<span style="color: #002200;">&#40;</span>0, 0, backingWidth, backingHeight<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; glBindRenderbufferOES<span style="color: #002200;">&#40;</span>GL_RENDERBUFFER_OES, viewRenderbuffer<span style="color: #002200;">&#41;</span>;<br />
&nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>context presentRenderbuffer<span style="color: #002200;">:</span>GL_RENDERBUFFER_OES<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>上面代码的前三行是设定作图空间。后两行是将作图空间与当前屏幕可见空间进行交换。如果你以前进行过动画或游戏编程工作，那么你应该知道这叫做 &ldquo;double buffered（双重缓冲）&rdquo;。</p>
<p>&nbsp;</p>
<p>如果不知道，我们解释下：我们创建了两个完全相同的缓冲，一个用于显示给用户，另一个被清理掉然后在其上绘图。在绘制结束后，我们交换这两个视图以便用户看到新的视图。我们之所以不拍麻烦做了这么多事情是为了动画更为平滑。
  </p>
<p>&nbsp;</p>
<p>我们还要加入更多的代码。</p>
<p>&nbsp;</p>
<p>首先，在dealloc方法前插入以下代码：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>checkGLError<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>visibleCheck <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; GLenum error <span style="color: #002200;">=</span> glGetError<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">switch</span> <span style="color: #002200;">&#40;</span>error<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">case</span> GL_INVALID_ENUM<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GL Error: Enum argument is out of range&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">case</span> GL_INVALID_VALUE<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GL Error: Numeric value is out of range&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">case</span> GL_INVALID_OPERATION<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GL Error: Operation illegal in current state&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">case</span> GL_STACK_OVERFLOW<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GL Error: Command would cause a stack overflow&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a61390;">break</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">case</span> GL_STACK_UNDERFLOW<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GL Error: Command would cause a stack underflow&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">case</span> GL_OUT_OF_MEMORY<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GL Error: Not enough memory to execute command&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">case</span> GL_NO_ERROR<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>visibleCheck<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;No GL Error&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">default</span><span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Unknown GL Error&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>OpenGL有一套错误检查的方法（glGetError())，但是需要将错误码转换成更容易读的格式。上面的代码就是完成这个工作的。</p>
<p>&nbsp;</p>
<p>布尔值&ldquo;visibleCheck&rdquo;只用于检查当没有错误时此方法是否已被调用。 </p>
<p>&nbsp;</p>
<p>最后，我们要做的只是在EAGLView.m中找到initWithCoder方法并调用&ldquo;setupView&rdquo;方法。在变量&ldquo;animationInterval&rdquo;设定之前，加入下面代码调用setupView：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">&#91;</span>self setupView<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>应注意我们只是调用在initWithCoder中setupView方法而不是创建一个新方法，它只应该被调用一次。</p>
<p>下面，打开EAGLView.h！</p>
<p>&nbsp;</p>
<h3>EAGLView.h<br />
  </h3>
<p>&nbsp;</p>
<p>我们只需要在这里加入两个方法的原型：
  </p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setupView;<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>checkGLError<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>visibleCheck;</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>教程到此结束。</p>
<p>&nbsp;</p>
<h2>后续&#8230;<br />
  </h2>
<p>&nbsp;</p>
<p>如果你此时按&ldquo;build and run&rdquo;，那么在simulator（模拟器）上只是显示一个空白屏幕。在下一个教程中，我们将在屏幕上绘制一下基本图形，基本图形是指点，线和三角形之类的元素。</p>
<p>&nbsp;</p>
<p>
  代码下载：<a href="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_00_-_Xcode_Project_Set_Up_files/AppleCoder-OpenGLES-00.zip" title="28_OpenGL_ES_00_-_Xcode_Project_Set_Up_files/AppleCoder-OpenGLES-00.zip">AppleCoder-OpenGLES-00.zip</a>
  </p>
<p>&nbsp;</p>
<h5>原文见： <a href="http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_00_-_Xcode_Project_Set_Up.html">OpenGL ES 00 &#8211; Xcode Project Set Up</a> 作者：Simon Maurice</h5>
<div>
<h5></h5>
</p></div>
</div>
<div> </div>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone-opengl-es%e7%b3%bb%e5%88%97%e4%b9%8b0-%e5%bb%ba%e7%ab%8bxcode%e9%a1%b9%e7%9b%ae/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone游戏编程教程之三- 启动画面</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e6%95%99%e7%a8%8b%e4%b9%8b%e4%b8%89-%e5%90%af%e5%8a%a8%e7%94%bb%e9%9d%a2</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e6%95%99%e7%a8%8b%e4%b9%8b%e4%b8%89-%e5%90%af%e5%8a%a8%e7%94%bb%e9%9d%a2#comments</comments>
		<pubDate>Wed, 18 Mar 2009 08:02:05 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[游戏]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://iphonegeek.zuesitech.com/?p=165</guid>
		<description><![CDATA[今天，我将介绍怎样为你的程序加一些&#8220;铃和哨&#8221;（注：指一些附加的花哨的东西）是你的游戏显得更完整。首先，我们为游戏增加一个启动页面。

&#160;
创建启动页面
&#160;
我们加入的启动页面将淡出到游戏主屏幕。你可以下载此图像加入到项目的Resources（资源）文件夹中。 请选择复选框中&#8220;copy this image to the project&#8217;s directory（拷贝此 图像至项目目录）&#8221;选项。

&#160;

我们需要加入一个View Controller到我们的项目，它将负责处理启动画面视图。在你的项目中加入一个新的UIViewController的子类文件。取名为SplashViewController，同时选择建立.h文件。
&#160;


&#160;


然后，我们要改变AppDelegate以加载此View Controller而不是原来的Main View Controller。打开iTennisAppDelegate.h修改如下：
&#160;




&#160;


主要是将iTennisViewController替换为SplashViewController。接着，打开iTennisAppDelegate.m做如下修改：



&#160;


这里我们所作的也只是将iTennisViewController替换为SplashViewController。这是因为我们希望开始时加载启动页面而不是游戏主画面。这里需要注意的一个主要区别是我们分配了一个新的SplashViewController实例。我们不需要对iTennisViewController这样做是因为它是从nib文件中加载而由程序本身对它进行初始化的。由于我们是通过编程来建立SplashViewController(没有nib), 所以需要将其实例化。接着我们就要实现SplashView。打开SplashViewController.h加入以下代码：
&#160;



&#160;


我来解释一下我们到底做了什么。首先，我们看到一个NSTimer。它被用于在启动画面淡出到游戏主画面前启动画面保持显示的时间。接着，有一个UIImageView，它将提供启动画面的图像。

  


最后，我们看到iTennisViewController，这是被程序代理替换掉的视图控制器。我们将从启动视图中加载它。打开SplashViewController.m 加入下列代码：



&#160;


这只是用来合成所有的属性。在loadView方法中加入下面代码:
&#160;



&#160;
这里有很多新代码。首先，由于是通过编程而不是通过nib来加载视图，我们必须创建视图。我们使用运行程序的框架（frame）来建立一个新的视图。然后将SplashViewController的视图设定到这个刚建立的视图。我们必须建立一个框架来通知应用程序创建一个320&#215;480的视图。

&#160;

下面，我们用Splash.png图像创建splashImageView。我们还需要为这个图像创建一个框架。将此框架想象成一个空的容器，我们将把图像放在里面。接着，我们把imageview加入主视图。然后，我们通过将要加载的nib的文件传递给视图的主控制器而对其进行初始化。再把视图的alpha透明性设为0.0。这样，它就会完全不可见。最后，我们将其加到我们的视图中。请注意，此时它覆盖在splashImageView的上方，但由于alpha透明值为0.0，它仍然不可见。
&#160;
最后，启动定时器。这样，在调用&#8220;fadeScreen&#8221;方法前，启动屏幕将显示2秒钟。必须指出我是从这篇文章借用的fadescreen方法。

&#160;
加入下面代码:


此代码中包括很多动画。由于注解很详细，我就不过多涉猎了。在fadeScreen方法中视图淡出，然后调用finishedFading。finishFading方法使视图控制器的视图重新淡入。主视图将显示出来。记住从父视图中移除启动屏视图，否则你会看到奇怪的画面过度效果。

&#160;
今天就到这里。下次我将引入音频到游戏中。如果有什么问题与建议，write me on Twitter.

&#160;
源代码在这里下载。
&#160;
18 Mar 2009 原文见：iPhone Game Programming Tutorial Part 3 &#8211; Splash Screen 
]]></description>
			<content:encoded><![CDATA[<p>今天，我将介绍怎样为你的程序加一些&ldquo;铃和哨&rdquo;（注：指一些附加的花哨的东西）是你的游戏显得更完整。首先，我们为游戏增加一个启动页面。</p>
<p><span id="more-165"></span></p>
<p>&nbsp;</p>
<h3>创建启动页面</h4>
<p>&nbsp;</p>
<p>我们加入的启动页面将淡出到游戏主屏幕。你可以下载此图像加入到项目的<strong>Resources（资源）</strong>文件夹中。 请选择复选框中&ldquo;copy this image to the project&rsquo;s directory（拷贝此 图像至项目目录）&rdquo;选项。</p>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/03/splash.png"><img title="splash" src="http://icodeblog.com/wp-content/uploads/2009/03/splash.png" alt="splash" width="320" height="480"></a></p>
<p>&nbsp;</p>
<p>
我们需要加入一个View Controller到我们的项目，它将负责处理启动画面视图。在你的项目中加入一个新的<strong>UIViewController</strong>的子类文件。取名为<strong>SplashViewController</strong>，同时选择建立.h文件。</p>
<p>&nbsp;</p>
<div>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_01.png"><img title="screenshot_01" src="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_01.png" alt="screenshot_01" width="600" height="442"></a></p>
<p>&nbsp;</p>
</div>
<div>
<p>然后，我们要改变AppDelegate以加载此View Controller而不是原来的Main View Controller。打开<strong>iTennisAppDelegate.h</strong>修改如下：</p>
<p>&nbsp;</p>
</div>
<p></p>
<div>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_02.png"><img title="screenshot_02" src="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_02.png" alt="screenshot_02" width="466" height="194"></a></p>
<p>&nbsp;</p>
</div>
<div>
<p>主要是将iTennisViewController替换为SplashViewController。接着，打开<strong>iTennisAppDelegate.m</strong>做如下修改：</p>
</div>
<div>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_03.png"><img title="screenshot_03" src="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_03.png" alt="screenshot_03" width="418" height="365"></a></p>
<p>&nbsp;</p>
</div>
<div>
<p>这里我们所作的也只是将iTennisViewController替换为SplashViewController。这是因为我们希望开始时加载启动页面而不是游戏主画面。这里需要注意的一个主要区别是我们分配了一个新的SplashViewController实例。我们不需要对iTennisViewController这样做是因为它是从nib文件中加载而由程序本身对它进行初始化的。由于我们是通过编程来建立SplashViewController(没有nib), 所以需要将其实例化。接着我们就要实现SplashView。打开<strong>SplashViewController.h</strong>加入以下代码：</p>
<p>&nbsp;</p>
</div>
<div>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_04.png"><img title="screenshot_04" src="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_04.png" alt="screenshot_04" width="406" height="231"></a></p>
<p>&nbsp;</p>
</div>
<div>
<p>我来解释一下我们到底做了什么。首先，我们看到一个NSTimer。它被用于在启动画面淡出到游戏主画面前启动画面保持显示的时间。接着，有一个UIImageView，它将提供启动画面的图像。</p>
<p>
  </p>
</div>
<div>
<p>最后，我们看到<strong>iTennisViewController</strong>，这是被程序代理替换掉的视图控制器。我们将从启动视图中加载它。打开<strong>SplashViewController.m</strong> 加入下列代码：</p>
</div>
<div>
<p><a href="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_05.png"><img title="screenshot_05" src="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_05.png" alt="screenshot_05" width="301" height="25"></a></p>
<p>&nbsp;</p>
</div>
<div>
<p>这只是用来合成所有的属性。在<strong>l</strong><strong>oadView</strong>方法中加入下面代码:</p>
<p>&nbsp;</p>
</div>
<div><a href="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_07.png"><img title="screenshot_07" src="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_07.png" alt="screenshot_07" width="761" height="259"></a></div>
<div>
<p>&nbsp;</p>
<p>这里有很多新代码。首先，由于是通过编程而不是通过nib来加载视图，我们必须创建视图。我们使用运行程序的框架（frame）来建立一个新的视图。然后将SplashViewController的视图设定到这个刚建立的视图。我们必须建立一个框架来通知应用程序创建一个320&#215;480的视图。</p>
</div>
<p>&nbsp;</p>
<div>
下面，我们用Splash.png图像创建splashImageView。我们还需要为这个图像创建一个框架。将此框架想象成一个空的容器，我们将把图像放在里面。接着，我们把imageview加入主视图。然后，我们通过将要加载的nib的文件传递给视图的主控制器而对其进行初始化。再把视图的alpha透明性设为0.0。这样，它就会完全不可见。最后，我们将其加到我们的视图中。请注意，此时它覆盖在splashImageView的上方，但由于alpha透明值为0.0，它仍然不可见。</p>
<p>&nbsp;</p>
<p>最后，启动定时器。这样，在调用&ldquo;fadeScreen&rdquo;方法前，启动屏幕将显示2秒钟。必须指出我是从<a href="http://www.iphonedevsdk.com/forum/iphone-sdk-development/12998-how-fade-between-views-transitioning-through-black.html" onclick="pageTracker._trackPageview('/outgoing/www.iphonedevsdk.com/forum/iphone-sdk-development/12998-how-fade-between-views-transitioning-through-black.html?referer=http%3A%2F%2Ficodeblog.com%2Fcategory%2Fiphone-programming-tutorials%2F');">这篇文章</a>借用的fadescreen方法。
</div>
<p>&nbsp;</p>
<div>加入下面代码:</div>
<div><a href="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_08.png"><img title="screenshot_08" src="http://icodeblog.com/wp-content/uploads/2009/03/screenshot_08.png" alt="screenshot_08" width="578" height="317"></a></div>
<div>
此代码中包括很多动画。由于注解很详细，我就不过多涉猎了。在fadeScreen方法中视图淡出，然后调用finishedFading。finishFading方法使视图控制器的视图重新淡入。主视图将显示出来。记住从父视图中移除启动屏视图，否则你会看到奇怪的画面过度效果。
</div>
<p>&nbsp;</p>
<p>今天就到这里。下次我将引入音频到游戏中。如果有什么问题与建议，<a href="http://twitter.com/brandontreb" onclick="pageTracker._trackPageview('/outgoing/twitter.com/brandontreb?referer=http%3A%2F%2Ficodeblog.com%2Fcategory%2Fiphone-programming-tutorials%2F');">write me on Twitter</a>.
</p>
<p>&nbsp;</p>
<p>源代码在<a href="http://icodeblog.com/wp-content/uploads/2009/03/itennis-3.zip">这里下载</a>。</p>
<p>&nbsp;</p>
<h5>18 Mar 2009 原文见：<a href="http://icodeblog.com/2009/03/18/iphone-game-programming-tutorial-part-3-splash-screen/" rel="bookmark" title="Permanent Link to iPhone Game Programming Tutorial Part 3 &ndash; Splash Screen">iPhone Game Programming Tutorial Part 3 &ndash; Splash Screen </a></h5>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e6%95%99%e7%a8%8b%e4%b9%8b%e4%b8%89-%e5%90%af%e5%8a%a8%e7%94%bb%e9%9d%a2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

