Libgdx Box2D真实---这缓释微丸(三:规则经常使用body和精灵联合)

介绍规则body怎样和图片结合。上一篇文章我介绍了box2D的基本知识,假设你用心的话。你会搜索网上相关简单demo吧。那些我就不写了。那么假设我用图片表示我的那个body。而不是简单线条。那该怎么办?

以下,我以我的项目中小球对象生成为例,介绍精灵和body怎样结合:

以下是创建一个小球类,重要的都凝视了:

public class Ball {
	private static final float BALL_RADIUS = 0.15f;// 球半径
	private final Random rand = new Random();
	public Body ballModels;     //小球body
	public Sprite ballSprite;//精灵
	public int type;         //小球的类型
	public Ball(World world,int type) {

		BodyDef ballBodyDef = new BodyDef();    //生成一个def
		ballBodyDef.type = BodyType.DynamicBody;  //定义成小球是不受控制的动态物体
		CircleShape shape = new CircleShape(); //定义小球的形状
		shape.setRadius(BALL_RADIUS);

		FixtureDef fd = new FixtureDef();    //生成一个Fixture
		fd.density = 1;                          //密度
		fd.friction = 0f;                     //摩擦力
		fd.restitution = 0.5f;                 //弹力
		fd.shape = shape;
		ballModels = GameScreen.world.createBody(ballBodyDef);  //为body载入def
	        ballModels.createFixture(fd);//为body创建fixture
	        shape.dispose();
		reset( type);
	}

	public void reset(int type){

		this.type=type;
		float tx = rand.nextFloat() * 1.0f - 0.4f;
		float ty = GameScreen.camera.position.y + GameScreen.camera.viewportHeight/2 + BALL_RADIUS;
		float angle = rand.nextFloat() * MathUtils.PI * 2;
		Vector2 vec = new Vector2();
		ballModels.setActive(true);
		ballModels.setAwake(true);
		ballModels.setLinearVelocity(vec.set(0, 0));
		ballModels.setAngularVelocity(0);
		ballModels.setTransform(vec.set(0.3f, 10), angle);  //小球创建的初始位置
		ballSprite = new Sprite(GameCenter.balls[type]);   //生成一个精灵
		ballSprite.setSize(BALL_RADIUS*2, BALL_RADIUS*2);
		ballSprite.setOrigin(BALL_RADIUS, BALL_RADIUS);
	}

}

那么我们能够通过  在游戏界面中调用Ball ball=new Ball(world,0)产生小球。可是你会发现当你写好以后并不会产生小球,为什么呢?不是它没产生,而是由于它是不可见的,所以我们要给他披上一件“外衣”让我们能够看到它,也就是绘制精灵,并让精灵和小球这个body同步。这样不就能够了嘛!

这里,我写了一个函数用来同步body和精灵,当我们把这个函数放到Render中不停地刷新:

public ArrayList<Ball> balls = new ArrayList<Ball>();
public ArrayList<Sprite> ballSprites = new ArrayList<Sprite>();
public void ballsRender() {
		for (int i = 0; i < balls.size(); i++) {
			Vector2 ballPos = balls.get(i).ballModels.getPosition();  <span style="color:#33ff33;">//首先获得body位置</span>
			ballSprites.get(i).setPosition(
					ballPos.x - ballSprites.get(i).getWidth() / 2,
					ballPos.y - ballSprites.get(i).getHeight() / 2); <span style="color:#33cc00;">//这里更新精灵位置</span>
			ballSprites.get(i).setRotation(
					balls.get(i).ballModels.getAngle()
					* MathUtils.radiansToDegrees);                   <span style="color:#33cc00;">//旋转角度</span>
			ballSprites.get(i).draw(batch);                        <span style="color:#33cc00;">  //绘制精灵</span>
		}
}

我想看到这你能够自己去尝试的写写试试吧,不是必需整我这麽多參数,看看能不能实现。

假设有什么问题,能够在下方留言。我会非常快答复的!

好,上面是一个简单的实现的规则图案的,眼下box2D支持形状没有特别更,只是一些简单的常用。你可以把那些在线去官demo小心翼翼的学习。所以,问题是,假设你遇到一个不规则图案,因此,我们将如何body和精灵结合起来?答案将公布下一个博客我。

时间: 2024-11-03 21:20:46

Libgdx Box2D真实---这缓释微丸(三:规则经常使用body和精灵联合)的相关文章

