LibGdx学习过程(五)Actor和Action
Actor
actor可以视作为对于游戏界面中元素的一种封装。
我们在之前的文章中讲述了Texture,Texture作为一个图像元素所拥有的属性和方法并不能让我们对于它有一个精致的操控,那么想要对于对于元素的长度宽度以及位置旋转等等属性进行操作我们要怎么办呢?
之前我们有提到过Image的概念,事实上Image就是对于Actor图形图像方面的一种封装方式。
我们可以通过把基础的图形图像转换成为Actor的方式来完成对于元素的复杂操作。
以Image为例,我们可以操作图像的大小,位置,旋转等等等等,相应的其他的游戏元素一样可以封装为Actor,作为一个Actor可以满足我们对于游戏界面的大部分处理需求。
包括按钮的设计,动画的展示以及透明度的处理,我们都可以通过它来完成。
那么actor拥有哪些主要的方法呢?我们看下源码
public void draw (Batch batch, float parentAlpha) {
}
draw方法一定是核心的,它决定你如何来完成对于这一个actor内容的绘制,但是在Actor类中的draw方法是空的,因为基于Actor基类有着太多的功能类来完成他们各自的绘制要求,而你只需要选择你需要的那一个子类并传入画板和透明度即可。
再来看一下act方法,在这个方法中我们可以实现我们想要的绘制逻辑。
public void act (float delta) {
Array<Action> actions = this.actions;
if (actions.size == 0) return;
if (stage != null && stage.getActionsRequestRendering()) Gdx.graphics.requestRendering();
try {
for (int i = 0; i < actions.size; i++) {
Action action = actions.get(i);
if (action.act(delta) && i < actions.size) {
Action current = actions.get(i);
int actionIndex = current == action ? i : actions.indexOf(action, true);
if (actionIndex != -1) {
actions.removeIndex(actionIndex);
action.setActor(null);
i--;
}
}
}
} catch (RuntimeException ex) {
String context = toString();
throw new RuntimeException("Actor: " + context.substring(0, Math.min(context.length(), 128)), ex);
}
}
以上是Actor类中的act方法源码,可以看到在基类中实现了对于action的调用执行。
那么action到底是什么,起着什么样的作用又和actor有着什么样的关系呢?
Action
action也就是动作。
在我们创作一个游戏的过程中我们的画面不能是静止的呀,这个时候我们就需要让界面内的元素动起来。
元素动起来自然也就是要让每个action绑定在actor的身上,让每个actor根据action的指令去移动、变换。
logoTexture = new Texture(Gdx.files.internal("logo.png"));
logoActor = new Image(logoTexture);
logoActor.setPosition(0, 0);
MoveToAction action = Actions.moveTo(150, 700, 5.0F);
logoActor.addAction(action);
如上述代码,我们用Image为例,创建一个Image Actor对象并设置它的初始位置为(0,0)。
然后我们创建一个action,可以看到这样一行代码
Actions.moveTo(150, 700, 5.0F);
它的意思是让actor移动到指定位置,用时五秒。
除此之外还有其他的移动指令,例如:
- MoveToAction:移动到指定位置
- RotateToAction:旋转到指定角度
- ScaleToAction:缩放到指定大小
- MoveByAction:移动一定距离的相对位置
- RotateByAction:旋转一定的相对角度
- ScaleByAction:在当前大小基础上缩放一定大小
使用的时候一定要注意to和by的区别才能达到预期的效果哦。
在这些动作的基础上我们不免产生了一个问题,我可不可以给一个actor同时添加多个动作呢?
我们都可以一边吃饭一边玩手机那么actor当然也可以添加多个action。
但是我们到底是先吃饭在玩手机还是一边吃饭一边玩手机呢?这个时候就需要控制。
action给我们提供了很多种控制,例如
- SequenceAction:顺序动作
- ParallelAction:并行动作
- RepeatAction:重复动作(一个动作反复执行)
- DelayAction:延时动作
Group
篇幅不长,顺便再写一下group吧,group也就是演员组。
它是一个介乎于stage和actor中间的层级,它的主要作用是管理actor,每一个group代表了一组相互关联或者一片区域的actor。由此,actor拥有的属性方法group基本也都拥有,使用方式也都类似。
如果使用group的话group会替代stage成为actor的父节点,需要注意actor的定位和坐标哦。
除了actor本身带有的方法和属性之外,group自然还有很多关于操作actor的方法,例如:
- addActor:添加actor
- removeActor:移除actor
- swapActor:交换actor位置
- clearChildren:移除全部actor
每个stage可以拥有多个group,每个group可以拥有多个actor,同时stage也可以直接添加actor。