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;
  }
相关推荐
程序员老刘·1 天前
从短剧App的bug看响应式编程在AI时代的优势
flutter·ai编程·跨平台开发
传奇开心果编程1 天前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
程序员老刘2 天前
从短剧App的bug看响应式编程在AI时代的优势
flutter·ai编程·客户端
恋猫de小郭2 天前
最近 Android 有什么更新:Android Dev Summit 2026 技术解读
android·前端·flutter
好的佩奇2 天前
Dart 之类修饰符
android·flutter·dart
好的佩奇013 天前
Dart 之类修饰符
android·flutter·dart
Jewel1053 天前
文字为什么总是不居中!记录一个bug
android·flutter·ios
2601_949847754 天前
Form-data 跨端三方库仓颉适配全流程
前端·javascript·flutter
大龄秃头程序员4 天前
Flutter 中我为什么把 GetX 定位为高效率方案,而不是默认架构方案
flutter
传奇开心果编程4 天前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack