Flame - HasGameRef
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
를 사용하여 게임 화면의 크기를 가져온다.