Libgdx学习笔记:封装自己的Actor

为什么要去封装我们自己的Actor?

答:Actor本身可能无法满足我们的开发需求,或者无法支持各种各样的效果,由此需要在其基础上进行拓展。

下面贴出本人二次封装的CHActor代码,供大家参考:

  1.CHActor使用了对象缓存池,自动管理释放,很好的解决了游戏中使用大量对象导致帧数较低的问题。 

  2.自行设置绘制的纹理,而不必使用Image。创建过多的Image会导致帧数下降的很厉害。

  3.可自由继承CHActor,方便自己再次扩展。

用法:

CHActor chactor  = CHActor.obtain();// 使用缓存池里面的

CHActor chactor = new CHActor();// 纯新建

YourActor extends CHActor {...}

YourActor youractor  = CHActor.obtain(YourActor.class);

基于libGdx二次封装的CHGame框架 :

https://git.oschina.net/oahcfly/CHGame

package com.oahcfly.chgame.core.mvc;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.Pool.Poolable;
import com.badlogic.gdx.utils.Pools;
import com.oahcfly.chgame.core.Chao;

/**
 * 
 * <pre>
 * 二次封装的actor
 * 
 * date: 2014-12-11
 * </pre>
 * 
 * @author caohao
 */
public class CHActor extends Actor implements Poolable {
	private int tag;

	private Texture bgTexture;

	private TextureRegion bgTextureRegion;

	public CHActor() {
	}

	@Override
	public void draw(Batch batch, float parentAlpha) {
		Color color = getColor();
		batch.setColor(color.r, color.g, color.b, color.a);

		float x = getX();
		float y = getY();
		float scaleX = getScaleX();
		float scaleY = getScaleY();

		float width = getWidth();
		float height = getHeight();

		if (bgTexture != null) {
			batch.draw(bgTexture, x, y, getOriginX(), getOriginY(), getWidth(), getHeight(), scaleX, scaleY,
					getRotation(), 0, 0, (int) width, (int) height, false, false);
		}

		if (bgTextureRegion != null) {
			if (bgTextureRegion instanceof Sprite) {
				Sprite sprite = (Sprite) bgTextureRegion;
				sprite.setColor(batch.getColor());
				sprite.setOrigin(getOriginX(), getOriginY());
				sprite.setPosition(x, y);
				sprite.setScale(scaleX, scaleY);
				sprite.setSize(width, height);
				sprite.setRotation(getRotation());
				sprite.draw(batch);
			} else {
				batch.draw(bgTextureRegion, x, y, getOriginX(), getOriginY(), width, height, scaleX, scaleY,
						getRotation());
			}
		}
	}

	public void setBgTexture(Texture bgTexture) {
		this.bgTexture = bgTexture;
		if (bgTexture != null) {
			setSize(bgTexture.getWidth(), bgTexture.getHeight());
		}
		setOrigin(Align.center);
	}

