JBox2D和JavaFX:事件與力量

在昨天的示例中,您看到了如何創建一個簡單的世界并使用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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Android】SVG和VectorDrawable——相關格式轉換

SVG是矢量圖,剛接觸尚不能仔細介紹,但只需記得一點:放大不失真,存儲也方便。 因為多數戶型圖使用SVG格式,Android要用的話必須通過相關轉換工具,將原SVG格式文件,轉換為XML后綴的VectorDrawable…

服務器時間維護制度,網絡設備及服務器日常維護管理制度

第一章總則第一條:為保證機房設備與信息的安全,保障本校服務器及網絡系統在良好、穩定、高效、快速的安全運行。特制定本制度。第二條:為確保中心機房網絡設備特別是服務器安全,根據崗位職責設立機房管理員,負責對機房…

SELinux入門簡介

操作系統有兩類訪問控制:自主訪問控制(DAC)和強制訪問控制(MAC)。標準Linux安全是一種DAC,SELinux為Linux增加了一個靈活的和可配置的的MAC。 進程啟動時所擁有的權限就是運行此進程的用戶權限,…

RESTEasy教程第3部分:異常處理

在開發軟件應用程序時,異常處理是顯而易見的要求。 如果在處理用戶請求時發生任何錯誤,我們應該向用戶顯示一個錯誤頁面,其中包含詳細的異常消息,錯誤代碼(可選),更正輸入和重試的提示&#xff…

WinForm關閉窗體徹底的退出方式

//System.Environment.Exit(0); //Process.GetCurrentProcess().Kill(); //System.Threading.Thread.CurrentThread.Abort(); System.Diagnostics.Process.GetCurrentProcess().Kill();Application.Exit(); 轉載于:https://www.cnblogs.com/XuPengLB/p/5799178.html

創建css的時候選擇器有哪幾類,CSS3-CSS的選擇器共有幾類?

CSS 3對屬性選擇器的又增加了3種子字符串的匹配方式:E[att^"val"]匹配所有E元素中att屬性的值以“val”開始的所有元素。E[att$"val"]匹配所有E元素中att屬性的值以“val”結束的所有元素。E[att*”val”]匹配所有E元素中att屬性的值中包含字符…

在Grails 2.0中使用Servlet 3.0異步功能

上周,我與某人談論了Grails 2中對Servlet 3.0異步功能的新支持,并意識到我對可用功能并不了解。 所以我想我會嘗試一下并分享一些例子。 該文檔對這個主題有些了解,因此首先介紹一些背景信息。 在3.0規范中進行異步工作的主要方式是javax.ser…

接口怎么實例化?

最開始看到數據庫連接的時候忽然想到這個問題: Connection connull;try {Class.forName(Driver);} catch (ClassNotFoundException e) {e.printStackTrace();}try {conDriverManager.getConnection(url, user, pass);} catch (SQLException e) {e.printStackTrace()…

css中基線指的是哪一條線,如何設置基線網絡_CSS, Vertical Rhythm 教程_W3cplus

首先,當談到排版,我們先要了解基線是什么?維基百科是這樣定義)的:在排版和書法中,基線是以字終sit底線為基礎,并且向兩邊延伸的直線。好極了,但我為什么要忽視他呢?好希望你充滿激情…

libvirt里的面向對象的C語言

C語言:類的聲明和定義 1 // 通用父類的定義2 struct _virClass {3 virClassPtr parent;4 5 unsigned int magic;6 char *name;7 size_t objectSize;8 9 virObjectDisposeCallback dispose; 10 }; 11 typedef struct _virClass virClass; 12 typ…

使用JGroups進行ElasticMQ消息復制

ElasticMQ是一臺消息服務器,具有Scala,Java和與Amazon SQS兼容的接口。 它通過跨服務器群集復制消息來支持有保證的消息傳遞,并通過日志記錄實現消息持久性。 消息復制是ElasticMQ的核心功能之一。 但是,如果您看一下代碼&#xf…

ajax省市二級聯動硬編碼,AJAX請求接受硬編碼的JSON,但不接受軟編碼

這個AJAX請求返回'成功'如果PHP中的輸出被復制并粘貼了JSON,但是'失敗'如果它是由文件生成的。看看下面api.php中的評論,看看我的意思。$.aj…

Fiddler高級技巧 - 映射路徑到本地文件夾

適用場景: 你是前端開發人員,要開發一個小模塊,需要用到線上的環境(賬號、數據、跨域等),但你又沒有權限往線上傳文件你是移動測試人員,需要將一組接口的返回結果替換為另一組,最簡單…

Spring Social入門

像我一樣,無論是添加簡單的Facebook“贊”按鈕,一大堆“共享”按鈕還是顯示時間軸信息,您都不會注意到當前對應用程序“社交化”的熱衷。 每個人都在做這件事,包括Spring的家伙,事實上,他們提供了一個稱為S…

apache ajax 跨域訪問,Apache 實現AJAX跨域請求

當使用ajax跨域請求時,瀏覽器報錯:XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的問題,如果用jsonp或者pro更多:當使用ajax跨域請求時,瀏覽器報錯:XmlHtt…

14、數據庫

數據庫轉載于:https://www.cnblogs.com/quyong/p/6687924.html

EhCache復制:RMI與JGroups

最近,我正在研究一種需要復制緩存的產品。 緩存提供程序已經確定-EhCache,剩下的就是有關傳輸的問題。 哪一個是最佳選擇? 這里的最佳選擇是指性能更好的選擇。 僅在兩個可用傳輸之間進行了性能評估-JGroups和RMI,對其他傳輸不予考…

Oracle 監控語句整理(包括TOP SQL等)

希望能對大家有所幫助! 很多時候大家想查看oracle數據庫中的sql語句執行情況,但是又不知道如何是好,今天在這里為大家提供一個sql語句,大家可以通過以下的sql語句查詢Oracle數據庫中Top Sql情況: 查詢結果可按照PCT、總…

服務器wifi無線放大器,一回家WiFi信號太弱?教你用兩毛錢制作信號放大器

原標題:一回家WiFi信號太弱?教你用兩毛錢制作信號放大器現在家家戶戶都有無線路由器,但是大部分人都還是早期的單天線產品,信號覆蓋范圍比較小,特別是穿墻性能不行。人在客廳WiFi信號還滿格,一到臥室就瞬間…

iOS開發 之 可穿戴設備 藍牙4.0 BLE 開發

1 前言 當前有越來越多的可穿戴設備使用了藍牙4.0 BLE(Bluetooth Low Energy)。對于iOS開發而言,Apple之前專門推出CoreBluetooth的Framework來支持BLE的開發。對于硬件開發有了解的朋友應該知道,在之前使用低版本的藍牙的設備,要…