泛克里金和普通克里金_避免敌人! 这是用克里制作的简单游戏。

泛克里金和普通克里金

你需要什么

  • Kree v1.9或最新版本
  • Eclipse IDE

您将学到什么

  • 创建场景
  • 创建一个游戏对象
  • 向游戏对象添加组件
  • 从用户那里获取输入
  • 创建自定义组件
  • 创造球员运动
  • 使用Kree产生随机数
  • 检测碰撞

制备

  1. 设置您的Java项目并将Kree添加到您的构建路径
  2. 创建一个名为避免的包

还请参见: Java 15:密封的类使Valhalla更近了一步

创建启动器类

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。

game.start()应该始终在主类的结尾

创建我们的播放器并添加组件

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)

为了使我们的敌人更加危险,我们添加了一个机制,使敌人应该跟随玩家,但要比玩家更慢,这样我们的敌人就不会过于强大。

还请参见: 将Python与Java集成

检测碰撞

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);

}

}

您可能会注意到,由于这一原因,我们没有使用BoxCollider类,原因是Kree v1.9上的BoxCollider是一个非常小的bug,将很快修复。

为了检测敌人是否击中了我们的玩家,我们将使用Vecto2中的静态类,该类是将返回两个向量之间距离的距离。

您可以看到我们在这里使用了Debug类来调试我们的游戏。 当我们在代码中调试某些东西时,Debug类非常有用。

接下来做什么?

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

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

  • 添加用户界面!
  • 添加粒子系统!

恭喜您完成本教程!

需要帮忙?

请随意浏览本网站提供的文档。

加入我们,与Discord携手共进。

翻译自: https://jaxenter.com/kree-avoid-the-enemy-172088.html

泛克里金和普通克里金

你可能感兴趣的:(游戏,python,java,游戏开发,js)