starling 笔记
------------------------------------------------------------------
这里的舞台是flash原生舞台,不是starling舞台
// register other event handlers
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKey, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_UP, onKey, false, 0, true);
stage.addEventListener(Event.RESIZE, onResize, false, 0, true);
stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeave, false, 0, true);
starling onEnterFrame
1.通过方法调度事件..传入的参数是两帧之间的时间
调用了mTouchProcessor的advanceTime
调用了mStage的advanceTime
调用了mJuggler的advanceTime
2.render 按照viewport缩放舞台自适应..等.
display object 的EnterFrame事件
1.当向displayobject增加事件的时候,如果是enterFrame事件,则会向starling舞台把该display添加到..mEnterFrameListeners数组中
//enterFrame只能被添加一次
if (type == Event.ENTER_FRAME && !hasEventListener(type))
{
addEventListener(Event.ADDED_TO_STAGE, addEnterFrameListenerToStage); =====> Starling.current.stage.addEnterFrameListener(this);
addEventListener(Event.REMOVED_FROM_STAGE, removeEnterFrameListenerFromStage);
if (this.stage) addEnterFrameListenerToStage(); //如果已经添加到了舞台上,则不会触发ADDED_TO_STAGE事件,这里则手动添加
}
2.starling舞台,会在每帧的时候.调用advanceTime方法.循环所有listeners..广播事件
-------------------------------------------------------
<h2>contentScaleFactor</h2>
Starling.current 实例化的Starling
mViewPort.width
mViewPort
mPreviousViewPort 早先的viewport
mClippedViewPort 原生的舞台viewport 和 mViewPort的 交集区域
mSupportHighResolutions 支持搞分辨率
mNativeStageContentScaleFactor,原生舞台缩放因子.
----------------------------------------------------------------------------
缩放比例
(mViewPort.width * mNativeStageContentScaleFactor) / mStage.stageWidth;
updateViewPort中...如果支持高资源而且原生的stage有contentsScaleFactor则..设置原生缩放银子
<pre>
if (mSupportHighResolutions && "contentsScaleFactor" in mNativeStage)
mNativeStageContentScaleFactor = mNativeStage["contentsScaleFactor"]; //要设置 支持高分辨率 和 原生舞台的contentsScaleFactor
else
mNativeStageContentScaleFactor = 1.0;
</pre>
------------------------------------------------------------------------
//一个空纹理..然后向里面上传数据
public static function empty(width:Number, height:Number, premultipliedAlpha:Boolean=true,
mipMapping:Boolean=true, optimizeForRenderToTexture:Boolean=false,
scale:Number=-1, format:String="bgra"):Texture
{
if (scale <= 0) scale = Starling.contentScaleFactor; //如没有在Starling中进行特殊设置..默认为1
var actualWidth:int, actualHeight:int;
var nativeTexture:flash.display3D.textures.TextureBase;
var context:Context3D = Starling.context;
if (context == null) throw new MissingContextError();
var origWidth:int = width * scale; //原始宽度
var origHeight:int = height * scale; //原始高度
var potWidth:int = getNextPowerOfTwo(origWidth); //获取该宽度最接近的偶数幂
var potHeight:int = getNextPowerOfTwo(origHeight); //获取该高度最接近的偶数幂
var isPot:Boolean = (origWidth == potWidth && origHeight == potHeight); //是否扩充
var useRectTexture:Boolean = !isPot && !mipMapping && //是否使用了矩形原理,如果扩充了..而且不使用mip..而且...剩下两个不知道 ...
Starling.current.profile != "baselineConstrained" &&
"createRectangleTexture" in context && format.indexOf("compressed") == -1;
if (useRectTexture)
{
actualWidth = origWidth;
actualHeight = origHeight;
// Rectangle Textures are supported beginning with AIR 3.8. By calling the new
// methods only through those lookups, we stay compatible with older SDKs.
nativeTexture = context["createRectangleTexture"](
actualWidth, actualHeight, format, optimizeForRenderToTexture);
}
else //基本上都是这个
{
actualWidth = potWidth;
actualHeight = potHeight;
nativeTexture = context.createTexture(actualWidth, actualHeight, format,
optimizeForRenderToTexture);
}
var concreteTexture:ConcreteTexture = new ConcreteTexture(nativeTexture, format, //通过原生纹理.创建了concreteTexture
actualWidth, actualHeight, mipMapping, premultipliedAlpha,
optimizeForRenderToTexture, scale);
concreteTexture.onRestore = concreteTexture.clear;
if (isPot || useRectTexture) //没有扩充或者使用了矩形纹理
return concreteTexture;
else
return new SubTexture(concreteTexture, new Rectangle(0, 0, width, height), true);
}
trace(!isPot,!mipMapping,Starling.current.profile != "baselineConstrained",
"createRectangleTexture" in context,format.indexOf("compressed") == -1);
false true false false true //经过 处理过的图片
true false false false true //未经过处理过的图片
//纹理的流程
/**
* 1.都是通过empty方法.建立一个空的纹理然后在bitmapData方法中.上传bitmap数据
* 2.在empty方法中会 将bitmap的width和height..扩充到2的幂数倍上
* 3.在empty方法中会 用实例化ConcreteTexture封装了Stage3D纹理对象的ConcreteTexture,用于存储纹理属性。
* 4.如果没有扩充幂数倍.或者使用了矩形纹理,则返回的是ConcreteTexture对象.
* 5.因为扩充后的大小和原始大小不一样..所以需要使用SubTexture对象.通过原始大小的rect操作纹理坐标截取原始大小的纹理..返回正常的纹理
*/
/**
* 纹理缩放主要来自两个地方..纹理是针对当前舞台的...所以要把纹理缩放到当前舞台需要的大小..即素材制作为原始素材的2倍,读取纹理的时候缩放成舞台需要的纹理大小即
* 除以2.然后starling会根据viewport将舞台进行缩放..达到高清的效果
*
* 1. Starling.contentScaleFactor
* 2.从外部传入的scale参数.....
*/
trace(texture.width,texture.nativeWidth,texture.scale);
trace(texture.height,texture.nativeHeight,texture.scale);
------------------------------------------------------------------------------------
关于starling内置的缩放模式
starling的viewport获取算法:
RectangleUtil的fit方法:
var stageWidth:int = 320;
var stageHeight:int = 480;
//获取根据showall等缩放模式返回的viewport大小..会改变x,y的值,以及缩放其中的一边...达到最合适的舞台大小
var viewPort:Rectangle = RectangleUtil.fit(
new Rectangle(0, 0, stageWidth, stageHeight),
new Rectangle(0, 0, stage.fullScreenWidth, stage.fullScreenHeight),
ScaleMode.SHOW_ALL, iOS);
mStarling = new Starling(Game, stage, viewPort);
mStarling.stage.stageWidth = stageWidth; // <- same size on all devices!
mStarling.stage.stageHeight = stageHeight; // <- same size on all devices!
在舞台的呈现的时候...会向viewport对舞台进行整体缩放.
所以只要根据stagewidth和stageheight..制作素材即可.
舞台(starling的stage)的大小决定了在该视口中显示的坐标系统的大小。(举个栗子:我用小米,屏幕分辨率是854*480.我设定statling的stage为400*400,那么手机屏幕上显示出来的其实是400*400像素的图像,只不过放大拉伸了,同理我设定starling的stage为1000*1000,虽然小米屏幕只有854*480像素,但它显示的是1000*1000的图像,图像被缩小了。)
------------------------------
关于dispaly的width和height
宽和高的获取..并不是直接返回属性width和height..而是,通过getBounds方法返回一个rect的width和height属性.
getBounds(mParent, sHelperRect) helerect为一个空的rect
quad
会根据其内部的mVertexData.的右下角点.设置sHelperPoint
mVertexData.getPosition(3, sHelperPoint);
最后根据缩放和pivotX和pivotY.返回一个新的矩形.
containers
首先矩阵进行计算,然后每一个子元件的每个顶点都和该矩阵相乘...他获取的是当前容器内部元素的宽和高...所以直接设置宽和高无效..
this._container = new Sprite();
this.addChild(this._container);
this._container.y = headBg.height;
this._container.width= 640;
trace(this._container.width);//该处是0
避免重复调用width和height
获取宽度和高度属性是一个昂贵的性能开销,特别是对于Sprite容器(首先矩阵进行计算,然后每一个子元件的每个顶点都和该矩阵相乘)。
出于这个原因,请避免重复访问它们,比如在一个循环里面。在某些情况下,使用一个恒定的值来代替它们更有意义。
--------------------------------
TextureSmoothing
image 默认 BILINEAR 双线性过滤。创建像素间的平滑过渡。
QuadBatch xxx
RenderTexture 若persistent===true 则其TmHelperImage的smooting为extureSmoothing.NONE
----------------------------------
纹理集
mTextureRegions
mTextureRegions 是个Dictionary 保存该纹理的region,索引是name,
mTextureFrames 是个Dictionary 保存该纹理的frame,索引是name 纹理框..是什么?
xml中每个子纹理.定义了以下属性
name
x,y,widht,height ---------------------------region
frameX,frameY,frameWidth,frameHeight---------frame
上面三个参数..通过addRegion方法..
mTextureRegions[name] = region;
mTextureFrames[name] = frame;
-------------------------------------------
assetManager
enqueue :
将一个或一组素材加入到队列中;只有在成功调用了"loadQueue"方法后这些资源才可用。
这个方法可以接受下面这些类型:
1.使用字符串定义的URL,链接到一个本地或远程网络上的资源。支持类型: png, jpg, atf, mp3, fnt, xml (纹理图集).
2.File类的实例 (只有AIR应用适用) 指定的一个目录或一个文件.如果是目录,则会自动扫描该目录下所有支持的文件类型。
3.包含静态成员结合Embed方式内嵌素材的类.
getName方法中:
对象的名称会自动提取:比如一个文件名称是"image.png",那么会自动将素材命名为"image"。
如果是通过类的嵌入素材方式,那么变量名称就会使用嵌入时那个名称。
一个例外是纹理图集:他们将具备相同的名称(实际引用的那个纹理名称)。
enqueueWithName: 将资源推入到mRawAssets数组中..并返回资源名称
---------
loadQueue
addSound(name, asset as Sound); 将加载的声音..保存在mSounds里
addTexture(name,texture) 将纹理存储在mTextures
addObject() 将json加载到mObject中
addByteArray(name, bytes); 将bytes 保存到mByteArrays
addXml(name:String, xml:XML) 如果是普通的xml保存到mXmls
addTextureAtlas rootNode == "TextureAtlas"的xml会被处理然后把纹理集保存到mAtlases...注意如果mTextures有同名纹理.则会从mTextures中删除
rootNode == "font" 会被TextField.registerBitmapFont注册.
getTexture 如果mTextures中有纹理..则会返回..没有的话,则查找纹理集.否则返回null
-------------------------------------------------------------------
juggler 当你创建了一个自定义juggler,那么你必须在每一帧上调用“advanceTime”方法.即在Main类的enterFrame方法中执行这个juggler的advancerTime方法
Starling在初始化的时候会默认生成一个juggler事例。并在每一帧的时候调用该实例的advanceTime函数
add 向mObjects中添加实现了IAnimatable接口的对象..即该对象要有advanceTime方法..例如movieClip .并添加了.Event.REMOVE_FROM_JUGGLER事件
advanceTime 会在每帧的时候循环调用mObjects中的object的advaneTime方法... 即每帧..
remove 可以直接使用该方法从juggler中移除..或者触发Event.REMOVE_FROM_JUGGLER事件
removeTweens...一般补间动画完成后,会自动删除!!如果手动移除用这个,触发Event.REMOVE_FROM_JUGGLER事件,会播放nextTween
purge() 移除所有对象
delayCall 延迟调用函数 实例化了一个DelayedCall,并添加到juggler中.
tween
在指定的时间内,用一个补间动画(tween)去"运动"一个对象。在内部,这个方法使用一个tween的实例(从缓存池中获取的),然后添加到juggler里面。 这个方法是一个快捷机制,用来方便的创建一个tween并且使用它。 设置'properties'属性,可以用键值对的方式来定义tween和动画对象。这里是一个示例片段: juggler.tween(object, 2.0, { transition: Transitions.EASE_IN_OUT, delay: 20, // -> tween.delay = 20 x: 50 // -> tween.animate("x", 50) });
Tween
补间一旦完成,他们会从juggler中被自动删除
sTweenPool juggler第一次添加tween后..会始终至少在sTweenPool中保存一个空的tween.
Transitions (过渡)类包含了一些静态方法,来定义缓动相关的函数。这些函数被用在Tween类执行动画的时候。用在tween中.默认为linear
------------------------------------------------------------------
hitest 返回舞台坐标系某个点下方的最顶层的显示对象,如果没有找到任何对象,则返回null。
测试点是否在该displayobject上.如果在则返回该对象,不在则返回null;
舞台触发touch事件---> TouchProcessor的processTouches事件--->使用hittest查找 target...然后触发touch事件
starling 笔记的更多相关文章
- 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西
我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...
- 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...
- 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF
我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...
- 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...
- 【Stage3D学习笔记续】山寨Starling(六):动画实现和测试
我发布了一个版本v0.2,该版本是未优化版本,且没有添加Touch事件体系,但是由于是最基础且未优化的,所以可以通过参考代码快速的了解实现原理. 接下来的一段笔记开始进行渲染优化,我会把所有的目光都集 ...
- 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序
本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...
- 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程
这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...
- 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽
还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...
- 【Stage3D学习笔记续】山寨Starling(一):从事件说起
我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中 ...
随机推荐
- Dropping water balloons
题意: 给你k个水球n层楼(n很大) 现在做实验在楼上向下丢水球,若水球没破可以重新丢,求把所有水球弄破的最小试验次数. 分析: 开始完全没思路啊.从正面求没法做不会表示状态,做实验是只能从第一层,一 ...
- codeforces 678E Another Sith Tournament 概率dp
奉上官方题解 然后直接写的记忆化搜索 #include <cstdio> #include <iostream> #include <ctime> #include ...
- Asp.net TextBox常规输入验证
Asp.net TextBox只能输入数字<asp:textbox id="TextBox1" onkeyup="if(isNaN(value))execComma ...
- ORA-15063: ASM discovered an insufficient number of disks for diskgroup "ASM,KEL"
在启动ASM的时候报错,报错如下: SQL> startup ASM instance started Total System Global Area 130023424 bytes Fixe ...
- ado.net(class0503)
ado.net组成 数据提供程序 connection //连接对象 command executeNonQuery //执行增删改 executeScalar //执行查询返回首行首列 execut ...
- matlab图像基础知识
1.MATLAB支持的几种图像文件格式: ⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像专家组的图像压缩格式. ⑵BMP(Windows Bitmap ...
- Downloading the Google Cloud Storage Client Library
Google Cloud Storage client是一个客户端库,与任何一个生产环境使用的App Engine版本都相互独立.如果你想使用App Engine Development server ...
- centos 安装git 服务端
// 在服务端安装好git后,开始安装gitosis 3.在服务器安装gitosis sudo yum install python python-setuptools cd /usr/local/s ...
- 第三百零二天 how can I 坚持
今天给掌中宝提了几个bug,确实管用,哈哈. 还有就是弟弟买房了,海亮艺术公馆,还好,至少安定下来了,可惜啊,我看好的房子也有的卖了,咋办啊. 看准的东西总是会想法设法的买了,可是无能为力啊. 还有, ...
- 在linux中使用find
最近用到了在linux系统中查找文件这个任务,学习了下面两篇文章,尤其是过滤结果信息的小技巧.记录下来,省得忘了再找. http://www.360doc.com/content/10/1110/10 ...