文档章节

Libgdx学习笔记:封装贝塞尔曲线动作

flyoahc
 flyoahc
发布于 2015/12/30 14:33
字数 346
阅读 174
收藏 1

对贝塞尔曲线不熟悉的,请自行百度了解下。在Libgdx中,已经提供了Bezier类。

// 起点,控制点,控制点,终点
		Bezier<Vector2> bezier = new Bezier<Vector2>(
		new Vector2(10, 300), 
		new Vector2(100, 500), 
		new Vector2(300, 100),
		new Vector2(410, 300));

在上面的构造函数中,中间部分为控制点,控制点可以为0个,1个,2个。最多2个控制点。

代码展示:

package com.oahcfly.chgame.core.actions;

import com.badlogic.gdx.math.Bezier;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.actions.TemporalAction;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.Pools;

/**
 * 
 * 贝塞尔曲线动作
 * @author haocao
 *
 */
public class CHBezierToAction extends TemporalAction {
	protected float x, y;
	private boolean rotate;
	private Bezier<Vector2> bezier;

	/**
	 *  设置贝塞尔曲线参数
	 * @param bezierParam
	 */
	public void setBezier (Bezier<Vector2> bezierParam) {
		bezier = bezierParam;
	}

	public boolean isRotate () {
		return rotate;
	}

	public void setRotate (boolean rotate) {
		this.rotate = rotate;
	}

	@Override
	protected void begin () {
		lastPos = bezier.points.get(0);
		x = actor.getX();
		y = actor.getY();
	}

	@Override
	protected void end () {
		lastPos = null;
	}

	@Override
	public void reset () {
		// TODO Auto-generated method stub
		super.reset();
		lastPos = null;
		bezier = null;
	}

	// 上个坐标
	private Vector2 lastPos;
	private Vector2 out = new Vector2();

	@Override
	protected void update (float percent) {

		bezier.valueAt(out, percent);
		// 更新坐标
		target.setPosition(out.x, out.y);
		// cache用于后面赋值
		Vector2 copyOut = out.cpy();
		// 计算当前坐标与上个坐标之间的角度,用于更新Actor的角度
		// bezier.derivativeAt(out, percent).angle()
		if (rotate) {
			float degrees = out.sub(lastPos).angle();
			target.setRotation(degrees);
		}
		// 赋值当前坐标
		lastPos = copyOut;
	}

	public static CHBezierToAction obtain (Bezier<Vector2> bezierParam, float duration) {
		Pool<CHBezierToAction> pool = Pools.get(CHBezierToAction.class);
		CHBezierToAction action = pool.obtain();
		action.setDuration(duration);
		action.setBezier(bezierParam);
		action.setPool(pool);
		return action;
	}
}


基于Libgdx开发的开源游戏框架CHGame:

http://git.oschina.net/oahcfly/CHGameFrame


© 著作权归作者所有

共有 人打赏支持
flyoahc
粉丝 12
博文 37
码字总数 15728
作品 0
南京
程序员
私信 提问
Libgdx学习笔记:使用ShapeRenderer绘制贝塞尔曲线路线图

上图红色路径即为贝塞尔曲线的路线。 核心思路: 获取贝塞尔曲线上的所有的点,然后通过ShapeRenderer画线即可。 代码展示: package com.oahcfly.chgame.core.ui; import com.badlogic.gdx....

flyoahc
2015/12/30
507
0
【iOS-Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)做抛物线动作并让CCSprite同时播放两个Action动作!

原文地址:http://blog.csdn.net/xiaominghimi/article/details/6779873 如果我们想实现让CCSprite进行抛物线运动的话,那么我想童鞋们首先会想到利用Box2d或者其他物理引擎去为CCSprite创建...

鉴客
2012/01/15
638
0
【iOS-Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)做抛物线动作并让CCSprite同时播放两个Action动作!

如果我们想实现让CCSprite进行抛物线运动的话,那么我想童鞋们首先会想到利用Box2d或者其他物理引擎去为CCSprite创建物理世界中对应的刚体进行实现,但是反过来想,对于不熟悉Box2d或者其他物...

junwong
2012/03/02
1K
0
OpenGL超级宝典笔记——贝塞尔曲线和曲面

参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即与y轴的交点坐标)。类似地,我们也可以用一个参数方程来表示一条曲线。1962年,法国...

Mario_Q
2013/12/11
0
0
IOS 手写签名:UberSignature

很早就有了自己写点技术博客的想法,正好最近在项目中用到了手写签名的功能,用到了Uber开源的UberSignature,发现代码结构思路也非常值得借鉴,希望能帮到需要使用的朋友。 UberSignature的架...

河豚鱼_3107
2018/01/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

生产者消费者问题(PV操作)

一、明确定义 要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减...

shzwork
9分钟前
0
0
重新认识网络通信协议

OSI网络分层 应用层 http, smtp,pop3这些都属于应用层协议 为用户的应用程序提供服务 表示层 确保一个系统的应用层发送的信息被另一个系统的应用层接收到 会话层 通过传输层建立数据传输的通...

最胖的瘦子
20分钟前
0
0
【转】分布式数据流的轻量级异步快照

本篇翻译自论文:Lightweight Asynchronous Snapshots for Distributed Dataflows,Flink的容错快照模型即来源于该论文。原文地址:https://arxiv.org/pdf/1506.08603.pdf 分布式数据流的轻量...

yiduwangkai
23分钟前
0
0
java使用反射机制设置私有成员变量的值

写一个方法:public void setProperty(Objectobj, String propertyName, Object value){}, 此方法可将obj对象中名为propertyName的属性的值设置为value。(这里不知道obj对象的propertyNam...

群星纪元
29分钟前
0
0
用 Tapestry 的方式在页面模板中加入注释

<span jwcid="$remove$">这里是注释</span>

LeoXu
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部