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;
  }
相关推荐
liulian091620 小时前
Flutter 跨平台路由与状态管理:go_router 与 Riverpod 的 OpenHarmony总结
flutter·华为·学习方法·harmonyos
liulian091621 小时前
Flutter for OpenHarmony 跨平台技术实战:flutter_animate 与 pull_to_refresh 库的鸿蒙化适配总结
flutter·华为·学习方法·harmonyos
IntMainJhy1 天前
【flutter for open harmony】第三方库 Flutter 二维码生成的鸿蒙化适配与实战指南
数据库·flutter·华为·sqlite·harmonyos
jiejiejiejie_1 天前
Flutter for OpenHarmony 底部选项卡与多语言适配小记:让 App 更贴心的两次小升级✨
flutter·华为·harmonyos
jiejiejiejie_1 天前
Flutter for OpenHarmony 应用更新检测与萌系搜索功能实战小记✨
flutter·华为·harmonyos
IntMainJhy1 天前
Flutter 三方库 Firebase Messaging 鸿蒙化适配与实战指南(权限检查+设备Token获取全覆盖)
flutter·华为·harmonyos
liulian09161 天前
Flutter 依赖注入与设备信息库:get_it 与 device_info_plus 的 OpenHarmony 适配指南总结
flutter·华为·学习方法·harmonyos
里欧跑得慢1 天前
微交互设计模式:提升用户体验的细节之美
前端·css·flutter·web
stringwu1 天前
Flutter GetX 核心坑及架构选型与可替换性方案
前端·flutter
IntMainJhy1 天前
【flutter for open harmony】第三方库Flutter 国际化多语言的鸿蒙化适配与实战指南
数据库·flutter·华为·sqlite·harmonyos