oRuRuoKeYi 2023-10-30 20:33 采纳率: 0%
浏览 55
已结题

游戏队伍移动跟随算法

队伍集体移动,成员跟随算法

需求:
1.队伍成员直接避免碰撞,比如保持200px的距离
2.脱离队伍的成员会向最近的合适的点移动靠拢
3.当操作杆转弯的时候,最远的会向内聚拢,形成类似一个圈圈
4.队伍成员不是固定的,可1-5个
5.有摇杆控制队伍方向,当操作行走的时候队伍按上面规则聚拢移动,有障碍物的时候成员又会自动绕开障碍物,松开手的时候成员独立行走

场景1

img

场景2

img

场景3

img

拐弯场景

img

重点解决

img

  • 写回答

18条回答 默认 最新

  • bug菌¹ 优质创作者: Java、算法与数据结构技术领域 2023-10-30 22:23
    关注
    获得0.60元问题酬金

    该回答引用ChatGPT,望对题主有所帮助/启发;若有帮助,还望采纳。


    针对您的需求,我可以给出一个简单的游戏队伍移动跟随算法的思路。以下是一个基于 TypeScript 的示例实现:

    class TeamMember {
      position: Vector2; // 队伍成员的位置
      targetPosition: Vector2; // 队伍成员的目标位置
    
      update(dt: number) {
        const direction = this.targetPosition.sub(this.position).normalize();
        const distance = this.position.distanceTo(this.targetPosition);
    
        if (distance > 200) {
          // 如果距离目标位置大于200像素,向目标位置移动
          const speed = 100; // 移动速度,可以根据需要调整
          const movement = direction.mul(speed * dt);
          this.position = this.position.add(movement);
        } else if (distance < 150) {
          // 如果距离目标位置小于150像素,向队伍中心移动
          const center = this.getTeamCenter();
          const centerDirection = center.sub(this.position).normalize();
          const centerMovement = centerDirection.mul(100 * dt);
          this.position = this.position.add(centerMovement);
        }
        // 其他情况下保持静止
    
        // 更新队伍成员的位置和朝向
        this.updatePositionAndRotation();
      }
    
      getTeamCenter(): Vector2 {
        // 计算队伍中心的位置
        const teamMembers = getTeamMembers(); // 获取所有队伍成员的位置
        const center = Vector2.ZERO;
        for (const member of teamMembers) {
          center.add(member.position);
        }
        center.div(teamMembers.length);
        return center;
      }
    
      updatePositionAndRotation() {
        // 更新队伍成员的位置和朝向
        // 根据具体游戏引擎的接口进行操作
      }
    }
    
    class GameController {
      teamMembers: TeamMember[] = [];
    
      update(dt: number) {
        for (const member of this.teamMembers) {
          member.update(dt);
        }
      }
    
      handleInput(direction: Vector2) {
        const teamCenter = this.getTeamCenter();
        for (const member of this.teamMembers) {
          member.targetPosition = teamCenter.add(direction.mul(200));
        }
      }
    
      getTeamCenter(): Vector2 {
        // 计算队伍中心的位置,方法同上
      }
    }
    
    // 使用示例
    const gameController = new GameController();
    // 添加队伍成员到 gameController.teamMembers
    // ...
    
    gameController.handleInput(new Vector2(1, 0)); // 指定移动方向
    gameController.update(0.016); // 更新游戏逻辑,参数为帧时间间隔
    // ...
    

    上述代码使用了一个TeamMember类来表示队伍成员,其中的position属性表示当前位置,targetPosition表示目标位置。在update()方法中,根据当前位置与目标位置的距离,决定成员的移动策略,以达到避免碰撞、聚拢等要求。

    GameController类负责管理整个队伍的行为。它包含一个teamMembers数组来存储队伍成员,提供update()方法用于更新队伍成员的状态,以及handleInput()方法来处理玩家输入的移动方向。

    这只是一个简单的示例,您可以根据具体的游戏引擎和需求进行适当的调整和扩展。

    希望以上的思路能对您有所帮助。如果您有任何疑问,请随时提问。祝您的游戏开发顺利!

    评论

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 修改了问题 11月3日
  • 修改了问题 10月30日
  • 创建了问题 10月30日