利用Java游戏引擎开发坦克大战

该博客详细介绍了如何使用FXGL游戏库创建一个坦克大战游戏。游戏包括键盘监听、坦克移动、子弹发射等功能。实体包括背景、敌我坦克、子弹和爆炸动画。代码展示了游戏初始化、实体创建、背景加载、我方坦克和敌方坦克的移动以及子弹发射等关键部分。此外,还包含了一个简单的碰撞检测和动画效果。
摘要由CSDN通过智能技术生成

效果图

未命名的设计.gif

源码

https://pan.baidu.com/s/1ZOKo1n5FW9u5wgoPfFMCkQ?pwd=1234
提取码:1234

主要功能

  • 键盘监听,接收游戏者的操作
  • 坦克在游戏界面中移动
  • 坦克发射子弹

实体

  • 背景
  • 敌我坦克
  • 敌我子弹
  • 爆炸动画

额外组件

  • 我方坦克移动并发射组件

依赖

<dependency>
    <groupId>com.github.almasb</groupId>
    <artifactId>fxgl</artifactId>
    <version>17</version>
</dependency>

代码

  • 游戏初始化
public class TanKeApp extends GameApplication {
    @Override
    protected void initSettings(GameSettings gameSettings) {
        gameSettings.setWidth(960);
        gameSettings.setHeight(640);
        gameSettings.setVersion("0.2");
        gameSettings.setTitle ("坦克大战");
    }
    public static void main(String[] args) {
        launch(args);
    }
}
  • 创建实体工程
public class HeroFactury implements EntityFactory {
    enum Phy1{ZIDAN,ENEMY}
    /**
     * 创建我方子弹
     * @param data
     * @return
     */
    @Spawns("zidan")
    public Entity newZiDan(SpawnData data){
        Texture texture = FXGL.texture("my/bulletB_2x.png").toColor(FXGLMath.randomColor ());
        Point2D point2D = data.get("point2D");
        double x = point2D.getX();
        double y = point2D.getY();
        Entity entity = FXGL.entityBuilder(data)
                .type(Phy1.ZIDAN)
                .viewWithBBox(texture)
                .with(new ProjectileComponent(point2D, 500))
                .with(new OffscreenCleanComponent())
                .collidable()
                .build();
        if (x==0.0&&y==-1.0){//up
            entity.setRotation(-90);
        }else if (x==0.0&&y==1.0){//d
            entity.setRotation(90);
        }
        else if (x==-1.0&&y==0.0){//l
            entity.setRotation(180);
        }else {//r
            entity.setRotation(0);
        }
        return entity;
    }
    /**
     * 创建敌方子弹
     * @param data
     * @return
     */
    @Spawns("dizdan")
    public Entity newDiZDan(SpawnData data){
        Texture texture = FXGL.texture("my/bulletB_2x.png").multiplyColor(Color.RED);
        Entity entity = FXGL.entityBuilder(data)
//                .type(Phy1.ZIDAN)
                .viewWithBBox(texture)
                .with(new ProjectileComponent(new Point2D(-1,0), 500))
                .with(new OffscreenCleanComponent())
                .with(new EnnmyZi())
                .collidable()
                .build();
        return entity;
    }
}
  • 加载背景
    @Spawns("bg")
    public Entity newBg(SpawnData data){
        return FXGL.entityBuilder()
                .view("LevelsBackground.jpg")
                .build();
    }
  • 加载我方坦克
    @Spawns("hero")
    public Entity newMyTanKe(SpawnData data){
        Entity entity = FXGL.entityBuilder()
                .viewWithBBox("my/LoadTank.png")
                .with(new MoveComponent())
                .with (new KeepOnScreenComponent ())
                .build();
        return entity;
    }
  • 我方坦克移动并发射子弹
