HasGameRef는 Flame 게임 엔진에서 사용되는 mixin(믹스인)이다. mixin이란, 클래스가 다른 클래스로부터 기능을 가져와서 확장할 수 있게 하는 Dart 언어의 특성 중 하나이다.

HasGameRef mixin은 Component 클래스에서 사용할 수 있으며, GameRef 객체를 소유하는 컴포넌트 클래스에 이 mixin을 추가하여, GameRef를 쉽게 참조할 수 있도록 도와준다.

GameRef

GameRef는 Flame에서 사용되는 HasGameRef mixin을 통해 추가되는 속성으로, 해당 컴포넌트가 현재 게임 인스턴스에 속해있는지를 나타내는 게임 레퍼런스이다. 즉, GameRef를 통해 현재 게임 인스턴스의 상태나 속성에 접근할 수 있다.

예를 들어, 게임 상태를 변경하거나 다른 컴포넌트를 추가하거나 게임 인스턴스에서 전체적인 상태를 조회하는 등의 작업을 할 때 사용할 수 있다. GameRef는 Game 인스턴스의 레퍼런스를 제공하기 때문에, 다른 컴포넌트와의 상호작용이 가능하다.

예를 들어, Enemy라는 컴포넌트가 있다고 가정해보자. 이 컴포넌트가 게임 인스턴스에 추가되면, GameRef를 사용하여 게임 인스턴스에서 다른 컴포넌트들과 상호작용하거나, 게임 상태를 변경할 수 있다. 아래는 Enemy 컴포넌트에서 GameRef를 사용하여 게임 인스턴스에서 다른 컴포넌트들과 상호작용하는 예시 코드이다.

import 'package:flame/components.dart';
import 'package:flame/game.dart';

class Enemy extends SpriteComponent with HasGameRef<Game> {
  // ...
  void hit() {
    // Check if we collided with a player bullet
    if (collidedWithBullet()) {
      // Decrement the player's score
      gameRef.score--;
    }
  }
}

위 코드에서 Enemy 컴포넌트는 HasGameRef<Game> 믹스인을 사용하여 GameRef 속성을 가진다. hit 메서드에서 적이 총에 맞았는지를 체크하고, 맞았을 경우 GameRef를 사용하여 게임 인스턴스의 score를 감소시킨다.

GameRef 객체는 BaseGame 클래스에서 파생된 게임에서 사용되며, 현재 게임 객체에 대한 참조를 제공한다. HasGameRef mixin을 사용하면 해당 컴포넌트에서 gameRef 변수를 통해 GameRef 객체에 접근할 수 있으며, 게임 객체의 기능을 사용할 수 있다.

HasGameRef<CLASS>

class MyComponent extends PositionComponent with HasGameRef<MyGame> {
  // ...
  void doSomething() {
    // gameRef를 사용하여 MyGame 클래스의 인스턴스에 접근합니다.
    gameRef.someMethod();
  }
}

위의 코드에서 MyComponent는 PositionComponent를 확장하면서 HasGameRef 클래스를 이용해 MyGame 클래스의 인스턴스에 대한 참조를 갖게 된다.

doSomething 메서드에서 gameRef를 사용하여 MyGame 클래스의 someMethod를 호출할 수 있다. 이렇게 함으로써 MyComponent에서 MyGame 클래스의 인스턴스에 대한 참조를 쉽게 얻을 수 있습니다.

HasGameRef 뒤에 인자가 없을 때

HasGameRef를 상속받은 클래스에서 HasGameRef 뒤에 타입 인자를 지정하지 않으면, Game 클래스를 참조하는 gameRef 변수를 정의할 수 있다. 이 경우, gameRef 변수는 Game 클래스의 인스턴스를 참조한다.

예를 들어, 다음과 같이 HasGameRef를 상속받는 클래스를 작성할 수 있다.

import 'package:flame/components.dart';

class MyComponent extends PositionComponent with HasGameRef {
  @override
  Future<void> onLoad() async {
    // gameRef를 사용하여 게임 객체에 액세스할 수 있습니다.
    final screenSize = gameRef.size;
  }
}

이 경우, MyComponent 클래스는 HasGameRef를 상속받고, gameRef 변수를 정의한다. gameRef 변수를 사용하여 Game 클래스의 인스턴스에 액세스할 수 있다. 위 예시에서는 gameRef를 사용하여 게임 화면의 크기를 가져온다.