HTML5游戏引擎(六)-添加与删除显示对象——添加显示对象到显示列表-addChild & 删除显示对象-removeChild

HTML5游戏引擎(六)-添加与删除显示对象——添加显示对象到显示列表-addChild & 删除显示对象-removeChild

添加与删除显示对象

在Egret中建立显示对象和渲染显示对象是两个过程。建立显示对象后,对象会处于内存中,但不会参与渲染过程,只有把显示对象放到显示列表后,显示对象才会参与渲染过程。如果想将某个显示对象从渲染过程中删除,只需要将其移除显示列表即可。

添加显示对象到显示列表

当创建一个显示对象后,就可以将其添加到显示列表中,首先绘制一个Sprite,这个Sprite是一个宽高为100的绿色正方形。

var spr:egret.Sprite = new egret.Sprite();
spr.graphics.beginFill( 0x00ff00 );
spr.graphics.drawRect(0, 0, 100, 100);
spr.graphics.endFill();

上面的代码就是建立显示对象的过程,测试程序,在舞台中看不到任何内容。将 spr 添加到显示列表中,代码如下:

this.addChild( spr );

添加这句代码之后,再次编译运行程序,浏览器中看到效果如图:

在这里插入图片描述

代码中 addChild() 方法将 spr 添加到显示列表中。前面介绍过,显示列表是一个树状结构,这里 spr 的上一级就是 this,也就是文档类。文档类是 stage 舞台的第一个子对象。

下面是关于当前示例的层级示意图:

在这里插入图片描述

删除显示对象

使用 removeChild() 方法可删除显示对象,代码如下:

this.removeChild( spr );

执行删除操作与添加显示对象操作类似,将被删除的显示对象作为参数传递给 removeChild 方法。示例中 spr 就是被删除的显示对象,而 this 则是 spr 的父级。

注意

显示对象独立于显示列表

虽然显示对象在运行时会被高频率的添加到显示列表或从中删除,但显示对象独立于显示列表。简单解释:当创建一个显示对象Sprite时,该对象拥有自己的坐标属性,旋转角度属性等。这些属性都是显示对象独立拥有的。一旦该显示对象被添加到显示列表之中,Egret就会按照显示对象的状态进行显示。

当用户将显示对象从显示列表中移除后,这些状态依然存在。将一个显示对象移除显示列表后,该对象并非在内存中被销毁。只是不让显示对象参与渲染而已。

通过一段代码观察显示对象在容器中的操作与状态改变:

//创建了一个类型为Sprite的显示对象
var spr:egret.Sprite = new egret.Sprite();
spr.graphics.beginFill( 0x00ff00 );
spr.graphics.drawRect(0, 0, 100, 100);
spr.graphics.endFill();
//该对象存在,被添加到显示列表中,在画面中显示
this.addChild( spr );
//该对象存在,但已被移除显示列表,画面上不显示
this.removeChild( spr );
//该对象存在,驻于内存中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在cocos2dx-lua中,可以使用ScrollView只显示可视区域的内容,以提高游戏性能。实现方式如下: 1. 创建一个ScrollView,并设置其大小和位置。 ```lua local scrollView = ccui.ScrollView:create() scrollView:setContentSize(cc.size(500, 500)) scrollView:setPosition(cc.p(0, 0)) ``` 2. 设置ScrollView的滚动方向和滚动条位置。 ```lua scrollView:setDirection(ccui.ScrollViewDir.vertical) scrollView:setScrollBarPositionFromCorner(cc.p(7, 7)) ``` 3. 创建一个容器,用于存储要加载的内容。 ```lua local container = ccui.Layout:create() container:setContentSize(cc.size(500, 1000)) scrollView:addChild(container) ``` 4. 定义一个函数,用于加载每一项内容到容器中。 ```lua local function loadItem(index) local item = ccui.Text:create() item:setString("Item " .. index) item:setPosition(cc.p(250, 1000 - index * 50)) container:addChild(item) end ``` 5. 在ScrollView的回调函数中,根据滚动位置动态加载内容,并移除不在可视区域的内容项。 ```lua local function scrollViewEvent(sender, eventType) if eventType == ccui.ScrollviewEventType.scrolling then local pos = scrollView:getInnerContainer():getPosition() local top = scrollView:getContentSize().height local bottom = top - scrollView:getInnerContainerSize().height for i = container:getChildrenCount(), 1, -1 do local item = container:getChildren()[i] local itemPos = item:convertToWorldSpace(cc.p(0, 0)) if itemPos.y < 0 or itemPos.y > top then item:removeFromParent() end end if pos.y < bottom + 500 then for i = 1, 10 do loadItem(i) end end end end scrollView:addScrollViewEventListener(scrollViewEvent) ``` 这样,在滚动ScrollView时,只会显示可视区域内的内容,不在可视区域内的内容会被自动移除。通过移除不需要显示的内容项,可以避免ScrollView中的内容过多导致游戏卡顿。可以根据实际需求调整每次加载的内容数量和内容项的布局样式,以及移除不需要显示的内容项的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值