Libgdx Box2D现实---这缓释微丸(两:Box2D介绍)

 Box2D官方网站 : http://box2d.org/ Box2D v2.1.0用户手冊翻译 : http://blog.csdn.net/complex_ok/article/category/871440 Libgdx使用jni封装了box2d的c++版本号,使得其执行效率比其它同级的物理引擎如jbox2d快不少. 一.基础类 BodyDef  A body definition holds all the data needed to construct a rigid body

Libgdx Box2D实战---放开那小球(三:规则常用的body和精灵结合)

上一篇文章我介绍了box2D的基本知识,如果你用心的话,你会搜索网上相关简单demo吧.那些我就不写了.那么如果我用图片表示我的那个body,而不是简单线条,那该怎么办? 下面,我以我的项目中小球对象生成为例,介绍精灵和body如何结合: 下面是创建一个小球类,重要的都注释了: public class Ball { private static final float BALL_RADIUS = 0.15f;// 球半径 private final Random rand = new Rand

Libgdx Box2D实战---放开那小球(四:不规则body创建--physics-body-editor的使用)

继续我们的问题,如果遇到不规则的图形怎么办?难不成要一个个组装吗? 这里就要提一个叫做"关节"的名词了,它可以将一个个部分进行组装成自己的形状,特别是各部件独自运转时,比如一辆自行车,它的轮子和车身都是各自运转的. 但是网上相关的资料真是太少了!一大堆复制粘贴的,全是废话,不知道大家是怎么感觉的?但是我的这个游戏没用到,所以没有深究,有兴趣的可以去谷歌一下. 下面我介绍的是一个非常非常方便的工具,它的名字叫做physics-body-editor,那么它是干什么的呢?恩,它可以根据你的

Libgdx Box2D实战---放开那小球(二:Box2D介绍)

 Box2D官网 : http://box2d.org/ Box2D v2.1.0用户手册翻译 : http://blog.csdn.net/complex_ok/article/category/871440 Libgdx使用jni封装了box2d的c++版本,使得其运行效率比其他同级的物理引擎如jbox2d快不少. 一.基础类 BodyDef  A body definition holds all the data needed to construct a rigid body. Y

Libgdx Box2D实战------放开那小球(1)

断断续续花了两周写了一个物理游戏,期间逃了还多次课,被点了上大学以来最多次!现在的我基本上每节课都被点了1-3次了吧,哎,看样子是不能再逃了.不知道值不值得,只是简单地想做自己喜欢的事情,而不是跟老师大眼瞪小眼无聊的一天天度过吧. 废话少说,目前游戏已经上线了, http://zhushou.360.cn/detail/index/soft_id/2288333?recrefer=SE_D_%E6%94%BE%E5%BC%80%E9%82%A3%E5%B0%8F%E7%90%83 这是链接,如果

【cocos2d-x学习笔记】三种文字类、批处理精灵、C++的四种cast

三种显示文字的类 CCLabelTTF, CCLabelAtlas, CCLabelBMFont CCLabelTTF:使用系统字体每个字符串会生成一个纹理,显示效率比较低下.适合无变化的文字 CCLabelAtlas: 使用NodeAtlas优化渲染,适合经常变化的数字,比如分数,金钱. CCLabelBMFont: 使用CCSpriteBatchNode,很灵活,每个字符都是一个精灵,可以对每一个字符进行操作. CCLabelAtlas *lable = CClabelAtlas::crea

GNU-makefle (三) 规则语法、文件查找、伪目标

参考链接:http://blog.csdn.net/haoel/article/details/2889 当命令和依赖关系描述在同一行时,可以使用分号 分隔. 当命令太长时,也可以用反斜杠 \ 来分隔成多行,分隔出的行首有没有tab都可以(空格更无所谓了). 在指定文件目录时,可以用~来表示系统home目录,因为make会以shell来执行. VPATH Makefile文件中的特殊变量.它指定make可以去哪些目录找寻依赖文件和目标文件. 默认不定义它,则在当前目录找,多目录用冒号(:)分隔

奇志思达-微网站前端规则建议

头部加上: <meta http-equiv="cache-control" content="no-cache" />

金三银四季,阿里工作10多年Java大牛的“心得”,献给迷茫中的你

当你从事Java一年后,重新找工作时,才会真实的感受到"金三银四"这四个字背后的意思. 工作第一年,往往是什么都充满新鲜感,什么都学习,冲劲十足的一年:WEB行业知识更新特别快,今天一个框架的新版本,明天又是另一个新框架,有时往往根据项目的需要来不断学习新东西:所以,很多时候感觉,自己用过的东西很多呀!但是真正深入研究的东西却不多. 面试,是跳槽后第一个需要面对的问题:而且不同公司面试的着重点不同:但是却有一个共同点:Java基础是必考的. 工作第一年,可能问你String对象创建的理