FXGL学习2

1.简单练习植物射击僵尸

使用动画函数 AnimationChannel、 AnimatedTexture以及实体工厂EntityFactory,通过SpawData传参生成实体。

2实现

2.1 代码

实现EntityFactory类

public class PlantFactory implements EntityFactory {
   @Spawns("shooter")
    public Entity newPeashooter(SpawnData data){
       ArrayList<Image> imageArrayList=new ArrayList<>();
       for (int i=0;i<13;i++){
           imageArrayList.add(image(String.format("player/Peashooter_"+i+".png")));
       }
       AnimationChannel ac=new AnimationChannel(imageArrayList, Duration.seconds(1.1));
       AnimatedTexture at=new AnimatedTexture(ac);
       at.loop();//循环播放

       return entityBuilder(data)
               .type(PlantEntity.PLANT)
               .viewWithBBox(at)
               .with(new CollidableComponent(true))
               .build();
   }
   @Spawns("zomba")
   public Entity newZomba(SpawnData data){
      ArrayList<Image> imageArrayList=new ArrayList<>();//图片集合
      for (int i=0;i<22;i++){
         imageArrayList.add(image(String.format("zombie/Zombie_"+i+".png")));
      }
      //动画播放通道,时间设置
      AnimationChannel ac=new AnimationChannel(imageArrayList,Duration.seconds(1.0));
      AnimatedTexture at=new AnimatedTexture(ac);
      at.loop();//循环播放
      return entityBuilder(data)
              .type(PlantEntity.ZOMBA)
              .viewWithBBox(at)
              .with(new CollidableComponent(true))
              .build();
   }
   @Spawns("pea")
   public Entity newBullet(SpawnData data){
      return entityBuilder(data)
              .type(PlantEntity.BULLET)
              .viewWithBBox("peabullet.png")
              .with(new CollidableComponent(true))
              .build();

   }

}

主类

public class MainPlay extends GameApplication {
   protected Entity shooter;
   protected Entity normalizedZomba;
   protected Entity bullet;
   int z_hp=12;//僵尸血条
   int s_hp=10;//植物血条

    @Override
    protected void initSettings(GameSettings gameSettings) {
        gameSettings.setWidth(680);
        gameSettings.setHeight(480);
        gameSettings.setVersion("1.0v");
        gameSettings.setTitle("植物练习射击僵尸");

    }

    @Override
    protected void initGame() {
       getGameWorld().addEntityFactory(new PlantFactory());
       shooter=spawn("shooter");
       normalizedZomba=spawn("zomba");
       normalizedZomba.setPosition(600,100);
       generate();

    }
    private  void generate(){
        bullet=spawn("pea");
        bullet.setPosition(shooter.getX()+10, shooter.getY());
    }
    @Override
    protected void initInput() {
        Input input=getInput();
      input.addEventHandler(MouseEvent.MOUSE_CLICKED,event -> {
          shooter.setPosition(event.getX()-40, event.getY()-20);
      });

    }

    @Override
    protected void initPhysics() {
       getPhysicsWorld().addCollisionHandler(new CollisionHandler(PlantEntity.PLANT,PlantEntity.ZOMBA) {
           @Override
           protected void onCollisionBegin(Entity plant, Entity zomba) {
               s_hp--;
               if (s_hp<=0){
                   shooter.removeFromWorld();
               }
           }
       });
       getPhysicsWorld().addCollisionHandler(new CollisionHandler(PlantEntity.BULLET,PlantEntity.ZOMBA) {
           @Override
           protected void onCollision(Entity bullet, Entity zomba) {
               z_hp--;
               if (z_hp<=0){
                   zomba.removeFromWorld();
               }
               bullet.removeFromWorld();//开始碰撞后移除bullet
           }

       });

    }

    @Override
    protected void onUpdate(double tpf) {
       normalizedZomba.translate(new Vec2(-tpf*10,0));//僵尸移动
      bullet.translate(new Vec2(6,0));//子弹发射
       if (bullet.getX()>getAppWidth()){
           bullet.removeFromWorld();
           generate();
       }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

2.2 运行

无

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流风之海

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

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

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

打赏作者

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

抵扣说明:

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

余额充值