上一篇实现飞镖发射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;
}