+1

LibGDX Tutorial 10: Scene2D Phần 2 - Sử dụng các Actions

Phần tiếp theo của Scene2D tutorial, chúng ta sẽ xem làm thế nào để các Actors hoạt động được sử dụng các Actions.

Hãy nhìn vào một ví dụ:

package com.thinhhung.game;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction;
import com.badlogic.gdx.utils.viewport.ScreenViewport;

public class SceneSample implements ApplicationListener {

	public class MyActor extends Actor {
		Texture texture = new Texture(Gdx.files.internal("dante.png"));
		public boolean started = false;

		public MyActor () {
			setBounds(getX(), getY(), texture.getWidth(), texture.getHeight());
		}

		@Override
		public void draw(Batch batch, float parentAlpha) {
			batch.draw(texture, this.getX(), this.getY());
		}
	}

	private Stage stage;

	@Override
	public void create () {
		stage = new Stage(new ScreenViewport());
		Gdx.input.setInputProcessor(stage);

		MyActor myActor = new MyActor();

		MoveToAction moveToAction = new MoveToAction();
		moveToAction.setPosition(300f, 0f);
		moveToAction.setDuration(10f);
		myActor.addAction(moveToAction);

		stage.addActor(myActor);
	}

	@Override
	public void resize(int width, int height) {

	}

	@Override
	public void render () {
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		stage.act(Gdx.graphics.getDeltaTime());
		stage.draw();
	}

	@Override
	public void pause() {

	}

	@Override
	public void resume() {

	}

	@Override
	public void dispose() {
		stage.dispose();
	}
}

Khi bạn chạy ví dụ này, nó sẽ di chuyện nhân vật Dante tới vị trí 300, 0.

image01.gif

Phần lớn ví dụ này được sử dụng lại code trong phần trước, vì thế tôi chỉ giải thích đoạn code mới trong phương thức create():

stage = new Stage(new ScreenViewport());
Gdx.input.setInputProcessor(stage);

MyActor myActor = new MyActor();

MoveToAction moveToAction = new MoveToAction();
moveToAction.setPosition(300f, 0f);
moveToAction.setDuration(10f);
myActor.addAction(moveToAction);

stage.addActor(myActor);

Ở đây chúng ta tạo một MoveToAction, nó sẽ di chuyển Actor được đính kém tới một ví trí nhất định theo thời gian. Bạn thiết lập ví trị với phương thức setPosition() và thiết lập tổng thời gian chuyển động sử dụng phương thức setDuration(). Bạn gán các Actions cho Actor sử dụng phương thức addAction(). Tất cả các Actions đều có nguồn gốc từ Action class, trong khi MoveToAction có nguồn gốc từ TemporalAction, đó là một Action có thời hạn. Ngoài MoveToAction, có một số Actions khác như MoveByAction, ScaleToAction, ColorAction, DelayAction, RepeatAction, RotateByAction,...

Nếu bạn chạy nhiều hơn một hành động như thế này:

MoveToAction moveToAction = new MoveToAction();
RotateToAction rotateToAction = new RotateToAction();
ScaleToAction scaleToAction = new ScaleToAction();

moveToAction.setPosition(300f, 0f);
moveToAction.setDuration(10f);
rotateToAction.setRotation(90f);
rotateToAction.setDuration(5f);
scaleToAction.setScale(0.5f);
scaleToAction.setDuration(5f);

myActor.addAction(moveToAction);
myActor.addAction(rotateToAction);
myActor.addAction(scaleToAction);

Bạn sẽ thấy:

image02.gif

Như bạn cso thể thấy, tất cả các actions của bạn chạy đồng thời theo mặc định.

Có một điều quan trọng cần nhận thấy. Phương thức draw() trong MyActor không thực hiện hành động rotate hay scale theo mặc định. Nếu bạn muốn rotate hay scale như trên, bạn cần phải thay đổi một chút phương thức draw() như thế này:

@Override
public void draw(Batch batch, float alpha){
    batch.draw(texture, this.getX(), getY(), this.getOriginX(), this.getOriginY(), this.getWidth(),
            this.getHeight(), this.getScaleX(), this.getScaleY(), this.getRotation(), 0, 0,
            texture.getWidth(), texture.getHeight(), false, false);
}

Nhiều khi chúng ta muốn delay một Action, hoặc chạy chúng theo thứ tự. May mắn thay LibGdx hỗ trợ điều này. Giả sử bạn muốn scale sau đó rotate, rồi di chuyển Actor của bạn, bạn có thể thực hiện điều này bằng cách sử dụng SequenceAction như sau:

MyActor myActor = new MyActor();

    SequenceAction sequenceAction = new SequenceAction();

MoveToAction moveToAction = new MoveToAction();
    RotateToAction rotateToAction = new RotateToAction();
    ScaleToAction scaleToAction = new ScaleToAction();

moveToAction.setPosition(300f, 0f);
moveToAction.setDuration(10f);
    rotateToAction.setRotation(90f);
    rotateToAction.setDuration(5f);
    scaleToAction.setScale(0.5f);
    scaleToAction.setDuration(5f);

    sequenceAction.addAction(scaleToAction);
    sequenceAction.addAction(rotateToAction);
    sequenceAction.addAction(moveToAction);

    myActor.addAction(sequenceAction);

stage.addActor(myActor);

Đơn giản chỉ cần thêm tất cả các actions vào SequenceAction, sau đó chạy từng cái một.

Bằng cách import static Actions giống như thế này:

import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*;

Bạn có thể chạy các actions theo thứ tự đơn giản như sau:

myActor.addAction(sequence(scaleTo(0.5f,0.5f,5f),rotateTo(90.0f,5f),moveTo(300.0f,0f,5f)));
stage.addActor(myActor);

Hoặc chạy chúng cùng lúc với phương thức parallel:

myActor.addAction(parallel(scaleTo(0.5f,0.5f,5f),rotateTo(90.0f,5f),moveTo(300.0f,0f,5f)));
stage.addActor(myActor);

Source code

Bạn có có thể tham khảo source code của project này tại đây.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí