在昨天的示例中,您看到了如何创建一个简单的世界并使用WorldView进行显示,以及如何提供自定义渲染器。 现在,我们将添加一些用户输入。 我们将创建一个类似于弹球机中的鳍状肢的控件。

为此,我们将创建一个关节。 在JBox2D中,关节用于将物体约束到世界或彼此约束。 我们将创建一个静态圆形的Body,它将用作我们的鳍状肢的轴,并通过RevoluteJoint将Box绑定到它。

为了简化代码,我们首先定义一个JointBuilder基类和一个RevoluteJointBuilder:

public abstract class JointBuilder, T extends JointDef> {protected World world;protected T jointDef;protected JointBuilder(World world, T jointDef) {this.world = world;this.jointDef = jointDef;}public K bodyA(Body a) {jointDef.bodyA = a;return (K) this;}public K bodyB(Body b) {jointDef.bodyB = b;return (K) this;}public K userData(Object userData) {jointDef.userData = userData;return (K) this;}public K type(JointType type) {jointDef.type = type;return (K) this;}public K collideConnected(boolean coco) {jointDef.collideConnected = coco;return (K) this;}public Joint build() {return world.createJoint(jointDef);}
}

这是RevoluteJointBuilder:

public class RevoluteJointBuilder extends JointBuilder {public RevoluteJointBuilder(World world, Body a, Body b, Vec2 anchor) {super(world, new RevoluteJointDef());jointDef.initialize(a, b, anchor);}public RevoluteJointBuilder enableLimit(boolean enable) {jointDef.enableLimit = enable;return this;}public RevoluteJointBuilder enableMotor(boolean motor) {jointDef.enableMotor = motor;return this;}public RevoluteJointBuilder localAnchorA(Vec2 localAnchorA) {jointDef.localAnchorA = localAnchorA;return this;}public RevoluteJointBuilder localAnchorB(Vec2 localAnchorB) {jointDef.localAnchorB = localAnchorB;return this;}public RevoluteJointBuilder lowerAngle(float lowerAngle) {jointDef.lowerAngle = lowerAngle;return this;}public RevoluteJointBuilder maxMotorTorque(float maxMotorTorque) {jointDef.maxMotorTorque = maxMotorTorque;return this;}public RevoluteJointBuilder motorSpeed(float motorSpeed) {jointDef.motorSpeed = motorSpeed;return this;}public RevoluteJointBuilder referenceAngle(float referenceAngle) {jointDef.referenceAngle = referenceAngle;return this;}public RevoluteJointBuilder upperAngle(float upperAngle) {jointDef.upperAngle = upperAngle;return this;}}

现在,我们可以像这样修改HelloWorld-Example:

public class HelloWorld extends Application {public static void main(String[] args) {Application.launch(args);}@Overridepublic void start(Stage primaryStage) {World world = new World(new Vec2(0, -2f), true);primaryStage.setTitle("Hello World!");NodeManager.addCircleProvider(new MyNodeProvider());new CircleBuilder(world).userData("ball").position(0.1f, 4).type(BodyType.DYNAMIC).restitution(1).density(2).radius(.15f).friction(.3f).build();final Body flipperBody = new BoxBuilder(world).position(0, 2).type(BodyType.DYNAMIC).halfHeight(.02f).halfWidth(.2f).density(2).friction(0).userData("flipper").build();Vec2 axis = flipperBody.getWorldCenter().add(new Vec2(.21f, 0));Body axisBody = new CircleBuilder(world).position(axis).type(BodyType.STATIC).build();new RevoluteJointBuilder(world, flipperBody, axisBody, axis).upperAngle(.6f).lowerAngle(-.6f).enableMotor(true).enableLimit(true).maxMotorTorque(10f).motorSpeed(0f).build();Scene scene = new Scene(new WorldView(world, 200, 400, 50), 500, 600);// groundnew BoxBuilder(world).position(0, -1f).halfHeight(1).halfWidth(5).build();primaryStage.setScene(scene);primaryStage.show();}
}

这将显示我们的场景,您将看到关节如何防止动态Box掉落到地面以及如何限制其运动。

下一步是允许用户对其进行控制。 为此,我们将在用户按下按键时施加力。 在场景实例化之后添加以下内容:

scene.setOnKeyPressed(new EventHandler() {@Overridepublic void handle(KeyEvent ke) {if (ke.getCode()== KeyCode.LEFT) {flipperBody.applyTorque(-15f);}}});scene.setOnKeyReleased(new EventHandler() {@Overridepublic void handle(KeyEvent ke) {if (ke.getCode()== KeyCode.LEFT) {flipperBody.applyTorque(15f);}}});

现在就这样。 在本教程的下一部分中,我们将做一些更多的自定义渲染,并创建一些不错的自定义节点。

参考:在Eppleton博客上,来自我们JCG合作伙伴 Toni Epple的JBox2D和JavaFX的事件和影响 。

翻译自: https://www.javacodegeeks.com/2012/05/jbox2d-and-javafx-events-and-forces.html

JBox2D和JavaFX:事件与力量相关推荐

