发布于:2020-12-30 11:24:19
0
68
0
遵循本教程并学习如何使用Kree Java制作简单的游戏。了解如何创建场景,创建GameObject,将组件添加到GameObject,收集用户输入,创建自定义组件,生成随机数以及检测碰撞。
你需要什么
Kree v1.9或最新版本
Eclipse IDE
你会学到什么
创建场景
创建一个GameObject
向游戏对象添加组件
从用户那里获取输入
创建自定义组件
创造球员运动
使用Kree产生随机数
检测碰撞
制备
设置Java项目并将Kree添加到构建路径
创建一个名为避免的包
创建启动器类
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(); } }
在这一节课中,我们将添加主课。
在第11行中,我们将为我们的窗口创建一个实例,该实例带有3个参数:窗口标题,窗口宽度和窗口高度。
在第12行中,我们将为我们的Game创建一个实例,该实例采用Window参数。在Game类中,这是所有操作(例如游戏循环,用户输入等)的开始位置。
最后,我们拥有 game.start() 这将触发游戏的开始。
创建场景
在Kree中创建场景非常简单。
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() { } }
您可以在我们将要使用的本教程中为您的场景命名GameScene。您的场景必须扩展Scene类,这样Kree才能了解您正在创建一个Scene。
将我们的GameScene类扩展到Scene Eclipse后,将给我们一个错误。不要担心,我们只需要实现一些未实现的方法,例如Initialize,Render和Update。
创建场景后,将调用一次Initialize方法。
Update&Render方法每秒调用60次。
设置我们的活跃场景
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行中,我们将创建带有1个参数的GameScene类的实例,在第16行中,将访问具有1个场景参数的SceneManager类方法setScene。
创建我们的播放器并添加组件
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行中,我们将玩家对象初始化为一个新的GameObject,该对象带有2个参数,即父场景和GameObject名称。
在第23行中,我们将播放器的位置设置为窗口的中心,以进行访问上面代码所示的窗口中的一些变量的操作。
在第24行中,我们将对象的比例设置为32 x 32像素,最后,我们添加了一个名为MeshRenderer的组件,以根据玩家的位置和比例渲染简单的矩形形状。
创建自定义组件并添加玩家移动
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中创建自定义组件与创建场景非常相似,但是在创建自定义组件时,我们需要将类扩展为Component类,以便可以将其添加到GameObject中。
在本教程中,我们将采用独特的方法来创建玩家的动作。我们将采用的实现方式是,只要单击鼠标即可在玩家使用Kree在游戏中实现此操作时跟随玩家跟随鼠标,这非常简单,我们将在Vector2上使用的方法,该方法moveTowards需要2个参数,第一个是Vector2和浮动速度。
为了实现这一机制,我们将需要创建一个Vector2对象,该对象将成为我们的目标,并且在Update方法中,只要单击鼠标左键就可以对其进行更新。
在第20行中,您可能会有点困惑。这是为了防止我们的程序在尝试访问GameObject时出错。
您可能会对gameobject我们正在访问的变量感到困惑。基本上,当您将组件添加到GameObject时,gameobject变量将分配给GameObject。
创造敌人
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); } }
创建敌人与创建玩家的过程类似,但是为了使游戏更具多样性,我们在敌人的位置上增加了一些随机性。
用Kree生成随机数很简单,我们只需要访问Kree内置的Random类上的方法。 Random.range(min, max)
为了使我们的敌人更加危险,我们添加了一个机制,使敌人应该跟随玩家,但要比玩家更慢,这样我们的敌人就不会被压倒。
检测碰撞
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); } }
为了检测敌人是否击中了我们的玩家,我们将使用来自Vecto2的静态类,该类是将返回两个向量之间距离的距离。
您可以看到我们在这里使用了Debug类来调试我们的游戏。当我们在代码中调试某些东西时,Debug类非常有用。
接下来做什么?
为了使游戏更具可定制性,我们将在此处结束教程。让您的创造力决定下一步的发展。
但是在这里结束之前,让我给您一些改善游戏的技巧:
添加用户界面!
添加粒子系统!
恭喜您完成本教程!
作者介绍