JavaFX 2 GameTutorial第4部分

介紹

這是與JavaFX 2游戲教程相關的六個部分系列的第四部分。 如果您錯過了第1部分 , 第2部分或第3部分 ,我建議您在開始本教程之前仔細閱讀它們。 回顧一下,在第3部分中,我為您提供了許多經典街機風格游戲和所使用的不同輸入設備的歷史記錄。 然后,我向您展示了如何創建類似于著名街機“小行星”的簡單游戲。 但是,控件(船的移動)與PC游戲“星際爭霸”的控件更為相似。 在第3部分中,您應該對如何從鍵盤和鼠標接收輸入有很好的了解。

圖1 JavaFX 2游戲教程第4部分

本教程的內容是調整第2部分的游戲引擎,并更新第3部分中現有的“ Asteroids”風格的游戲以處理碰撞檢測。 在本教程中,我將簡要討論精靈以及如何處理碰撞檢測。 現在,飛船將具有產生力場的能力,以保護自己免受敵人和小行星的傷害。 這讓人想起經典的街機“ 小行星豪華版 ”。 如果要運行演示,請向下滾動并單擊下面的WebStart按鈕。 在啟動游戲之前,請先閱讀要求。

什么是雪碧?

根據Wikipedia的說法,“ 子畫面是整合到更大場景中的二維圖像或動畫。” 從Java游戲世界的角度來看,子畫面是一個對象,其中包含圖像幀和基于要動畫化到場景區域上的演員的上下文的其他數據。 在沃爾特·迪斯尼 ( Walt Disney)時代 ,用鉛筆和紙畫漫畫時,藝術家制作了許多圖畫,成為了動畫。 這個例子指向了翻書的創建。 我確定您小時候就已經制作了翻書。 我知道我做到了 我曾經在筆記本的各個角落進行涂鴉和制作炫酷的動畫。 在我們的Asteroid型游戲中,我創建了一個sprite對象,其中包含像翻書一樣預先旋轉的飛船的所有圖像( ImageView )。 為了使船轉彎具有動畫效果,我使當前幀可見,而其余幀不可見。 與翻書類似,它似乎圍繞其中心(樞軸)點旋轉。 子畫面還可以包含其他信息,例如速度或健康點。

碰撞檢測

當演員或小精靈在整個場景中設置動畫時,游戲引擎將檢查每個小精靈是否與其他小精靈相互沖突,以確定它們是否相互碰撞。 此過程應該非常有效,尤其是當您在屏幕上移動大量精靈時。 在效率方面需要權衡。 因為游戲循環中的每個循環都會檢查碰撞,所以更精確通常會降低性能。 許多游戲會使用圖像的邊界區域來確定兩個精靈是否相互碰撞。 一些游戲使用矩形作為邊界區域。 下面的圖2中顯示了兩個精靈碰撞:

圖2邊界框為矩形碰撞區域。

我敢肯定,到現在為止,當圍繞角色的像素是透明的時,游戲中的大多數角色(圖像)都不會顯示為矩形。 但是,即使像素是透明的,演員或圖像的確是矩形的。

圖3描繪了一個演員圖像

那些使用矩形邊界區域的游戲通常會在精靈圖像中刻出邊界框。 如圖4下方所示,兩個矩形邊界區域(橙色和綠色)被刻在宇宙飛船圖像中。

圖4兩個用作碰撞邊界框的矩形。

我相信您會注意到船和機翼的鼻尖沒有被任何一個邊界盒覆蓋。 這意味著,當小行星與子畫面的無界區域重疊時,不會發生碰撞。 有些游戲使用這種策略。 您會注意到,子畫面的矩形邊界區域很小,并放置在子畫面圖像的關鍵區域中。 對于多邊形和其他非矩形形狀,使用更好的算法會發現更高的精度。 在此博客文章中,我基本上將圓形用作邊界區域,而不是矩形。 我本可以使每個精靈包含一組碰撞形狀,但我選擇為每個精靈只設置一個碰撞區域。 每個碰撞區域在場景圖上將為圓形。 對于宇宙飛船,我根據飛船的中心點劃了一個圓圈,半徑擴展到了飛船的駕駛艙。 下圖5中顯示了該船的有界圓形碰撞區域,用紅色圓圈表示。

