Android 在场景2D中,当一个动作完成时,它将从参与者中移除,但它';别把它放回游泳池里
在场景2D中,当一个动作完成时,它将从参与者中移除,但不会放回池中 动作类Android 在场景2D中,当一个动作完成时,它将从参与者中移除,但它';别把它放回游泳池里,android,libgdx,scene2d,Android,Libgdx,Scene2d,在场景2D中,当一个动作完成时,它将从参与者中移除,但不会放回池中 动作类 /** Sets the actor this action will be used for. This is called automatically when an action is added to an actor. This is also * called with null when an action is removed from an actor. When set to null, {
/** Sets the actor this action will be used for. This is called automatically when an action is added to an actor. This is also
* called with null when an action is removed from an actor. When set to null, {@link #reset()} is called.
* <p>
* This method is not typically a good place for a subclass to query the actor's state because the action may not be executed
* for some time, eg it may be {@link DelayAction delayed}. The actor's state is best queried in the first call to
* {@link #act(float)}. For a TimedAction, use TimedAction#initialize(). */
public void setActor (Actor actor) {
this.actor = actor;
}
/** Resets the optional state of this action to as if it were newly created, allowing the action to be pooled and reused. State
* required to be set for every usage of this action or computed during the action does not need to be reset.
* <p>
* The default implementation calls {@link #restart()}. Also, if the action has a {@link #setPool(Pool) pool} then the action is
* {@link Pool#free(Object) returned} to the pool.
* <p>
* If a subclass has optional state, it must override this method, call super, and reset the optional state. */
public void reset () {
restart();
if (pool != null) {
pool.free(this);
pool = null;
}
}
/**
* Timeline action runs a Timeline (separate from the TweenManager to avoid a second manager/loop cycle)
* with Scene2d
*/
public class TimelineAction extends Action {
private static final Pool<TimelineAction> pool = new Pool<TimelineAction>() {
@Override
protected TimelineAction newObject() {
Gdx.app.log("LOG", "TimelineAction action = new TimelineAction();");
TimelineAction action = new TimelineAction();
return action;
}
};
private Timeline timeline;
private boolean done;
/**
* Get instance from pool.
*
* @param timeline
* The associated tween.
*
* @return Pooled instance.
*/
public static TimelineAction createTimelineAction(Timeline _timeline) {
TimelineAction action = pool.obtain();
action.setPool(pool);
action.setTimeline(_timeline);
return action;
}
@Override
public boolean act(float delta) {
done = timeline.isFinished();
if (!done) {
timeline.update(delta);
} else {
Gdx.app.log("LOG", "timeline.finished()");
timeline.free();
timeline = null;
}
return done;
}
private void setTimeline(Timeline timeline) {
this.timeline = timeline;
}
}
顺便说一句,TimelineAction完成后,Timeline及其Tweens对象成功发送到各自的池(2):
(2) -Timeline.getPoolSize()返回1,Tween.getPoolSize()返回2
actor1.addAction(TimelineAction.createTimelineAction(
Timeline.createSequence()
.push( Tween.to(logo_MUTANT, Element2DAccessor.POS_XY, 3f)
.waypoint(400, 800)
.waypoint(200, 400)
.waypoint(100, 200)
.target(0,0)
)
.ease(Quad.INOUT).path(TweenPaths.catmullRom)).push(Tween.call(callback).setCallbackTriggers(TweenCallback.BACK_COMPLETE)).repeatYoyo(1, 0.5f).start()));
所以,我需要一些帮助,拜托
提前谢谢,请原谅我的英语不好
Libgdx版本0.9.6(24-07-2012)您是否仍有问题。我是netthreads版本TimelineAction的作者,我认为只要您使用此版本,就不应该有问题:
public class TimelineAction extends Action
{
private static final ActionResetingPool<TimelineAction> pool = new ActionResetingPool<TimelineAction>(10, 100)
{
@Override
protected TimelineAction newObject()
{
TimelineAction action = new TimelineAction();
return action;
}
};
private Timeline timeline;
private Actor target;
protected boolean done;
/**
* Get instance from pool.
*
* @param timeline
* The action time-line to execute.
*
* @return Pooled instance.
*/
public static TimelineAction $(Timeline timeline)
{
TimelineAction action = pool.obtain();
action.setTimeline(timeline);
return action;
}
@Override
public void act(float delta)
{
if (!isDone())
{
timeline.update((int) (delta * 1000));
}
else
{
Gdx.app.log("TimelineAction", "!!!Executing finished timeline, " + timeline.getClass().hashCode());
}
}
@Override
public boolean isDone()
{
return timeline.isFinished();
}
@Override
public Action copy()
{
return this;
}
@Override
public void setTarget(Actor actor)
{
this.target = actor;
}
@Override
public Actor getTarget()
{
return target;
}
@Override
public void finish()
{
super.finish();
pool.free(this);
timeline.free();
}
private void setTimeline(Timeline timeline)
{
this.timeline = timeline;
}
/**
* Fetch TimeLine reference.
*
* @return The TimeLine reference.
*/
public Timeline getTimeline()
{
return timeline;
}
/**
* Set done status.
*
* @param done
*/
public void setDone(boolean done)
{
this.done = done;
}
}
我正在将所有演示更新为0.9.6
public class TimelineAction extends Action
{
private static final ActionResetingPool<TimelineAction> pool = new ActionResetingPool<TimelineAction>(10, 100)
{
@Override
protected TimelineAction newObject()
{
TimelineAction action = new TimelineAction();
return action;
}
};
private Timeline timeline;
private Actor target;
protected boolean done;
/**
* Get instance from pool.
*
* @param timeline
* The action time-line to execute.
*
* @return Pooled instance.
*/
public static TimelineAction $(Timeline timeline)
{
TimelineAction action = pool.obtain();
action.setTimeline(timeline);
return action;
}
@Override
public void act(float delta)
{
if (!isDone())
{
timeline.update((int) (delta * 1000));
}
else
{
Gdx.app.log("TimelineAction", "!!!Executing finished timeline, " + timeline.getClass().hashCode());
}
}
@Override
public boolean isDone()
{
return timeline.isFinished();
}
@Override
public Action copy()
{
return this;
}
@Override
public void setTarget(Actor actor)
{
this.target = actor;
}
@Override
public Actor getTarget()
{
return target;
}
@Override
public void finish()
{
super.finish();
pool.free(this);
timeline.free();
}
private void setTimeline(Timeline timeline)
{
this.timeline = timeline;
}
/**
* Fetch TimeLine reference.
*
* @return The TimeLine reference.
*/
public Timeline getTimeline()
{
return timeline;
}
/**
* Set done status.
*
* @param done
*/
public void setDone(boolean done)
{
this.done = done;
}
}
public void act (float delta) {
actions.iter();
Action action;
while ((action = actions.next()) != null) {
action.act(delta);
if (action.isDone()) {
action.finish();
actions.remove();
}
}
}