栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java游戏开发入门(七) - 计时器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java游戏开发入门(七) - 计时器

java游戏开发入门(七) - 计时器

前言函数说明

在一秒钟之后执行一次每隔0.5秒执行一次 实例

目标效果敌方实体定时创建敌方实体碰撞效果效果展示完整代码

HelloWorldApp.javaDemoEntityFactory.javaEntityType.java 完整项目

前言

  上一章我们讲了变量与UI,这章我们讲FXGL的计时器。

函数说明 在一秒钟之后执行一次
runOnce(()->{
    // ...
}, Duration.seconds(1));
每隔0.5秒执行一次
run(()->{
    // ...
},Duration.seconds(0.5));
实例 目标效果

每隔一秒在游戏的上方随机位置生成一个敌人,并向下移动; 当Player与敌方实体碰撞时扣除1分。

敌方实体

  首先我们需要定义一个敌方实体类型,并初始化敌方实体的生成工厂。

public enum EntityType {
    PLAYER,GOLD,ENEMY
}

敌方实体

 @Spawns("Enemy")
 public Entity newEnemy(SpawnData data){
     // 移动速度, 200 - 400 内随机
     var speed = FXGLMath.random(200,400);
     return FXGL.entityBuilder(data)
             //声明设备类型
             .type(EntityType.ENEMY)
             // 根据UI大小自动生成碰撞体积
             .collidable()
             .with(new ProjectileComponent(new Point2D(0, 1), speed))
             // 宽 50px 高 50px 颜色蓝色
             .viewWithBBox(new Rectangle(50,50, Color.BLUE))
             // 超出边界移除实体
             .with(new OffscreenCleanComponent())
             .build();
 }
定时创建敌方实体
// 每秒生成一个敌方实体
run(()->{
    // 生成坐标
    var x = FXGLMath.random(0,getAppWidth()-50);
    var y = FXGLMath.random(-50,0);

    spawn("Enemy",x,y);
},Duration.seconds(1));
碰撞效果
onCollisionBegin(EntityType.PLAYER, EntityType.ENEMY,(player, enemy)->{
    inc("integral",-1);
});
效果展示

完整代码 HelloWorldApp.java
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 javafx.util.Duration;

import java.util.Map;

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


public class HelloWorldApp extends GameApplication {

    
    private Entity player;

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

        // 每秒生成一个敌方实体
        run(()->{
            // 生成坐标
            var x = FXGLMath.random(0,getAppWidth()-50);
            var y = FXGLMath.random(-50,0);

            spawn("Enemy",x,y);
        },Duration.seconds(1));
    }

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

        onCollisionBegin(EntityType.PLAYER, EntityType.ENEMY,(player, enemy)->{
            inc("integral",-1);
        });
    }

    
    @Override
    protected void initGameVars(Map vars) {
        vars.put("integral",0);
    }

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


    
    public static void main(String[] args) {
        launch(args);
    }
}
DemoEntityFactory.java
import com.almasb.fxgl.core.math.FXGLMath;
import com.almasb.fxgl.dsl.FXGL;
import com.almasb.fxgl.dsl.components.OffscreenCleanComponent;
import com.almasb.fxgl.dsl.components.ProjectileComponent;
import com.almasb.fxgl.entity.Entity;
import com.almasb.fxgl.entity.EntityFactory;
import com.almasb.fxgl.entity.SpawnData;
import com.almasb.fxgl.entity.Spawns;
import javafx.geometry.Point2D;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;


public class DemoEntityFactory implements EntityFactory {

    
    @Spawns("Player")
    public Entity newPlayer(SpawnData data){
        return FXGL.entityBuilder(data)
                // 声明设备类型
                .type(EntityType.PLAYER)
                // 将实体标记为可碰撞,并根据UI大小自动生成碰撞体积
                .collidable()
                // 宽 10px 高 10px 颜色黑色
                .viewWithBBox(new Rectangle(50,50, Color.BLACK))
                .build();
    }

    
    @Spawns("Gold")
    public Entity newGold(SpawnData data){
        return FXGL.entityBuilder(data)
                //声明设备类型
                .type(EntityType.GOLD)
                // 根据UI大小自动生成碰撞体积
                .collidable()
                // 宽 50px 高 50px 颜色红色
                .viewWithBBox(new Rectangle(50,50, Color.RED))
                .build();
    }
    
    @Spawns("Enemy")
    public Entity newEnemy(SpawnData data){
        // 移动速度, 200 - 400 内随机
        var speed = FXGLMath.random(200,400);
        return FXGL.entityBuilder(data)
                //声明设备类型
                .type(EntityType.ENEMY)
                // 根据UI大小自动生成碰撞体积
                .collidable()
                .with(new ProjectileComponent(new Point2D(0, 1), speed))
                // 宽 50px 高 50px 颜色蓝色
                .viewWithBBox(new Rectangle(50,50, Color.BLUE))
                // 超出边界移除实体
                .with(new OffscreenCleanComponent())
                .build();
    }

}
EntityType.java
public enum EntityType {
    PLAYER,GOLD,ENEMY
}
完整项目

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785431.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号