基于ActionScript3.0的滑动拼接游戏核心算法的研究

来源 :中国包装工业(下半月) | 被引量 : 0次 | 上传用户:chting0910
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘 要】滑动拼接游戏是一款深受大众喜爱的益智小游戏,文章详细介绍了在Flash平台下,使用ActionScript 3.0角本语言来实现滑动拼接游戏中几个关键问题的核心算法。
  【关键词】ActionScript3.0 滑动拼接游戏 核心算法
  引言
  滑动拼接游戏是一款深受大众喜爱的益智小游戏,早在电脑出现之前就以实体的形式存在。随着计算机技术的发展和人们在生活中对益智小游戏的需求,促进了游戏开发行业的迅猛发展。ActionScript是一种基于Flash、Flex等多种开发环境、面向对象编程的脚本语言。随着ActionScript 3.0(以下简称AS3)的出现,使Flash开发游戏变得更加强大,Flash结合AS3能够迅速而灵活的制作出更加细腻、交互娱乐性强的小游戏。
  1 游戏设计的几个关键问题
  滑动拼接游戏是一个由n个格子组成的长方形盒子,在盒子中将n-1个拼图小块锁在里面,玩家可以单击拼图小块滑入唯一一个没有小块的格子里,接着可以继续滑动新的小块到空的格子,如此反复,直到拼图小块构成一个完整的图形。在游戏的设计中最为关键的几个问题是:(1)如何导入与分割图片;(2)如何随机排列图片小块;(3)如何实现单击图片小块其向空格滑动;(4)如何测试游戏结束。
  2 图片的导入与分割算法研究
  滑动拼接游戏的制作首先要考虑的是如何将位图导入并将导入的图片分割成n个小块,n的个数由二维数组的行数和列数决定,如3行4列就是3×4共12个小块,4行6列就是4×6共24个小块,小块的个数越多,游戏的难度就越大。最后还应去掉最右下角的图片小块,让该位置形成一个空位即产生一个空的格子。
  2.1 位图的导入
  要导入位图,需创建一个Loader对象和一个URLRequest实例,然后使用load命令将它们配对。导入图像函数loadBitmap()代码如下。
  private function loadBitmap(bitmapFile:String):void //导入图像函数
  {//创建URLRequest变量,表示外部图像文件的位置
  var tplj:URLRequest = new URLRequest(bitmapFile);
  var tpzr:Loader=new Loader(); //创建一个图像Loader对象
  tpzr.load(tplj); //使用load()方法告诉Loader对象装入URLRequest所代表的图像文件
  tpzr.contentLoaderInfo.addEventListener(Event.COMPLETE,fengetp);// 当图像导入完成后,fengetp函数被调用
  }
  2.2 图片的分割
  当Loader对象帧听到图像导入完成后,会调用分割图片函数fengetp()来实现图片的分割。函数中创建一个Bitmap对象tp接收导入的位图,分割图片使用二维数组来完成,在行数与列数的双重循环中,将其按分割的块数把相应区域的像素拷贝到一个个小Bitmap对象上,并生成相应的Sprit对象,最后在场景中按对应位置显示拷贝后的小图片Sprit对象,同时将它们存储在一个数组中。需要注意的是要产生一个空的格子,可定义一个blankPoint,它是一个Point对象,代表拼图中的空白区域,初始值为最右下角的图片位置,即blankPoint = new Point(hangshu - 1,lieshu - 1);在循环中,当前小块的位置依次与blankPoint比较,若相同即最右下角小块,则不进行像素拷贝等操作,从而形成空格。分割图片函数fengetp()代码如下:
  private function fengetp(cs:Event)
  {var tp:Bitmap = Bitmap(cs.target.loader.content);
  xiaotpdxsz=new Array();
  for (var i:uint=0; i  {for (var j:uint=0; j  {if (blankPoint.equals(new Point(i,j)))
  {continue; } //形成空格
  var xiaotp:Bitmap = new Bitmap(new BitmapData(onewidth,oneheight)); //创建新的小块
  xiaotp.bitmapData.copyPixels(tp.bitmapData,new Rectangle(j*onewidth,i*oneheight,onewidth,oneheight),new Point(0,0)); //对新建小块复制图像
  var xiaotpjl:Sprite = new Sprite ?; //创建新的Sprite,小块位图数据赋给它
  xiaotpjl.addChild(xiaotp);
  addChild(xiaotpjl); //按对应位置显示拷贝后的小图片Sprit对象
  xiaotpjl.x=j*(onewidth+jianju)+xcz;
  xiaotpjl.y=i*(oneheight+jianju)+ycz;
  var xiaotpdx:Object=new Object();
  //创建小图片Object,包含当前位置、原始位置和小图片Sprit   xiaotpdx.dqwz = new Point(i,j);
  xiaotpdx.ywz = new Point(i,j);
  xiaotpdx.piece = xiaotpjl;
  xiaotpjl.addEventListener(MouseEvent.CLICK,clickyd);//单击小图片调用clickyd函数
  xiaotpdxsz.push(xiaotpdx);//将小图片Object存入数组中}}}
  3 随机排列图片小块算法研究
  当图片小块的位置放好了之后,需要将拼图打乱,但并不能将所有的小块放置在随机的位置上,因为这样做很有可能在游戏时再也不能将它们还原为原来的位置,即游戏无法结束也就是无解。为了防止出现这样的情况,可以采取逆序的方法,从最后完成的拼图开始,随机移动拼图小块200次,直到拼图板看起来已经完全被打乱。为了让移动随机化,将所有可以移动的小块放进一个数组,然后从数组中随机挑选出一个移动,并执行它。随机排列图片小块代码如下:
  private function paileitp()
  {for (var n:uint=0; n<200; n++) //随机移动拼图小块200次
  { var hfydxiaotpdxsz:Array=new Array(); //创建数组对象用来存放所有可以移动的小块
  for (var i:uint=0; i  {if (youxiaoyd(xiaotpdxsz[i]) != "none")
  {hfydxiaotpdxsz.push(xiaotpdxsz[i]); }
  }
  var sjxb:uint = Math.floor(Math.random() * hfydxiaotpdxsz.length);
  // 在可合法移动小块数组中随机挑选出一个移动
  yidongtp(hfydxiaotpdxsz[sjxb],false); //调用移动图片函数进行移动
  }
  }
  通过youxiaoyd()函数来判断小块是否为合法的移动小块。即小块的位置如果在空格的上、下、左、右四个位置时能够合法的移动,否则不能移动。代码如下:
  private function youxiaoyd(cs:Object):String
  {
  if ((cs.dqwz.x==blankPoint.x )&& (cs.dqwz.y==blankPoint.y+1))
  { return "left";}
  if ((cs.dqwz.x==blankPoint.x )&& (cs.dqwz.y==blankPoint.y-1))
  {return "right";}
  if ((cs.dqwz.y==blankPoint.y )&& (cs.dqwz.x==blankPoint.x+1))
  {return "up";}
  if ((cs.dqwz.y==blankPoint.y )&& (cs.dqwz.x==blankPoint.x-1))
  {return "down";}
  return "none";
  }
  4 单击图片小块开始滑动算法研究
  在游戏开始前随机排列图片小块和游戏中玩家单击图片小块时都会对图片小块进行移动,我们可通过移动图片函数yidongtp()的第二个布尔参数yidongxg来进行区分。参数设置为false,为随机排列图片小块时的移动;参数设置为true,为玩家单击图片小块时的移动,这时会添加一个滑动过程的动画。yidongtp()函数代码如下:
  private function yidongtp(cs:Object,yidongxg:Boolean)//将一个小块移动到空白区域
  {switch (youxiaoyd(cs)) //得到空白区域的方向
  { case "up" :
  yidongtpfx(cs,-1,0,yidongxg); break;
  case "down" :
  yidongtpfx(cs,1,0,yidongxg); break;
  case "left" :
  yidongtpfx(cs,0,-1,yidongxg); break;
  case "right" :
  yidongtpfx(cs,0,1,yidongxg); break;
  }
  }
  private function yidongtpfx(cs:Object,dx:int,dy:int,yidongxg:Boolean)
  { //将小块移入空白区域
  cs.dqwz.x += dx;
  cs.dqwz.y += dy;
  blankPoint.x -= dx;
  blankPoint.y -= dy;
  if (yidongxg) //是否需要移动的动画
  {kshuadong(cs,dy*(oneheight+jianju),dx*(onewidth+jianju)); } //添加滑动动画效果
  else
  { cs.piece.x=cs.dqwz.y*(oneheight+jianju)+xcz;
  cs.piece.y=cs.dqwz.x*(onewidth+jianju)+ycz;
  }
  }
  5 判断游戏是否结束算法研究
  判断游戏是否结束,只需比较每个小块的当前位置与初始位置是否相同,如果全部相同,则游戏结束。游戏完成函数youxiwancheng()代码如下:
  private function youxiwancheng()
  {var iscomplete:Boolean
  for (var i:uint=0; i  {if (! xiaotpdxsz[i].dqwz.equals(xiaotpdxsz[i].ywz))
  { iscomplete=false; }
  }
  iscomplete= true;
  if (iscomplete ())//检测拼图游戏是否完成
  {clearhs(); //游戏结束时的清理
  gotoAndStop(“gameover”); //跳转到游戏结束帧
  }
  }
  结语
  至此通过算法已解决了滑动拼接游戏中的几个关键问题,我们还可以在此基础上通过形参来控制二维数组的行数和列数,从而改变游戏的难度;也可以通过AS代码来为游戏添加背景音乐和显示原图提示。
  参考文献
  [1](美)Gary Rosenzweig,胡蓉,张东宁,朱栗华译.ActionScrip3.0游戏编程(第2版)[M].北京:人民邮电出版社,2013.
  [2]孙颖.Flash Action 3殿堂之路[M].北京:电子工业出版社,2007.
  [3](美)Todd Perkins,张猛译.Flash ActionScript3.0实训课堂[M].北京:人民邮电出版社,2008.
其他文献
酒,是文化的载体。随着科技的高速发展,酒的品种越来越多,酒的分类方法也越来越多。酒是逢年过节礼尚往来的馈赠佳品,也是日常生活中一些人们的嗜好之物。如今市面上的酒类包装琳琅满目,人们对产品的包装除了实用价值外,还要求其顺应现代的审美潮流,追求美的情调和心理感受。酒类包装要有潜力激发、诱使、吸引消费者在销售点购物时的注意力,只有当包装设计中的视觉流程编排的恰到好处时,这样的视觉效果才能展现出来。  所
期刊
【摘 要】中国传统文化可谓是博大精深,更是在漫长的发展过程当中形成了更为丰富的视觉形态群,传统的烙痕,往往是设计师风格护照上最显眼的标志之一。因此,如果在现代的产品设计当中恰如其分的运用传统文化因素,如湖南江永女书等,这样一种地域特色、女性特色以及艺术特色均十分出众的传统文化元素,不仅能够充分体现出中华民族独特的精神风貌,更是能够在这个巨变激烈的市场当中迅速树立起独树一帜的中国特色产品形象来,这对
期刊
【摘 要】“立象尽意”是以象形会意为造字基础的汉字艺术设计的突出特点,本文试从新媒体技术对汉字字体设计赋予的全新的创作手段为立足点揭示信息技术对汉字“立象尽意”的具体艺术表现影响。  【关键词】新媒体 信息技术 汉字设计 立象尽意 研究  汉字艺术之美正是借助毛笔所产生的线条之美,借助外矩方圆,内律经序的图式之美淋漓尽致地展现出来的。传统的笔、墨、纸、砚,各类材料的刻板印刷,各种书写方法都与形形色
期刊
【摘 要】在现在种类繁多的设计当中,要学习的很多,但是被我们所忽视的儿童画中给予我们设计的启发是影响深远的。同时也是值得我们探究的。儿童画的纯真、质朴、画面的吸引感,都是值得我们研究的。  【关键词】儿童画 海报设计 质朴  1 海报设计的起源  海报的设计源于美术,然而对于美术的起源至今都没有在学术界得到一个一致的认识,大部分的人以为美术起源于在猿人进化的过程中进行工具的创作、思维的发展。但是有
期刊
【摘 要】随着城市化进程的不断推进,文化资源在城市建设中的作用也日益显著。近年来西安的城市化发展取得了有目共睹的成就。西安市的经济和城市规模的增长都得益于“文化+旅游+城市”的模式。但是,也有一些市民担心这种发展模式其明显的商业特点让未来城市发展存在一定的隐忧。本文以西安为例,着重探讨未来的城市建设中如何合理使用文化资源。  【关键词】城市建设 文化资源 应用  引言  近几年经济全球化以及随之而
期刊
【摘 要】本文主要根据2012年11月1日上午宾虹小学由吴佳燕老师执教的民间木雕这一课来进行评析,根据其教学过程,依据《义务教育美术课程标准》(2011年版)的课程性质、理念,从教学设计、教学理念和教学目标三个方面进行展开阐述并提出自己的想法。  【关键词】欣赏 体验 观看  公开课民间木雕在浙江省金华市宾虹小学开课,教学对象为小学四年级学生,在本课当中,学生不仅可以调动其感官,对实物进行摸、闻、
期刊
【摘 要】文章通过对“两化”融合的定义分析入手,探讨“两化”融合的重要性及紧迫性。选取温州区域优势产业-物流包装行业,在对其企业信息化及工业化程度的调研分析,结合国内外两化融合的推进过程及实施路径进行探讨和分析,提出能够有效针对温州特色的中小企业产业升级相对接的有效路径和可行性模式,供产业研究者参考。  【关键词】传统制造型企业 “两化” 融合 实现路径  中图分类号:F832.0 文献标识号:A
期刊
【摘 要】书籍装帧设计兼具实用性、文化性、审美性,其发展与人类文明与技术的发展同步。对我国书籍装帧的发展历程及新趋势的研究有着十分重要的意义。  【关键词】书籍装帧 设计 形态 历史 演变 新趋势  书籍因其文字信息载体的作用,一直作为各个历史时期中时代精神与文化成果,乃至技术水平的缩影。书籍装帧设计要考虑对书籍的保护和准确的商业定位,要考虑对作者思想在视觉触觉等一系列感官上综合的高度还原,还要考
期刊
【摘 要】文化产业属于第三产业范围,在21世纪属于“黄金产业”,高效和低耗是其产业特点,这是其他产业无法比拟的。江西省历史悠久,具有深厚的文化底蕴,拥有的文化资源独特性极强,拥有绿色和红色文化以及“多彩”的古色文化。对江西文化产业发展进行研究有助于对江西的经济发展发挥显著的推动作用,并能够积极的影响到江西社会的进步。  【关键词】赣文化产业 问题 发展 对策  在当前的经济趋势中,产业呈现下游化状
期刊
【摘 要】对于任何产品的设计,功能应该放在首位,但功能又只是设计师要给人们带来的唯一好处,好的产品设计师应该把功能与造型完美的结合在一起,同时满足人们对产品功能和形式美的需求。所以根据人们对旅途满载而归的箱包需求产生了对扩容拉杆箱的设计,同时根据使用人群,赋予其新的形式美的造型,并力求采用新型环保材料,创造出新时代人们真正需要的箱包产品。  【关键词】产品设计 扩容箱包 人体造型 抽象  1 产品
期刊