0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ebitengineのシーンマネージャーを作ってみた

Posted at

これは何?

ゲームを作ろうとすると複数の画面(シーン)を遷移する必要がありますが、実際に管理部分を作っていると結構大変なのでパッケージにして使いやすくしてみました。
(下の例のように、同じ画面同士で遷移し合うような時に何も考えないと循環参照とかがめんどくさくて死ぬ)

コード

package main

import (
	"image/color"
	"log"

	"github.com/hajimehoshi/ebiten/v2"
	"github.com/hajimehoshi/ebiten/v2/ebitenutil"
	"github.com/hajimehoshi/ebiten/v2/inpututil"
	"github.com/krile136/sceneManager/game"
	"github.com/krile136/sceneManager/game/effectType"
	"github.com/krile136/sceneManager/game/effects"
)

func main() {
	game := game.MakeGame(320, 240)

	game.SetInitScene(&Top{})
	game.AddScene(&Next{})

	ebiten.SetWindowSize(640, 480)
	ebiten.SetWindowTitle("Hello, SceneManager!")
	if err := ebiten.RunGame(game); err != nil {
		log.Fatal(err)
	}
}

// Top Scence
type Top struct{}

func (t *Top) Init() error {
	return nil
}

func (t *Top) Update() error {
	if inpututil.IsKeyJustPressed(ebiten.KeyEnter) {
		outSceneEffect := &effects.SceneEffect{
			Type:  effectType.CircularClosing,
			Clr:   color.RGBA{R: 24, G: 235, B: 249, A: 255},
			Frame: 60,
		}

		inSceneEffect := &effects.SceneEffect{
			Type:  effectType.CircularOpening,
			Clr:   color.RGBA{R: 24, G: 235, B: 249, A: 255},
			Frame: 60,
		}

		op := &game.TransitionOptions{
			OutSceneEffect: *outSceneEffect,
			InSceneEffect:  *inSceneEffect,
		}
		game.Change("Next", op)
	}

	return nil
}

func (t *Top) Draw(screen *ebiten.Image) {
	ebitenutil.DebugPrint(screen, "top!")
}

// Next Scene
type Next struct{}

func (n *Next) Init() error {
	return nil
}

func (n *Next) Update() error {
	if inpututil.IsKeyJustPressed(ebiten.KeyEnter) {
		outSceneEffect := &effects.SceneEffect{
			Type:  effectType.FadeOut,
			Clr:   color.RGBA{R: 0, G: 0, B: 0, A: 255},
			Frame: 30,
		}
		inSceneEffect := &effects.SceneEffect{
			Type:  effectType.FadeIn,
			Clr:   color.RGBA{R: 0, G: 0, B: 0, A: 255},
			Frame: 30,
		}

		op := &game.TransitionOptions{
			OutSceneEffect: *outSceneEffect,
			InSceneEffect:  *inSceneEffect,
		}
		game.Change("Top", op)
	}
	return nil
}

func (n *Next) Draw(screen *ebiten.Image) {
	ebitenutil.DebugPrint(screen, "Next!")
}

動かすとどうなるの?

  • Top画面からNext画面
    • 画面の中央に向かって円が狭まっていき、切り替えと同時に円が広がってNext画面が開きます
  • Next画面からTop画面
    • フェードアウト/フェードインをして画面が切り替わります

リポジトリ

よかったらスター押していってね⭐️

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?