2016-01-07 3 views
5

Ich habe eine Frage wie vor 4 Tagen gestellt. Ich habe Hilfe und jetzt sieht mein Code wieEine Aktion kann nicht wiederholt werden. libGDX

ColorAction actionBtG = new ColorAction(); 
ColorAction actionGtB = new ColorAction(); 
SequenceAction sequenceAction; 
RepeatAction repeatAction = new RepeatAction(); 
ShapeRenderer shapeRenderer; 
Color blue = new Color(Color.BLUE); 

@Override 
public void create() { 

    shapeRenderer = new ShapeRenderer(); 
    actionBtG.setColor(blue); 
    actionBtG.setEndColor(Color.GOLD); 
    actionBtG.setDuration(5); 

    actionGtB.setColor(blue); 
    actionGtB.setEndColor(Color.BLUE); 
    actionGtB.setDuration(5); 
    sequenceAction = new sequenceAction(actionBtG,actionGtB); 






    repeatAction = new RepeatAction():   
    repeatAction.setAction(sequenceAction); 
    repeatAction.setCount(RepeatAction.FOREVER); 
} 

@Override 
public void render() { 

    repeatAction.act(Gdx.graphics.getDeltaTime()); 
    Gdx.gl.glClearColor(1,1,1,1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); 
    shapeRenderer.setColor(blue); 
    shapeRenderer.rect(100, 100, 40, 40); 
    shapeRenderer.end(); 


} 

Aber es funktioniert immer noch falsch. Es macht einmal Aktion und stoppt. Wenn ich das wiederholen muss. Von Blau zu Gold, dann von Gold zu Blau. Ich würde jede Hilfe sehr schätzen, weil ich gerade libGDX lerne. Vielen Dank.

Ich habe alle Antworten gelesen und meinen Code bearbeitet, aber es immer noch nicht funktioniert:

private Actor actionManager = new Actor(); 
ColorAction actionBtG = new ColorAction(); 
ColorAction actionGtB = new ColorAction(); 
SequenceAction sequenceAction; 
RepeatAction repeatAction; 
Color activeColor = new Color(Color.BLUE); 
ShapeRenderer shapeRenderer; 


@Override 
public void create() { 

    shapeRenderer = new ShapeRenderer(); 
    actionBtG.setColor(activeColor); 
    actionBtG.setEndColor(Color.GOLD); 
    actionBtG.setDuration(5); 

    actionGtB.setColor(activeColor); 
    actionGtB.setEndColor(Color.BLUE); 
    actionGtB.setDuration(5); 
    sequenceAction = new SequenceAction(actionBtG,actionGtB); 
    repeatAction = new RepeatAction(); 
    repeatAction.setAction(sequenceAction); 
    repeatAction.setCount(RepeatAction.FOREVER); 

    actionManager.addAction(repeatAction); 
} 

Hier wird render()

@Override 
    public void render() { 
    Gdx.gl.glClearColor(1, 1, 1, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    actionManager.act(Gdx.graphics.getDeltaTime()); 

    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); 
    shapeRenderer.setColor(blue); 
    shapeRenderer.rect(100, 100, 40, 40); 
    shapeRenderer.end(); 
} 

Jetzt nicht, dass es das Ändern der Farbe, ist es immer Blau.

+1

