详细介绍:基于 Android 和 JBox2D 的简单小游戏

news/2025/10/7 21:08:50/文章来源:https://www.cnblogs.com/lxjshuju/p/19128886

以下是一个基于 Android 和 JBox2D 的简单小游戏开发示例,实现一个小球在屏幕上弹跳的效果:

1. 添加 JBox2D 依赖

在项目的 build.gradle 文件中添加 JBox2D 的依赖:

dependencies {
implementation 'org.jbox2d:jbox2d-library:2.3.1'
}

2. 创建物理世界和刚体

创建一个类 JBoxImpl,用于封装 JBox2D 的逻辑:

import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.collision.shapes.EdgeShape;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.*;public class JBoxImpl {
private World world;
private float widthWorld = 10f; // 世界宽度
private float heightWorld = 10f; // 世界高度
private float ratioForBox2dToScreen; // 屏幕与世界的比例public JBoxImpl() {
world = new World(new Vec2(0f, -10f)); // 重力向下
}public void onSizeChanged(int width, int height) {
ratioForBox2dToScreen = width / widthWorld;
initEdges(width, height);
}private void initEdges(int width, int height) {
// 创建边界
float widthScreen = width;
float heightScreen = height;
float widthWorld = widthScreen / ratioForBox2dToScreen;
float heightWorld = heightScreen / ratioForBox2dToScreen;BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.STATIC;EdgeShape edgeShape = new EdgeShape();
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = edgeShape;
fixtureDef.density = 1f;
fixtureDef.restitution = 1f; // 完全弹性碰撞// 创建四个边界
Body groundBody = world.createBody(bodyDef);
edgeShape.set(new Vec2(0,
0), new Vec2(widthWorld, 0));
groundBody.createFixture(fixtureDef);edgeShape.set(new Vec2(widthWorld, 0), new Vec2(widthWorld, heightWorld));
groundBody.createFixture(fixtureDef);edgeShape.set(new Vec2(widthWorld, heightWorld), new Vec2(0, heightWorld));
groundBody.createFixture(fixtureDef);edgeShape.set(new Vec2(0, heightWorld), new Vec2(0,
0));
groundBody.createFixture(fixtureDef);
}public Body createBall(float x, float y, float radius) {
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DYNAMIC;
bodyDef.position.set(x / ratioForBox2dToScreen, y / ratioForBox2dToScreen);CircleShape circleShape = new CircleShape();
circleShape.m_radius = radius / ratioForBox2dToScreen;FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circleShape;
fixtureDef.density = 1f;
fixtureDef.restitution = 1f; // 完全弹性碰撞Body ballBody = world.createBody(bodyDef);
ballBody.createFixture(fixtureDef);
return ballBody;
}public void step() {
world.step(1f / 60f, 8,
3); // 更新物理世界
}public World getWorld() {
return world;
}public float getRatioForBox2dToScreen() {
return ratioForBox2dToScreen;
}
}

3. 创建自定义 View 进行绘制

创建一个自定义 View,用于绘制小球:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;public class JBoxView extends View {
private JBoxImpl jBoxImpl;
private Paint paint;public JBoxView(Context context, AttributeSet attrs) {
super(context, attrs);
jBoxImpl = new JBoxImpl();
paint = new Paint();
paint.setColor(0xFFFF0000); // 红色
paint.setStyle(Paint.Style.FILL);
}@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
jBoxImpl.onSizeChanged(w, h);
jBoxImpl.createBall(w / 2, h / 2,
50); // 创建一个小球
}@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
jBoxImpl.step(); // 更新物理世界for (Body body = jBoxImpl.getWorld().getBodyList(); body != null; body = body.getNext()) {
if (body.getType() == BodyType.DYNAMIC) {
float x = body.getPosition().x * jBoxImpl.getRatioForBox2dToScreen();
float y = body.getPosition().y * jBoxImpl.getRatioForBox2dToScreen();
float radius = ((CircleShape) body.getFixtureList().get(0).getShape()).m_radius * jBoxImpl.getRatioForBox2dToScreen();
canvas.drawCircle(x, y, radius, paint);
}
}
invalidate(); // 重绘
}
}

4. 在布局中使用自定义 View

在布局文件中添加自定义 JBoxView

<com.example.jbox2dgame.JBoxView
android:layout_width="match_parent"
android:layout_height="match_parent" />

5. 运行效果

运行程序后,你将看到一个小球在屏幕上弹跳。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF2152H2 Victorious Coloring (Hard Version) 题解

Description 给定一棵有 \(n\) 个顶点的树,每个顶点编号为 \(1\) 到 \(n\)。每条边都被赋予一个正整数权值 \(w_1, w_2, \ldots, w_{n-1}\)。 一种“胜利染色”指的是将所有顶点染成红色或黄色两种颜色,其中必须至少…

