starling 笔记

时间:2022-09-25 12:03:31

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

这里的舞台是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&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理5

    我们先直接拷贝下blank.html这个页面的代码,顺带先建立一个Home控制器,并添加Index视图.将代码拷贝进去. <!DOCTYPE html> <html lang=&qu ...

  2. 【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接

    在CentOS安装 因Rabbit MQ使用Erlang,所以需要先安装Erlang,安装过程中可能会遇到种种问题,可参考CentOS 6.5安装Erlang/OTP 17.0.然后就可以安装MQ了. ...

  3. makefile多目录的&period;c 格式&period;cpp混合编译

    # # c.cpp混合编译的makefile模板 # # BIN = test.exe CC = gcc CPP = g++ #这里只加入库头文件路径及库路径 INCS = -I"c:/mi ...

  4. 获得select下拉框的值

    html -------------------------------------------------------------------------------------- <sele ...

  5. Flask中mongodb实现flask&lowbar;login保持登录

    最近在学习Flask,使用flask-login时,一直无法完成保持登录的状态,网上的例子都是使用SQLAlchemy,但是我用的是mongodb. 网上的例子使用SQLAlchemy时,定义User ...

  6. DWZ LookUp Suggest 教程

    单个查找带回 jsp 代码 lookup.jsp <%@ page language="java" contentType="text/html; charset= ...

  7. 关于实现判断用户是在PC端和还是移动端访问。

    最近一直在忙我们团队的项目“咖啡之翼”,在这个项目中,我们为移动平台提供了一个优秀的体验.伴随Android平台的红火发展.不仅带动国内智能手机行业,而且许多国内开发者也开始投身于Android移动终 ...

  8. href&equals;&amp&semi;quot&semi;javascript&colon;void&lpar;0&rpar;&semi;&amp&semi;quot&semi;与&num;差异

    将<a>标签设置为空链接有两种方式.第一个是href="#",第二个是href="javascript:void(0);". 两种方式都设置了标签为 ...

  9. ASP&period;Net Core开发&lpar;踩坑&rpar;指南

    ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...

  10. CocosCreator动作系统

    废话没有,直接上代码,有注释可以看的, cc.Class({ extends: cc.Component, properties: { player:{ default:null, type:cc.N ...