public class MoveComponent extends Component {
    private boolean isMoving;
    private Dir dir;
    private LocalTimer localTimer=FXGL.newLocalTimer();
    enum Dir{UP,DOWN,LEFT,RIGHT}
    @Override
    public void onAdded() {
        FXGL.getInput().addAction(new UserAction("UP") {
            @Override
            protected void onAction() {
                if (isMoving) {
                    return;
                }
                isMoving=true;
                entity.setRotation(-90);
                dir=Dir.UP;
                entity.translateY(-5);

            }
        }, KeyCode.UP);
        FXGL.getInput().addAction(new UserAction("DOWN") {
            @Override
            protected void onAction() {
                if (isMoving) {
                    return;
                }
                isMoving=true;
                entity.setRotation(90);
                dir=Dir.DOWN;
                entity.translateY(+5);

            }
        }, KeyCode.DOWN);
        FXGL.getInput().addAction(new UserAction("LEFT") {
            @Override
            protected void onAction() {
                if (isMoving) {
                    return;
                }
                isMoving=true;
                entity.setRotation(180);
                dir=Dir.LEFT;
                entity.translateX(-5);

            }
        }, KeyCode.LEFT);
        FXGL.getInput().addAction(new UserAction("RIGHT") {
            @Override
            protected void onAction() {
                if (isMoving) {
                    return;
                }
                isMoving=true;
                entity.setRotation(0);
                dir=Dir.RIGHT;
                entity.translateX(5);

            }
        }, KeyCode.RIGHT);

        FXGL.getInput().addAction(new UserAction("SPACE") {
            @Override
            protected void onAction() {
                //间隔2秒钟
                if (!localTimer.elapsed(Duration.seconds(0.25))){
                    return;
                }
                localTimer.capture();
                Point2D point2D;
                if (dir==Dir.UP){
                    point2D=new Point2D(0,-1);
                }else if (dir==Dir.DOWN){
                    point2D=new Point2D(0,1);
                }else if (dir==Dir.LEFT){
                    point2D=new Point2D(-1,0);
                }else{
                    point2D=new Point2D(1,0);
                }
                FXGL.spawn("zidan",new SpawnData(entity.getCenter().getX(),entity.getCenter().getY())
                        .put("point2D",point2D));
            }
        },KeyCode.SPACE);
    }

    @Override
    public void onUpdate(double tpf) {

        isMoving=false;
    }
}
  • 敌方坦克
    @Spawns("enemy")
    public Entity newDiTanKe(SpawnData data){
        Texture texture = FXGL.texture("my/LoadTank.png").toColor(FXGLMath.randomColor ());
        Entity build = FXGL.entityBuilder(new SpawnData(FXGL.random(0,800), FXGL.random(0,500)))
                .type(Phy1.ENEMY)
                .viewWithBBox(texture)
                .collidable()
                .with(new KeepOnScreenComponent())
                .with(new RandomMoveComponent(new Rectangle2D(0,0,960,640),100,0))
                .build();
        return build;
    }
  • 爆炸
    @Spawns("bar")
    public Entity newBarrel(SpawnData data){
        ArrayList<Image> list = new ArrayList<>();
        list.add(FXGL.image("barrel/barrelExplode1.png"));
        list.add(FXGL.image("barrel/barrelExplode2.png"));
        list.add(FXGL.image("barrel/barrelExplode3.png"));
        list.add(FXGL.image("barrel/barrelExplode4.png"));
        list.add(FXGL.image("barrel/barrelExplode5.png"));
        list.add(FXGL.image("barrel/barrelExplode6.png"));
        list.add(FXGL.image("barrel/barrelExplode7.png"));
        list.add(FXGL.image("barrel/barrelExplode8.png"));
        list.add(FXGL.image("barrel/barrelExplode9.png"));
        list.add(FXGL.image("barrel/barrelExplode10.png"));
        AnimationChannel ac = new AnimationChannel(list, Duration.seconds(0.35));
        AnimatedTexture at = new AnimatedTexture(ac);
        at.play();
        return FXGL.entityBuilder(data)
                .view(at)
                .with(new ExpireCleanComponent(Duration.seconds(0.35)))
                .build();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

眰恦.H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值