Box2D例子——Demo2停不下来的球球

package com.cvte.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.EdgeShape;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.utils.Array;

public class Demo2 extends ApplicationAdapter implements InputProcessor {

    private static final float PXTM = 80;

	protected OrthographicCamera mCamera;
	private Box2DDebugRenderer mRenderer;

	private World mWorld;

	private SpriteBatch mBatch;

	private Texture mTextureBall;

	private float mBallRadius;

	@Override
	public void create() {
        float cameraWidth = Gdx.graphics.getWidth() / PXTM;
        float cameraHeight = Gdx.graphics.getHeight() / PXTM;
		mCamera = new OrthographicCamera(cameraWidth, cameraHeight);
		mCamera.position.set(cameraWidth / 2, cameraHeight / 2, 0);
		mCamera.update();

		mRenderer = new Box2DDebugRenderer();

		mWorld = new World(new Vector2(0, 0), true);

		//wall
		{
			BodyDef bd = new BodyDef();
			bd.type = BodyType.StaticBody;

			EdgeShape edgeShape = new EdgeShape();

			FixtureDef fd = new FixtureDef();
			fd.shape = edgeShape;

			Body box = mWorld.createBody(bd);
			edgeShape.set(new Vector2(toWorldSize(0), toWorldSize(0)), new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(0)));
			box.createFixture(fd);
			edgeShape.set(new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(0)), new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(Gdx.graphics.getHeight())));
			box.createFixture(fd);
			edgeShape.set(new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(Gdx.graphics.getHeight())), new Vector2(0, toWorldSize(Gdx.graphics.getHeight())));
			box.createFixture(fd);
			edgeShape.set(new Vector2(toWorldSize(0), toWorldSize(Gdx.graphics.getHeight())), new Vector2(0, toWorldSize(0)));
			box.createFixture(fd);
		}

		mTextureBall = new Texture(Gdx.files.internal("coin1.png"));

		mBatch = new SpriteBatch();

		Gdx.input.setInputProcessor(this);
	}

	@Override
	public void dispose() {
		mCamera = null;

		mRenderer.dispose();
		mRenderer = null;

		mWorld.dispose();
		mWorld = null;

		mBatch = null;

		mTextureBall.dispose();
		mTextureBall = null;
	}

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

		mWorld.step(Gdx.app.getGraphics().getDeltaTime(), 6, 2);

		mBatch.setProjectionMatrix(mCamera.combined);
		mBatch.begin();

		Array<Body> bodies = new Array<Body>();
		mWorld.getBodies(bodies);
		for (Body b : bodies) {
			Ball ball = (Ball)b.getUserData();
			if (ball != null) {
				ball.setPosition(b.getPosition().x, b.getPosition().y);
				ball.setRotation(MathUtils.radiansToDegrees * b.getAngle());

				ball.draw(mBatch);
			}
		}

		mBatch.end();
	}

	private float toWorldSize(float pos) {
		return (pos / PXTM);
	}

	private void addBall() {
		BodyDef bd = new BodyDef();
		bd.type = BodyType.DynamicBody;
		bd.position.set(toWorldSize(400), toWorldSize(800));

		mBallRadius = toWorldSize(20);
		CircleShape circleShape = new CircleShape();
		circleShape.setRadius(mBallRadius);

		FixtureDef fd = new FixtureDef();
		fd.shape = circleShape;
		fd.density = 1;
		fd.friction = 0;
		fd.restitution = 1;

		Body b = mWorld.createBody(bd);
		b.createFixture(fd);

		Vector2 force = new Vector2(100, 100);
		b.applyForce(force, bd.position, true);
		b.applyLinearImpulse(force, bd.position, true);

		Ball ball = new Ball(mTextureBall, mBallRadius);
		b.setUserData(ball);
	}

	@Override
	public boolean keyDown(int keycode) {
		return false;
	}

	@Override
	public boolean keyUp(int keycode) {
		return false;
	}

	@Override
	public boolean keyTyped(char character) {
		return false;
	}

	@Override
	public boolean touchDown(int screenX, int screenY, int pointer, int button) {
		addBall();

		return false;
	}

	@Override
	public boolean touchUp(int screenX, int screenY, int pointer, int button) {
		return false;
	}

	@Override
	public boolean touchDragged(int screenX, int screenY, int pointer) {
		return false;
	}

	@Override
	public boolean mouseMoved(int screenX, int screenY) {
		return false;
	}

	@Override
	public boolean scrolled(int amount) {
		return false;
	}

	public class Ball extends Sprite {

		public Ball(Texture texture, float radius) {
			super(texture);

			setSize(radius * 2, radius * 2);
		}

	}

}

时间: 2024-10-04 21:23:48

Box2D例子——Demo2停不下来的球球的相关文章

websocket实现简化版球球大作战

