發(fā)布于:2020-12-30 11:24:19
0
82
0
遵循本教程并學(xué)習(xí)如何使用Kree Java制作簡(jiǎn)單的游戲。了解如何創(chuàng)建場(chǎng)景,創(chuàng)建GameObject,將組件添加到GameObject,收集用戶輸入,創(chuàng)建自定義組件,生成隨機(jī)數(shù)以及檢測(cè)碰撞。
你需要什么
Kree v1.9或最新版本
Eclipse IDE
你會(huì)學(xué)到什么
創(chuàng)建場(chǎng)景
創(chuàng)建一個(gè)GameObject
向游戲?qū)ο筇砑咏M件
從用戶那里獲取輸入
創(chuàng)建自定義組件
創(chuàng)造球員運(yùn)動(dòng)
使用Kree產(chǎn)生隨機(jī)數(shù)
檢測(cè)碰撞
制備
設(shè)置Java項(xiàng)目并將Kree添加到構(gòu)建路徑
創(chuàng)建一個(gè)名為避免的包
創(chuàng)建啟動(dòng)器類
package avoid; import dev.jabo.kree.Game; import dev.jabo.kree.Window; public class Launcher { public static void main(String[] args) { Window window = new Window("Avoid the Enemy", 800, 600); Game game = new Game(window); game.start(); } }
在這一節(jié)課中,我們將添加主課。
在第11行中,我們將為我們的窗口創(chuàng)建一個(gè)實(shí)例,該實(shí)例帶有3個(gè)參數(shù):窗口標(biāo)題,窗口寬度和窗口高度。
在第12行中,我們將為我們的Game創(chuàng)建一個(gè)實(shí)例,該實(shí)例采用Window參數(shù)。在Game類中,這是所有操作(例如游戲循環(huán),用戶輸入等)的開(kāi)始位置。
最后,我們擁有 game.start() 這將觸發(fā)游戲的開(kāi)始。
創(chuàng)建場(chǎng)景
在Kree中創(chuàng)建場(chǎng)景非常簡(jiǎn)單。
package avoid; import java.awt.Graphics; import dev.jabo.kree.Game; import dev.jabo.kree.Input; public class GameScene extends Scene { public GameScene(Game game) { super(game); } @Override public void Initialize() { } @Override public void Render(Graphics g) { } @Override public void Update() { } }
您可以在我們將要使用的本教程中為您的場(chǎng)景命名GameScene。您的場(chǎng)景必須擴(kuò)展Scene類,這樣Kree才能了解您正在創(chuàng)建一個(gè)Scene。
將我們的GameScene類擴(kuò)展到Scene Eclipse后,將給我們一個(gè)錯(cuò)誤。不要擔(dān)心,我們只需要實(shí)現(xiàn)一些未實(shí)現(xiàn)的方法,例如Initialize,Render和Update。
創(chuàng)建場(chǎng)景后,將調(diào)用一次Initialize方法。
Update&Render方法每秒調(diào)用60次。
設(shè)置我們的活躍場(chǎng)景
package avoid; import dev.jabo.kree.Game; import dev.jabo.kree.SceneManager; import dev.jabo.kree.Window; public class Launcher { public static void main(String[] args) { Window window = new Window("Avoid the Enemy", 800, 600); Game game = new Game(window); GameScene gameScene = new GameScene(game); SceneManager.setScene(gameScene); game.start(); } }
在第14行中,我們將創(chuàng)建帶有1個(gè)參數(shù)的GameScene類的實(shí)例,在第16行中,將訪問(wèn)具有1個(gè)場(chǎng)景參數(shù)的SceneManager類方法setScene。
創(chuàng)建我們的播放器并添加組件
package avoid; import java.awt.Graphics; import dev.jabo.kree.Game; import dev.jabo.kree.GameObject; import dev.jabo.kree.Scene; import dev.jabo.kree.Vector2; import dev.jabo.kree.components.MeshRenderer; public class GameScene extends Scene { private GameObject player; public GameScene(Game game) { super(game); } @Override public void Initialize() { player = new GameObject(this, "Player"); player.getTransform().setPosition(new Vector2(game.getWindow().getWindowWidth() / 2, game.getWindow().getWindowHeight() / 2)); player.getTransform().setScale(new Vector2(32, 32)); player.addComponent(new MeshRenderer()); } @Override public void Render(Graphics g) { } @Override public void Update() { } }
在第22行中,我們將玩家對(duì)象初始化為一個(gè)新的GameObject,該對(duì)象帶有2個(gè)參數(shù),即父場(chǎng)景和GameObject名稱。
在第23行中,我們將播放器的位置設(shè)置為窗口的中心,以進(jìn)行訪問(wèn)上面代碼所示的窗口中的一些變量的操作。
在第24行中,我們將對(duì)象的比例設(shè)置為32 x 32像素,最后,我們添加了一個(gè)名為MeshRenderer的組件,以根據(jù)玩家的位置和比例渲染簡(jiǎn)單的矩形形狀。
創(chuàng)建自定義組件并添加玩家移動(dòng)
package avoid; import java.awt.Graphics; import dev.jabo.kree.Component; import dev.jabo.kree.Input; import dev.jabo.kree.Vector2; public class Player extends Component { private Vector2 playerTarget; public Player() { } @Override public void Update() { if(gameObject == null) return; if(Input.leftMouseDown) { playerTarget = Input.getMouse(); } gameObject.getTransform().getPosition().moveTowards(playerTarget, 5f); } @Override public void Render(Graphics g) { } }
在Kree中創(chuàng)建自定義組件與創(chuàng)建場(chǎng)景非常相似,但是在創(chuàng)建自定義組件時(shí),我們需要將類擴(kuò)展為Component類,以便可以將其添加到GameObject中。
在本教程中,我們將采用獨(dú)特的方法來(lái)創(chuàng)建玩家的動(dòng)作。我們將采用的實(shí)現(xiàn)方式是,只要單擊鼠標(biāo)即可在玩家使用Kree在游戲中實(shí)現(xiàn)此操作時(shí)跟隨玩家跟隨鼠標(biāo),這非常簡(jiǎn)單,我們將在Vector2上使用的方法,該方法moveTowards需要2個(gè)參數(shù),第一個(gè)是Vector2和浮動(dòng)速度。
為了實(shí)現(xiàn)這一機(jī)制,我們將需要?jiǎng)?chuàng)建一個(gè)Vector2對(duì)象,該對(duì)象將成為我們的目標(biāo),并且在Update方法中,只要單擊鼠標(biāo)左鍵就可以對(duì)其進(jìn)行更新。
在第20行中,您可能會(huì)有點(diǎn)困惑。這是為了防止我們的程序在嘗試訪問(wèn)GameObject時(shí)出錯(cuò)。
您可能會(huì)對(duì)gameobject我們正在訪問(wèn)的變量感到困惑?;旧希?dāng)您將組件添加到GameObject時(shí),gameobject變量將分配給GameObject。
創(chuàng)造敵人
package avoid; import java.awt.Color; import java.awt.Graphics; import dev.jabo.kree.Game; import dev.jabo.kree.GameObject; import dev.jabo.kree.Random; import dev.jabo.kree.Scene; import dev.jabo.kree.Vector2; import dev.jabo.kree.components.MeshRenderer; public class GameScene extends Scene { private GameObject player; private GameObject enemy; public GameScene(Game game) { super(game); } @Override public void Initialize() { // Player player = new GameObject(this, "Player"); player.getTransform().setPosition(new Vector2(game.getWindow().getWindowWidth() / 2, game.getWindow().getWindowHeight() / 2)); player.getTransform().setScale(new Vector2(32, 32)); player.addComponent(new MeshRenderer()); player.addComponent(new Player()); // Enemy enemy = new GameObject(this, "Enemy"); enemy.getTransform().setPosition(new Vector2(Random.range(0, game.getWindow().getWindowWidth()), Random.range(0, game.getWindow().getWindowHeight()))); enemy.getTransform().setScale(new Vector2(32, 32)); enemy.addComponent(new MeshRenderer()); ((MeshRenderer) enemy.getComponent("Mesh Renderer")).setColor(Color.RED); } @Override public void Render(Graphics g) { } @Override public void Update() { enemy.getTransform().getPosition().moveTowards(player.getTransform().getPosition(), 3f); } }
創(chuàng)建敵人與創(chuàng)建玩家的過(guò)程類似,但是為了使游戲更具多樣性,我們?cè)跀橙说奈恢蒙显黾恿艘恍╇S機(jī)性。
用Kree生成隨機(jī)數(shù)很簡(jiǎn)單,我們只需要訪問(wèn)Kree內(nèi)置的Random類上的方法。 Random.range(min, max)
為了使我們的敵人更加危險(xiǎn),我們添加了一個(gè)機(jī)制,使敵人應(yīng)該跟隨玩家,但要比玩家更慢,這樣我們的敵人就不會(huì)被壓倒。
檢測(cè)碰撞
package avoid; import java.awt.Color; import java.awt.Graphics; import dev.jabo.kree.Debug; import dev.jabo.kree.Game; import dev.jabo.kree.GameObject; import dev.jabo.kree.Random; import dev.jabo.kree.Scene; import dev.jabo.kree.Vector2; import dev.jabo.kree.components.BoxCollider; import dev.jabo.kree.components.MeshRenderer; public class GameScene extends Scene { private GameObject player; private GameObject enemy; public GameScene(Game game) { super(game); } @Override public void Initialize() { // Player player = new GameObject(this, "Player"); player.getTransform().setPosition(new Vector2(game.getWindow().getWindowWidth() / 2, game.getWindow().getWindowHeight() / 2)); player.getTransform().setScale(new Vector2(32, 32)); player.addComponent(new MeshRenderer()); player.addComponent(new Player()); // Enemy enemy = new GameObject(this, "Enemy"); enemy.getTransform().setPosition(new Vector2(Random.range(0, game.getWindow().getWindowWidth()), Random.range(0, game.getWindow().getWindowHeight()))); enemy.getTransform().setScale(new Vector2(32, 32)); enemy.addComponent(new MeshRenderer()); ((MeshRenderer) enemy.getComponent("Mesh Renderer")).setColor(Color.RED); } @Override public void Render(Graphics g) { } @Override public void Update() { if(Vector2.distance(player.getTransform().getPosition(), enemy.getTransform().getPosition()) < 16) { Debug.log("We've been hit!"); } enemy.getTransform().getPosition().moveTowards(player.getTransform().getPosition(), 3f); } }
為了檢測(cè)敵人是否擊中了我們的玩家,我們將使用來(lái)自Vecto2的靜態(tài)類,該類是將返回兩個(gè)向量之間距離的距離。
您可以看到我們?cè)谶@里使用了Debug類來(lái)調(diào)試我們的游戲。當(dāng)我們?cè)诖a中調(diào)試某些東西時(shí),Debug類非常有用。
接下來(lái)做什么?
為了使游戲更具可定制性,我們將在此處結(jié)束教程。讓您的創(chuàng)造力決定下一步的發(fā)展。
但是在這里結(jié)束之前,讓我給您一些改善游戲的技巧:
添加用戶界面!
添加粒子系統(tǒng)!
恭喜您完成本教程!
作者介紹
熱門(mén)博客推薦