  1. jbox2d_JBox2D和JavaFX:事件与力量

    jbox2d 在昨天的示例中,您看到了如何创建一个简单的世界并使用WorldView进行显示,以及如何提供自定义渲染器. 现在,我们将添加一些用户输入. 我们将创建一个类似于弹球机中的鳍状肢的控件. ...

  2. JavaFX 相关资源

    Libraries, Tools and Projects(类库,工具和项目) Advanced-Bindings for JavaFX(8) - 高级绑定是一组有用的帮助程序和自定义绑定实现,如ja ...

  3. DDD理论学习系列(9)-- 领域事件

    1. 引言 A domain event is a full-fledged part of the domain model, a representation of something that ...

  4. 【Java】JavaFx桌面编程整理

    JavaFX是用于构建富Internet应用程序的Java库. 使用此库编写的应用程序可以跨多个平台一致地运行. 使用JavaFX开发的应用程序可以在各种设备上运行,例如台式计算机,移动电话,电视,平 ...

  5. JavaFX和可视化信息抽取

    1.阅读说明 本篇博客是非介绍类的,即,不含有关于JavaFX的基础介绍.博客主要描述实现可视化信息抽取时,如何利用JavaFX的WebView组件.仅介绍涉及到的JavaFX的内容,至于可视化信息抽 ...

  6. “争议话题”事件营销成败与否的关键

    新媒体传播的力量不可小觑,尤其是网络传播,近年来网络上成功的事件营销可圈可点.从多芬的"真美运动"开始,事件营销被企业视为营销法宝,屡次使用.屡次受用. 研究之后发现,但凡近年来成 ...

  7. 浅谈领域事件及其应用

    前言:好久没更新博客啦.这阵子刚忙完,稍微空暇,就想分享下在开发中用过的领域事件.因为大家做微服务的,基本上都会用DDD去进行领域驱动设计.而领域事件是领域模型里一个很重要的概念.下面开搞,放心,不只 ...

  8. Zetcode GUI 教程

    来源:ApacheCN Zetcode 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request. 请您勇敢地去翻译和改进翻译.虽然 ...

  9. 新媒体视频导演 - 导演学前班

    为什么80%的码农都做不了架构师?>>>    导演学前班 1.你能学到什么 系统理论知识和导演思维 影视行业最好的时代 门槛空前降低 举例1:年轻作家-郭敬明<小时代> ...

最新文章

  1. ASP.NET图象处理详解
  2. 52深入理解C指针之---不透明指针
  3. 【 FPGA 】设置伪路径
  4. HDU 1540 Tunnel Warfare 线段树区间合并
  5. 软考网络规划设计师备考及通过心得
  6. [Oracle] SQL*Loader 详细使用教程(3)- 控制文件
  7. 《你好李焕英》票房反超《唐探3》 成中国影史票房第五
  8. 可临摹学习的精致的音乐播放器界面设计ui模板
  9. js键盘相关知识总结
  10. iOS 深拷贝、浅拷贝、自定义对象拷贝简介
  11. Ionic项目中如何使用Native Camera
  12. 【解决】Windows Mobile 6 Professional SDK Refresh.msi 在xp上一直卡死
  13. Salesforce 知识点记录(JSZip在lighting中使用时遇到的坑)
  14. [移动GIS] 4.1-TDOA定位
  15. Java实现 LeetCode 787 K 站中转内最便宜的航班(两种DP)
  16. 场面火爆!5G+智慧灯杆融合发展论坛在北京顺利召开
  17. ACL 2021 | 基于词依存信息类型映射记忆神经网络的关系抽取
  18. 显示器分辨率一直跳_电脑屏幕的分辨率老是变换怎么回事?
  19. Android native层Hander原理分析
  20. PaddleDetection复现笔记

热门文章

  1. 解决eclipse中tomcat无法识别maven web项目问题
  2. jvm(13)-线程安全与锁优化
  3. MySQL优化(一):表结构优化
  4. 单列集合List的实现类
  5. layui绑定json_JSON-B非对称属性绑定
  6. dynamodb容器使用_使用DynamoDB映射器将DynamoDB项目映射到对象
  7. cdi 2.7.5_看一下CDI 2.0 EDR1
  8. mongodb上限集合_用Java创建MongoDB上限集合
  9. 在ADF 12.2.1.3中使用基于JSON的REST Web服务
  10. 具有ESB,API管理和Now ..服务网格的应用程序网络功能。