パソコンの画面上にgopherくんを飛ばしてみた🍤
概要
以前、goids(gopher + boids)のアプリを作りました。
boidsアルゴリズムに関しては以前作ったアプリに関する記事の中の説明を読んでください。
これらのアプリは、ブラウザ上や、ウィンドウ上でgopherが飛んでいました。それでも十分可愛いのですが、実際にパソコンで作業しながら飛んでいるgopherくんを眺めたかったので、作ってみました。
作ったもの
パソコンのが画面上にたくさんの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でアプリケーションを作る方法を知っている方がいましたら、教えていただきたいです。ログイン項目に追加して、パソコンを起動するたびに実行できるようにしてみたいです。
追記:
次の方法でひとまずはできた。
この記事の通りにするだけでできるかもしれないので、試してみる。
Discussion