Qiita Conference 2025

Qiita史上最多!豪華12名のゲストが登壇

特別講演ゲスト(敬称略)

ymrl、成瀬允宣、鹿野壮、伊藤淳一、uhyo、徳丸浩、ミノ駆動、みのるん、桜庭洋之、tenntenn、けんちょん、こにふぁー

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

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
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?