<?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>中文 &#187; qikaibinglan</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/qikaibinglan/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Sat, 26 May 2012 06:34:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Snake 游戏深入解析</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/12/28/snake/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/12/28/snake/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 02:12:25 +0000</pubDate>
		<dc:creator>qikaibinglan</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/12/28/snake/</guid>
		<description><![CDATA[Snake 是 Android SDK 例子程序中的一个小游戏，工程源代码：android-sdk-windows-1.5_r2\platforms\android-1.1\samples\Snake。这个小游戏在手机、游戏机、电脑中都出现过，游戏具体的玩法想必大家都知道，我主要是从Android开发应用程序的角度来分析这个游戏的框架、结构等。 首先将工程添加到Eclipes中，看源代码，分析类之间的关系，如下： 整个工程主体也就3个类：Snake，SnakeView，TitleView。Activity，View，Handler是Android SDK提供的基础类，Coordinate，RefreshHandler是2个辅助类，也是SnakeView类中的内部类。其中，Coordinate就相当于是一个点的坐标（x，y），RefreshHandler的主要功能是将RefreshHandler对象绑定某个线程并与给它发送消息。Snake类是这个游戏的入口点，TitleView类负责游戏的绘画，SnakeView类负责对游戏控制操作的处理。类的结构在上图中已经清晰说明，主要接口解析如下： 然后具体分析整个游戏的框架，任何一个游戏都需要有个引擎来推动游戏的运行，最简化的游戏引擎就是：在一个线程中While循环，检测用户操作，对用户的操作作出反应，更新游戏的界面，直到用户退出游戏。先解析下RefreshHandler这个辅助类的作用，RefreshHandler继承至Handler，其主要作用就是把RefreshHandler与当前线程进行绑定，然后就可以直接给线程发送消息并处理消息，有一点需要强调的是：Handle对消息的处理都是异步。RefreshHandler在Handler的基础上增加sleep()接口，其主要作用就是每隔一个时间段后给当前线程发送一个消息；而handleMessage()则就是在接受消息后，让界面对当前的游戏状态作出处理，运行机制如下： 实际上以上就相当于一个定时器，在特定的时刻发送消息，根据消息处理相应的事件。Update()与Sleep()这2个函数间接的相互调用就构成了一个循环。需要注意的是：mRedrawHandle绑定的是Avtivity所在的线程，也就是程序的主线程；另外由于sleep()是个异步函数，所以Update()与Sleep()之间的相互调用才没有构成死循环。 最后分析下游戏数据的保存机制，如下： 以上主要考虑了Activity的生命周期：如果用户在游戏期间离开游戏界面，游戏暂停；如果由于内存比较紧张，Android关闭游戏释放内存，那么当用户返回游戏界面的时候恢复到上次离开时的界面。 Snake源代码的内部细节，就不额外说明，在了解了框架后，再阅读代码就轻松多了。 总结说明 通过学习Snake这个简单的游戏，初步学习了如何开发游戏的界面、如何处理游戏的交互、如何保存游戏的数据等，这为我们以后开发更加复杂的游戏打好坚实的基础。]]></description>
			<content:encoded><![CDATA[<p>Snake 是 Android SDK 例子程序中的一个小游戏，工程源代码：android-sdk-windows-1.5_r2\platforms\android-1.1\samples\Snake。这个小游戏在手机、游戏机、电脑中都出现过，游戏具体的玩法想必大家都知道，我主要是从Android开发应用程序的角度来分析这个游戏的框架、结构等。</p>
<p>首先将工程添加到Eclipes中，看源代码，分析类之间的关系，如下：<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/Snake-Class2.jpg"><img class="alignnone size-full wp-image-400006657" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/Snake-Class2.jpg" alt="" width="711" height="585" /></a></p>
<p>整个工程主体也就3个类：Snake，SnakeView，TitleView。Activity，View，Handler是Android SDK提供的基础类，Coordinate，RefreshHandler是2个辅助类，也是SnakeView类中的内部类。其中，Coordinate就相当于是一个点的坐标（x，y），RefreshHandler的主要功能是将RefreshHandler对象绑定某个线程并与给它发送消息。Snake类是这个游戏的入口点，TitleView类负责游戏的绘画，SnakeView类负责对游戏控制操作的处理。类的结构在上图中已经清晰说明，主要接口解析如下：<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/QQ截图未命名.png"><img class="alignnone size-full wp-image-400006658" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/QQ截图未命名.png" alt="" width="574" height="160" /></a></p>
<p>然后具体分析整个游戏的框架，任何一个游戏都需要有个引擎来推动游戏的运行，最简化的游戏引擎就是：在一个线程中While循环，检测用户操作，对用户的操作作出反应，更新游戏的界面，直到用户退出游戏。先解析下RefreshHandler这个辅助类的作用，RefreshHandler继承至Handler，其主要作用就是把RefreshHandler与当前线程进行绑定，然后就可以直接给线程发送消息并处理消息，有一点需要强调的是：Handle对消息的处理都是异步。RefreshHandler在Handler的基础上增加sleep()接口，其主要作用就是每隔一个时间段后给当前线程发送一个消息；而handleMessage()则就是在接受消息后，让界面对当前的游戏状态作出处理，运行机制如下：<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/Snake-Core1.jpg"><img class="alignnone size-full wp-image-400006659" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/Snake-Core1.jpg" alt="" width="679" height="506" /></a></p>
<p>实际上以上就相当于一个定时器，在特定的时刻发送消息，根据消息处理相应的事件。Update()与Sleep()这2个函数间接的相互调用就构成了一个循环。需要注意的是：mRedrawHandle绑定的是Avtivity所在的线程，也就是程序的主线程；另外由于sleep()是个异步函数，所以Update()与Sleep()之间的相互调用才没有构成死循环。</p>
<p>最后分析下游戏数据的保存机制，如下：<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/Snake-SaveData1.jpg"><img class="alignnone size-full wp-image-400006660" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/12/Snake-SaveData1.jpg" alt="" width="643" height="484" /></a></p>
<p>以上主要考虑了Activity的生命周期：如果用户在游戏期间离开游戏界面，游戏暂停；如果由于内存比较紧张，Android关闭游戏释放内存，那么当用户返回游戏界面的时候恢复到上次离开时的界面。</p>
<p>Snake源代码的内部细节，就不额外说明，在了解了框架后，再阅读代码就轻松多了。</p>
<p>总结说明<br />
通过学习Snake这个简单的游戏，初步学习了如何开发游戏的界面、如何处理游戏的交互、如何保存游戏的数据等，这为我们以后开发更加复杂的游戏打好坚实的基础。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/12/28/snake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