websocket是一种全新的网络协议(虽然就我接触编程的时间点来说不算新了),在服务器端和客户端频繁通信时,相较与ajax轻便很多,球球大作战这个小项目如果在网页上实现,必然使用websocket而非ajax. 由于是个小游戏,所以,我也没用上什么框架或者数据库,服务器端用nodejs构建,客户端就用js写. 接下来写写项目中遇到的一些需求难题以及解决方案.(姑且将我写出错误的地方叫做难题吧) 1.如何将所有用户的小球都展现在每一个客户端的画面上? 每一个用户参与游戏后,都用构造函数生成一个小

【204】显示3D大球球

1. 光滑球 From Jan 28, 2016 2. 大球球 https://www.revolvermaps.com/?target=enlarge&i=0xoqkxnu52c&dm=8

TYVJ4623 球球大作战&#183;生存

时间: 500ms / 空间: 65536KiB / Java类名: Main 背景 小天很喜欢玩球球大作战这个游戏,大家也应该都玩过.游戏规则是:移动自己的球,移动到别人的球(一定要比自己的球小)的位置上,就可以吃掉别人的球,把别人的球的体积值加到自己的球上.还有分身.吐球等功能,但本题不考虑. 描述 作为一个OIer,小天给自己做了一个超牛的外挂:让自己的球瞬间移动到场内的任何位置!!!这意味着小天可以瞬间移动到任何一个比自己小的球上,把它吃掉.现在,小天只用外挂来瞬移,每次瞬移只能吃掉一个

当我阅读完上千行的游戏球球大作战战斗服务器端源码后...

这周服务器主程安排给了我一个任务(其实是我在用Go做完了一些小demo后,向主程请示下一步的安排),让我将他用Lua语言写的球球大作战的服务端代码转成Go语言形式. 于是,我开搞了! 此内容以上传至github,感兴趣的可以看一下github地址 框架主要分以下几个部分 1,sever-client部分 因为要有主入口,所以要新增一个server文件,client文件用来测试服务器端.而服务器又分以下几类: 与客户端的连接 选择进入的房间 进入房间后玩家数据的收发 战斗中的数据变化 2,玩家和A

球球大作战

球球大作战 http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=831&pid=1003 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 小Z最近迷上了球球大作战,他准备出

球球大作战四亿人都在玩?玩家回归没有优越感,新玩家游戏被虐,游戏体验感极差!

球球大作战,这是一款很火的手游,自己曾经玩了3年的游戏,如今已经厌倦了,所以退游了. 当时任然记得猎魔模式,感觉身边都是人,这游戏身边都有人在玩.后面嘛,由于游戏氛围不太好,合作的人太多,一个人单排这种简直没法玩了,自然卸了. 当初为了棒棒糖,可以没日没夜的玩,可以说是'不择手段',好不容易攒够了棒棒糖,买了一个光环,虽然是比较廉价的,当时自己还是很激动,很开心的,也很心满意足的.当时球球大作战这一款游戏还是很良心的,没有像今天这么多的充值活动,现在的球球大作战怎么感觉越来越向腾讯游戏靠拢了?

[哈夫曼树]猜球球

题目描述 六一到了,为了庆祝这个节日,好多商家都推出了很多好玩的小游戏.Tongtong看到了一个猜球球的游戏,有n种除了颜色之外完全相同的球,商家从中拿出来一个球球放到了箱子里,已知第i种颜色的球出现在箱子里的概率为ai.Tongtong可以用下面这种方法来确定箱子中球的颜色:向商家提出猜测:“是第x种颜色的球球或第y种颜色的球球或...........中的一个”,商家会回答你的猜测是正确还是错误的,直到你有百分百的把握确定箱子里的球球,猜测的次数越少,Tongtong能够得到的礼物就更好.为

球球大作战 01 小球的移动和碰到金币,金币会消失。

版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top 优梦创客的游戏讲堂:https://91make.ke.qq.com 『优梦创客』的微信公众号:umaketop 您可以自由转载,但必须加入完整的版权声明! 球球大作战小球的移动和碰到金币,金币会消失. 吃到金币 public class SphereMove : MonoBehaviour { p

Creator3D 守护你的球球—UV动画与天空盒

1 游戏预览 在线体验地址:http://example.creator-star.cn/follo-ball/ 2 场景物体 场景物体 新建场景后,引擎会为我们创建默认的摄像机和灯光,这个我们就不介绍了,如果不太了解,可以参考之前的文章.我们先介绍一下游戏中的物体: 地面:地面使用 Plane 创建,将他的Z深度设置为10米,同时为地面定制了一个材质贴图: 吸盘:吸盘是由 Torus 圆环体创建,定制了专用材质,而且还有一个向里面吸入的UV动画(下面一小节),同时为它添加了一个球体碰撞组件,但