我看了几个教程,并try 将onCollision方法的代码组合到我的Player类中.辅导人员的解释很好,但我仍然不明白它到底是如何工作的.Vector2中间表示中间,如下图所示
直观地说,我可以理解如何获得重叠部分的长度(图片中的x)并将其添加到代表玩家位置的Vector2上,这样玩家就不能通过平台行走/摔倒/ skip .然而,有些Vector2数学超出了我的能力范围.我已经通读了这description of linear algebra for game dev行代码,它有概念行规范化,但在应用它来具体理解这些代码行时遇到了困难:
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);
有没有人能帮我理解这个问题,或者在游戏开发中,这个问题是如何为平台解决的?
我的播放器类(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();
}
}