Ebiten (海老天)
v1.1.0-alpha
- A simple SNES-like 2D game library in Go
- Works on
- Web browsers (powered by GopherJS)
- Mac OS X
- Linux (maybe)
- Windows (possibly)
- API Docs
- Source Code (Development version: v1.1.0-alpha)
Features
- 2D Graphics
- Input (Mouse, Keyboard)
Example
// blocks
// Please read example/blocks/main.go and example/blocks/blocks/*.go
|
Click to play!
|
// hue
package main
import (
"github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil"
_ "image/jpeg"
"log"
"math"
)
const (
screenWidth = 320
screenHeight = 240
)
var (
count int
gophersImage *ebiten.Image
)
func update(screen *ebiten.Image) error {
count++
w, h := gophersImage.Size()
op := &ebiten.DrawImageOptions{}
op.GeoM.Translate(float64(screenWidth-w)/2, float64(screenHeight-h)/2)
op.ColorM.Concat(ebiten.RotateHue(float64(count%360) * 2 * math.Pi / 360))
if err := screen.DrawImage(gophersImage, op); err != nil {
return err
}
return nil
}
func main() {
var err error
gophersImage, _, err = ebitenutil.NewImageFromFile("images/gophers.jpg", ebiten.FilterNearest)
if err != nil {
log.Fatal(err)
}
if err := ebiten.Run(update, screenWidth, screenHeight, 1, "Hue (Ebiten Demo)"); err != nil {
log.Fatal(err)
}
}
|
|
// mosaic
package main
import (
"github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil"
_ "image/jpeg"
"log"
)
const (
screenWidth = 320
screenHeight = 240
)
const mosaicRatio = 16
var (
gophersImage *ebiten.Image
gophersRenderTarget *ebiten.Image
)
func update(screen *ebiten.Image) error {
op := &ebiten.DrawImageOptions{}
op.GeoM.Scale(1.0/mosaicRatio, 1.0/mosaicRatio)
gophersRenderTarget.DrawImage(gophersImage, op)
op = &ebiten.DrawImageOptions{}
op.GeoM.Scale(mosaicRatio, mosaicRatio)
screen.DrawImage(gophersRenderTarget, op)
return nil
}
func main() {
var err error
gophersImage, _, err = ebitenutil.NewImageFromFile("images/gophers.jpg", ebiten.FilterNearest)
if err != nil {
log.Fatal(err)
}
w, h := gophersImage.Size()
gophersRenderTarget, err = ebiten.NewImage(w/mosaicRatio, h/mosaicRatio, ebiten.FilterNearest)
if err != nil {
log.Fatal(err)
}
if err := ebiten.Run(update, screenWidth, screenHeight, 1, "Mosaic (Ebiten Demo)"); err != nil {
log.Fatal(err)
}
}
|
|
// perspective
package main
import (
"github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil"
_ "image/jpeg"
"log"
)
const (
screenWidth = 320
screenHeight = 240
)
var (
gophersImage *ebiten.Image
)
type parts struct {
image *ebiten.Image
}
func (p parts) Len() int {
_, h := p.image.Size()
return h
}
func (p parts) Dst(i int) (x0, y0, x1, y1 int) {
w, h := p.image.Size()
width := w + i*3/4
x := ((h - i) * 3 / 4) / 2
return x, i, x + width, i + 1
}
func (p parts) Src(i int) (x0, y0, x1, y1 int) {
w, _ := p.image.Size()
return 0, i, w, i + 1
}
func update(screen *ebiten.Image) error {
op := &ebiten.DrawImageOptions{
ImageParts: &parts{gophersImage},
}
w, h := gophersImage.Size()
maxWidth := float64(w) + float64(h)*0.75
op.GeoM.Translate(-maxWidth/2, -float64(h)/2)
op.GeoM.Translate(screenWidth/2, screenHeight/2)
screen.DrawImage(gophersImage, op)
return nil
}
func main() {
var err error
gophersImage, _, err = ebitenutil.NewImageFromFile("images/gophers.jpg", ebiten.FilterNearest)
if err != nil {
log.Fatal(err)
}
if err := ebiten.Run(update, screenWidth, screenHeight, 1, "Perspective (Ebiten Demo)"); err != nil {
log.Fatal(err)
}
}
|
|
// rotate
package main
import (
"github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil"
_ "image/jpeg"
"log"
"math"
)
const (
screenWidth = 320
screenHeight = 240
)
var (
count int
gophersImage *ebiten.Image
)
func update(screen *ebiten.Image) error {
count++
w, h := gophersImage.Size()
op := &ebiten.DrawImageOptions{}
op.GeoM.Translate(-float64(w)/2, -float64(h)/2)
op.GeoM.Rotate(float64(count%360) * 2 * math.Pi / 360)
op.GeoM.Translate(screenWidth/2, screenHeight/2)
if err := screen.DrawImage(gophersImage, op); err != nil {
return err
}
return nil
}
func main() {
var err error
gophersImage, _, err = ebitenutil.NewImageFromFile("images/gophers.jpg", ebiten.FilterNearest)
if err != nil {
log.Fatal(err)
}
if err := ebiten.Run(update, screenWidth, screenHeight, 1, "Rotate (Ebiten Demo)"); err != nil {
log.Fatal(err)
}
}
|
|
Install on Mac OS X
:; brew install glew
:; brew install glfw3 # or homebrew/versions/glfw3
:; go get github.com/hajimehoshi/ebiten
If you want to run your game on a web browser, execute this:
:; go get github.com/gopherjs/gopherjs
:; go get github.com/gopherjs/webgl
Execute the example
:; cd $GOHOME/src/github.com/hajimehoshi/ebiten/example
:; go run rotate/main.go
Execute the example on a web browser
If you can the example screens above, Ebiten is working on your browser! Each example above works as an independent html in an iframe. If you want to execute the examples apart from this site, execute this:
:; go run $GOPATH/src/github.com/hajimehoshi/ebiten/example/server/main.go
Then, open localhost:8000
on your browser.
localhost:8000/?EXAMPLE_NAME
shows other examples (e.g. localhost:8000/?rotate
).
Of cource, you can execute gopherjs yourself. Please see GopherJS site for more detail.
Run your game on a web browser
Compile your game with GopherJS:
:; gopherjs build -o yourgame.js path/to/yourgame
Then, open the below HTML on your HTTP server:
<!DOCTYPE html>
<script src="yourgame.js"></script>
Change Log
2015-??-??
- v1.1.0-rc1 released.
- Support for web browsers: Ebiten now includes support for web browsers with GopherJS.
- Some API has changed:
- ImagePart is deprecated. Use ImageParts interface instead.
- ColorM.Element and GeoM.Element's recievers changed from structs to pointers.
2015-01-04
- v1.0.0 released.
- Nothing has changed from v1.0.0-rc1.
2014-12-29
License
Ebiten
Copyright 2015 Hajime Hoshi
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Go Gopher photograph
The original photograph of Go gophers by Chris Nokleberg is licensed under the Creative Commons 3.0 Attributions license.