当前位置: 首页 > news >正文

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

以下是一个基于 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.hskmm.com/?act=detail&tid=26317

相关文章:

  • 基于深度学习的语音识别高效的系统设计与实现
  • CF2152H2 Victorious Coloring (Hard Version) 题解
  • 题解:P6162 [Cnoi2020] 四角链
  • 题解:P3301 [SDOI2013] 方程
  • # 20232321 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • 题解:CF1292E Rin and The Unknown Flower
  • 打印A3大小的PDF文件为A4幅面
  • 课程总结2
  • 解码查找算法与哈希表
  • 第二次课动手动脑合集
  • centos8的防火墙管理
  • 如何生成和制作PDF文件 - 实践
  • 1.2 马尔可夫决策过程(Markov Decision Process, MDP)
  • 博弈论dp复习笔记
  • 10.7阅读笔记
  • 如果你的微信支付界面出现“摇一摇”,说明你的隐私正在泄露
  • 多线程和网络总结
  • 8.RV1126-OPENCV 视频中添加LOGO - 指南
  • 学习记录:响应式系统、文件通知与游戏输入机制的异同
  • oppoR9m刷Linux系统: 制作 scatter.txt 和 导出手机preloader
  • 详细介绍:ASR技术(自动语音识别)深度解析
  • 1.1 采样问题 Sampling and Bandits
  • 10.7 NOIP 模拟赛 T2. 中心极限定理
  • 【题解】10.6 国庆中秋 提高组 热身赛
  • UCB-CS70_离散数学_个人笔记:至少和至多 - Zeeh
  • 几个重要的偏微分方程
  • 虚拟机器人学习自然语言指令技术解析
  • 题解:换乘旅行
  • 2025企业级AI数据防泄漏指南:精准选型与核心指标全景透视
  • 感觉你是那种