Wo Sie tun [set das Ziel] (https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Action.html#setTarget-com.badlo gic.gdx.scenes.scene2d.Actor-) der 'Aktion'? – asherbar

+0

@ user2016436 ColorActions benötigt kein Ziel, wenn Sie 'setColor' verwenden. – Tenfour04

+0

Es wäre eine gute Idee, 'blau' in etwas anderes umzubenennen, da Sie nicht beabsichtigen, dass es blau bleibt. – Tenfour04

Antwort

3

Es liegt ein Fehler im Zusammenhang mit Aktionen vor, die mit Actors verwendet werden sollen. Viele Aktionen funktionieren ohne Actor, aber SequenceAction funktioniert nicht, weil es erwartet, dass es an einen Actor angeschlossen ist, um zu erkennen, ob es noch ausgeführt werden sollte.

Also eine etwas hacky Lösung wäre, einen Dummy-Actor zu Ihrer Top-Level-Action hinzuzufügen, wenn Sie es einrichten. Dies simuliert, was passiert, wenn Sie einem Akteur in einer Phase eine Aktion hinzufügen.

repeatAction.setActor(new Actor()); 

Wenn Sie planen, mehr Aktionen in Ihrer App zu verwenden, können Sie eine einzelne Darsteller erstellen, die Sie alle Ihre Aktionen verwalten verwenden:

private Actor actionManager = new Actor(); 

//when creating actions: 
actionManager.addAction(repeatAction); 

//In render(), use this instead of calling act on individual actions 
//It will call act on all actions in the actor: 
actionManager.act(Gdx.graphics.getDeltaTime()); 

Und natürlich, wenn Sie eine verwenden möchten Bühne für Zeichenmaterial, Sie können Ihre Aktionen einfach der Bühne hinzufügen, anstatt einen Schauspieler als Ihren Aktionsmanager zu verwenden.

Ich persönlich finde scene2d Aktionen müssen einfacher zu verwenden und einzurichten als Universal TweenEngine.

+0

Ich denke auch, dass libgdx-Aktionen einfacher einzurichten sind als Universal Tween-Engine, aber wenn Ihre Spielobjekte nicht alle libgdx-Darsteller sind, welche andere Wahl haben Sie? Schließlich möchten Sie wahrscheinlich etwas tweenen, das nicht mit libgdx-Aktionen getweent werden kann. Für ein großes Projekt scheint es unvermeidlich, dass Sie Universal Tween Engine verwenden möchten. – Barodapride

+0

@ Tenfour04 hat wie Sie in der zweiten Hälfte der ur-Antwort gesagt, fügte einige Informationen zu der Frage hinzu. – WardS

+0

Es funktioniert, weiß nicht wie, aber es funktioniert. Ich habe gerade ein neues Projekt erstellt und schreibe den ganzen Code manuell ohne Copypasting. Danke allen. – WardS

0

Libgdx Aktionen sind nur für Libgdx-Akteure. Sie erstellen eine Aktion, weisen diese jedoch keinem Actor zu. Sie setzen die Farbe des ShapeRenderer nur auf Blau, unabhängig von der Aktion, die Sie erstellt haben. Ich würde empfehlen, ein Tween von Universal tween engine zu verwenden, wenn Sie die Farbe im Laufe der Zeit ändern möchten.

Alternativ können Sie den ShapeRenderer ablegen und ein Image (Unterklasse von Actor) verwenden. Sie würden dann Ihre Aktion dem Bild zuweisen. Dazu müssten Sie jedoch eine Bühne erstellen und Ihr Bild der Bühne hinzufügen. Siehe die scene2d wiki.

Jeder Weg wird ein paar zusätzliche Schritte sein. Vielleicht ein billiges Hack zu bekommen dies leicht arbeiten würde:

  1. erstellen Sie einfach ein Bild:

    Bild i = new Bild();

  2. zuweisen Ihre Aktion auf das Bild i

    i.addAction (repeatAction);

  3. ersetzen repeatAction.act (...) mit

    i.act (Gdx.graphics.getDeltaTime(),),

  4. Änderung shapeRenderer.setColor (blau) zu

    shapeRenderer.setColor (i.getColor());

Hoffe, dass hilft.

+1

Da die Farbaktionen auf die 'blaue' Color-Instanz abzielen, liest der Shape-Renderer tatsächlich den korrekten Farbwert aus den Aktionen. – Tenfour04

+0

Ich sehe, was für mich interessanter ist, dass Sie Aktionen haben können, die nicht mit Schauspielern verbunden sind. Das scheint wirklich nützlich zu sein. Das wusste ich nicht. Jetzt werde ich überall runnable verzögerte Aktionen verwenden. – Barodapride

+0

Ich denke, es ist speziell für ColorAction. Siehe meine andere Antwort. Sie können einen Dummy-Schauspieler als Ihren Aktionsmanager verwenden. – Tenfour04

0

So arbeitete das folgende Beispiel für mich (unendliche Rotation)

Methode 1: (empfohlen)

loadingActor.addAction(Actions.repeat(RepeatAction.FOREVER, Actions.rotateBy(360, 1))); 

Methode 2:

Image loadingActor = new Image(AssetsController.getInstance().getLoading()); 
loadingActor.setOrigin(Align.center); 
final SequenceAction infiniteRotate = Actions.sequence(); 
infiniteRotate.addAction(Actions.rotateTo(0 , 0f)); 
infiniteRotate.addAction(Actions.rotateTo(360 , 1f)); 
loadingActor.addAction(Actions.forever(infiniteRotate));