Flutter体验 Day 29-flame Collidable

flame Collidable

有开发过游戏的人应该都有听过碰撞侦测这名词,程序使用碰撞侦测的演算法侦测物件是否发生碰撞的事件,而触发对应的游戏行为(动画、得分、扣血…)。

范例素材图片使用来自 cocos-creator GitHub

Collidable

flame 中我们使用 mixin Collidable 取得 onCollision 以及 onCollisionEnd 碰撞事件的接口。

mixin Collidable on Hitbox {
  CollidableType collidableType = CollidableType.active;

  void onCollision(Set<Vector2> intersectionPoints, Collidable other) {}
  void onCollisionEnd(Collidable other) {}

  @override
  void onRemove() {
    super.onRemove();
    findParent<HasCollidables>()?.collidables.remove(this);
  }
}

Collidable 又另外绑定在 Hitbox 设定上

mixin Hitbox on PositionComponent {
  final List<HitboxShape> _hitboxes = <HitboxShape>[];

我们就来看看要怎麽完善星星游戏吧。

HasCollidables

首先我们需要在游戏上 mixin HasCollidables 类别

class StarGame extends FlameGame with HasDraggableComponents, HasCollidables {
  ...

它用来处理画面上的可碰撞物件

可碰撞物件

让我们加入"星星" SpriteComponent

为了定义可碰撞行为,我们需要 mixin Hitbox, Collidable 类别,并使用addHitbox定义碰撞范围。

下面我们用圆形碰撞演算法定义范围。

class Star extends SpriteComponent with Hitbox, Collidable {
  bool _collision = false;
  Star(_game)
      : super(
          sprite: Sprite(_game.images.fromCache('star.png')),
        ) {
    position = getNewStarPosition();
    addHitbox(HitboxCircle());
  }

  Vector2 getNewStarPosition() {
    return Vector2(_rnd.nextDouble() * 800, _rnd.nextDouble() * 100 + 150);
  }
}

同样的内容我们也在 Moster 类别上加入新的碰撞设定

定义碰撞事件

实作onCollision内容,我们可以从方法上取得碰撞的位置以及碰撞的物件

下面我们检测与 Star 物件发生碰撞的是 Moster,我们先标记发生碰撞

  @override
  void onCollision(Set<Vector2> intersectionPoints, Collidable other) {
    super.onCollision(intersectionPoints, other);
    if (other is Moster) {
      _collision = true;
    }
  }

定义碰撞行为

这边我们先简单定义当StarMoster碰撞时会更换星星的位置,从update方法实作内容。

  @override
  void update(double dt) {
    if (_collision) {
      position = getNewStarPosition();
      _collision = false;
    }
    super.update(dt);
  }

今日成果

flame_collision

小结

距离一款完整的游戏还有许多需要研究的方向:

  • 关卡限制条件
  • 关卡计分方式
  • 动画的效果
  • 音效的搭配

若需要在更进阶的学习游戏的开发方法,可以到 awesome-flame 查看更多的范例介绍。

今日程序码


<<:  网页定位-30天学会HTML+CSS,制作精美网站

>>:  Adaptor 转接器模式

如何把Spotify搜寻框加到自己网站?

请教各位高手,如这个卖纪念品的网站 https://myspotifyplaque.com/ 他可以...

MLOps在金融产业:关於ML系统监控的why, what, how

我们常常听到,在一个ML专案当中,会需要做各种的资料监控。这些资料监控包含哪些呢? 开发流程 在开发...

接API

缘由: 接API大概是在科技业的面试时最常问的问题了吧,但老实说资料的复杂性能不能接得正确好像才是关...

Day16 - 准备 GitLab 的 GitOps 环境

GitOps 介绍 GitOps 是一种 DevOps 的解决方式,方法是以 Git 为中心,将应用...

[Day21] Conditional Chains

虽然昨天说 TypeScript 已经差不多,但其实还有一个(或一些?)还没写到。我们来看一段程序码...