【AS3 Coder】任务五:Flash 2D游戏的第二春(上)
在上一节中,我们基本上已经讲完了游戏中最主要的逻辑部分,不过为了更加全面地运用Starling中的一些特性,在本节中我们将一起来看看如何实现多面板切换以及粒子效果,这两个玩意儿可是比较频繁会出现于Starling游戏中的哦~
本章源码下载:www.iamsevent.com/zb_users/UPLOAD/AS3Coder5/AS3Coder5_src3.rar
游戏暂停面板
玩游戏的过程中难免要暂停一下游戏,不然老子玩个游戏却被尿憋憋死,你说老子的老娘是不是白养我那么多年了?!而创建这样一个面板非常容易,因为我们把一些基础的设置都封装在了其父类PanelBase中了:
/**
* 看名字就晓得是干嘛的了
* @author S_eVent
*
*/
public class GamePausePanel extends PanelBase
{
private var _theText:TextField; public function GamePausePanel()
{
super(); backgroundWidth = backgroundHeight = 300;
backgroundAlpha = 0.5;
layout();
} private function layout():void
{
_theText = new TextField(200, 150, "游戏暂停中……", "Verdana", 30, 0xFFFF00, true);
_theText.x = (width - _theText.width) >> 1;
_theText.y = 150;
addChild(_theText);
} }
之后,我们只需要在Game类中创建它,并在适当的时候弹出它并播放其内部的动画即可(虽然该面板内部暂时没有什么动画可播放):
/**
* 游戏主类
* @author S_eVent
*
*/
public class Game extends Sprite
{
……
private var _pausePanel:GamePausePanel;
private var _isPause:Boolean = false; …… protected function onAdded( e:Event ):void
{
…… _pausePanel = new GamePausePanel(); this.addEventListener(EnterFrameEvent.ENTER_FRAME, onEF);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
} /** 暂停/继续游戏 */
private function pauseAndResume():void
{
_isPause = !_isPause;
if( _isPause )
{
addChild( _pausePanel );
_pausePanel.x = (stage.stageWidth - _pausePanel.width) >> 1;
_pausePanel.y = (stage.stageHeight - _pausePanel.height) >> 1;
_pausePanel.start();
_world.stop();
}
else
{
removeChild( _pausePanel );
_pausePanel.stop();
_world.start();
}
} private function onKeyDown( e:KeyboardEvent ):void
{
var direction:String;
//方向键控制人物行走,P键控制游戏暂停
switch(e.keyCode)
{
……
case 80:
pauseAndResume();
break;
} if( direction )
_world.startMoving( direction );
} …… private function onEF( e:EnterFrameEvent ):void
{
if( _world.paused )
{
_pausePanel.advanceTime( e.passedTime );
}
else
{
_world.advanceTime( e.passedTime );
}
}
}
这样就可以在按下键盘上的P键(其keyCode为80)时会弹出暂停面板,且同时停掉游戏主界面中的动画播放。运行结果应该如下图所示:
这个暂停面板有点单调不是吗?那么接下来就让我们试玩一下Starling中的粒子效果吧。
你就像那一把火!
在《Starling介绍》中讲到过粒子效果需要借助第三方编写的Starling粒子插件来实现,该插件的下载地址如下:https://github.com/PrimaryFeather/Starling-Extension-Particle-System。下载完毕后你可以得到一个zip压缩包,找到其中的src目录,打开它,将其中的starling文件夹拷贝到咱们的项目目录中,这样我们就可以使用粒子插件的源码了。
参考过其给出的demo例子之后,我们了解了其使用的方式,即使用粒子纹理图片(.jpg,.png等格式)和粒子描述文件(.pex)文件来创建一个ParticleDesignerPS对象,之后将其添加到juggler对象中就可以播放了。不过,《Starling介绍》中介绍的用来制作粒子素材的工具ParticleDesigner只有在MAC系统上才能安装使用,我们国内的电脑大多数是用的Windows系统,啊呀,俺娘哎,你说这可咋办捏?不用着急,不用着急,休息,休息一会儿……
打开http://onebyonedesign.com/flash/particleeditor/,你看见了什么?哦,是的,我的孩子,这是一个在线的Starling粒子编辑器,来自onebyoneblog。使用它可以实现在Windows操作系统下的粒子素材制作。我简单地调了几个参数后,点击Export Particle按钮,在“保存到”界面将保存的文件名命名为fire后确定。发现在我选择的保存位置多了一个fire文件,若是没有指定文件类型,就给该文件加上.rar的文件后缀名,因为该文件本身是一个压缩包文件。将其加上.rar文件后缀名之后打开之,会发现其中包含了两个文件,一个是粒子纹理图片文件,一个是纹理描述文件。将它们拷贝到项目目录下面并分别命名为fire.png和fire.pex后我们需要将它们嵌入到AssetManager中,并为快速获取一个粒子效果创建一个共有方法:
public class AssetswManager
{
…… //-----------------------------------------粒子素材-----------------------------------------------------// [Embed(source="/assets/particals/fire.png")]
public var FireTexture:Class;
[Embed(source="/assets/particals/fire.pex", mimeType="application/octet-stream")]
public var FireData:Class; ……
private var _particalFactory:Object = {};//粒子缓存,其中每一项的格式为:name:{texture:, config:} …… /**
* 获取一个粒子效果
* @param particalName 欲获取的粒子效果名
*
*/
public function getPartical(particalName:String):ParticleDesignerPS
{
var result:ParticleDesignerPS;
var config:XML;
var texture:Texture;
if( _particalFactory[particalName] )
{
config = _particalFactory[particalName].config;
texture = _particalFactory[particalName].texture;
}
else
{
config = XML( getEmbedResource(particalName + "Data") );
var bmp:Bitmap = getEmbedResource(particalName + "Texture") as Bitmap;
if( bmp )texture = Texture.fromBitmap(bmp);
if( config && texture )
{
_particalFactory[particalName] = {config:config, texture:texture};
}
} if( config && texture )
result = new ParticleDesignerPS(config, texture); return result;
}
}
之后,我们就可以利用getPartical方法来很快地获取一个粒子效果。太棒了,赶快来试试看吧baby。打开GamePausePanel类,为其加上一个火焰效果:
public class GamePausePanel extends PanelBase
{
……
private var _theFire:ParticleDesignerPS; …… override public function start():void
{
super.start();
_theFire.start();
} override public function stop():void
{
super.stop();
_theFire.stop();
} private function layout():void
{
…… _theFire = AssetswManager.instance.getPartical("Fire");
_theFire.emitterX = width >> 1;
_theFire.emitterY = 150; addChild(_theFire);
juggler.add(_theFire);
} }
只需要使用AssetswManager.instance.getPartical方法来获取一个粒子效果,然后将其粒子发生位置(对于火焰效果来说该位置为火焰底部位置)设置在文本框上面一点点就可以了,再次提醒一下,ParticleDesignerPS对象是一个实现了IAnimatable的对象,你必须将其添加到juggler对象中才能进行播放哦~
好了。大功告成,接下来直接运行一下程序吧,可以看到我们这个粒子的最终成品(点击图片试玩):
另外,你可以从我空间的友情链接中找到“simppa大神的粒子空间”,这是一个老外的博客,里面有很多构建于Stage3D基础上的粒子效果,相当地华丽。但是我想他应该不是使用Starling框架做的。
总结
又到了总结的时刻了,我不太喜欢做总结也不怎么爱在公共场合发言,不过轮到我讲的话就随便扯两句好了。经过咱们刚才的探索和实践,发现Starling框架还是比较好用的一个东东,只需要注意几个习惯性的问题即可,我总结了几个,有不足的可以补充:
1.注意纹理的尺寸限制问题
2.动画对象得放入juggler里面去,尽量用时间,而不是帧来控制人物移动等运动逻辑
3.MovieClip不是容器,制作多状态动画时需要注意
4.时刻注意导入的包路径是否正确,不要用到flash.display包里面的东西去……
本例中比较重要的四个类是:BackgroundImage、MutiStateMovieClip、PanelBase及AssetswManager。注意它们的写法会为你以后的开发带来一定的启示。
GPU加速带来的好处是降低CPU压力,提高呈现性能,但与传统的CPU渲染相比,依然存在诸多不足之处,还有待改进:
1.GPU中基本上都是基于图片来渲染的,都不能动态地绘制图像,Graphics类不能用,TextInput不能用……
2.没有滤镜支持。我开始向往传统Flash中的高亮、模糊这些滤镜了,555……要在GPU环境中使用滤镜,只能用替换图片的方式来做到了,这对于我们程序员来说实在是不便啊。虽说使用PixelBender3D可以创建一些GPU中可用的滤镜及混合模式,但是目前这一块研究的人极少,Starling的作者在其开发者社区中承诺在未来版本的Starling中会加入几个常用的滤镜,但是他也承认难度较大。额~这个不晓得要等到什么时候去了,还是用PS来换换图片得了……
3.尺寸约束。由于尺寸的约束,我们在一些大型场景中就很难用上一些超大尺寸的swf动画文件作为背景了,这不仅让程序员犯难,也让美术人员犯难
4.无法在Flex中使用Starling框架
5.Stage3D显示列表和原生Flash显示列表共存会造成性能下降,但是有时候我们不得不使用原生Flash显示列表……
还有一些我就不想举例了,总之,不论Flash还是Starling框架在GPU这块的发展才刚刚开始,以后还有相当长的路要走,作为小小的一个开发人员,我们当然希望它们发展得越来越好喽。不过当下,由于这块的发展还未成熟,使用Starling框架也就只能做做较简单的游戏啦,而且很多公司也不太愿意冒险步入这块领域,想试手的童鞋可能还需要耐心等待机会喽~
又到了告别的时候了,列位道友,要想念贫道哦~
【AS3 Coder】任务五:Flash 2D游戏的第二春(上)的更多相关文章
- 【AS3 Coder】任务五:Flash 2D游戏的第二春(中)
在上一节中,我们介绍了如何构建我们小小的90度角RPG游戏的背景,在这一节中我将为列位带来重头戏部分,隆重介绍我们的主角及NPC登场,噔噔噔噔……掌声在哪里?! 额,没听到掌声,罢了,直接开场吧. 本 ...
- 【AS3 Coder】任务五:Flash 2D游戏的第二春(下)
在上一节中,我们基本上已经讲完了游戏中最主要的逻辑部分,不过为了更加全面地运用Starling中的一些特性,在本节中我们将一起来看看如何实现多面板切换以及粒子效果,这两个玩意儿可是比较频繁会出现于St ...
- 【AS3 Coder】任务九:游戏新手引导的制作原理(上)
使用框架:AS3任务描述:了解游戏中新手的制作原理及流程 难度:3 本章源码下载:http://www.iamsevent.com/zb_users/UPLOAD/GuideManager/Test1 ...
- 【AS3 Coder】任务九:游戏新手引导的制作原理(下)
在上一篇教程中,我们了解了一套我自创的新手引导管理框架的使用原理,那么在本篇教程中,我们将考虑新手引导制作中可能遇到的一些棘手问题及探讨其解决方案.Are you ready my baby? Let ...
- 【AS3 Coder】任务四:噪音的魅力(上)
使用框架:AS3任务描述:使用AS3中BitmapData的noise方法以及perlinNoise方法构建自然景观效果以及其他一些比较cool的效果难度系数:2 本文章源码下载:www.iamsev ...
- unity3d 2d游戏制作的模式
经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了.这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师, ...
- 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结
前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...
- 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
转自:http://www.iamsevent.com/post/36.html AS3 Coder]任务七:初涉PureMVC——天气预报功能实现 使用框架:AS3任务描述:了解PureMVC框架使 ...
- 2D游戏平滑的迷雾战争效果
近期刚好有做2D游戏的点光源效果,然后就扩展一下.研究了一下战争迷雾的效果.主要是想实现相似魔兽争霸那种人物走动,然后黑色的战争迷雾随着人物的移动渐渐打开的效果.使用具有渐变透明图片作为光源来使得战争 ...
随机推荐
- Spark on Yarn——spark1.5.1集群配置
写在前面: spark只是一种计算框架,如果要搭建集群要依托与一定的组织模式. 目前来说,Spark集群的组织形式有三种: 1. Standalone:使用akka作为网络IO组件,mast ...
- aFlex脚本入门
aFlex脚本入门 来源:http://blog.51cto.com/virtualadc/599194 来源:http://blog.51cto.com/virtualadc/624219 对于A1 ...
- [bzoj2038] [2009国家集训队]小Z的袜子
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...
- [CF954G]Castle Defense
题目大意:有$n$个点,每个点最开始有$a_i$个弓箭手,在第$i$个位置的弓箭手可以给$[i-r,i+r]$区间加上$1$的防御,你还有$k$个弓箭手,要求你最大化最小防御值 题解:二分答案,从右向 ...
- vue1和vue2获取dom元素的方法
vue1.*版本中 在标签中加上el='dom',然后在代码中this.$els.dom这样就拿到了页面元素 例如:<div class='box' v-el: myBox>你好</ ...
- CF10D LCIS (动态规划)
题目链接 Solution 动态规划. 令 \(f_{i,j}\) 表示 \(a\) 数组前 \(i\) 个和 \(b\) 数组前 \(j\) 所得的最长的 LCIS . 转移很好想: \(a_i!= ...
- Installing Wine 1.5: configure: error: Cannot build a 32-bit program, you need to install 32-bit development libraries(转载)
Installing Wine 1.5: configure: error: Cannot build a 32-bit program, you need to install 32-bit dev ...
- bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环
Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...
- [hdu1695] GCD ——欧拉函数+容斥原理
题目 给定两个区间[1, b], [1, d],统计数对的个数(x, y)满足: \(x \in [1, b]\), \(y \in [1, d]\) ; \(gcd(x, y) = k\) HDU1 ...
- VIM使用技巧1
.命令是vim中很重要的一个命令,用法如下: 加入有一个文件vimtest.txt,内容如下: 1 Line one 2 Line two ...