本文链接: http://blog.csdn.net/xietansheng/article/details/50187223
http://m.blog.csdn.net/xietansheng/article/details/50187223
LibGDX 基础教程(总目录)

  1. 概述

演员组类(Group)表示的是一组演员,可以包含多个不同层次演员,将多个演员添加到组中作为演员的父节点对多个演员统一管理。Group 类继承自 Actor,本质上也是一样演员,Group 是对于 Actor 的增强封装。实际上 Group 中维护了一个数组用于存放添加到组中的演员,在绘制时根据数组中的顺序依次绘制演员。

Actor 添加到 Group 中后,Actor 的父节点则变为 Group,因此 Actor 的坐标将相对于 Group 的左下角,关系如下图所示:

  1. Group 常用方法

Group 继承自 Actor,因此演员拥有的特性和方法 Group 均拥有。作为管理众多演员的组,还增加了许多操作组中演员的方法:

void addActor(Actor actor): 将演员作为子节点添加到组中。
void addActorAfter(Actor actorAfter, Actor actor): 在已在组中的演员 actorAfter 的索引位置后面添加演员 actor。绘制时 actorAfter 先绘制,actor 后绘制。
void addActorBefore(Actor actorBefore, Actor actor): 在已在组中的演员 actorBefore 的索引位置前面添加演员 actor。绘制时 actor 先绘制,actorBefore 后绘制。
void addActorAt(int index, Actor actor): 在指定索引位置添加一个演员(索引越大先后绘制,即越显示在屏幕前面)。
boolean removeActor(Actor actor): 移除组中的一个演员。
boolean swapActor(Actor first, Actor second): 交换组中两个演员的位置。
boolean swapActor(int first, int second): 根据索引交换组中两个演员的位置。
void clearChildren(): 移除组中所有演员。
void clear(): 移除组中所有演员,组的所有动作和监听。
SnapshotArray

  1. 代码示例

引用前面章节自定义的演员:

package com.libgdx.test;

import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;

/**
 * 自定义演员
 */
public class MyActor extends Actor {

    private TextureRegion region;

    public MyActor(TextureRegion region) {
        super();
        this.region = region;
        setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
    }

    public TextureRegion getRegion() {
        return region;
    }

    public void setRegion(TextureRegion region) {
        this.region = region;
        setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
    }

    @Override
    public void act(float delta) {
        super.act(delta);
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        super.draw(batch, parentAlpha);
        if (region == null || !isVisible()) {
            return;
        }
        batch.draw(
                region, 
                getX(), getY(), 
                getOriginX(), getOriginY(), 
                getWidth(), getHeight(), 
                getScaleX(), getScaleY(), 
                getRotation()
        );
    }
}

游戏主程序的启动入口类:

package com.libgdx.test;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.Stage;

/**
 * 游戏主程序的启动入口类
 */
public class MainGame extends ApplicationAdapter {

    private Texture texture;

    private Stage stage;

    private Group group;

    private MyActor actor1;

    private MyActor actor2;

    @Override
    public void create() {
        // 创建纹理, badlogic.jpg 图片的宽高为 256 * 256
        texture = new Texture(Gdx.files.internal("badlogic.jpg"));

        // 创建舞台, 舞台宽高默认为屏幕宽高
        stage = new Stage();

        // 创建演员组
        group = new Group();
        // 设置 group 在舞台中的位置
        group.setPosition(50, 100);

        // 添加 group 到舞台(group 本身也是一个演员)
        stage.addActor(group);

        // 创建第一个演员, 并设置属性
        actor1 = new MyActor(new TextureRegion(texture));
        actor1.setScale(0.5F);
        actor1.setPosition(0, 0);   // 位置设置到 group 的左下角

        // 创建第二个演员, 并设置属性
        actor2 = new MyActor(new TextureRegion(texture));
        actor2.setScale(0.25F);
        actor2.setPosition(100, 200);
        actor2.setRotation(45);     // 逆时针旋转 45 度

        // 添加演员到组中
        group.addActor(actor1);
        group.addActor(actor2);

        // 还可以设置演员的绘制顺序(ZIndex 属性)

        /*
         * ZIndex 属性说明:
         * 
         * 当组中有许多演员时, 如果某些演员有重叠部分, 往往需要规定演员的绘制顺序, 例如背景先绘制,
         * 人物后绘制, 在 Actor 中使用 ZIndex 属性来表示绘制顺序, ZIndex 值越大越后绘制, 即显示越靠前。
         * 
         * ZIndex 属性值其实对应的是 Group 中的演员数组对象中演员所在的索引位置(添加到 Group 中的演员的默认添加到数组的最后位置)。
         * 绘制时 Group 将遍历数组依次绘制演员, 则越靠后(ZIndex/index 越大)的元素越后绘制(即显示越靠前)。
         * 
         * 因此, 必须先将 Actor 添加到 Group(或 Stage, 因为 Stage 也是通过 Group 管理其中的演员)中之后才能操作 ZIndex 属性, 
         * 否则 ZIndex 属性没有意义。
         * 
         * // 获取演员的索引, 如果 actor 没有添加到 Group/Stage 中, 将返回 -1
         * int index = actor.getZIndex();
         * 
         * // 设置演员的索引(实际上是将数组中的演员元素移动到指定的索引位置, 可能会引起其他演员的 ZIndex 值跟着改变)
         * // 如果 actor 没有添加到 Group/Stage 中, 设置 ZIndex 属性无效
         * actor.setZIndex(int index);
         */
    }

    @Override
    public void render() {
        // 黑色清屏
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // 更新舞台逻辑
        stage.act();
        // 绘制舞台
        stage.draw();
    }

    @Override
    public void dispose() {
        // 释放资源
        if (texture != null) {
            texture.dispose();
        }
        if (stage != null) {
            stage.dispose();
        }
    }

}

发表评论

邮箱地址不会被公开。 必填项已用*标注