	/**
	 * 
	 * <pre>
	 * 使用缓存池
	 * 
	 * date: 2015-1-3
	 * </pre>
	 * 
	 * @author caohao
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T extends CHActor> T obtain(Class<T> type) {
		Pool<CHActor> pool = (Pool<CHActor>) Pools.get(type);
		CHActor actor = pool.obtain();
		actor.setBgTexture(null);
		return (T) actor;
	}

	public static CHActor obtain() {
		return obtain(CHActor.class);
	}

	@Override
	public void reset() {
	        // 初始化
		this.bgTexture = null;
		this.bgTextureRegion = null;
		setScale(1);
		setRotation(0);
		clear();
		setUserObject(null);
		this.setColor(new Color(1, 1, 1, 1));
		setStage(null);
		setParent(null);
		setVisible(true);
		setName(null);
		setOrigin(Align.center);
		setPosition(0, 0);
	}

	public Texture getBgTexture() {
		return bgTexture;
	}

	public TextureRegion getBgTextureRegion() {
		return bgTextureRegion;
	}

	public void setBgTextureRegion(TextureRegion textureRegion) {
		this.bgTextureRegion = textureRegion;
		if (bgTextureRegion != null) {
			if (bgTextureRegion instanceof Sprite) {
				Sprite sprite = (Sprite) bgTextureRegion;
				setSize(sprite.getWidth(), sprite.getHeight());
			} else if (bgTextureRegion instanceof AtlasRegion) {
				AtlasRegion atlasRegion = (AtlasRegion) bgTextureRegion;
				bgTextureRegion = Chao.plistCenter.createSprite(atlasRegion);
				Sprite sprite = (Sprite) bgTextureRegion;
				setSize(sprite.getWidth(), sprite.getHeight());
			} else {
				setSize(bgTextureRegion.getRegionWidth(), bgTextureRegion.getRegionHeight());
			}
		}

		setOrigin(Align.center);
	}

	@Override
	public boolean remove() {
		boolean remove = super.remove();
		if (remove) {
			Pools.free(this);
		}
		return remove;
	}

	public int getTag() {
		return tag;
	}

	public void setTag(int tag) {
		this.tag = tag;
	}

}
时间: 2024-10-24 21:57:18

Libgdx学习笔记:封装自己的Actor的相关文章

Libgdx学习笔记: 游戏如何在androidx86 2.2的vbox虚拟机测试运行

这个问题我花了一天半的时间才解决,换了无数个libgdx的版本,0.98.0.99 1.0 还有最新未发布的版本都测试了,虚拟机的版本也换了很多个,都不行 最后总结出来. vBox虚拟机上的androidx86 无论哪个版本,至少我测试的2.2 4.0 4.1 都无法成功运行 libgdx 的opengl es2.0版本的程序 先说下我为什么一定要虚拟机,因为androidAVD带的模拟器不能多个模拟器进行socket交互,我说的是超过2个,只有2个可以端口映射,3个以上就没办法了,而现在我做的

Libgdx学习笔记:自己封装各种粒子特效

实现的思路:缓存池+(Image或者CHActor) + Actions 例:实现星星右中心点向圆形周围扩散,且星星不断的旋转,缩小,到达圆上时消失. 这个需求里面对于单个星星包含的Action有: moveTo 移动 roatateBy 旋转 scaleTo 缩小 我们使用Actions.parallel(...)来同时执行上面三个Action.当然我们再执行上面所有Action还需要加上最后的RunnableAction.用来处理粒子结束后的其他工作(释放星星对象到缓存池). 单个星星的运动

Direct-X学习笔记--封装一个网格模型类

之前学习了网格模型的导入,绘制,了解了X文件等相关知识,但是,那样绘制比较麻烦,而且绘制一个模型需要好多代码,完全是面向过程的思维,这次,学习一下怎么把网格模型的导入以及绘制等功能封装在一个类中.顺便加深一下对World Transform的理解.感觉自己的3D思维还是没有培养起来,想绘制一个对象,绘制出来和想象中的位置相差甚远. 一.复习一下网格模型相关知识 网格模型就是一个我们在美术工具中制作好的资源,通过一些API接口我们可以将美术童鞋做好的模型很方便的导入程序中.我们只需要了解怎样从文件

Libgdx学习笔记:Simple text input

官方Wiki:https://github.com/libgdx/libgdx/wiki/Simple-text-input 实现接口TextInputListener public class MyTextInputListener implements TextInputListener {       @Override    public void input (String text) {    }       @Override    public void canceled () 

PHP学习笔记---封装(面向对象三大特性之一)

回顾:类的概念(对象的抽象化) 对象(类的实例化) 定义 类:成员变量:成员方法: 如何造对象呢: 1 $r = new ren(); new 创建 调用对象的成员  :  $r-> 对于面向对象有三大特性:封装:继承:多态: 关于封装(做类的将类进行封装) 目的是:让类更加安全,不让外界直接访问类的成员: 做法:不让外界直接访问类的成员 具体做法一: 1.成员变为私有:访问修饰符(publc ,private ,protected) public:公共的 所有的地方都能访问到: private

Libgdx学习笔记:Scene2d之Group

UI组件之Group 当Group旋转或缩放时,它的孩子们正常绘制,并且Batch变换后正确的旋转或缩放. 绘制Group前,Batch flush使得变换可以设置.有很多Group时这将可能成为性能瓶颈.如果在一组演员不旋转或缩放,然后settransform(false)可用于Group.当这样做,每个孩子的位置基于Group的位置进行绘制,使孩子们出现在正确的位置,即使没有转换. Group继承自Actor,是2D场景绘制的节点,包含了很多其他演员: 每个演员都有一个 z-order 等于

Libgdx学习笔记:使用Action做定时器

在Gdx中,定时器可以使用Timer来实现,如: Timer timer = new Timer(); Task timerTask = new Task() { @Override public void run() { } }; timer.scheduleTask(timerTask, 0, 1, 20);// 0s之后执行,每次间隔1s,执行20次. 下面我们使用Action来实现上面的效果: Action[] sAction = new Action[20];// 一共执行20次 //

Libgdx学习笔记:照相机的平滑拖动和缩放效果

不知道线性插值的,自行百度.     核心代码: // 缩放平滑因子 private float zoomSmothFactor = 5f; // 滑动 private float moveSmothFactor = 12f; Vector2 oldZoomVector = new Vector2(0, 1); Vector2 newZoomVector = new Vector2(0, 1f); Vector2 oldPositionVector = new Vector2(); Vector

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea