51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

java游戏开发入门(六) - 变量 & UI

前言 {#前言}

  上一章我们讲了物理引擎,这章我们讲变量与UI,以及数据绑定。

编码 {#编码}

首先我们创建一个变量 {#首先我们创建一个变量}

	/**
     * 初始化变量
     * @param vars
     */
    @Override
    protected void initGameVars(Map<String, Object> vars) {
        vars.put("integral",0);
    }

  此时我们得到了一个integral 的变量用来存储当前分数,当我们的Player对象与Gold对象发生碰撞时,integral加一,所以此时我们还需要修改Player与Gold实体的碰撞处理

修改碰撞逻辑 {#修改碰撞逻辑}

  当我们的Player对象与Gold对象发生碰撞时,integral加一,并且在游戏内随机位置再生成一个Gold对象。

    /**
     * 初始化物理引擎(碰撞效果)
     */
    @Override
    protected void initPhysics() {
        getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){
            @Override
            protected void onCollisionBegin(Entity player, Entity gold) {
                //将gold对象从游戏中移除
                gold.removeFromWorld();
                // 设置参数+1
                inc("integral",+1);
                // 在界面内随机位置生成一个 Gold对象
                spawn("Gold", FXGLMath.random(0,getAppWidth()-50),FXGLMath.random(0,getAppHeight()-50));
            }
        });
    }

初始化UI并将UI与变量绑定绑定 {#初始化ui并将ui与变量绑定绑定}

  此时我们创建了一个文字UI并将其与integral参数绑定,之后修改integral变量的值UI对应的显示也会动态修改。最后我们将文字UI添加到游戏内。

    /**
     * 初始化UI
     */
    @Override
    protected void initUI() {
        // 初始化 Text 字体大小18 颜色 粉色
        var scoreText = getUIFactoryService().newText("", Color.PINK, 18);
        scoreText.textProperty().bind(getip("integral").asString("分数: %d"));
        addUINode(scoreText, 10, 30);
    }

于是我们就得到了这样一个效果 {#于是我们就得到了这样一个效果}

得分
得分

完整代码 {#完整代码}

import com.almasb.fxgl.app.GameApplication;
import com.almasb.fxgl.app.GameSettings;
import com.almasb.fxgl.core.math.FXGLMath;
import com.almasb.fxgl.dsl.FXGL;
import com.almasb.fxgl.entity.Entity;
import com.almasb.fxgl.physics.CollisionHandler;
import javafx.scene.input.KeyCode;
import javafx.scene.paint.Color;

import java.util.Map;

import static com.almasb.fxgl.dsl.FXGL.*;

/**

  • @author lhDream */ public class HelloWorldApp extends GameApplication {

    /**

    • 玩家实体 */ private Entity player;

    /**

    • 初始化设置

    • @param settings 配置对象 */ @Override protected void initSettings(GameSettings settings) { settings.setTitle("Hello world"); settings.setWidth(600); settings.setHeight(600);

      settings.setMainMenuEnabled(true); settings.setGameMenuEnabled(true); }

    /**

    • 初始化游戏内容 */ @Override protected void initGame() { // 注册实体工厂 FXGL.getGameWorld().addEntityFactory(new DemoEntityFactory());

      // 在界面正中间生成玩家实体 player = FXGL.spawn("Player",FXGL.getAppWidth()/2,FXGL.getAppHeight()/2);

      // 在界面200,200位置生成一个Gold实体 spawn("Gold", 200,200); }

    /**

    • 初始化输入 */ @Override protected void initInput() { onKey(KeyCode.W,"上",()->{ player.translateY(-5); }); onKey(KeyCode.S,"下",()->{ player.translateY(+5); }); onKey(KeyCode.A,"左",()->{ player.translateX(-5); }); onKey(KeyCode.D,"右",()->{ player.translateX(+5); }); }

    /**

    • 初始化物理引擎(碰撞效果) */ @Override protected void initPhysics() { getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){ @Override protected void onCollisionBegin(Entity player, Entity gold) { //将gold对象从游戏中移除 gold.removeFromWorld(); // 设置参数+1 inc("integral",+1); // 在界面内随机位置生成一个 Gold对象 spawn("Gold", FXGLMath.random(0,getAppWidth()-50),FXGLMath.random(0,getAppHeight()-50)); } }); }

    /**

    • 初始化参数

    • @param vars */ @Override protected void initGameVars(Map<String, Object> vars) { vars.put("integral",0); }

    /**

    • 初始化UI */ @Override protected void initUI() { // 初始化 Text 字体大小18 颜色 粉色 var scoreText = getUIFactoryService().newText("", Color.PINK, 18); scoreText.textProperty().bind(getip("integral").asString("分数: %d")); addUINode(scoreText, 10, 30); }

    /** ``

    • main 程序的开始

    • @paramargs 参数 */``publicstaticvoidmain(String[] args){ launch(args); } }

完整项目 {#完整项目}

https://github.com/lhDream/lhDreamGameDemo/tree/master/HelloWorld

赞(3)
未经允许不得转载:工具盒子 » java游戏开发入门(六) - 变量 & UI