🍤

パソコンの画面上にgopherくんを飛ばしてみた🍤

2024/01/01に公開

概要

以前、goids(gopher + boids)のアプリを作りました。
boidsアルゴリズムに関しては以前作ったアプリに関する記事の中の説明を読んでください。

https://zenn.dev/hamao/articles/6560486f923dce

https://zenn.dev/hamao/articles/16fa30b6c73ea6

これらのアプリは、ブラウザ上や、ウィンドウ上でgopherが飛んでいました。それでも十分可愛いのですが、実際にパソコンで作業しながら飛んでいるgopherくんを眺めたかったので、作ってみました。

https://github.com/hamao0820/goids-ebiten

作ったもの

パソコンのが画面上にたくさんのgopherくんを飛ばす(泳がす?)アプリを作りました。
たくさんのgopherくんに囲まれながら作業することもできます。

遊び方

$ git clone https://github.com/hamao0820/goids-ebiten.git
$ go run ./main.go

あとは眺めるだけです。マウスを近づけることで、gopherくんが逃げていきます。

実装

利用したパッケージ

goids

boidsアルゴリズムの処理は先に貼った記事とほとんど一緒なので、詳しく知りたい方はそちらを参照してください。
一応、Goid構造体を載せておきます。

type Goid struct {
	position     vector.Vector
	velocity     vector.Vector
	acceleration vector.Vector
	maxSpeed     float64
	maxForce     float64
	sight        float64
	imageType    ImageType
}

Update

Update関数内では、それぞれのgoidの構造体のUpdateメソッドを呼び出しています。
また、ebiten.CursorPosition()でマウスの位置を取得して、gopherくんがマウスから逃げる処理に渡しています。

func (g *Game) Update() error {
	x, y := ebiten.CursorPosition()
	mouse := vector.CreateVector(float64(x), float64(y))
	for i := 0; i < len(g.goids); i++ {
		goid := &g.goids[i]
		goid.Flock(g.goids, mouse)
		goid.Update(float64(Width), float64(Height))
	}
	return nil
}

画面サイズの取得

ebiten.ScreenSizeInFullscreenで取得できます。

var (
	Width, Height int
)

func init() {
	Width, Height = ebiten.ScreenSizeInFullscreen()
}

オプションの追加

main関数は次のようになっています。

func main() {
	g := goids.NewGame()
	ebiten.SetWindowSize(goids.Width, goids.Height)
	ebiten.SetWindowTitle("Goids")
	ebiten.SetWindowFloating(true)
	ebiten.SetWindowDecorated(false)
	ebiten.SetWindowMousePassthrough(true)
	op := &ebiten.RunGameOptions{}
	op.ScreenTransparent = true
	if err := ebiten.RunGameWithOptions(g, op); err != nil {
		panic(err)
	}
}

ebiten.SetWindow*でウィンドウの設定ができます。それらのうちいくつかの意味は以下の通りです。

  • SetWindowFloating(true): ウィンドウが常に一番手前に来るようになります。
  • SetWindowDecorated(false): ウィンドウのヘッダが非表示になります。閉じるボタンなどを押すことができなくなります。
  • SetWindowMousePassthrough(true): マウスの判定がウィンドウをすり抜けるようになります。ウィンドウの後ろにあるものをクリックしたりできるようになります。

また、&ebiten.RunGameOptions{ScreenTransparent: true}RunGameWithOptionsに渡すことで、ウィンドウの背景が透過するようになります。

まとめ

Ebitengineには色々な機能があって面白いです🍤

Goでアプリケーションを作る方法を知っている方がいましたら、教えていただきたいです。ログイン項目に追加して、パソコンを起動するたびに実行できるようにしてみたいです。

追記:

次の方法でひとまずはできた。

https://zenn.dev/hamao/articles/bdc3a13ad5b628

この記事の通りにするだけでできるかもしれないので、試してみる。

https://ebitengine.org/ja/blog/steam.html

Discussion