flame forge2d 实现随机小怪以及飞镖射中爆炸

上一篇实现飞镖发射juejin.cn/post/745291... 这一篇实现怪物随机出现,飞镖追踪怪物杀死并爆炸

效果图

这次比较简单

1 生产怪物

在活动区域随机生成一个怪物并让怪物朝着人物移动

随机添加怪物

js 复制代码
  var random = Random();
  //随机添加怪物
  List<MoveMonsterComponent> moveMonsterList = [];
  var maxMoveMonsterCount = 10;
  void randomAddMonster() async{
    while(true){
      await Future.delayed(const Duration(seconds: 1));
      if(moveMonsterList.length > maxMoveMonsterCount){
        continue;
      }
      //game.camera.visibleWorldRect 是会改变的 跟着移动
      var topLeft = game.camera.visibleWorldRect.topLeft.toVector2();
      var bottomRight = game.camera.visibleWorldRect.bottomRight.toVector2();

      var width = game.size.x;
      var height = game.size.y;

      var dx = (bottomRight - topLeft).x;
      var dy = (bottomRight - topLeft).y;

      var position =  (Vector2(dx * random.nextDouble() , dy * random.nextDouble())) + Vector2( - width / 2, -height/2);
      var monster = MoveMonsterComponent();
      monster.position = position;
      moveMonsterList.add(monster);
      monster.startMove(playerContainer.body);
      add(monster);
    }
  }

怪物朝玩家移动

js 复制代码
  void startMove(Body target) async{
    while(true){
      await doMove(target);
    }
  }
  var speed = 100;
  var eachTime = 0.1;
  //每eachTime 计算一次移动 知道移动到玩家身边
  Future doMove(Body target) async{
    var completer = Completer<bool>();
    var distance = speed * eachTime;
    var xOffset = target.position.x - position.x;
    var yOffset = target.position.y - position.y;

    var totalDistance = sqrt(xOffset * xOffset + yOffset * yOffset);
    var cons = xOffset / totalDistance;
    var sin = yOffset / totalDistance;
    if(totalDistance <= distance){
      distance = totalDistance;
    }
    var moveX = distance * cons;
    var moveY = distance * sin;
    add(MoveByEffect(Vector2(moveX,moveY), LinearEffectController(eachTime),onComplete: (){
      completer.complete(true);
    }));
    return completer.future;
  }

2 定时发射飞镖,并随机找一个怪物移动

定时发射飞镖

js 复制代码
  void startShoot() async{
    //每间隔1s 添加一个回旋镖 并移动
    while(true){
      await Future.delayed(const Duration(milliseconds: 300));
      var targetMonster = game.world.moveMonsterList.firstWhereOrNull((item)=>!item.isCollimation);
      if(targetMonster == null){
        continue;
      }
      targetMonster.isCollimation  = true;
      var hxb = HXBSkillComponent();
      hxb.position = body.position;
      world.add(hxb);
      hxb.moveToMonster(targetMonster);
    }
  }

飞镖朝怪物移动

js 复制代码
  void moveToMonster(PositionComponent target) async{
    add(RotateEffect.by(
      pi * 2 * 3,
      EffectController(
        duration: 1,
        // reverseDuration: 1,
        curve: Curves.linear,
        infinite: true,
      ),
    ),);
    while(true){
      await moveToMonsterStep(target);
    }
  }

  Future moveToMonsterStep(PositionComponent target) async{
    var completer = Completer<bool>();
    var distance = speed * eachTime;
    var xOffset = target.position.x - position.x;
    var yOffset = target.position.y - position.y;

    var totalDistance = sqrt(xOffset * xOffset + yOffset * yOffset);
    var cons = xOffset / totalDistance;
    var sin = yOffset / totalDistance;
    var moveX = distance * cons;
    var moveY = distance * sin;
    add(MoveByEffect(Vector2(moveX,moveY), LinearEffectController(eachTime),onComplete: (){
      completer.complete(true);
    }));
    return completer.future;
  }
相关推荐
只可远观4 小时前
Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件
前端·flutter
周胡杰4 小时前
组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
前端·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
肥肥呀呀呀5 小时前
flutter Stream 有哪两种订阅模式。
flutter
WDeLiang13 小时前
Flutter - 集成三方库:日志(logger)
flutter·dart
hudawei99613 小时前
flutter缓存网络视频到本地,可离线观看
flutter·缓存·音视频
0wioiw01 天前
Flutter基础()
flutter
肥肥呀呀呀2 天前
flutter 视频通话flutter_webrtc
flutter
明似水2 天前
2025年Flutter项目管理技能要求
flutter
肥肥呀呀呀2 天前
flutter使用命令生成BinarySize分析图
flutter
程序猿阿伟2 天前
《数字分身进化论:React Native与Flutter如何打造沉浸式虚拟形象编辑》
flutter·react native·react.js