flutter 碰撞检测平台,如何修复我的角色滑下平台的边缘?

yyyllmsg  于 2023-11-21  发布在  Flutter
关注(0)|答案(1)|浏览(126)

我的游戏中的角色/玩家一旦接近边缘就会慢慢滑下平台。我该如何解决这个问题?理想情况下,即使在这样的情况下,我的角色也会保持在平台上:x1c 0d1x
我的Player类(onCollision方法是相关部分):

class Player extends SpriteAnimationGroupComponent with HasGameRef<Gain>, KeyboardHandler, CollisionCallbacks {
  String character;
  Player({pos, this.character = "Ninja Frog"}) : super(position: pos);

  final double stepTime = 0.05;

  ...
  @override
  void onCollision(Set<Vector2> intersectionPoints, PositionComponent other) {
    if (other is Platform) {
      if (intersectionPoints.length == 2) {
        Vector2 mid = (intersectionPoints.elementAt(0) + intersectionPoints.elementAt(1)) / 2;
        Vector2 collisionNormal = absoluteCenter - mid;
        final seperationDist = (size.x / 2) - collisionNormal.length;
        collisionNormal.normalize();
        if (Vector2(0, -1).dot(collisionNormal) > 0.9) {
          _isOnGround = true;
        }
        position += collisionNormal.scaled(seperationDist);
      }
    }
    super.onCollision(intersectionPoints, other);
  }
}

字符串
我的平台类,代表游戏的墙壁,地面,天花板:

class Platform extends PositionComponent with CollisionCallbacks {
  bool canJumpThrough;
  Platform({required Vector2 position, required Vector2 size, this.canJumpThrough = false}) : super(position: position, size: size);

  @override
  FutureOr<void> onLoad() {
    add(RectangleHitbox(collisionType: CollisionType.passive));
    return super.onLoad();
  }
}

a0x5cqrl

a0x5cqrl1#

有多种方法可以解决这个问题,一种方法是将onCollision改为onCollisionStart。由于onCollisionStart只在碰撞开始时调用,因此您应该保持玩家和平台重叠一个像素,然后一旦玩家离开平台,onCollisionEnd将被调用,您可以重新激活重力等功能。
您现在使用的onCollision方法将在每个tick中被调用,并且可能存在一些舍入错误,使玩家滑动。

相关问题