圖5船舶的碰撞區域。

我選擇一個圓作為邊界區域是因為相對容易根據距離公式 ( 勾股定理 )確定兩個對象的碰撞,該距離公式僅需要每個子圖形的邊界區域的中心點及其半徑。 在基于兩個中心點計算距離之后,您將比較結果以查看它是否小于或等于兩個半徑的總和。 如果結果確實小于或等于兩個半徑的總和,則發生了碰撞。 圖6描述了距離公式如何與圓形邊界區域的兩個中心點相關。

圖6兩個中心點之間的距離公式。

以下代碼從GameWorld類創建主游戲循環:

@Overridepublic void handle(javafx.event.ActionEvent event) {// update actorsupdateSprites();// check for collisioncheckCollisions();// removed dead thingscleanupSprites();}

下面的代碼從GameWorld類創建checkCollision()方法:

protected void checkCollisions() {// check other sprite's collisionsspriteManager.resetCollisionsToCheck();// check each sprite against other sprite objects.for (Sprite spriteA : spriteManager.getCollisionsToCheck()) {for (Sprite spriteB : spriteManager.getAllSprites()) {if (handleCollision(spriteA, spriteB)) {// The break helps optimize the collisions//  The break statement means one object only hits another// object as opposed to one hitting many objects.// To be more accurate comment out the break statement.break;}}}}

派生的Game World( TheExpanse )類對其handleCollision()方法的實現:

/*** How to handle the collision of two sprite objects.** @param spriteA Sprite from the first list.* @param spriteB Sprite from the second list.* @return boolean returns a true if the two sprites have collided otherwise false.*/@Overrideprotected boolean handleCollision(Sprite spriteA, Sprite spriteB) {if (spriteA != spriteB) {if (spriteA.collide(spriteB)) {if (spriteA != myShip) {spriteA.handleDeath(this);}if (spriteB != myShip) {spriteB.handleDeath(this);}}}return false;}

Sprite類使用距離公式的collide()方法的默認實現:

public boolean collide(Sprite other) {if (collisionBounds == null || other.collisionBounds == null) {return false;}// determine it's sizeCircle otherSphere = other.collisionBounds;Circle thisSphere = collisionBounds;Point2D otherCenter = otherSphere.localToScene(otherSphere.getCenterX(), otherSphere.getCenterY());Point2D thisCenter = thisSphere.localToScene(thisSphere.getCenterX(), thisSphere.getCenterY());double dx = otherCenter.getX() - thisCenter.getX();double dy = otherCenter.getY() - thisCenter.getY();double distance = Math.sqrt(dx * dx + dy * dy);double minDist = otherSphere.getRadius() + thisSphere.getRadius();return (distance < minDist);}

Sprite類的handleDeath()方法的默認實現:

public void handleDeath(GameWorld gameWorld) {gameWorld.getSpriteManager().addSpritesToBeRemoved(this);}

Atom (小行星或導彈)類將覆蓋handleDeath()方法:

public void handleDeath(GameWorld gameWorld) {implode(gameWorld);super.handleDeath(gameWorld);}

JavaFX 2 Sprite和碰撞演示

這個簡單的演示游戲將是星際爭霸和小行星之間的混合體。 使用鼠標導航飛船時,您會注意到控件類似于StarCraft的Battle Cruiser 。 目的是在武器撞擊您的飛船或其他因撞擊而爆炸的球體之前向它們發射武器。 由于這是一個簡單的教程,甚至是處于開發初期的游戲,因此該游戲無法跟蹤得分。 我鼓勵您去GitHub下載代碼并增強游戲。 為了簡潔起見,我不會顯示所有代碼更改,但是我相信您會在這里訪問GitHub: https : //github.com/carldea/JFXGen,以獲取所有演示和源代碼。

要求

  • Java 7或更高版本
  • JavaFX 2.1或更高版本
  • Windows XP或更高版本(應該很快可用于Linux / MacOS)

一個簡單的小行星類型游戲,名為“ The Expanse”。

說明:

  • 右鍵單擊(在Windows上)以飛船。
  • 單擊鼠標左鍵(在Windows鼠標上單擊鼠標左鍵)即可射擊武器。
  • 按鍵'2? 變成大型導彈。 (藍色圓形彈丸)
  • 其他按鍵默認為較小的導彈。 (紅色圓形彈丸)
  • 按下空格鍵將切換力場,以保護飛船免受敵人和小行星的傷害。

單擊下面的啟動按鈕以啟動演示: 教程演示

繼續本教程的第5部分 。

相關文章

Sprite的定義: http : //en.wikipedia.org/wiki/Sprite_%28computer_graphics%29

沃爾特·迪斯尼(Walt Disney): http : //en.wikipedia.org/wiki/Walt_Disney

如何制作翻書: http : //www.bitrebels.com/design/how-to-create-a-flip-book/

JavaFX的ImageView: http : //docs.oracle.com/javafx/2/api/javafx/scene/image/ImageView.html

碰撞檢測:http: //zetcode.com/tutorials/javagamestutorial/collision/

Java中的AABB碰撞檢測: http : //www.youtube.com/watch?v = JIxV-LXqa1g

勾股定理: http : //en.wikipedia.org/wiki/Pythagorean_theorem

距離公式: http : //en.wikipedia.org/wiki/Distance

嚴肅的Asteroids Deluxe游戲(Youtube): http : //www.youtube.com/watch?v= 6DG-GJENHgg

參考:來自我們的JCG合作伙伴 Carl Dea的JavaFX 2 GameTutorial第4部分 ,位于Carl's FX Blog博客上。


翻譯自: https://www.javacodegeeks.com/2012/06/javafx-2-gametutorial-part-4.html

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

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

相關文章

關于ListView的作業

原生布局并未多做修改 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http://schemas.android.com/tools" android:id"id/activity_m…

Java 7的類型推斷

每個優秀的程序員都喜歡編寫簡潔但有效且經過優化的代碼。 類型推斷是JDK 7中引入的一種方法&#xff0c;它肯定會為您帶來更少鍵入的好處。 您以以下方式使用Java代碼已有很長時間了。 但是&#xff0c;在初始化Collections的特定實現時&#xff0c;您是否曾經想到過代碼重復&…

python實現膠囊網絡_膠囊網絡 -- Capsule Networks

膠囊網絡是 vector in vector out的結構&#xff0c;最后對每個不同的類別&#xff0c;輸出不一個向量&#xff0c;向量的模長表示屬于該類別的概率。例如&#xff0c;在數字識別中&#xff0c;兩個數字雖然重疊在一起&#xff0c;Capsule中的兩個向量能完整表達兩個數字的特征…

基變換與過渡矩陣

取定線性空間的一組基&#xff0c;任何一組向量可以表示為基向量的線性組合&#xff0c;且是同構映射。兩個線性空間是同構。 不同的基向量&#xff0c;基向量之間的過渡矩陣 取線性空間的兩組基任一向量可以表示為這兩組向量的線性組合將一組基向量表示為另外基向量的線性組合…

bootstrap的滾動監聽

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1,maximum-scale1, user-scalableno"><title>下拉菜單和滾動監…

java構造函數_JAVA的構造函數是怎么寫的。萬分感謝。路過的請不要嘲笑%_%

展開全部JAVA的構造函數是&#xff1a;SetLocal EnableDelayedExpansionset classpath.for %%c in (lib\*.jar) do set classpath!32313133353236313431303231363533e59b9ee7ad9431333431363030classpath!;%%cset classpath%classpath%;./classes;java com.ham.server.Server。…

在Spring中使用Redis

隨著NoSQL解決方案在許多問題上越來越受歡迎&#xff0c;現代項目越來越多地考慮使用一些&#xff08;或幾種&#xff09;NoSQL代替&#xff08;或并排&#xff09;傳統RDBMS。 我已經在本 &#xff0c; 本和本文章中介紹了我在MongoDB上的經驗。 在本文中&#xff0c;我想對Re…

C# 中winform的一些屬性設置

1 窗體的大小固定住&#xff0c;不能調整其大小 窗體FormBorderStyle 屬性設置為 FixedSingle; MaximizeBox 屬性設置為false; MinimizeBox 屬性設置為 false; 2. 在狀態欄中無圖標顯示 設置為fase即可。 3. 設置窗體的啟動位置 方法1&#xff0c; 用代碼控制 this.Location …

LiveBos---按鈕成下拉

轉載于:https://www.cnblogs.com/luhanzhen/p/6802779.html

Solr:創建拼寫檢查器

在上一篇文章中&#xff0c;我談到了Solr Spellchecker的工作原理&#xff0c;然后向您展示了其性能的一些測試結果。 現在&#xff0c;我們將看到另一種拼寫檢查方法。 與其他方法一樣&#xff0c;此方法使用兩步過程。 相當快速的“候選單詞”選擇&#xff0c;然后對這些單詞…

linux修改機器名稱

1 使用hostname命令&#xff1a;hostname 新機器名稱 2 修改vi /etc/sysconfig/network # cat /etc/sysconfig/network NETWORKINGyes HOSTNAMElocalhost.localdomain 注意&#xff1a;左側都必須大寫&#xff0c;等號附件沒有空格。 查看機器名稱使用hostname命令 轉載于:h…

java property_property在Java中的用法

展開全部在項目中經常用到各種配置文件62616964757a686964616fe78988e69d8331333337623561&#xff0c;有.properties的&#xff0c;也有.xml格式的都可以通過java.utils.Property類進行處理。1. 讀取.properties文件File pFile new File("test.properties");FileIn…

Django 和 html

下面是對應的形式&#xff0c;自定義的forms 轉載于:https://www.cnblogs.com/kilen/p/6804047.html

Grails動態下拉菜單

最近&#xff0c;我有一個UI要求&#xff0c;客戶希望從兩個單獨的下拉列表中選擇值。 第一個下拉列表的值實質上過濾了第二個下拉列表的值。 鑒于我們支持的財務項目對UI的要求并不嚴格&#xff0c;因此我不得不進行一些初步的學習和實驗&#xff0c;以實現良好的實施。 這篇博…

【Java大系】Java快速教程

感謝原作者&#xff1a;Vamei 出處&#xff1a;http://www.cnblogs.com/vamei Java是面向對象語言。這門語言其實相當年輕&#xff0c;于1995年才出現&#xff0c;由Sun公司出品。James Gosling領導了Java的項目小組。該項目的最初只想為家電設計一門容易移植的語言。然而&am…

[轉]前端構建工具gulpjs的使用介紹及技巧

本文轉自&#xff1a;http://www.cnblogs.com/2050/p/4198792.html gulpjs是一個前端構建工具&#xff0c;與gruntjs相比&#xff0c;gulpjs無需寫一大堆繁雜的配置參數&#xff0c;API也非常簡單&#xff0c;學習起來很容易&#xff0c;而且gulpjs使用的是nodejs中stream來讀取…

Eclipse側邊欄Outline設置字體

Eclipse的Outline&#xff0c;Project Explorer&#xff0c;Call Hierarchy等小窗口是很方便的功能&#xff0c;但是遇到函數名或文件名很長的情況&#xff0c;就只能顯示前半段。盡管Eclipse的自定義程度很高&#xff0c;但是卻找不到這些窗口的字體設置。 經過一番摸索后&…

AOP的簡單介紹

為什么使用AOP&#xff0c;一個簡單的回答這個問題的方法是顯示一個橫切關注點的實現而不使用AOP。 考慮一個簡單的服務及其實現&#xff1a; public interface InventoryService {public Inventory create(Inventory inventory);public List<inventory> list();public I…

java實現表達式求值_如何編寫一個高效的Java表達式求值程序

雖然&#xff0c;這個題目是有一點奪人眼球&#xff0c;但我真實這么做了(關是以否信任基準測試效果&#xff0c;這是其他一個話題)。所以&#xff0c;上周我一貫在找一個小型、適用的競賽爭辯數學表達式的類庫。有功夫我在stackoverflow上看到了一個帖子&#xff0c;里面舉薦的…

兩張表的笛卡爾積用sql語句

第一個表的行數乘以第二個表的行數等于笛卡爾積結果集的大小SELECT * FROM table1 CROSS JOIN table2轉載于:https://www.cnblogs.com/henuyuxiang/p/6811717.html