避免敌人!这是用克里制作的简单游戏。

发布于:2020-12-30 11:24:19

0

66

0

Java 制作 简单的游戏

遵循本教程并学习如何使用Kree Java制作简单的游戏。了解如何创建场景,创建GameObject,将组件添加到GameObject,收集用户输入,创建自定义组件,生成随机数以及检测碰撞。

你需要什么

  • Kree v1.9或最新版本

  • Eclipse IDE

你会学到什么

  • 创建场景

  • 创建一个GameObject

  • 向游戏对象添加组件

  • 从用户那里获取输入

  • 创建自定义组件

  • 创造球员运动

  • 使用Kree产生随机数

  • 检测碰撞

制备

  1. 设置Java项目并将Kree添加到构建路径

  2. 创建一个名为避免的包

创建启动器类

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类非常有用。

接下来做什么?

为了使游戏更具可定制性,我们将在此处结束教程。让您的创造力决定下一步的发展。

但是在这里结束之前,让我给您一些改善游戏的技巧:

  • 添加用户界面!

  • 添加粒子系统!

恭喜您完成本教程!