본문 바로가기
Flutter/GAME Programming

[플러터 게임] 2D 게임 개발의 기초 / 게임 루프 구현하기/ Ticker와 Animation을 이용한 게임 루프 구현

by Maccrey Coding 2024. 9. 21.
반응형

 

플러터(Flutter)로 2D 게임 개발하기: Ticker와 Animation으로 게임 루프 쉽게 구현하기

게임 개발은 많은 사람들의 꿈이죠! 이번 글에서는 플러터(Flutter)를 이용해서 2D 게임을 만드는 방법과, 그 중에서도 중요한 게임 루프(game loop)를 구현하는 법을 초보자도 쉽게 이해할 수 있게 설명드릴게요.

특히 TickerAnimationController를 사용해서 게임 루프를 관리하는 방법에 대해 자세히 다룰 예정입니다.

1. 플러터로 2D 게임 개발하기

플러터는 주로 모바일 앱 개발에 사용되는 프레임워크로 알려져 있지만, 2D 게임 개발에도 강력한 기능을 제공합니다.

특히 Flutter의 강력한 위젯 시스템애니메이션 기능은 게임을 만들 때 유용하게 활용할 수 있습니다.

2. 게임 루프(Game Loop)란?

게임 루프는 게임에서 시간에 따라 화면을 지속적으로 업데이트하고, 사용자의 입력을 처리하는 중요한 개념입니다.

게임 루프는 보통 3가지 일을 반복합니다.

  • 입력 처리: 플레이어의 터치나 키보드 입력을 받음
  • 업데이트: 캐릭터나 오브젝트의 상태(위치, 애니메이션 등)를 변경
  • 렌더링: 변경된 상태를 화면에 다시 그리기

3. Ticker란 무엇인가?

Ticker는 플러터에서 주기적으로 코드를 실행하게 해주는 도구입니다.

게임 루프에서 "프레임 단위로 업데이트하는 코드"를 실행할 때 사용됩니다.

쉽게 말해, Ticker는 초당 몇 번 코드를 실행할지 정해주는 타이머 역할을 합니다.

4. AnimationController로 움직임 관리하기

AnimationController는 화면에서 캐릭터나 오브젝트가 부드럽게 움직이도록 도와주는 도구입니다.

Ticker와 비슷한 역할을 하지만, 좀 더 복잡한 애니메이션을 다룰 수 있습니다.

주로 위젯의 움직임이나 변화를 자연스럽게 만들 때 사용되죠.

5. 플러터에서 Ticker와 Animation을 활용해 게임 루프 구현하기

이제 TickerAnimationController를 사용해 게임 루프를 어떻게 구현할지 살펴볼게요.

Ticker는 프레임 단위로 게임 상태를 업데이트하는 데 사용하고, AnimationController는 오브젝트의 움직임을 자연스럽게 제어하는 데 사용할 수 있습니다.

6. 코드 예제: Ticker와 Animation을 사용한 간단한 게임 루프

아래는 Ticker와 Animation을 사용해 간단한 게임 루프를 구현한 코드입니다.

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';

void main() => runApp(MyGameApp());

class MyGameApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter 2D Game')),
        body: GameScreen(),
      ),
    );
  }
}

class GameScreen extends StatefulWidget {
  @override
  _GameScreenState createState() => _GameScreenState();
}

class _GameScreenState extends State<GameScreen> with SingleTickerProviderStateMixin {
  // Ticker와 AnimationController 선언
  Ticker _ticker;
  AnimationController _animationController;
  double _position = 0.0; // 오브젝트의 위치
  
  @override
  void initState() {
    super.initState();

    // 1. Ticker 생성 - 60fps로 게임 루프 실행
    _ticker = this.createTicker((elapsed) {
      setState(() {
        // 2. 매 프레임마다 위치 업데이트 (게임 루프의 업데이트 부분)
        _position += 1; // 매 프레임마다 오브젝트의 위치를 1씩 증가
      });
    });

    // 3. Ticker 시작
    _ticker.start();

    // 4. AnimationController 생성 (애니메이션 제어)
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 2), // 애니메이션 2초간 지속
    );

    // 5. 애니메이션 실행
    _animationController.repeat(reverse: true); // 반복 재생
  }

  @override
  void dispose() {
    // 6. Ticker와 AnimationController 해제
    _ticker.dispose();
    _animationController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        // 7. 오브젝트 렌더링 (애니메이션으로 오브젝트 움직임)
        AnimatedBuilder(
          animation: _animationController,
          builder: (context, child) {
            return Positioned(
              top: 100,
              left: _position, // 오브젝트의 위치를 Ticker에서 업데이트한 값으로 설정
              child: Icon(Icons.star, size: 50),
            );
          },
        ),
      ],
    );
  }
}

코드 설명

  1. Ticker 생성: 초당 60번 호출되는 Ticker를 생성하여 게임 루프를 돌립니다.
  2. 오브젝트 위치 업데이트: 매 프레임마다 오브젝트의 위치를 업데이트하여 게임 루프에서 필요한 상태 변경을 처리합니다.
  3. AnimationController: 오브젝트의 애니메이션을 자연스럽게 제어합니다. 여기서는 별 모양의 아이콘을 2초마다 반복해서 움직이도록 설정했습니다.

이제 Flutter로 간단한 2D 게임 루프를 구현할 수 있습니다!

TickerAnimationController를 사용하면, 게임에서 중요한 업데이트애니메이션을 쉽게 처리할 수 있죠.

이 기본 개념을 이해하고 나면, 더 복잡한 게임을 만들 수 있는 기반이 됩니다.

 

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

반응형