Flame - Sprite
Flutter에서 Sprite는 2D 게임에서 사용되는 이미지 요소이다. Sprite는 게임에서 플레이어, 적, 아이템 등과 같은 게임 오브젝트를 나타내는 데 사용된다.
Flutter에서 Sprite를 사용하려면, Sprite
클래스를 사용하여 이미지를 로드하고 SpriteComponent
를 상속받아 게임 오브젝트를 만들어야 한다. SpriteComponent
는 PositionComponent
를 상속받으며, PositionComponent
는 Component
를 상속받는다.
Sprite
를 로드하기 위해서는 먼저 이미지 파일을 로드해야 한다. 이를 위해 loadSprite
함수를 사용할 수 있으며, 이 함수는 이미지 파일 경로와 스프라이트 시트를 읽어들여 Sprite 객체를 반환한다.
Sprite sprite = await loadSprite('assets/images/sprite.png');
SpriteComponent
를 이용하여 Sprite
를 게임 오브젝트로 만들 수 있다. SpriteComponent
는 Component
를 상속받기 때문에 render
함수를 오버라이드하여 Sprite
를 그리는 코드를 작성할 수 있다.
class MySpriteComponent extends SpriteComponent {
MySpriteComponent() : super.fromSprite(32, 32, sprite);
@override
void render(Canvas canvas) {
super.render(canvas);
}
}
위의 코드에서 super.fromSprite
함수를 이용하여 SpriteComponent
를 초기화하고, render
함수를 오버라이드하여 Sprite
를 그리도록 작성했다. 아래에서 super.fromSprite
와 render
함수에대해 알아보자.
super.fromSprite
fromSprite
함수는 Sprite
객체에서 SpriteComponent
를 생성하는 방법 중 하나이다. SpriteComponent
는 게임에서 Sprite
를 렌더링하기 위한 컴포넌트이다.
fromSprite
함수를 사용하면 Sprite
를 가지고 있는 SpriteComponent
객체를 쉽게 만들 수 있다. 이 함수는 SpriteComponent
의 생성자 대신에 사용할 수 있다. fromSprite
함수는 다음과 같은 형태를 가진다.
SpriteComponent.fromSprite(double width, double height, Sprite sprite)
width
와 height
는 SpriteComponent
의 너비와 높이를 지정한다. sprite
는 SpriteComponent
가 그릴 Sprite
객체이다.
예를 들어, 다음과 같은 코드를 사용하여 SpriteComponent
를 만들 수 있다.
final sprite = await Sprite.load('assets/player.png');
final player = SpriteComponent.fromSprite(32, 32, sprite);
위 코드는 assets/player.png
에서 Sprite를 로드하고, 해당 Sprite를 사용하여 너비가 32, 높이가 32인 SpriteComponent
를 생성한다. 이렇게 생성된 SpriteComponent
는 게임에서 캐릭터를 표현하는 데 사용될 수 있다.
render
render
함수는 해당 Sprite를 그리는 함수이다. render
함수를 이용하여 Sprite를 화면에 그리거나, 다른 Canvas 객체에 그릴 수 있다.
Sprite의 render
함수는 다음과 같은 형태를 가진다.
void render(Canvas canvas, {double x = 0, double y = 0, double width, double height});
render
함수의 첫 번째 인자인 canvas
는 그림을 그릴 Canvas 객체다. 두 번째와 세 번째 인자인 x
와 y
는 그림을 그릴 위치이고, width
와 height
는 그림의 크기이다.
Sprite 객체는 일반적으로 게임의 배경, 캐릭터, 아이템 등 이미지 요소를 표현하는 데 사용된다. 따라서 render
함수를 사용하여 Sprite를 그리는 것은 게임에서 매우 중요한 작업 중 하나이다.
update
Sprite 클래스에서 update
함수는 보통 게임 로직을 업데이트하기 위해 사용된다. 이 함수는 일정한 시간 간격으로 호출되며, Sprite의 상태를 업데이트하고 게임 로직을 실행하는 데 사용된다.
예를 들어, 만약 게임에서 Sprite가 움직이는 것이라면, update
함수에서는 Sprite의 위치를 업데이트하고, 다음 위치에 Sprite를 그리도록 하면 된다. 또는 만약 Sprite가 게임에서 어떤 애니메이션을 수행한다면, update
함수에서는 Sprite의 애니메이션 상태를 업데이트하고, 다음 프레임에 Sprite를 그리도록 하면 된다.
Sprite 클래스에서 update
함수를 사용하는 예제 코드를 살펴보면 다음과 같다.
class MySprite extends Sprite {
double x, y;
double speed;
MySprite(Image image, this.x, this.y, this.speed) : super.fromImage(image);
@override
void update(double dt) {
x += speed * dt;
}
}
위 코드에서 MySprite
클래스는 Sprite 클래스를 상속하고 있으며, update
함수에서 x 위치를 이동시킨다. update
함수에서 dt
파라미터는 마지막 업데이트 이후의 시간 간격을 나타낸다. 이 값을 사용하여 x 위치를 speed
만큼 이동시키면, Sprite가 일정한 속도로 움직이게 된다.
onLoad
onLoad()
함수는 Component 클래스의 메서드로, 해당 컴포넌트가 화면에 로드되었을 때 호출되는 함수이다. 이 함수는 게임이 시작되기 전에 리소스를 로드하고, 컴포넌트가 사용할 수 있게 준비하는 등의 초기화 작업을 수행하는 데 사용된다.
보통 게임에서 사용되는 이미지, 오디오 파일 등의 리소스들은 매우 크기 때문에, 게임이 시작되기 전에 미리 로드되어야 한다. 이러한 로드 작업은 보통 onLoad()
함수에서 수행된다. 게임에서 필요한 리소스가 많을수록, 로드 작업이 오래 걸리게 되므로, 최적화에 대한 고려가 필요하다.
onLoad()
함수는 일반적으로 Future 형태로 구현되며, 리소스 로드 작업이 모두 완료될 때까지 대기하고, 모두 로드된 후 다음 단계로 넘어가도록 처리한다. 이후에는 게임이 시작되고, update()
와 render()
함수가 호출된다.
import 'package:flame/game.dart';
import 'package:flame/flame.dart';
class MyGame extends Game {
@override
Future<void> onLoad() async {
// 이미지 로드
final image = await Flame.images.load('image.png');
// 이미지 사용
final sprite = Sprite.fromImage(image);
add(sprite);
}
// ...
}
이 예시에서는 onLoad()
함수를 사용하여 image.png
라는 이미지를 로드하고, 이를 Sprite로 변환한 다음 게임에 추가한다. 이렇게 하면 게임이 시작될 때 이미지가 로드되어 화면에 표시된다.