题解:P6162 [Cnoi2020] 四角链

传送门 绝大多数的计数题都可以用 dp 和容斥解决。 本题的 dp 比较好想,设 \(f_{i,j}\) 表示前 \(i\) 个位置填了 \(j\) 个数。考虑如果第 \(i\) 个位置不填,则贡献是 \(f_{i-1,j}\);否则前面 \(i-1\) 个位置一共填…

题解:P3301 [SDOI2013] 方程

传送门 首先如果没有任何限制条件,则原问题即变为简单的「求方程 \(\sum_{i=1}^nx_i=m\) 的解的个数」。此时考虑插板法,等价于将 \(m\) 个 \(1\) 分成 \(n\) 份,这时有 \(m-1\) 个空隙,要插 \(n-1\) 个板,方案数…

# 20232321 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容1.1直接修改程序机器指令,改变程序执行流程————通过直接修改可执行文件改变流程 1.2通过构造输入参数,造成BOF攻击,改变程序执行流————通过利用缓冲区溢出的漏洞,使返回的地址跳转到getshell 1.…

基于深度学习的语音识别高效的系统设计与实现

基于深度学习的语音识别高效的系统设计与实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

[ARC201B] Binary Knapsack 大大背包

思路 第一眼背包, 但是 \(n \leq 2e5\) 和重量 $ 2^{X}, X\in[0,60)$ 。所以不能使用背包 由于重量为 $ 2^{X}$ , 很有可能与二进制有关, 于是按位贪心 开 \(65\) 个优先队列,每个优先队列里存放对应与下标相等的 …

网站开发要什么软件济南抖音推广公司

目录 前言 1-保持小的拉取请求 2-使用拉取请求模板 3-实施响应时间 SLA 4-培训初级和中级工程师 5-设置持续集成管道 6-使用拉取请求审查应用程序 7-生成图表以可视化您的代码更改 前言 代码审查可能会很痛苦软件工程师经常抱怨审查过程缓慢&#xff0c;延迟下游任务&…

宁波做网站建设推广广推科技(北京)有限公司

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;Java微服务 ✨特色专栏&#xff1a; 知识分享 &…

题解:CF1292E Rin and The Unknown Flower

传送门 一道有趣的思维题。 我们从最简单的情况开始考虑:如果还剩下 \(2\) 格电呢? 那么直接询问 \(\texttt{O}\) 和 \(\texttt{H}\),剩下的位置就是 \(\texttt{C}\)。 从以上的朴素做法中我们得到启发:能不能通过…

打印A3大小的PDF文件为A4幅面

Foxit 福昕打印pdf:放大150% 然后把每页旋转180度,保存,打印。方法一: 用 Acrobat Pro DC 旋转。 方法二: 用 illustrator,打开pdf,选择某页,旋转,保存

一个完整的网站建设怎么在58同城上做网站

linux服务器的字符集设置可能影响到网站页面出现 “&#xff1f;&#xff1f;&#xff1f;” 等问号乱码&#xff0c;还有可能导致文件中的汉字部分出现乱码。有两个原因 服务器没有安装 zh_CN.UTF-8 字符集&#xff0c;导致不支持中文&#xff01;服务器虽然装了 zh_CN.UTF-8…

深入解析:SpringBoot-Thymeleaf

深入解析:SpringBoot-Thymeleafpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

课程总结2

请看下列代码,你发现有什么特殊之处吗? public class MethodOverload { public static void main (String [] args) { System.out.println ("The square of integer 7 is" + square (7)); System.out.prin…

延安网站建设哪家专业深圳多区最新通知

‍作者|张祥威 编辑|德新 多位知情人士告诉HiEV&#xff0c;智能网联汽车准入试点通知&#xff0c;乐观预计将在一个月内发布。试点的推动&#xff0c;意味着国家层面的自动驾驶L3标准随之到来。 「L3标准内容大部分与主机厂相关&#xff0c;由工信部牵头&#xff0c;找了几家…

机器学习:集成学习概念、分类、随机森林 - 实践

机器学习:集成学习概念、分类、随机森林 - 实践2025-10-07 20:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解码查找算法与哈希表

查找基础概念 查找的定义 查找(又称搜索)是从一组数据中,找出 “关键字与目标值匹配” 的记录的操作;若找到则返回记录的位置(如数组下标),若未找到则返回 “不存在” 标识(如-1)。 查找效率的影响因素数据存…

完整教程:MySQL 如何判断某个表中是否存在某个字段

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025/10/7

2025/10/7休息一天