------------------------------------------------------------------

这里的舞台是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 笔记的更多相关文章

  1. 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西

    我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...

  2. 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系

    我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...

  3. 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF

    我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...

  4. 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

    批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...

  5. 【Stage3D学习笔记续】山寨Starling(六):动画实现和测试

    我发布了一个版本v0.2,该版本是未优化版本,且没有添加Touch事件体系,但是由于是最基础且未优化的,所以可以通过参考代码快速的了解实现原理. 接下来的一段笔记开始进行渲染优化,我会把所有的目光都集 ...

  6. 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序

    本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...

  7. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

  8. 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽

    还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...

  9. 【Stage3D学习笔记续】山寨Starling(一):从事件说起

    我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中 ...

随机推荐

  1. asp调用.net xml web services

    来源:http://www.cnblogs.com/notus/archive/2006/08/10/473000.html#2662503 (是不是实际上可以用这个办法调用任何xml web ser ...

  2. [Irving] SQL 2005/SQL 2008 备份数据库并自动删除N天前备份的脚本

    以下为SQL脚本,本人以执行计划来调用,所以改成了执行命令,大家可根据自己需要改为存储过程使用 )='E:\MsBackUp\SqlAutoBackup\' --备份路径; --备份类型为全备,1为差 ...

  3. NGUI-快捷键

    ALT+SHIFT+S :添加一个新的sprite ALT+SHIFT+L :添加一个新的Label ALT+SHIFT+T:添加一个简单的Texture ALT+SHIFT+W 添加一个可见的wid ...

  4. [学习笔记] Web设计过程中该做和不该做的

    原文网址: http://www.javascriptstyle.com/the-dos-and-donts-of-web-design -该做的: QR代码QR代码即快速响应代码,这是矩阵条形码的一 ...

  5. 在阿里云linux下使用SVN访问VisualSVN出错:SSL handshake failed: SSL error: Key usage violation in certificate has been detected

    Subversion clients receive the following error message when attempting to connect to VisualSVN Serve ...

  6. scanf,sscanf利用format跳过干扰的空格

    scanf,sscanf利用format跳过干扰的空格 用了一点时间做读取配置部分的代码,希望一次记录上读取N个数据, 希望读取的格式就是一个IP地址加上端口号,希望把IP地址读取到4个短整数里面,端 ...

  7. NodeJs 开源

    iwebpp.io - 运行P2P Node.js web 服务,穿透防火墙,NAT https://github.com/InstantWebP2P/iwebpp.io pm 是一个轻量级的Node ...

  8. Oracle中纵横表的转化

    横表就是普通的建表方式,如一个表结构为:主键.字段1.字段2.字段3......如果变成纵表后, 则表结构为:主键.字段代码.字段值.而字段代码则为字段1.字段2.字段3. 纵表对从数据库到内存的映射 ...

  9. Spring AOP Example – Advice

    Spring AOP + AspectJ Using AspectJ is more flexible and powerful. Spring AOP (Aspect-oriented progra ...

  10. C++中#include包含头文件带 .h 和不带 .h 的区别

    C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些 ...