<?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>DFdou&#039;s Blog &#187; Game</title>
	<atom:link href="http://nwhy.org/tag/game/feed" rel="self" type="application/rss+xml" />
	<link>http://nwhy.org</link>
	<description>Life is short,Be yourself.</description>
	<lastBuildDate>Wed, 08 Sep 2010 05:34:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>AS3-LightOut</title>
		<link>http://nwhy.org/as3-lightout.html</link>
		<comments>http://nwhy.org/as3-lightout.html#comments</comments>
		<pubDate>Thu, 13 May 2010 08:49:03 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[LightOut]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=5161</guid>
		<description><![CDATA[来个LightOut小游戏，至于LightOut是啥，可以看这里:http://en.wikipedia.org/wiki/Lights_Out_%28game%29 如果该页面被和谐，那可以看下@dfdou的简单介绍，LightOut是一个开/关游戏，游戏的目的很简单，在5x5的的... ]]></description>
			<content:encoded><![CDATA[<p>来个LightOut小游戏，至于LightOut是啥，可以看这里:<a  href="http://en.wikipedia.org/wiki/Lights_Out_%28game%29">http://en.wikipedia.org/wiki/Lights_Out_%28game%29</a><br />
如果该页面被和谐，那可以看下@dfdou的简单介绍，LightOut是一个开/关游戏，游戏的目的很简单，在5x5的的方阵里，把全部的图换成亮着的状态就过关了，Demo里是白色方块代表亮起状态。<br />
规则是点击一个方块，在方块4周的4个方块和方块本身的状态会发生改变，是亮起就变成关掉，是关掉就变成亮起～</p>
<p>Demo在这里：</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="125" height="125" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://nwhy.org/nwhy/game/LightOut.swf" /><embed type="application/x-shockwave-flash" width="125" height="125" src="http://nwhy.org/nwhy/game/LightOut.swf"></embed></object></p>
<p>下边来讲下代码部分，比较简单，3个类搞定。<br />
<span id="more-5161"></span><br />
LightOut.as:<br />
[js]<br />
package {<br />
	import flash.display.Sprite;<br />
	import flash.events.MouseEvent;</p>
<p>	public class LightOut extends Sprite {<br />
		private var _lv = 0;<br />
		private var _map:Map;</p>
<p>		public function LightOut() {<br />
			init();<br />
		}</p>
<p>		private function init():void {<br />
			_map = new Map(_lv);<br />
			addChild(_map);<br />
			addEventListeners();<br />
		}<br />
		private function addEventListeners():void {<br />
			addEventListener(MouseEvent.MOUSE_DOWN, changeLight);<br />
		}<br />
		private function changeLight(e:MouseEvent):void<br />
		{<br />
			var tx:int = mouseX / Config.TILE_SIZE < < 0;<br />
			var ty:int = mouseY / Config.TILE_SIZE << 0;<br />
			var numRows:int = _map.getMapData().length;<br />
			var numCols:int = _map.getMapData()[0].length;</p>
<p>			for (var i:int = 0; i < numRows; i++) {<br />
				for (var j:int = 0; j < numCols; j++) {<br />
					if (Math.abs(i - tx) + Math.abs(j - ty) <= 1) {<br />
						if (_map.getMapData()[j][i] == 0) {<br />
							_map.setMapData(j,i,1);<br />
						}else {<br />
							_map.setMapData(j,i,0);<br />
						}<br />
					}<br />
				}<br />
			}<br />
		}<br />
	}<br />
}<br />
[/js]<br />
Config.as，用来配置常数和地图。<br />
[js]<br />
package<br />
{<br />
	/**<br />
	 * ...<br />
	 * @author DFdou<br />
	 */<br />
	public class Config<br />
	{<br />
		public static const TILE_SIZE = 25;</p>
<p>		public static const LIGHT_ON = 1;<br />
		public static const LIGHT_OFF = 0;</p>
<p>		public static const MAP:Array = [<br />
			[<br />
			[0, 1, 0, 1, 0],<br />
			[0, 1, 0, 1, 0],<br />
			[1, 1, 1, 1, 1],<br />
			[0, 1, 0, 1, 0],<br />
			[0, 1, 0, 1, 0]<br />
			],<br />
		];<br />
	}<br />
}<br />
[/js]<br />
Map.as，直接从Sokoban那拷过来的，基本上差不多@.@<br />
[js]<br />
package<br />
{<br />
	import flash.display.Sprite;<br />
	import flash.events.Event;</p>
<p>	/**<br />
	 * ...<br />
	 * @author DFdou<br />
	 */<br />
	public class Map extends Sprite<br />
	{<br />
		private var _lv:uint;//关卡<br />
		private var _mapData:Array = [];//map数据</p>
<p>		public function Map(lv:uint=0)<br />
		{<br />
			_lv = lv;<br />
			initMapData(lv);<br />
		}<br />
		private function initMapData(lv:uint = 0) {<br />
			for (var i = 0; i < Config.MAP[lv].length; i++) {<br />
				_mapData[i] = [];<br />
				for (var j = 0; j < Config.MAP[lv][i].length; j++) {<br />
					_mapData[i][j] = Config.MAP[lv][i][j];<br />
				}<br />
			}<br />
			drawMap();<br />
		}<br />
		private function drawMap() {<br />
			var tile:Tile;<br />
			for (var i = 0; i < _mapData.length; i++) {<br />
				for (var j = 0; j < _mapData[i].length; j++) {<br />
					tile = new Tile();<br />
					tile.x = j * Config.TILE_SIZE;<br />
					tile.y = i * Config.TILE_SIZE;<br />
					tile.gotoAndStop(_mapData[i][j]+1);<br />
					addChild(tile);<br />
				}<br />
			}<br />
		}<br />
		private function repaintMap() {<br />
			clearMap();<br />
			drawMap();<br />
		}<br />
		private function clearMap() {<br />
			while (numChildren > 0) {<br />
				removeChildAt(0);<br />
			}<br />
		}<br />
		private function checkSuccess() {<br />
			if(isSuccess()){<br />
				trace("Success");<br />
				//nextLevel();<br />
			}<br />
		}<br />
		private function isSuccess():Boolean {<br />
			var success:Boolean = true;<br />
			var numRow:int = _mapData.length;<br />
			var numCols:int =  _mapData[0].length;<br />
			for (var i = 0; i < numRow; i++) {<br />
				for (var j = 0; j < numCols; j++) {<br />
					success = success &#038;& (_mapData[i][j] == Config.LIGHT_ON);<br />
				}<br />
			}<br />
			return success;<br />
		}<br />
		public function setMapData(py:int, px:int, type:int) {<br />
			_mapData[py][px] = type;<br />
			repaintMap();<br />
			checkSuccess();<br />
		}<br />
		public function getMapData():Array {<br />
			return _mapData;<br />
		}<br />
	}<br />
}<br />
[/js]<br />
感觉也没什么好讲的地方，就这样吧，有问题请留言，别客气～</p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2010/04/14 -- <a  href="http://nwhy.org/as3-sokoban.html" title="AS3-Sokoban推箱子">AS3-Sokoban推箱子</a> (11)</li><li>2010/03/02 -- <a  href="http://nwhy.org/as3-tile-role-move.html" title="AS3-类似于机战的角色移动(基于Tile)">AS3-类似于机战的角色移动(基于Tile)</a> (4)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/04/23 -- <a  href="http://nwhy.org/game-quake-live.html" title="GAME-Quake Live">GAME-Quake Live</a> (0)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/03/08 -- <a  href="http://nwhy.org/what-s-in-your-brain.html" title="GAME-What&#8217;s in your brain? 你的脑内是什么?">GAME-What&#8217;s in your brain? 你的脑内是什么?</a> (7)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/as3-lightout.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>AS3-Sokoban推箱子</title>
		<link>http://nwhy.org/as3-sokoban.html</link>
		<comments>http://nwhy.org/as3-sokoban.html#comments</comments>
		<pubDate>Wed, 14 Apr 2010 03:06:19 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Sokoban]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=5156</guid>
		<description><![CDATA[先是Demo： 方向键控制移动，红色的方块是你～ UI嘛，就不说了，网上偷了点图，就这么放着了，有兴趣的可以弄弄呗。 Source code:https://dl.dropbox.com/u/477487/flash/game/sokoban.rar PS：如果该地址被和... ]]></description>
			<content:encoded><![CDATA[<p>先是Demo：</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="320" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://nwhy.org/nwhy/game/Sokoban.swf" /><embed type="application/x-shockwave-flash" width="480" height="320" src="http://nwhy.org/nwhy/game/Sokoban.swf"></embed></object></p>
<p>方向键控制移动，红色的方块是你～<br />
UI嘛，就不说了，网上偷了点图，就这么放着了，有兴趣的可以弄弄呗。</p>
<p>Source code:<a  href="https://dl.dropbox.com/u/477487/flash/game/sokoban.rar">https://dl.dropbox.com/u/477487/flash/game/sokoban.rar</a></p>
<p>PS：如果该地址被和谐，而你又想要源代码，联系我，服务很周到的～</p>
<p>推箱子的实现方法很多，各有各的做法，下边是我的实现方式：<br />
Sokoban.as:<br />
[js]<br />
package {<br />
	import flash.display.Sprite;<br />
	import flash.events.Event;<br />
	/**<br />
	 * ...<br />
	 * @author DFdou<br />
	 */<br />
	public class Sokoban extends Sprite {<br />
		private var _lv = 0;<br />
		private var _map:Map;</p>
<p>		public function Sokoban() {<br />
			init();<br />
		}<br />
		private function init() {<br />
			_map = new Map(_lv);<br />
			addChild(_map);</p>
<p>			var role:Role = new Role(stage,_map,_lv);<br />
			addChild(role);<br />
		}</p>
<p>	}<br />
}<br />
[/js]<br />
文档类要干的事儿就是生成一个map，一个role。<br />
<span id="more-5156"></span><br />
Map.as:<br />
[js]<br />
package<br />
{<br />
	import flash.display.Sprite;<br />
	import flash.events.Event;</p>
<p>	/**<br />
	 * ...<br />
	 * @author DFdou<br />
	 */<br />
	public class Map extends Sprite<br />
	{<br />
		private var _lv:uint;//关卡<br />
		private var _mapData:Array = [];//map数据</p>
<p>		public function Map(lv:uint=0)<br />
		{<br />
			_lv = lv;<br />
			initMapData(lv);<br />
		}<br />
		private function initMapData(lv:uint = 0) {<br />
			for (var i = 0; i < MapData.MAP[lv].length; i++) {<br />
				_mapData[i] = [];<br />
				for (var j = 0; j < MapData.MAP[lv][i].length; j++) {<br />
					_mapData[i][j] = MapData.MAP[lv][i][j];<br />
				}<br />
			}<br />
			drawMap();<br />
		}<br />
		private function drawMap() {<br />
			var tile:Tile;<br />
			for (var i = 0; i < _mapData.length; i++) {<br />
				for (var j = 0; j < _mapData[i].length; j++) {<br />
					if(_mapData[i][j]!=0){<br />
						tile = new Tile();<br />
						tile.x = j * Config.TILE_SIZE;<br />
						tile.y = i * Config.TILE_SIZE;<br />
						tile.gotoAndStop(_mapData[i][j]);<br />
						addChild(tile);<br />
					}<br />
				}<br />
			}<br />
		}<br />
		private function repaintMap() {<br />
			clearMap();<br />
			drawMap();<br />
		}<br />
		private function clearMap() {<br />
			while (numChildren > 0) {<br />
				removeChildAt(0);<br />
			}<br />
		}<br />
		private function checkSuccess() {<br />
			if(isSuccess()){<br />
				trace("Success");<br />
				//nextLevel();<br />
			}<br />
		}<br />
		private function isSuccess():Boolean {<br />
			var success:Boolean = true;<br />
			for (var i = 0; i < MapData.MAP[_lv].length; i++) {<br />
				for (var j = 0; j < MapData.MAP[_lv][i].length; j++) {<br />
					//4是目标点<br />
					if (MapData.MAP[_lv][i][j] == MapData.TARGET || MapData.MAP[_lv][i][j] == MapData.SPECIAL) {<br />
						if ((_mapData[i][j] == MapData.BOX || _mapData[i][j] == MapData.SPECIAL)) {<br />
							trace(i,j,_mapData[i][j]);<br />
						}<br />
						success = success &#038;& (_mapData[i][j]==MapData.BOX || _mapData[i][j]==MapData.SPECIAL);<br />
					}<br />
				}<br />
			}<br />
			return success;<br />
		}<br />
		public function setMapData(py:int, px:int, type:int) {<br />
			_mapData[py][px] = type;<br />
			//trace(py,px,_mapData[py][px]);<br />
			repaintMap();<br />
			checkSuccess();<br />
		}<br />
		public function getMapData():Array {<br />
			return _mapData;<br />
		}<br />
	}<br />
}<br />
[/js]<br />
那Map要干嘛呢，自然就是绘制Map咯，先从MapData取得对应关卡的数据，然后绘制Map，顺便在这里边判断是否过关～</p>
<p>接下去就是Role.as:<br />
[js]<br />
package<br />
{<br />
	import flash.display.Sprite;<br />
	import flash.display.Stage;<br />
	import flash.events.KeyboardEvent;</p>
<p>	/**<br />
	 * ...<br />
	 * @author DFdou<br />
	 */<br />
	public class Role extends Sprite<br />
	{<br />
		private var _lv:uint;<br />
		private var _map:Map;</p>
<p>		public function Role(stage:Stage,map:Map,lv:uint=0)<br />
		{<br />
			_lv = lv;<br />
			_map = map;<br />
			getPosition();</p>
<p>			stage.addEventListener(KeyboardEvent.KEY_DOWN, moveRole);<br />
		}</p>
<p>		private function getPosition() {<br />
			for (var i = 0; i < MapData.MAP[_lv].length; i++) {<br />
				for (var j = 0; j < MapData.MAP[_lv][i].length; j++) {<br />
					//6是role位置<br />
					if(MapData.MAP[_lv][i][j]==MapData.ROLE){<br />
						x = j * Config.TILE_SIZE;<br />
						y = i * Config.TILE_SIZE;<br />
					}<br />
				}<br />
			}</p>
<p>		}<br />
		private function moveRole(e:KeyboardEvent) {<br />
			switch(e.keyCode) {<br />
				case 37://left<br />
					move( -1, 0);<br />
					break;<br />
				case 38://top<br />
					move(0, -1);<br />
					break;<br />
				case 39://right<br />
					move(1, 0);<br />
					break;<br />
				case 40://down<br />
					move(0, 1);<br />
					break;<br />
				default:<br />
					trace(e.keyCode);<br />
					break;<br />
			}<br />
		}<br />
		private function move(px:int, py:int) {<br />
			if (canMove(px,py)) {<br />
				x += px * Config.TILE_SIZE;<br />
				y += py * Config.TILE_SIZE;<br />
			}<br />
		}<br />
		//1是墙壁,2是路,3是箱子,4是目的地<br />
		private function canMove(px:int, py:int):Boolean {<br />
			var nextPx:int = x / Config.TILE_SIZE + px;<br />
			var nextPy:int = y / Config.TILE_SIZE + py;<br />
			//移动范围超出和碰壁的情况<br />
			if (isRoad(nextPy, nextPx)) {<br />
				return true;<br />
			}<br />
			//前边是箱子<br />
			else if (_map.getMapData()[nextPy][nextPx] == MapData.BOX || _map.getMapData()[nextPy][nextPx] == MapData.SPECIAL) {<br />
				if (canBoxMove(nextPy, nextPx, py, px)) {<br />
					moveBox(nextPy,nextPx,py,px);<br />
					return true;<br />
				}<br />
			}<br />
			return false;<br />
		}<br />
		private function canBoxMove(basePy:int, basePx:int, py:int, px:int):Boolean {<br />
			var nextPx:int = basePx+px;<br />
			var nextPy:int = basePy+py;<br />
			if (isRoad(nextPy, nextPx)) {<br />
				return true;<br />
			}<br />
			return false;<br />
		}<br />
		private function isRoad(nextPy:int, nextPx:int):Boolean {<br />
			if (nextPy >= 0 &#038;& nextPx >= 0 &#038;& nextPy < = _map.getMapData().length &#038;& nextPx <= _map.getMapData()[0].length &#038;& (_map.getMapData()[nextPy][nextPx] == MapData.ROAD || _map.getMapData()[nextPy][nextPx] == MapData.TARGET || _map.getMapData()[nextPy][nextPx] == MapData.ROLE)) {<br />
				return true;<br />
			}<br />
			return false;<br />
		}<br />
		private function moveBox(basePy:int, basePx:int, py:int, px:int) {<br />
			//如果当前格子不是目标点<br />
			switch(MapData.MAP[_lv][basePy][basePx]) {<br />
				//目标点<br />
				case MapData.SPECIAL:<br />
				case MapData.TARGET:<br />
					_map.setMapData(basePy, basePx, MapData.TARGET);<br />
					break;<br />
				default:<br />
					_map.setMapData(basePy, basePx, MapData.ROAD);<br />
					break;<br />
			}<br />
			_map.setMapData(basePy+py,basePx+px,MapData.BOX);<br />
		}<br />
	}<br />
}<br />
[/js]<br />
Role类比较明了，就是Role的移动控制，主要处理部分就是移动的控制，先预算下要移动到的位置是否允许移动，是的话就移动被。<br />
如果前边是箱子，就判断箱子能不能移动，能移动就移动，不能移动就拉倒～</p>
<p>地图数据MapData.as:<br />
[js]<br />
package<br />
{<br />
	/**<br />
	 * ...<br />
	 * @author DFdou<br />
	 */<br />
	public class MapData<br />
	{<br />
		public static const WALL:uint = 1;//墙壁<br />
		public static const ROAD:uint = 2;//路<br />
		public static const BOX:uint = 3;//箱子<br />
		public static const TARGET:uint = 4;//目的地<br />
		public static const SPECIAL:uint = 5;//箱子直接在目的地<br />
		public static const ROLE:uint = 6;//角色</p>
<p>		public static const MAP:Array = [<br />
			[<br />
			[0, 0, 1, 1, 1, 1, 1, 1, 0, 0],<br />
			[0, 0, 1, 2, 2, 2, 2, 1, 0, 0],<br />
			[1, 1, 1, 2, 2, 2, 2, 1, 1, 1],<br />
			[1, 2, 2, 2, 6, 5, 2, 2, 2, 1],<br />
			[1, 1, 1, 3, 2, 1, 1, 1, 1, 1],<br />
			[0, 0, 1, 4, 2, 1, 0, 0, 0, 0],<br />
			[0, 0, 1, 1, 1, 1, 0, 0, 0, 0]],<br />
		];</p>
<p>	}</p>
<p>}<br />
[/js]<br />
关卡和组件对应描述文件。</p>
<p>全局配置文件Config.as：<br />
[js]<br />
package<br />
{<br />
	/**<br />
	 * ...<br />
	 * @author DFdou<br />
	 */<br />
	public class Config<br />
	{<br />
		public static const TILE_SIZE = 30;<br />
	}<br />
}<br />
[/js]<br />
这里是全局的配置。更新了下代码，修正了下边这2个问题。<br />
<del datetime="2010-04-15T02:35:12+00:00">恩，当时写的时候做的不好把Role的位置单独弄出来了，应该放到MapData里的…现在这样太不OOP了……另外，在配置地图的时候发现另一个问题，如果一开始箱子就在目标点的情况没被考虑在内……</p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2010/05/13 -- <a  href="http://nwhy.org/as3-lightout.html" title="AS3-LightOut">AS3-LightOut</a> (8)</li><li>2010/04/20 -- <a  href="http://nwhy.org/as3-sokoban-astar.html" title="AS3-Sokoban推箱子-寻路扩展">AS3-Sokoban推箱子-寻路扩展</a> (2)</li><li>2010/03/02 -- <a  href="http://nwhy.org/as3-tile-role-move.html" title="AS3-类似于机战的角色移动(基于Tile)">AS3-类似于机战的角色移动(基于Tile)</a> (4)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/04/23 -- <a  href="http://nwhy.org/game-quake-live.html" title="GAME-Quake Live">GAME-Quake Live</a> (0)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/03/08 -- <a  href="http://nwhy.org/what-s-in-your-brain.html" title="GAME-What&#8217;s in your brain? 你的脑内是什么?">GAME-What&#8217;s in your brain? 你的脑内是什么?</a> (7)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/as3-sokoban.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>AS3-类似于机战的角色移动(基于Tile)</title>
		<link>http://nwhy.org/as3-tile-role-move.html</link>
		<comments>http://nwhy.org/as3-tile-role-move.html#comments</comments>
		<pubDate>Tue, 02 Mar 2010 04:01:13 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Tile]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=5145</guid>
		<description><![CDATA[先来看下Demo： 源代码下载地址:http://dl.dropbox.com/u/477487/flash/game/mapMove.rar 只做了移动，重叠和阻挡的部分没做，短时间内不会有时间做的=,= 主要逻辑是这样，选中Role就显示可以行走的范围，选... ]]></description>
			<content:encoded><![CDATA[<p>先来看下Demo：</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="420" height="420" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://nwhy.org/nwhy/game/mapMove.swf" /><embed type="application/x-shockwave-flash" width="420" height="420" src="http://nwhy.org/nwhy/game/mapMove.swf"></embed></object></p>
<p>源代码下载地址:<a  href="http://dl.dropbox.com/u/477487/flash/game/mapMove.rar">http://dl.dropbox.com/u/477487/flash/game/mapMove.rar</a><br />
只做了移动，重叠和阻挡的部分没做，短时间内不会有时间做的=,=<br />
主要逻辑是这样，选中Role就显示可以行走的范围，选其中一点之后Role就移动。<br />
下边看下简单的实现。主要是OverlayView.as和Role.as，我很懒，其他代码大家自己看……<br />
<span id="more-5145"></span><br />
OverlayView.as用来显示Path。<br />
[js]<br />
package org.nwhy.game{<br />
	import flash.display.Sprite;<br />
	import flash.events.MouseEvent;</p>
<p>	public class OverlayView extends Sprite {<br />
		private var target;//目标<br />
		public var isActived:Boolean;<br />
		public function OverlayView(target:Sprite) {<br />
			this.target = target;<br />
			showPath();<br />
		}<br />
		private function showPath() {<br />
			removeAllChildren();<br />
			var targetPosition:uint = target.movement;<br />
			for (var i:uint=0; i<target .movement*2+1; i++) {<br />
				for (var j:uint=0; j<target.movement*2+1; j++) {<br />
					var offset:uint = Math.abs(i-targetPosition)+Math.abs(j-targetPosition);<br />
					//trace("x:"+Math.abs(i-targetPosition)+"y:"+Math.abs(j-targetPosition));<br />
					if (offset<=target.movement) {<br />
						var path:Path = new Path();<br />
						path.alpha = 0.5;<br />
						path.x = i*Tile.SIZE;<br />
						path.y = j*Tile.SIZE;<br />
						path.addEventListener(FEvent.PATH_SELECTED,pathSelected);<br />
						addChild(path);<br />
					}<br />
				}<br />
			}<br />
		}<br />
		private function pathSelected(e:FEvent){<br />
			var evt:FEvent = new FEvent(FEvent.PATH_SELECTED);<br />
			var disX = e.currentTarget.x/Tile.SIZE - target.movement;<br />
			var disY = e.currentTarget.y/Tile.SIZE - target.movement;<br />
			evt.info = {disX:disX,disY:disY};<br />
			dispatchEvent(evt);<br />
		}<br />
		private function removeAllChildren() {<br />
			while (numChildren>0) {<br />
				removeChildAt(0);<br />
			}<br />
		}<br />
	}<br />
}<br />
[/js]<br />
Role.as:<br />
[js]<br />
package org.nwhy.game{<br />
	import flash.display.MovieClip;<br />
	import flash.events.MouseEvent;</p>
<p>	public class Role extends MovieClip{<br />
		public var movement;//行走步数<br />
		public function Role(colNumer:uint,rowNumber:uint,mProperty:Property){<br />
			this.x = colNumer * Tile.SIZE;//x位置<br />
			this.y = rowNumber * Tile.SIZE;//y位置<br />
			movement = mProperty.movement;<br />
			gotoAndStop(mProperty.faceType);<br />
			addEventListeners();<br />
		}<br />
		private function addEventListeners(){<br />
			addEventListener(MouseEvent.MOUSE_DOWN,mDown);<br />
		}<br />
		private function mDown(e:MouseEvent){<br />
			if(Controller.overlay){//先判断有无实例<br />
				if(Controller.overlay.parent){//再判断有无被加入到场景<br />
					parent.removeChild(Controller.overlay);<br />
				}<br />
			}<br />
			Controller.overlay = new OverlayView(this);<br />
			Controller.overlay.x = this.x - movement*Tile.SIZE;<br />
			Controller.overlay.y = this.y - movement*Tile.SIZE;</p>
<p>			parent.addChild(Controller.overlay);<br />
			Controller.overlay.addEventListener(FEvent.PATH_SELECTED,positionToGo);<br />
		}<br />
		private function positionToGo(e:FEvent){<br />
			//trace(this.x+":"+this.y+"---"+e.info.disX+":"+e.info.disY);<br />
			this.x += e.info.disX * Tile.SIZE;<br />
			this.y += e.info.disY * Tile.SIZE;<br />
			removeOverlay();<br />
		}<br />
		private function removeOverlay(){<br />
			parent.removeChild(Controller.overlay);<br />
		}<br />
	}<br />
}<br />
[/js]</target></p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2010/05/13 -- <a  href="http://nwhy.org/as3-lightout.html" title="AS3-LightOut">AS3-LightOut</a> (8)</li><li>2010/04/14 -- <a  href="http://nwhy.org/as3-sokoban.html" title="AS3-Sokoban推箱子">AS3-Sokoban推箱子</a> (11)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/04/23 -- <a  href="http://nwhy.org/game-quake-live.html" title="GAME-Quake Live">GAME-Quake Live</a> (0)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/03/08 -- <a  href="http://nwhy.org/what-s-in-your-brain.html" title="GAME-What&#8217;s in your brain? 你的脑内是什么?">GAME-What&#8217;s in your brain? 你的脑内是什么?</a> (7)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/as3-tile-role-move.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AS3-连连看的主要算法</title>
		<link>http://nwhy.org/as3-lianliankan.html</link>
		<comments>http://nwhy.org/as3-lianliankan.html#comments</comments>
		<pubDate>Mon, 10 Aug 2009 11:36:53 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=4705</guid>
		<description><![CDATA[这几天一直在忙的一个东西,因为时间的关系,只弄了主要的算法,计时,分数,划线,点击效果等内容都没有管=.= 先来看连连看的规则分析，这里将选中的2个Obj分3种情况来讨论，一是同位于X轴，二... ]]></description>
			<content:encoded><![CDATA[<p><object id="whatsinurbrain" width="600" height="480" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"><param name="allowScriptAccess" value="sameDomain"/><param name="movie" value="http://nwhy.org/nwhy/game/llk.swf"/><param name="quality" value="high"/><embed width="600" height="480" src="http://nwhy.org/nwhy/game/llk.swf" quality="high" bgcolor="#ffffff" name="llk" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/><br />
</object><br />
这几天一直在忙的一个东西,因为时间的关系,只弄了主要的算法,计时,分数,划线,点击效果等内容都没有管=.=<br />
先来看连连看的规则分析，这里将选中的2个Obj分3种情况来讨论，一是同位于X轴，二是同位于Y轴，三是不同X，Y轴。<br />
而第三种情况其实又可以归结到第1和第2种情况，具体的操作是先判断是否同X,Y轴,是的话先检测能否直连,不能的话判断不直连的情况.<br />
如果两者属于不同的X,Y轴,那么先判断通过一点连接,然后再判断通过两点连接的情况,这里图方便用了最烂的方法.<br />
<span id="more-4705"></span><br />
下边是针对示意图的分析:<br />
<img src="http://nwhy.org/nwhy/game/llk.gif" alt="连连看" /><br />
对应图示的分析,假定objA和objB是不同的X,Y轴位置，那么可以从objA开始整列开始处到结束循环寻找到一点tmpA，如果objA和tmpA可以直连(testCrossAbleX()方法)，那么判断tmpA和objB的拐点位置tmpB和tmpA的连通性(testCrossAbleY()方法)，之后再判断tmpB和objB的连通性(testCrossAbleX()方法)和tmpB和objB是不是同一点。<br />
其实最有效率的做法是从objA和objB两个中间的点开始检索，有兴趣的自己改吧…<br />
Demo的代码如下：<br />
[js]<br />
stage.align = StageAlign.TOP_LEFT;<br />
stage.scaleMode = StageScaleMode.NO_SCALE;</p>
<p>var PICWIDTHNUM:uint = 13;<br />
var PICHEIGHTNUM:uint = 10;<br />
var PICSIZE:uint = 40;<br />
var aryPic:Array = [1,2,3,4,5,6,7,8];<br />
var aryPicType:Array = [];<br />
var aryPath:Array = [];<br />
var aryCrossPath:Array = [];</p>
<p>var WIDTHNUM:uint = PICWIDTHNUM + 2;<br />
var HEIGHTNUM:uint = PICHEIGHTNUM + 2;<br />
var PATHSIZE:uint = 40;</p>
<p>var clkFlag:Boolean = false;<br />
var firstObj:Pic;<br />
var secondObj:Pic;</p>
<p>//生成路径图<br />
setPath ();<br />
function setPath () {<br />
	for (var i:uint=0; i < WIDTHNUM; i++) {<br />
		aryPath[i] = [];<br />
		for (var j:uint=0; j < HEIGHTNUM; j++) {<br />
			var path = new Path();<br />
			path.x = PATHSIZE * i;<br />
			path.y = PATHSIZE * j;</p>
<p>			path.disX = i;<br />
			path.disY = j;<br />
			path.name = "path" + path.disX * 8 + path.disY;<br />
			path.txt_disInfo.text = "(" + path.disX + "," + path.disY + ")";</p>
<p>			if (i ==0 || i == (WIDTHNUM - 1) || j == 0 || j ==(HEIGHTNUM - 1)) {<br />
				setCrossFlag (i,j,path,true);<br />
			} else {<br />
				setCrossFlag (i,j,path,false);<br />
			}<br />
			//trace(path.disX);<br />
			//trace(path.disY);<br />
			addChild (path);<br />
		}<br />
	}<br />
	//trace (aryPath);<br />
}<br />
//设置路径的可通过和不可通过crossFlag<br />
function setCrossFlag (i:uint,j:uint,path:Path,flag:Boolean) {<br />
	aryPath[i][j] = flag;<br />
	path.crossFlag = flag;<br />
	path.txt_CrossFlag.text = String(flag);<br />
}</p>
<p>//生成图片数组并随机打乱<br />
setTypeArray ();<br />
function setTypeArray () {<br />
	var i:uint = 0;<br />
	while (i < PICWIDTHNUM * PICHEIGHTNUM / 2) {<br />
		//picArray是图片数组<br />
		aryPicType.push (i % (aryPic.length) +1);<br />
		aryPicType.push (i % (aryPic.length) +1);<br />
		++i;<br />
	}<br />
	aryPicType = aryRandom(aryPicType);<br />
}<br />
//数组随机排列函数<br />
function aryRandom (ary:Array):Array {<br />
	var ary_temp:Array = new Array();<br />
	for (var i:int = ary.length; i > 0; i--) {<br />
		var int_num:Number = int(Math.random() * ary.length);<br />
		ary_temp.push (ary[int_num]);<br />
		ary.splice (int_num, 1);<br />
	}<br />
	return ary_temp;<br />
}<br />
//图片设置部分<br />
initPic ();<br />
var startNum:uint = 0;<br />
function initPic () {<br />
	for (var i:uint=0; i < PICWIDTHNUM; i++) {<br />
		for (var j:uint=0; j < PICHEIGHTNUM; j++) {<br />
			setPic (i, j, aryPicType[startNum]);<br />
			startNum++;<br />
		}<br />
	}<br />
}<br />
//设置图片类型，位置，以及点击事件<br />
function setPic (i:uint, j:uint, type:uint) {<br />
	var pic = new Pic();<br />
	pic.x = PATHSIZE + PICSIZE * i;<br />
	pic.y = PATHSIZE + PICSIZE * j;</p>
<p>	pic.disX = i + 1;<br />
	pic.disY = j + 1;<br />
	pic.pType = type;<br />
	pic.name = "pic" + pic.disX * 8 + pic.disY;<br />
	//trace(pic.name);<br />
	pic.txt_disInfo.text = "(" + pic.disX + "," + pic.disY + ")";<br />
	pic.gotoAndStop (type);<br />
	addChild (pic);<br />
	pic.addEventListener (MouseEvent.CLICK,picCLK);<br />
}<br />
//点击事件具体处理部分<br />
function picCLK (_evt:MouseEvent) {<br />
	//trace(_evt.currentTarget.name);<br />
	if (! clkFlag) {<br />
		firstObj = _evt.currentTarget as Pic;<br />
		clkFlag = true;<br />
	} else if (firstObj == (_evt.currentTarget as Pic)) {<br />
		//trace ("the same one");<br />
		/*firstObj = _evt.currentTarget as Pic;<br />
		clkFlag = true;*/<br />
		clkFlag = true;<br />
	} else {<br />
		secondObj = _evt.currentTarget as Pic;<br />
		if (checkTwoObj()) {<br />
			matchSucc ();<br />
		} else {<br />
			matchFailed ();<br />
		}<br />
		aryCrossPath = [];<br />
	}</p>
<p>	/*trace ("-------------------------------------------");<br />
	trace ("firstObj"+firstObj.pType);<br />
	trace ("secondObj"+secondObj.pType);<br />
	trace ("firstObj.disX"+firstObj.disX);<br />
	trace ("firstObj.disY"+firstObj.disY);<br />
	trace ("secondObj.disX"+secondObj.disX);<br />
	trace ("secondObj.disY"+secondObj.disY);<br />
	trace ("-------------------------------------------");*/<br />
}<br />
//判断firstObj和secondObj是否可以消除<br />
function checkTwoObj ():Boolean {<br />
	if (matchTwoObj()) {<br />
		//trace ("same type");<br />
		if (testCrossAbleXY(firstObj,secondObj)) {<br />
			return true;<br />
		}<br />
	}<br />
	return false;<br />
}</p>
<p>function matchFailed () {<br />
	firstObj = secondObj;<br />
	secondObj = null;<br />
	clkFlag = true;<br />
	//trace(aryCrossPath);<br />
}</p>
<p>function matchSucc () {<br />
	var firstPathName = "path" + firstObj.name.substr(3);<br />
	var firstPath:Path = getChildByName(firstPathName) as Path;<br />
	var secondPathName = "path" + secondObj.name.substr(3);<br />
	var secondPath:Path = getChildByName(secondPathName) as Path;<br />
	setCrossFlag (firstObj.disX,firstObj.disY,firstPath,true);<br />
	setCrossFlag (secondObj.disX,secondObj.disY,secondPath,true);<br />
	removeChild (firstObj);<br />
	removeChild (secondObj);<br />
	firstObj = null;<br />
	secondObj = null;<br />
	clkFlag = false;<br />
	drawLine(aryCrossPath);<br />
	//trace(aryCrossPath);<br />
}<br />
//连线函数<br />
function drawLine(_ary:Array){<br />
	//trace("drawLine");<br />
	var lineSP:Shape = new Shape();<br />
	lineSP.graphics.beginFill(0x000000);<br />
    lineSP.graphics.lineStyle(1, 0x000000);<br />
	//lineSP.graphics.moveTo(_ary[0][0]*PICSIZE+0.5*PICSIZE,_ary[0][1]*PICSIZE+0.5*PICSIZE);<br />
	for(var i:uint = 0; i<(_ary.length-1); i++){<br />
		lineSP.graphics.moveTo(_ary[i][0]*PICSIZE+0.5*PICSIZE,_ary[i][1]*PICSIZE+0.5*PICSIZE);<br />
        lineSP.graphics.lineTo(_ary[(i+1)][0]*PICSIZE+0.5*PICSIZE,_ary[(i+1)][1]*PICSIZE+0.5*PICSIZE);<br />
		//trace(_ary[i][0],_ary[i][1]);<br />
	}<br />
	lineSP.graphics.endFill();<br />
	addChild(lineSP);<br />
	setTimeout(clearLine,1000,lineSP);<br />
}<br />
//移除连线<br />
function clearLine(_lineSP:Shape){<br />
	_lineSP.graphics.clear();<br />
}<br />
//判断firstObj和secondObj是否是同一个类型的图，是返回true，不是返回false<br />
function matchTwoObj ():Boolean {<br />
	if (firstObj.pType == secondObj.pType) {<br />
		return true;<br />
	} else {<br />
		return false;<br />
	}<br />
}<br />
//同一列方向(X相同时)的直接连通检测<br />
function testCrossAbleX (disX:uint, firstObjDisY:uint, secondObjDisY:uint):Boolean {<br />
	var maxY = Math.max(firstObjDisY,secondObjDisY);<br />
	var minY = Math.min(firstObjDisY,secondObjDisY);<br />
	if ((maxY - minY)>1) {<br />
		for (var i:uint = minY+1; i< maxY; i++) {<br />
			if (! aryPath[disX][i]) {<br />
				//trace ("testCrossAbleX failed");<br />
				return false;<br />
			}<br />
		}<br />
	}<br />
	//trace ("testCrossAbleX succ");<br />
	return true;<br />
}<br />
//同一行方向(Y相同时)的直接连通检测<br />
function testCrossAbleY (disY:uint, firstObjDisX:uint, secondObjDisX:uint):Boolean {<br />
	var maxX = Math.max(firstObjDisX,secondObjDisX);<br />
	var minX = Math.min(firstObjDisX,secondObjDisX);<br />
	if ((maxX - minX)>1) {<br />
		for (var i:uint = minX+1; i< maxX; i++) {<br />
			if (! aryPath[i][disY]) {<br />
				//trace ("testCrossAbleY failed");<br />
				return false;<br />
			}<br />
		}<br />
	}<br />
	//trace ("testCrossAbleY succ");<br />
	return true;<br />
}<br />
//firstObj和secondObj不同列也不同行时的检测<br />
function testCrossAbleXY (firstObj:Pic, secondObj:Pic):Boolean {<br />
	var aryFlag1:Boolean = false;<br />
	var aryFlag2:Boolean = false;<br />
	if ((firstObj.disX == secondObj.disX &#038;& testCrossAbleX(firstObj.disX,firstObj.disY,secondObj.disY)) || (firstObj.disY == secondObj.disY &#038;& testCrossAbleY(firstObj.disY,firstObj.disX,secondObj.disX))) {<br />
		var aryP1:Array = [firstObj.disX,firstObj.disY];<br />
		var aryP2:Array = [secondObj.disX,secondObj.disY];<br />
		aryCrossPath.push(aryP1);<br />
		aryCrossPath.push(aryP2);<br />
		return true;<br />
	} else {<br />
		for (var i:uint = 0; i<HEIGHTNUM; i++) {<br />
			var flagH1:Boolean;<br />
			var flagH2:Boolean;<br />
			var flagH3:Boolean;<br />
			if (aryPath[firstObj.disX][i]) {<br />
				flagH1 = testCrossAbleX(firstObj.disX,i,firstObj.disY);<br />
				if (i == secondObj.disY) {<br />
					flagH2 = testCrossAbleY(i,firstObj.disX,secondObj.disX);<br />
				} else {<br />
					flagH2 = aryPath[secondObj.disX][i] &#038;& testCrossAbleY(i,firstObj.disX,secondObj.disX);<br />
				}<br />
				flagH3 = testCrossAbleX(secondObj.disX,i,secondObj.disY);<br />
				//aryFlag1[i] = (testCrossAbleX(firstObj.disX,i,firstObj.disY) &#038;& aryPath[firstObj.disX][i]) &#038;& (testCrossAbleY(i,firstObj.disX,secondObj.disX) &#038;& aryPath[secondObj.disY][i]) &#038;& testCrossAbleX(secondObj.disX,i,secondObj.disY);<br />
				aryFlag1 = aryFlag1 || (flagH1 &#038;& flagH2 &#038;& flagH3);<br />
				if (aryFlag1) {<br />
					var aryPx1:Array = [firstObj.disX,firstObj.disY];<br />
					var aryPx2:Array = [firstObj.disX,i];<br />
					var aryPx3:Array = [secondObj.disX,i];<br />
					var aryPx4:Array = [secondObj.disX,secondObj.disY];<br />
					aryCrossPath.push(aryPx1);<br />
					aryCrossPath.push(aryPx2);<br />
					aryCrossPath.push(aryPx3);<br />
					aryCrossPath.push(aryPx4);<br />
					return true;<br />
				}<br />
			}<br />
		}<br />
		for (var j:uint = 0; j<WIDTHNUM; j++) {<br />
			var flagW1:Boolean;<br />
			var flagW2:Boolean;<br />
			var flagW3:Boolean;<br />
			if (aryPath[j][firstObj.disY]) {<br />
				flagW1 = testCrossAbleY(firstObj.disY,j,firstObj.disX);<br />
				if (j == secondObj.disX) {<br />
					flagW2 = testCrossAbleX(j,firstObj.disY,secondObj.disY);<br />
				} else {<br />
					flagW2 = aryPath[j][secondObj.disY] &#038;& testCrossAbleX(j,firstObj.disY,secondObj.disY);<br />
				}<br />
				flagW3 = testCrossAbleY(secondObj.disY,j,secondObj.disX);<br />
				aryFlag2 = aryFlag2 || (flagW1 &#038;& flagW2 &#038;& flagW3);<br />
				if (aryFlag2) {<br />
					var aryPy1:Array = [firstObj.disX,firstObj.disY];<br />
					var aryPy2:Array = [j,firstObj.disY];<br />
					var aryPy3:Array = [j,secondObj.disY];<br />
					var aryPy4:Array = [secondObj.disX,secondObj.disY];<br />
					aryCrossPath.push(aryPy1);<br />
					aryCrossPath.push(aryPy2);<br />
					aryCrossPath.push(aryPy3);<br />
					aryCrossPath.push(aryPy4);<br />
					return true;<br />
				}<br />
			}<br />
		}<br />
	}<br />
	aryCrossPath= [];<br />
	return false;<br />
}<br />
[/js]<br />
Pic类就是图片了,这里图方便我在库里丢了个元件弄了8桢,每桢画了不一样的颜色.<br />
该类有3个属性,所在列数disX,所在行数disY,图片类型pType.<br />
[js]<br />
package{<br />
	import flash.display.MovieClip;<br />
	public class Pic extends MovieClip{<br />
		public var disX;<br />
		public var disY;<br />
		public var pType;<br />
		public function Pic(){}<br />
	}<br />
}<br />
[/js]</p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li><li>2010/05/13 -- <a  href="http://nwhy.org/as3-lightout.html" title="AS3-LightOut">AS3-LightOut</a> (8)</li><li>2010/04/14 -- <a  href="http://nwhy.org/as3-sokoban.html" title="AS3-Sokoban推箱子">AS3-Sokoban推箱子</a> (11)</li><li>2010/03/18 -- <a  href="http://nwhy.org/as3-mapconvert.html" title="AS3-Mapppp~的一个生成方案">AS3-Mapppp~的一个生成方案</a> (3)</li><li>2010/03/02 -- <a  href="http://nwhy.org/as3-tile-role-move.html" title="AS3-类似于机战的角色移动(基于Tile)">AS3-类似于机战的角色移动(基于Tile)</a> (4)</li><li>2010/02/04 -- <a  href="http://nwhy.org/as3-aspaceescape-map-tile.html" title="AS3-aSpaceEscape 迷宫脱离游戏(二)地图生成部分">AS3-aSpaceEscape 迷宫脱离游戏(二)地图生成部分</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/as3-lianliankan.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>AS3-子弹躲避游戏(下)</title>
		<link>http://nwhy.org/game-avoid-bullets-2.html</link>
		<comments>http://nwhy.org/game-avoid-bullets-2.html#comments</comments>
		<pubDate>Mon, 20 Jul 2009 02:11:37 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=4593</guid>
		<description><![CDATA[接上一篇《AS3-子弹躲避游戏(上)》。 有了Enemy和Role之后，自然就是游戏的主体控制部分了，这里是Game类： 这个类负责生成多少个Enemy，Role如何移动，游戏如何开始和如何结束，以及控制其他... ]]></description>
			<content:encoded><![CDATA[<p>接上一篇<a  href="http://nwhy.org/game-avoid-bullets-1.html">《AS3-子弹躲避游戏(上)》</a>。<br />
有了Enemy和Role之后，自然就是游戏的主体控制部分了，这里是Game类：<br />
这个类负责生成多少个Enemy，Role如何移动，游戏如何开始和如何结束，以及控制其他事务，比如记时类。<br />
[js]<br />
package{<br />
	import flash.display.Sprite;<br />
	import flash.events.*;<br />
	import flash.utils.Timer;<br />
	import flash.text.TextField;<br />
	import flash.text.TextFieldAutoSize;<br />
	import flash.text.TextFormat;<br />
	import fl.controls.Button;<br />
	import Config;<br />
	import Role;<br />
	import Enemy;<br />
	import TimeCount;</p>
<p>	public class Game extends Sprite{<br />
		private var _role:Role;<br />
		private var _enemy:Sprite;<br />
		private var _time:TimeCount;<br />
		private var _enemyTotal:uint;<br />
		private var _gameFlag:Boolean;</p>
<p>		private var startBtn:Button;<br />
		private var gameInfo:TextField;</p>
<p>		//存储四个方向键是否按下的变量<br />
		private var leftArrow:Boolean=false;<br />
		private var rightArrow:Boolean=false;<br />
		private var upArrow:Boolean=false;<br />
		private var downArrow:Boolean=false;</p>
<p>		public function Game():void{<br />
			startBtn = new Button();<br />
			startBtn.label = "StartGame";<br />
			startBtn.x=(Config.STAGE_W-startBtn.width)/2;<br />
			startBtn.y=(Config.STAGE_H-startBtn.height)/2;<br />
			addChild(startBtn);<br />
			startBtn.addEventListener(MouseEvent.MOUSE_DOWN,gameStart);<br />
			gameInfo = new TextField();<br />
			gameInfo.autoSize = TextFieldAutoSize.LEFT;<br />
			gameInfo.selectable = false;<br />
			gameInfo.text = "上下左右方向键控制方块移动，被黑球击中就挂了。";<br />
			gameInfo.x = (Config.STAGE_W-gameInfo.width)/2;<br />
			gameInfo.y = startBtn.y-30;<br />
			addChild(gameInfo);<br />
		}<br />
		private function gameStart(_evt:MouseEvent):void{<br />
			startBtn.removeEventListener(MouseEvent.MOUSE_DOWN,gameStart);<br />
			startBtn.visible = false;<br />
			gameInfo.visible = false;<br />
			init();<br />
		}<br />
		private function init():void{<br />
			initTime();<br />
			initRole();<br />
			initEnemy();<br />
		}<br />
		private function initTime():void{<br />
			_time = new TimeCount();<br />
			addChild(_time);<br />
		}<br />
		private function initRole():void{<br />
			_role = new Role();<br />
			addChild(_role);<br />
			_role.x=(Config.STAGE_W-_role.width)/2;<br />
			_role.y=(Config.STAGE_H-_role.height)/2;<br />
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);<br />
			stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);<br />
			_role.addEventListener(Event.ENTER_FRAME, roleMove);<br />
			stage.addEventListener(Event.DEACTIVATE, missingStage);//Flash处于非活动状态时调用<br />
		}</p>
<p>		private function initEnemy():void{<br />
			_enemyTotal = Config.ENEMY_TOTAL;<br />
			var t:Timer=new Timer(2000,1);<br />
			t.addEventListener(TimerEvent.TIMER, timeToCreateEnemy);<br />
            t.start();<br />
		}</p>
<p>		private function createEnemy():void{<br />
			var enemy=new Enemy();<br />
			enemy.setRole(_role);<br />
			_enemy.addChild(enemy);<br />
		}<br />
		private function getEnemyNum():uint{<br />
			return this.numChildren;<br />
		}</p>
<p>		private function timeToCreateEnemy(_evt:TimerEvent):void{<br />
			_enemy = new Sprite();<br />
			addChild(_enemy);<br />
			for (var i:uint=0; i<_enemytotal ; i++) {<br />
				createEnemy();<br />
			}<br />
			addEventListener(Event.ENTER_FRAME,checkFlag);<br />
		}</p>
<p>		//按键时的检测，左上右下分别是37，38，39，40<br />
		private function keyPressedDown(_evt:KeyboardEvent) {<br />
			if (_evt.keyCode==37) {<br />
				leftArrow=true;<br />
			} else if (_evt.keyCode == 39) {<br />
				rightArrow=true;<br />
			} else if (_evt.keyCode == 38) {<br />
				upArrow=true;<br />
			} else if (_evt.keyCode == 40) {<br />
				downArrow=true;<br />
			}<br />
		}</p>
<p>		//松开按键时<br />
		private function keyPressedUp(_evt:KeyboardEvent) {<br />
			if (_evt.keyCode==37) {<br />
				leftArrow=false;<br />
			} else if (_evt.keyCode == 39) {<br />
				rightArrow=false;<br />
			} else if (_evt.keyCode == 38) {<br />
				upArrow=false;<br />
			} else if (_evt.keyCode == 40) {<br />
				downArrow=false;<br />
			}<br />
		}<br />
		private function roleMove(_evt:Event) {<br />
			//移动的速度<br />
			var speed:Number=Config.ROLE_SPEED;<br />
			if (leftArrow) {<br />
				//MC的位置检测，下边相同<br />
				if (0<=_role.x) {<br />
					_role.x-=speed;<br />
				}<br />
			}<br />
			if (rightArrow) {<br />
				if (_role.x<=Config.STAGE_W-_role.width) {<br />
					_role.x+=speed;<br />
				}<br />
			}<br />
			if (upArrow) {<br />
				if (0<=_role.y) {<br />
					_role.y-=speed;<br />
				}<br />
			}<br />
			if (downArrow) {<br />
				if (_role.y<=Config.STAGE_H-_role.height*2) {<br />
					_role.y+=speed;<br />
				}<br />
			}<br />
		}</p>
<p>		//Flash处于非激活状态时<br />
		private function missingStage(_evt:Event) {<br />
			leftArrow=false;<br />
			rightArrow=false;<br />
			upArrow=false;<br />
			downArrow=false;<br />
		}<br />
		private function checkFlag(_evt:Event):void{<br />
			//trace(_gameFlag);<br />
			if(_gameFlag){<br />
				_gameFlag = false;<br />
				gameOver();<br />
			}<br />
		}<br />
		private function gameOver(){</p>
<p>			removeEventListener(Event.ENTER_FRAME,checkFlag);<br />
			_time.stopTime();</p>
<p>			gameInfo.text = "You Failed At " + _time.getTime() + " Second!";<br />
			var format:TextFormat = new TextFormat();<br />
			format.font = "Arial";<br />
            format.color = 0xFF0000;<br />
            format.size = 30;<br />
            gameInfo.setTextFormat(format);<br />
			gameInfo.x=(Config.STAGE_W-gameInfo.textWidth)/2;<br />
			gameInfo.y=(Config.STAGE_H-gameInfo.textHeight)/2;<br />
			gameInfo.visible = true;</p>
<p>			startBtn.visible = true;<br />
			startBtn.y = gameInfo.y + 40;<br />
			startBtn.addEventListener(MouseEvent.MOUSE_DOWN,gameStart);</p>
<p>			//_role.roleClear();<br />
			_role.removeEventListener(Event.ENTER_FRAME, roleMove);<br />
			removeChild(_role);</p>
<p>			while(_enemy.numChildren>0){<br />
				Enemy(_enemy.getChildAt(0)).enemyClear();<br />
				_enemy.removeChildAt(0);<br />
			}<br />
			removeChild(_enemy);<br />
		}<br />
		public function setGameFlag(_value:Boolean):void{<br />
			_gameFlag = _value;<br />
		}<br />
	}<br />
}<br />
[/js]<br />
<span id="more-4593"></span><br />
然后是一个不是很重要的类，记时类：<br />
[js]<br />
package{<br />
	import flash.text.TextField;<br />
	import flash.text.TextFormat;<br />
	import flash.text.TextFieldAutoSize;<br />
	import flash.utils.Timer;<br />
    import flash.events.TimerEvent;</p>
<p>	public class TimeCount extends TextField{<br />
		private var _timeCount:uint;<br />
		private var t:Timer;<br />
		var format:TextFormat;</p>
<p>		public function TimeCount():void{<br />
			init();<br />
		}<br />
		private function init(){<br />
			format = new TextFormat();<br />
			format.font = "Arial";<br />
			format.color = 0x666666;<br />
            format.size = 15;<br />
			format.bold = true;<br />
			_timeCount=0;<br />
			autoSize = TextFieldAutoSize.LEFT;<br />
			selectable = false;<br />
			t = new Timer(1000);<br />
			t.addEventListener(TimerEvent.TIMER,showTimeCount);<br />
			t.start();<br />
		}<br />
		private function showTimeCount(_evt:TimerEvent):void{<br />
			_timeCount++;<br />
			showTime(_timeCount);<br />
		}<br />
		private function showTime(timeCount:uint):void{<br />
			var _count = String(timeCount);<br />
			text = "Time: " + _count + " Second";<br />
			setTextFormat(format);<br />
		}<br />
		public function stopTime():void{<br />
			t.start();<br />
			t.removeEventListener(TimerEvent.TIMER,showTimeCount);<br />
			text = "";<br />
		}<br />
		public function getTime():uint{<br />
			return _timeCount;<br />
		}<br />
	}<br />
}<br />
[/js]<br />
当然了，你可以加入声音类，Enemy子类，Role子类，以及其他的OOXX的OOX之类的。<br />
或者加入开始动画，结束动画，甚至是和《特训!99》一样加入一个巧妙度的计算类？</_enemytotal></p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li><li>2009/09/07 -- <a  href="http://nwhy.org/as3-physics-formula.html" title="Flash-一些常用物理公式和AS3的结合应用">Flash-一些常用物理公式和AS3的结合应用</a> (1)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/28 -- <a  href="http://nwhy.org/flash-fuzzy-theory.html" title="Flash &#8211; 说是XXX的模糊理论视觉模型？">Flash &#8211; 说是XXX的模糊理论视觉模型？</a> (2)</li><li>2009/07/27 -- <a  href="http://nwhy.org/flash-setter-getter.html" title="Flash-Setter &#038; Getter">Flash-Setter &#038; Getter</a> (0)</li><li>2009/07/13 -- <a  href="http://nwhy.org/as3-code-optimization.html" title="AS3 Code Optimization一些代码优化的问题">AS3 Code Optimization一些代码优化的问题</a> (0)</li><li>2009/06/25 -- <a  href="http://nwhy.org/flash-megazine3.html" title="Flash-An Pageflip/Flashbook Engine MegaZine 3">Flash-An Pageflip/Flashbook Engine MegaZine 3</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/game-avoid-bullets-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3-子弹躲避游戏(上)</title>
		<link>http://nwhy.org/game-avoid-bullets-1.html</link>
		<comments>http://nwhy.org/game-avoid-bullets-1.html#comments</comments>
		<pubDate>Fri, 17 Jul 2009 04:19:29 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=4587</guid>
		<description><![CDATA[先来Demo： 游戏本身很简单，本尊是一个日本人做的叫《特训!99》，移动方块不要被球击中即可。 下边说下做法，首先我们需要一个配置参数的类，当然你可以写个XML读取，或者其他的～ [js] pa... ]]></description>
			<content:encoded><![CDATA[<p>先来Demo：<br />
<object id="as2-system" width="550" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"><param name="allowScriptAccess" value="sameDomain"/><param name="AvoidBullets" value="http://nwhy.org/nwhy/game/AvoidBullets.swf"/><param name="quality" value="high"/><embed width="550" height="400" src="http://nwhy.org/nwhy/game/AvoidBullets.swf" quality="high" bgcolor="#ffffff" name="AvoidBullets" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/><br />
</object><br />
<span id="more-4587"></span><br />
游戏本身很简单，本尊是一个日本人做的叫《特训!99》，移动方块不要被球击中即可。<br />
下边说下做法，首先我们需要一个配置参数的类，当然你可以写个XML读取，或者其他的～<br />
[js]<br />
package{<br />
	public class Config{<br />
		public static var STAGE_W:uint = 550;<br />
		public static var STAGE_H:uint = 400;<br />
		public static var ENEMY_SIZE:uint = 5;<br />
		public static var ENEMY_MINSPEED:uint = 1;<br />
		public static var ENEMY_MAXSPEED:uint = 3;<br />
		public static var ENEMY_COLOR:uint = 0x000000;<br />
		public static var ENEMY_TOTAL:uint = 120;<br />
		public static var ROLE_SIZE:uint = 10;<br />
		public static var ROLE_COLOR:uint = 0x0066cc;<br />
		public static var ROLE_SPEED:uint = 5;<br />
	}<br />
}<br />
[/js]<br />
里边的变量名就是代表的含义，就不说明了……<br />
然后就是Enemy的类，也就是黑球，这个类要实现什么功能呢，首先肯定是绘制一个形状对吧，然后呢，就是让这些形状动起来，并且判断冲出屏幕和碰撞Role等情况。这个类差不多是长这个样子：<br />
[js]<br />
package {<br />
	import flash.display.Sprite;<br />
	import flash.display.Shape;<br />
	import flash.display.Graphics;<br />
	import flash.events.*;</p>
<p>	import ascb.util.NumberUtilities;//来自于as3 cook book 的第三方类<br />
	import Config;//配置文件 里边存放了游戏的基本参数<br />
	import Role;//游戏角色，也就是方块</p>
<p>	public class Enemy extends Sprite{</p>
<p>		private var _size:uint;//大小<br />
		private var _color:uint;//颜色<br />
		private var _spdX:Number;//x轴的速度<br />
		private var _spdY:Number;//y轴的速度<br />
		private var _directionX:int;//x轴移动方向<br />
		private var _directionY:int;//y轴移动方向<br />
		private var _minSpeed:int;//最小运动速度<br />
		private var _maxSpeed:int;//最大运动速度<br />
		private var _role:Role;</p>
<p>		public function Enemy():void {<br />
			init();<br />
			drawCircle();<br />
			_directionX = randDirection();<br />
			_directionY = randDirection();<br />
			addEventListener(Event.ENTER_FRAME,run);<br />
		}<br />
		private function init():void{<br />
			//trace(Config.STAGE_W);<br />
			//trace(Config.STAGE_H);<br />
			_minSpeed = Config.ENEMY_MINSPEED;<br />
			_maxSpeed = Config.ENEMY_MAXSPEED;<br />
			_spdX = NumberUtilities.random(_minSpeed,_maxSpeed);<br />
			_spdY = NumberUtilities.random(_minSpeed,_maxSpeed);<br />
			_size = Config.ENEMY_SIZE;<br />
			_color = Config.ENEMY_COLOR;<br />
			x = randDis()[0];<br />
			y = randDis()[1];<br />
		}<br />
		//开始位置定了4个点<br />
		private function randDis():Array{<br />
			var aryTmp:Array = [[50,50],[Config.STAGE_W-50,50],[50,Config.STAGE_H-50],[Config.STAGE_W-50,Config.STAGE_H-50]];<br />
			var rand = NumberUtilities.random(0,3);<br />
			trace(aryTmp[rand]);<br />
			return (aryTmp[rand]);<br />
		}<br />
		//x，y轴的移动方向随机值<br />
		private function randDirection():int{<br />
			var rand = NumberUtilities.random(0,1);<br />
			if(rand){<br />
				return 1;<br />
			}else{<br />
				return -1;<br />
			}<br />
			//trace(_direction);<br />
		}<br />
		//绘制圆<br />
		private function drawCircle():void{<br />
			//trace("drawCircle");<br />
            var childCircle:Shape = new Shape();<br />
            var halfSize:uint = Math.round(_size / 2);<br />
            childCircle.graphics.beginFill(_color);<br />
            childCircle.graphics.lineStyle(0,_color);<br />
            childCircle.graphics.drawCircle(halfSize, halfSize, halfSize);<br />
            childCircle.graphics.endFill();<br />
            addChild(childCircle);<br />
		}<br />
		//enemy的位移控制<br />
		public function run(_evt:Event):void {<br />
			//trace("run");<br />
			x += _spdX * (_directionX);<br />
			y += _spdY * (_directionY);<br />
			//trace(_spdX * _direction);<br />
			//out of stage的时候改变移动方向<br />
			if(x< =0 || x>=Config.STAGE_W || y< =0 || y>=Config.STAGE_H){<br />
				_spdX = NumberUtilities.random(_minSpeed,_maxSpeed);<br />
				_spdY = NumberUtilities.random(_minSpeed,_maxSpeed);<br />
				_directionX = randDirection();<br />
				_directionY = randDirection();<br />
				//本来是打算冲出屏幕就删除的<br />
				/*if (parent){<br />
					//trace("out of stage");<br />
					removeEventListener(Event.ENTER_FRAME,run);<br />
					parent.removeChild(this);<br />
				}*/<br />
			}<br />
			hitRole();<br />
		}<br />
		//判断是否和Role碰撞了<br />
		private function hitRole(){<br />
			if(hitTestObject(_role)){<br />
				Game(root).setGameFlag(true);<br />
			}<br />
		}<br />
		//设置Role<br />
		public function setRole(roleObj:Role):void{<br />
			_role = roleObj;<br />
		}<br />
		//game over时的清除操作<br />
		public function enemyClear(){<br />
			removeEventListener(Event.ENTER_FRAME,run);<br />
		}<br />
	}<br />
}<br />
[/js]<br />
然后是Role类，也就是游戏主体方块，这个类很简单，绘制一个Role就可以了：<br />
[js]<br />
package {<br />
	import flash.display.Sprite;<br />
	import flash.display.Shape;<br />
	import flash.display.Graphics;<br />
	import Config;</p>
<p>	public class Role extends Sprite {<br />
		private var _size:uint;<br />
		private var _color:uint;</p>
<p>		public function Role():void {<br />
			init();<br />
		}<br />
		private function init():void {<br />
			_size=Config.ROLE_SIZE;<br />
			_color=Config.ROLE_COLOR;<br />
			drawRole();<br />
		}<br />
		private function drawRole():void {<br />
			var role:Shape = new Shape();<br />
			role.graphics.beginFill(_color);<br />
			role.graphics.lineStyle(0, _color);<br />
			role.graphics.drawRect(0, 0, _size, _size);<br />
			role.graphics.endFill();<br />
			addChild(role);<br />
		}<br />
		public function roleClear(){<br />
			if (parent){<br />
				parent.removeChild(this);<br />
			}<br />
			//other code<br />
		}<br />
	}<br />
}<br />
[/js]<br />
最后是控制部分，请见这里<a  href="http://nwhy.org/game-avoid-bullets-2.html">《AS3-子弹躲避游戏(下)》</a></p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li><li>2009/09/07 -- <a  href="http://nwhy.org/as3-physics-formula.html" title="Flash-一些常用物理公式和AS3的结合应用">Flash-一些常用物理公式和AS3的结合应用</a> (1)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/28 -- <a  href="http://nwhy.org/flash-fuzzy-theory.html" title="Flash &#8211; 说是XXX的模糊理论视觉模型？">Flash &#8211; 说是XXX的模糊理论视觉模型？</a> (2)</li><li>2009/07/27 -- <a  href="http://nwhy.org/flash-setter-getter.html" title="Flash-Setter &#038; Getter">Flash-Setter &#038; Getter</a> (0)</li><li>2009/07/13 -- <a  href="http://nwhy.org/as3-code-optimization.html" title="AS3 Code Optimization一些代码优化的问题">AS3 Code Optimization一些代码优化的问题</a> (0)</li><li>2009/06/25 -- <a  href="http://nwhy.org/flash-megazine3.html" title="Flash-An Pageflip/Flashbook Engine MegaZine 3">Flash-An Pageflip/Flashbook Engine MegaZine 3</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/game-avoid-bullets-1.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GAME-Quake Live</title>
		<link>http://nwhy.org/game-quake-live.html</link>
		<comments>http://nwhy.org/game-quake-live.html#comments</comments>
		<pubDate>Thu, 23 Apr 2009 15:21:22 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[Quake Live]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=4217</guid>
		<description><![CDATA[Quake Live：http://www.quakelive.com 无比强大的Flash版本，游戏正规容量应当在800M左右的效果做在了10M左右的Flash里边，强大的地方，有兴趣的可以去参观一下。 Some Related Posts2010/05/13 -- AS3-LightOut (8)201... ]]></description>
			<content:encoded><![CDATA[<p><img src="http://cdn-web.quakelive.com/web78/images/sf/general/logo_v78.0.png" alt="Quake" /><br />
Quake Live：<a  href="http://www.quakelive.com">http://www.quakelive.com</a><br />
无比强大的Flash版本，游戏正规容量应当在800M左右的效果做在了10M左右的Flash里边，强大的地方，有兴趣的可以去参观一下。</p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2010/05/13 -- <a  href="http://nwhy.org/as3-lightout.html" title="AS3-LightOut">AS3-LightOut</a> (8)</li><li>2010/04/14 -- <a  href="http://nwhy.org/as3-sokoban.html" title="AS3-Sokoban推箱子">AS3-Sokoban推箱子</a> (11)</li><li>2010/03/02 -- <a  href="http://nwhy.org/as3-tile-role-move.html" title="AS3-类似于机战的角色移动(基于Tile)">AS3-类似于机战的角色移动(基于Tile)</a> (4)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/03/08 -- <a  href="http://nwhy.org/what-s-in-your-brain.html" title="GAME-What&#8217;s in your brain? 你的脑内是什么?">GAME-What&#8217;s in your brain? 你的脑内是什么?</a> (7)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/game-quake-live.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GAME-NamePK 基于MD5的名字PK(下)</title>
		<link>http://nwhy.org/game-namepk-2.html</link>
		<comments>http://nwhy.org/game-namepk-2.html#comments</comments>
		<pubDate>Sun, 22 Mar 2009 02:00:48 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[MD5]]></category>
		<category><![CDATA[NamePK]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=3964</guid>
		<description><![CDATA[上接：“GAME-NamePK 基于MD5的名字PK(上)” Source Code： [js] import org.nwhy.Player; //这个是As3CoreLib里的工具类 import com.adobe.utils.StringUtil; import gs.TweenLite; btnStart.buttonMode=true; btnStart.addEventListener (MouseEvent.... ]]></description>
			<content:encoded><![CDATA[<p>上接：“<a  href="http://nwhy.org/game-namepk-1.html">GAME-NamePK 基于MD5的名字PK(上)</a>”<br />
Source Code：<br />
[js]<br />
import org.nwhy.Player;<br />
//这个是As3CoreLib里的工具类<br />
import com.adobe.utils.StringUtil;<br />
import gs.TweenLite;</p>
<p>btnStart.buttonMode=true;<br />
btnStart.addEventListener (MouseEvent.CLICK,gameStart);<br />
//开始游戏<br />
function gameStart (_evt:MouseEvent) {<br />
	var p1Name:String=trimStr(inputP1.text);<br />
	var p2Name:String=trimStr(inputP2.text);<br />
	if (checkPName (p1Name) &#038;& checkPName (p2Name)) {<br />
		txtInfoShow.text="";<br />
		btnStart.buttonMode=false;<br />
		btnStart.removeEventListener (MouseEvent.CLICK,gameStart);<br />
		var p1=new Player(p1Name);<br />
		initPlayer(p1,mcP1);<br />
		var p2=new Player(p2Name);<br />
		initPlayer(p2,mcP2);<br />
		if(p1.getDex()>=p2.getDex()){<br />
			txtInfoShow.appendText("比对敏捷值  "+p1.getName()+"  获得优先攻击权 \n");<br />
			setTimeout(doPK,2000,p1,p2);<br />
		}else{<br />
			txtInfoShow.appendText("比对敏捷值  "+p2.getName()+"  获得优先攻击权 \n");<br />
			setTimeout(doPK,2000,p2,p1);<br />
		}<br />
	} else {<br />
		txtInfoShow.appendText("请输入名字！\n");<br />
	}<br />
}<br />
//初始化角色<br />
function initPlayer(_player:Player,_mc:MovieClip){<br />
	_player.setBindMC(_mc);<br />
	setTxt(_mc.txtName,String(_player.getName()));<br />
	setTxt(_mc.txtHp,String(_player.getHp()));<br />
	setTxt(_mc.txtStr,String(_player.getStr()));<br />
	setTxt(_mc.txtDex,String(_player.getDex()));<br />
	TweenLite.to(_mc.hp,0.3,{width:_player.getHp()/5< &lt;0});<br />
	TweenLite.to(_mc.str,0.3,{width:_player.getStr()*2});<br />
	TweenLite.to(_mc.dex,0.3,{width:_player.getDex()*2});<br />
}<br />
function doPK(_p1:Player,_p2:Player){<br />
	attack(_p1,_p2);<br />
	if(_p2.isAlive()){<br />
		setTimeout(doPK,1000,_p2,_p1);<br />
	}<br />
}<br />
//攻击函数<br />
function attack(_p1:Player,_p2:Player){<br />
	var p1AttackValue:Array=_p1.attack();<br />
	gameInfoShow(txtInfoShow,p1AttackValue[1],p1AttackValue[0],_p1);<br />
	if(_p1.getRate()>_p2.getRate()){<br />
		_p2.setHp(_p2.getHp()-p1AttackValue[0]);<br />
  		if(_p2.isAlive()){<br />
			setTxt(_p2.getBindMC().txtHp,String(_p2.getHp()));<br />
			TweenLite.to(_p2.getBindMC().hp,0.3,{width:_p2.getHp()/5< &lt;0});<br />
		}else{<br />
			setTxt(_p2.getBindMC().txtHp,"死亡");<br />
			TweenLite.to(_p2.getBindMC().hp,0.3,{width:0});<br />
			txtInfoShow.appendText(_p2.getName()+"  被扁趴下  "+_p1.getName()+"  获得胜利 \n");<br />
			btnStart.buttonMode=true;<br />
			btnStart.addEventListener (MouseEvent.CLICK,gameStart);<br />
		}<br />
	}else{<br />
		txtInfoShow.appendText("但是  "+_p2.getName()+"  闪开了 \n");<br />
	}<br />
}<br />
//文本设置<br />
function setTxt(_txt:TextField,_str:String){<br />
	_txt.text=_str;<br />
}<br />
//显示PK实况<br />
function gameInfoShow(_txt:TextField,_style:String,_str:uint,_player:Player){<br />
	_txt.appendText(_player.getName()+"  "+_style+"  伤害值为  "+_str+"\n");<br />
}<br />
//简单的见车名字输入<br />
function checkPName (playerName:String):Boolean {<br />
	if (playerName=="") {<br />
		return false;<br />
	} else {<br />
		return true;<br />
	}<br />
}<br />
//去左右空格函数<br />
function trimStr(_str:String){<br />
	return StringUtil.trim(_str);<br />
}<br />
[/js]<br />
相对来说主要就是攻击的顺序判断，攻击的命中，还有游戏是否结束的判断。<br />
Source files here:http://dl.getdropbox.com/u/477487/flash/game/namePK.rar<br />
<span id="more-3964"></span><br />
放个豆腐和豆奶的PK结果记录哈：<br />
[html]<br />
比对敏捷值  豆奶  获得优先攻击权<br />
豆奶  使出了砖石星辰拳  伤害值为  122<br />
豆腐  喝下一口酒精喷出一个大火球  伤害值为  82<br />
但是  豆奶  闪开了<br />
豆奶  搬起一块石头砸了过来  伤害值为  111<br />
豆腐  喝下一口酒精喷出一个大火球  伤害值为  91<br />
豆奶  扔出了发着佛光的雅典娜  伤害值为  128<br />
豆腐  不知从哪丢出一陀大便  伤害值为  91<br />
但是  豆奶  闪开了<br />
豆奶  使出了砖石星辰拳  伤害值为  133<br />
豆腐  被扁趴下  豆奶  获得胜利<br />
[/html]</p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li><li>2009/09/07 -- <a  href="http://nwhy.org/as3-physics-formula.html" title="Flash-一些常用物理公式和AS3的结合应用">Flash-一些常用物理公式和AS3的结合应用</a> (1)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/28 -- <a  href="http://nwhy.org/flash-fuzzy-theory.html" title="Flash &#8211; 说是XXX的模糊理论视觉模型？">Flash &#8211; 说是XXX的模糊理论视觉模型？</a> (2)</li><li>2009/07/27 -- <a  href="http://nwhy.org/flash-setter-getter.html" title="Flash-Setter &#038; Getter">Flash-Setter &#038; Getter</a> (0)</li><li>2009/07/13 -- <a  href="http://nwhy.org/as3-code-optimization.html" title="AS3 Code Optimization一些代码优化的问题">AS3 Code Optimization一些代码优化的问题</a> (0)</li><li>2009/06/25 -- <a  href="http://nwhy.org/flash-megazine3.html" title="Flash-An Pageflip/Flashbook Engine MegaZine 3">Flash-An Pageflip/Flashbook Engine MegaZine 3</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/game-namepk-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GAME-NamePK 基于MD5的名字PK(上)</title>
		<link>http://nwhy.org/game-namepk-1.html</link>
		<comments>http://nwhy.org/game-namepk-1.html#comments</comments>
		<pubDate>Sat, 21 Mar 2009 06:30:00 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[MD5]]></category>
		<category><![CDATA[NamePK]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=3958</guid>
		<description><![CDATA[先上Demo： 灵感来自网上的“MD5大作战”，不过无法找到原作者的链接。 这个游戏过程很简单，只要输入2个名字，点击“StartPk”，就开始战斗，直到有一个被扁趴下为止。 详细的制作过程如... ]]></description>
			<content:encoded><![CDATA[<p>先上Demo：<br />
<object id="namePK" height="601" width="650" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"><param name="allowScriptAccess" value="sameDomain"/><param name="movie" value="http://nwhy.org/nwhy/game/namePK.swf"/><param name="quality" value="high"/><embed height="601" width="650" src="http://nwhy.org/nwhy/game/namePK.swf" quality="high" bgcolor="#ffffff" name="namePK" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/><br />
</object><br />
<span id="more-3958"></span><br />
灵感来自网上的“MD5大作战”，不过无法找到原作者的链接。<br />
这个游戏过程很简单，只要输入2个名字，点击“StartPk”，就开始战斗，直到有一个被扁趴下为止。<br />
详细的制作过程如下：<br />
首先要让输入的名字对应的角色属性值唯一化，实现这个的方法有很多种(例如MD5，SHA)，这里用的是MD5，先把输入的名字去除左右空格后转化做MD5转换，这样出来的就是一个固定32位长度的字符串，接下去只要把这个字符串转换成数字就可以了，做法有好几种，可以将字符串里的字母转换为ASCII码值，可以直接去掉里边的字母只保留数字，也可以自己做一个转换函数来把字母转换成特定的数字，这里我直接去掉字符串中的字母。<br />
实现这部分功能的代码，根据输入字符串生成Player属性的类，Player.as:<br />
[js]<br />
package org.nwhy{<br />
	import utils.MD5;<br />
	import flash.display.MovieClip;</p>
<p>	public class Player {<br />
		//名字<br />
		private var _name:String;<br />
		//血量值<br />
		private var _hp:int;<br />
		//力量值，影响攻击力<br />
		private var _str:uint;<br />
		//敏捷值，影响命中和躲避率<br />
		private var _dex:uint;<br />
		//幸运值，影响攻击力和命中/闪避率<br />
		private var _luck:uint;<br />
		//显示状态的MC<br />
		private var _bindMC:MovieClip;<br />
		//攻击方式<br />
		private var _aryAttackStyle:Array=new Array("不知从哪丢出一陀大便","搬起一块石头砸了过来","喝下一口酒精喷出一个大火球","高唱我的菊花为谁开","使出了砖石星辰拳","扔出了发着佛光的雅典娜");<br />
		public function Player (__str:String="") {<br />
			var strTmp=MD5.hash(__str);<br />
			strTmp=str2num(strTmp);<br />
			//保证strTmp的长度为10个字符以上<br />
			while (strTmp.length&lt;10) {<br />
				strTmp+=strTmp;<br />
			}<br />
			//各属性的赋值和调整<br />
			_hp=int(strTmp.substr(0,3));<br />
			if (_hp&lt;150) {<br />
				_hp+=200;<br />
			} else if (500<_hp ) {<br />
				_hp=(_hp*0.8)<&lt;0;<br />
			}<br />
			_str=int(strTmp.substr(3,2));<br />
			if (_str&lt;20) {<br />
				_str+=20;<br />
			} else if (90<_str) {<br />
				_str=(_str*0.9)<&lt;0;<br />
			}<br />
			_dex=int(strTmp.substr(5,2));<br />
			if (_dex&lt;20) {<br />
				_dex+=20;<br />
			} else if (80<_dex) {<br />
				_dex=(_dex*0.75)<&lt;0;<br />
			}<br />
			_luck=int(strTmp.substr(7,2));<br />
			_name=__str;<br />
		}<br />
		public function getName ():String {<br />
			return _name;<br />
		}<br />
		public function setHp (value:int):void {<br />
			if(value&lt;0){<br />
				value=0;<br />
			}<br />
			_hp=value;<br />
		}<br />
		public function getHp ():int {<br />
			return _hp;<br />
		}<br />
		public function getStr ():uint {<br />
			return _str;<br />
		}<br />
		public function getDex ():uint {<br />
			return _dex;<br />
		}<br />
		public function getLuck ():uint {<br />
			return _luck;<br />
		}<br />
		//绑定显示用的MC<br />
		public function setBindMC (_mc:MovieClip):void {<br />
			_bindMC=_mc;<br />
		}<br />
		public function getBindMC ():MovieClip {<br />
			return _bindMC;<br />
		}<br />
		//判断是不是还活着<br />
		public function isAlive ():Boolean {<br />
			if (_hp>0) {<br />
				return true;<br />
			} else {<br />
				return false;<br />
			}<br />
		}<br />
		//攻击函数<br />
		public function attack():Array{<br />
			var aryAttack:Array=new Array((Math.random()*_str< &lt;0)+_str/5+_luck,_aryAttackStyle[Math.random()*_aryAttackStyle.length<&lt;0]);<br />
			return aryAttack;<br />
		}<br />
		//生成命中和闪避率<br />
		public function getRate():Number{<br />
			return Math.random()*((_dex+_luck)/100);<br />
		}<br />
		//获取字符串中数字<br />
		public static function str2num (char:String):String {<br />
			var pattern:RegExp=/^[-\+]?\d+$/;<br />
			var strTemp:String="";<br />
			for (var i:uint=0; i<char.length; i++) {<br />
				var rs:Object=pattern.exec(char.charAt(i));<br />
				if (rs==null) {<br />
				} else {<br />
					strTemp+=char.charAt(i);<br />
				}<br />
			}<br />
			return strTemp;<br />
		}<br />
	}<br />
}<br />
[/js]<br />
下边是具体的游戏实现部分和源码下载：“<a  href="http://nwhy.org/game-namepk-2.html">GAME-NamePK 基于MD5的名字PK(下)”。</_hp></p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/03/22 -- <a href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li><li>2009/09/07 -- <a  href="http://nwhy.org/as3-physics-formula.html" title="Flash-一些常用物理公式和AS3的结合应用">Flash-一些常用物理公式和AS3的结合应用</a> (1)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/28 -- <a  href="http://nwhy.org/flash-fuzzy-theory.html" title="Flash &#8211; 说是XXX的模糊理论视觉模型？">Flash &#8211; 说是XXX的模糊理论视觉模型？</a> (2)</li><li>2009/07/27 -- <a  href="http://nwhy.org/flash-setter-getter.html" title="Flash-Setter &#038; Getter">Flash-Setter &#038; Getter</a> (0)</li><li>2009/07/13 -- <a  href="http://nwhy.org/as3-code-optimization.html" title="AS3 Code Optimization一些代码优化的问题">AS3 Code Optimization一些代码优化的问题</a> (0)</li><li>2009/06/25 -- <a  href="http://nwhy.org/flash-megazine3.html" title="Flash-An Pageflip/Flashbook Engine MegaZine 3">Flash-An Pageflip/Flashbook Engine MegaZine 3</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/game-namepk-1.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>GAME-What&#8217;s in your brain? 你的脑内是什么?</title>
		<link>http://nwhy.org/what-s-in-your-brain.html</link>
		<comments>http://nwhy.org/what-s-in-your-brain.html#comments</comments>
		<pubDate>Sun, 08 Mar 2009 00:15:46 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[As3CoreLib]]></category>
		<category><![CDATA[JPGEncoder]]></category>
		<category><![CDATA[MD5]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=3867</guid>
		<description><![CDATA[Demo: 想法来自http://usokonikki.com/，觉得挺好玩，加上正好想学一下JPGEncoder，就试着做了一下，呵呵，挺有趣的。 不过现实内容只做了9帧+空白，刚好对应数字0-9，也没怎么去研究usokonikki是怎么... ]]></description>
			<content:encoded><![CDATA[<p>Demo:<br />
<object id="whatsinurbrain" height="340" width="550" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param value="sameDomain" name="allowScriptAccess"/><param value="http://nwhy.org/nwhy/game/whatsinurbrain.swf" name="movie"/><param value="high" name="quality"/><embed height="340" width="550" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="sameDomain" name="textFly" bgcolor="#ffffff" quality="high" src="http://nwhy.org/nwhy/game/whatsinurbrain.swf"/><br />
</object><br />
想法来自http://usokonikki.com/，觉得挺好玩，加上正好想学一下JPGEncoder，就试着做了一下，呵呵，挺有趣的。<br />
不过现实内容只做了9帧+空白，刚好对应数字0-9，也没怎么去研究usokonikki是怎么做的…哈。<br />
无聊的人也试一下吧，看脑袋里装的是些什么～<br />
<span id="more-3867"></span><br />
Codes:<br />
[js]<br />
import utils.MD5;<br />
import utils.StringUtil;<br />
import com.adobe.images.JPGEncoder;</p>
<p>btnInit.addEventListener (MouseEvent.CLICK,showBrain);<br />
btnDownload.addEventListener (MouseEvent.CLICK,downloadIt);</p>
<p>function showBrain (_evt:MouseEvent) {<br />
	init ();<br />
}<br />
function init () {<br />
	mcBrain.txtName.text=txtInput.text+"  的脑内";<br />
	//用户存放名字转换成数字后的字符串<br />
	var aryS:Array=new Array();<br />
	//先去掉左右空格<br />
	var _str:String=StringUtil.trim(txtInput.text);<br />
	//MD5转换<br />
	_str=MD5.hash(_str);<br />
	//获取字符串中的所有数字<br />
	_str=StringUtil.str2num(_str);<br />
	//取前4位数字<br />
	_str=_str.substr(0,4);<br />
	//复制到需要的长度，这里设置了60<br />
	while (_str.length < 60) {<br />
		_str+=_str;<br />
	}<br />
	//因为不知道怎么对字符串排序，所以塞进数组<br />
	for (var i:uint=0; i < _str.length; i++) {<br />
		aryS.push (_str.charAt(i));<br />
	}<br />
	//使用数组的sort来排序，倒序排列<br />
	aryS.sort (Array.DESCENDING);<br />
	//trace(aryS);<br />
	//让放字的mc跑到指定帧显示<br />
	for (var j:uint=0; j < 60; j++) {<br />
		MovieClip(mcBrain.mcTexts.getChildAt(j)).gotoAndStop (aryS[j]);<br />
	}<br />
}<br />
function downloadIt (_evt:MouseEvent) {<br />
	//Call the function and pass in the movieclip that you want to encode,<br />
	//the quality, and the file name<br />
	//As3CoreLib里的函数，从mc制作jpg<br />
	createJPG (mcBrain, 90, txtInput.text);<br />
}<br />
function createJPG (m:MovieClip, q:Number, fileName:String) {<br />
	var jpgSource:BitmapData = new BitmapData (m.width, m.height);<br />
	jpgSource.draw (m);<br />
	var jpgEncoder:JPGEncoder = new JPGEncoder(q);<br />
	var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);</p>
<p>	var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");</p>
<p>	//Make sure to use the correct path to jpg_encoder_download.php<br />
	var baseURL:String="http://nwhy.org/nwhy/";//因为这个flash要放别处引用，所以写绝对路径<br />
	var jpgURLRequest:URLRequest = new URLRequest (baseURL+"jpg_encoder_download.php?name=" + fileName + ".jpg");<br />
	//给php文件发送数据<br />
	jpgURLRequest.requestHeaders.push (header);<br />
	jpgURLRequest.method = URLRequestMethod.POST;<br />
	jpgURLRequest.data = jpgStream;</p>
<p>	var jpgURLLoader:URLLoader = new URLLoader();<br />
	navigateToURL (jpgURLRequest, "_blank");<br />
}<br />
[/js]<br />
function str2num in utils.StringUtil.as:<br />
[js]<br />
//获取全部数字<br />
public static function str2num (char:String):String {<br />
	var pattern:RegExp=/^[-\+]?\d+$/;<br />
	var strTemp:String="";<br />
	for (var i:uint=0; i<char.length; i++) {<br />
		var rs:Object=pattern.exec(char.charAt(i));<br />
		if (rs==null) {<br />
		} else {<br />
			strTemp+=char.charAt(i);<br />
		}<br />
	}<br />
	return strTemp;<br />
}<br />
[/js]</p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2010/05/13 -- <a  href="http://nwhy.org/as3-lightout.html" title="AS3-LightOut">AS3-LightOut</a> (8)</li><li>2010/04/14 -- <a  href="http://nwhy.org/as3-sokoban.html" title="AS3-Sokoban推箱子">AS3-Sokoban推箱子</a> (11)</li><li>2010/03/02 -- <a  href="http://nwhy.org/as3-tile-role-move.html" title="AS3-类似于机战的角色移动(基于Tile)">AS3-类似于机战的角色移动(基于Tile)</a> (4)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/04/29 -- <a  href="http://nwhy.org/bitmapdata-copypixels.html" title="AS3-图像复制BitmapData.copyPixels()">AS3-图像复制BitmapData.copyPixels()</a> (3)</li><li>2009/04/23 -- <a  href="http://nwhy.org/game-quake-live.html" title="GAME-Quake Live">GAME-Quake Live</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/what-s-in-your-brain.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>AS3-MC的移动控制</title>
		<link>http://nwhy.org/as3-mc-move.html</link>
		<comments>http://nwhy.org/as3-mc-move.html#comments</comments>
		<pubDate>Tue, 24 Feb 2009 02:10:43 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=3807</guid>
		<description><![CDATA[大部分的游戏，都离不开MC的移动，下边是一个AS3的MC移动Demo： 代码部分： [js] //存储四个方向键是否按下的变量 var leftArrow:Boolean = false; var rightArrow:Boolean = false; var upArrow:Boolean = false; var downArro... ]]></description>
			<content:encoded><![CDATA[<p>大部分的游戏，都离不开MC的移动，下边是一个AS3的MC移动Demo：<br />
<object height="400" width="550" data="http://nwhy.org/nwhy/game/mcMove.swf" type="application/x-shockwave-flash"><param name="src" value="http://nwhy.org/nwhy/game/mcMove.swf"/><param name="quality" value="best"/></object><br />
代码部分：<br />
[js]<br />
//存储四个方向键是否按下的变量<br />
var leftArrow:Boolean = false;<br />
var rightArrow:Boolean = false;<br />
var upArrow:Boolean = false;<br />
var downArrow:Boolean = false;</p>
<p>stage.addEventListener (KeyboardEvent.KEY_DOWN, keyPressedDown);<br />
stage.addEventListener (KeyboardEvent.KEY_UP, keyPressedUp);<br />
stage.addEventListener (Event.ENTER_FRAME, mcMove);<br />
stage.addEventListener (Event.DEACTIVATE, missingStage);//Flash处于非活动状态时调用<br />
//按键时的检测，左上右下分别是37，38，39，40<br />
function keyPressedDown (_evt:KeyboardEvent) {<br />
	if (_evt.keyCode == 37) {<br />
		leftArrow = true;<br />
	} else if (_evt.keyCode == 39) {<br />
		rightArrow = true;<br />
	} else if (_evt.keyCode == 38) {<br />
		upArrow = true;<br />
	} else if (_evt.keyCode == 40) {<br />
		downArrow = true;<br />
	}<br />
}</p>
<p>//松开按键时<br />
function keyPressedUp (_evt:KeyboardEvent) {<br />
	if (_evt.keyCode == 37) {<br />
		leftArrow = false;<br />
	} else if (_evt.keyCode == 39) {<br />
		rightArrow = false;<br />
	} else if (_evt.keyCode == 38) {<br />
		upArrow = false;<br />
	} else if (_evt.keyCode == 40) {<br />
		downArrow = false;<br />
	}<br />
}</p>
<p>//MC的移动部分<br />
function mcMove (_evt:Event) {<br />
        //移动的速度<br />
	var speed:Number = 8;<br />
	if (leftArrow) {<br />
                //MC的位置检测，下边相同<br />
		if (0<=mc.x) {<br />
			mc.x -= speed;<br />
		}<br />
	}<br />
	if (rightArrow) {<br />
		if(mc.x<=stageW-mc.width-20){<br />
		mc.x += speed;<br />
		}<br />
	}<br />
	if (upArrow) {<br />
		if(0<=mc.y){<br />
		mc.y -= speed;<br />
		}<br />
	}<br />
	if (downArrow) {<br />
		if(mc.y<=stageH-mc.height-20){<br />
		mc.y += speed;<br />
		}<br />
	}<br />
}</p>
<p>//Flash处于非激活状态时<br />
function missingStage (_evt:Event) {<br />
	leftArrow = false;<br />
	rightArrow = false;<br />
	upArrow = false;<br />
	downArrow = false;<br />
}<br />
[/js]</p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/09/07 -- <a  href="http://nwhy.org/as3-physics-formula.html" title="Flash-一些常用物理公式和AS3的结合应用">Flash-一些常用物理公式和AS3的结合应用</a> (1)</li><li>2009/08/10 -- <a  href="http://nwhy.org/as3-lianliankan.html" title="AS3-连连看的主要算法">AS3-连连看的主要算法</a> (8)</li><li>2009/07/28 -- <a  href="http://nwhy.org/flash-fuzzy-theory.html" title="Flash &#8211; 说是XXX的模糊理论视觉模型？">Flash &#8211; 说是XXX的模糊理论视觉模型？</a> (2)</li><li>2009/07/27 -- <a  href="http://nwhy.org/flash-setter-getter.html" title="Flash-Setter &#038; Getter">Flash-Setter &#038; Getter</a> (0)</li><li>2009/07/13 -- <a  href="http://nwhy.org/as3-code-optimization.html" title="AS3 Code Optimization一些代码优化的问题">AS3 Code Optimization一些代码优化的问题</a> (0)</li><li>2009/06/25 -- <a  href="http://nwhy.org/flash-megazine3.html" title="Flash-An Pageflip/Flashbook Engine MegaZine 3">Flash-An Pageflip/Flashbook Engine MegaZine 3</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/as3-mc-move.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Flash-Camera Game使用摄像头玩游戏</title>
		<link>http://nwhy.org/flash-camspace.html</link>
		<comments>http://nwhy.org/flash-camspace.html#comments</comments>
		<pubDate>Fri, 13 Feb 2009 16:59:38 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Camera]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Game]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=3757</guid>
		<description><![CDATA[Kiss your keyboard, mouse and joystick goodbye, and start playing games with your webcam! CamSpace is Super Easy &#038; Super Fun Download version 8.0 Now! 官方网站地址：http://www.camspace.com CamSpace是一款使用摄像头来玩的游戏，哈... ]]></description>
			<content:encoded><![CDATA[<p>Kiss your keyboard, mouse and joystick goodbye, and start playing games with your webcam!<br />
CamSpace is Super Easy &#038; Super Fun Download version 8.0 Now!<br />
官方网站地址：<a  href="http://www.camspace.com">http://www.camspace.com</a><br />
CamSpace是一款使用摄像头来玩的游戏，哈，下边是演示视频，看起来非常好玩！<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/v0srY37kkMw&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/v0srY37kkMw&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></p>
<h4  class="related_post_title">Some Related Posts</h4><ul class="related_post"><li>2009/07/20 -- <a  href="http://nwhy.org/game-avoid-bullets-2.html" title="AS3-子弹躲避游戏(下)">AS3-子弹躲避游戏(下)</a> (0)</li><li>2009/07/17 -- <a  href="http://nwhy.org/game-avoid-bullets-1.html" title="AS3-子弹躲避游戏(上)">AS3-子弹躲避游戏(上)</a> (1)</li><li>2009/03/22 -- <a  href="http://nwhy.org/game-namepk-2.html" title="GAME-NamePK 基于MD5的名字PK(下)">GAME-NamePK 基于MD5的名字PK(下)</a> (0)</li><li>2009/03/21 -- <a  href="http://nwhy.org/game-namepk-1.html" title="GAME-NamePK 基于MD5的名字PK(上)">GAME-NamePK 基于MD5的名字PK(上)</a> (4)</li><li>2009/02/24 -- <a  href="http://nwhy.org/as3-mc-move.html" title="AS3-MC的移动控制">AS3-MC的移动控制</a> (3)</li><li>2010/07/29 -- <a  href="http://nwhy.org/the-evolution-of-adobe-flash-from-1996-to-2010.html" title="The Evolution of Adobe Flash: From 1996 to 2010">The Evolution of Adobe Flash: From 1996 to 2010</a> (0)</li><li>2010/05/13 -- <a  href="http://nwhy.org/as3-lightout.html" title="AS3-LightOut">AS3-LightOut</a> (8)</li><li>2010/04/14 -- <a  href="http://nwhy.org/as3-sokoban.html" title="AS3-Sokoban推箱子">AS3-Sokoban推箱子</a> (11)</li><li>2010/03/02 -- <a  href="http://nwhy.org/as3-tile-role-move.html" title="AS3-类似于机战的角色移动(基于Tile)">AS3-类似于机战的角色移动(基于Tile)</a> (4)</li><li>2009/11/30 -- <a  href="http://nwhy.org/iphone-adobe-flash%e5%92%8cmicrosoft-sliverlight.html" title="iPhone-Adobe Flash和Microsoft SliverLight">iPhone-Adobe Flash和Microsoft SliverLight</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/flash-camspace.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
