mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 19:28:57 +01:00
380 lines
9.7 KiB
HTML
380 lines
9.7 KiB
HTML
<!DOCTYPE html>
|
|
<!--
|
|
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.
|
|
|
|
-->
|
|
<link rel="shortcut icon" href="./favicon.png" type="image/png" >
|
|
<link rel="icon" href="./favicon.png" type="image/png" >
|
|
<title>Ebiten - A simple SNES-like 2D game library in Go</title>
|
|
<style>
|
|
body {
|
|
font-family: sans-serif;
|
|
}
|
|
table.examples td {
|
|
vertical-align: top;
|
|
}
|
|
table.examples td.code {
|
|
border-color: #999;
|
|
border-style: solid;
|
|
border-width: 1px;
|
|
}
|
|
table.examples td.code pre {
|
|
height: 240px;
|
|
overflow: auto;
|
|
}
|
|
table.examples iframe {
|
|
border-color: #999;
|
|
border-style: solid;
|
|
border-width: 1px;
|
|
overflow: hidden;
|
|
}
|
|
</style>
|
|
<h1>Ebiten (海老天)</h1>
|
|
<p>v1.1.0-alpha</p>
|
|
<ul>
|
|
<li>A simple SNES-like 2D game library in Go</li>
|
|
<li>Works on
|
|
<ul>
|
|
<li>Web browsers (powered by <a href="http://gopherjs.org/">GopherJS</a>)
|
|
<li>Mac OS X</li>
|
|
<li>Linux (maybe)</li>
|
|
<li>Windows (possibly)</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="http://godoc.org/github.com/hajimehoshi/ebiten">API Docs</a></li>
|
|
<li><a href="http://github.com/hajimehoshi/ebiten">Source Code</a> (Development version: v1.1.0-alpha)</li>
|
|
</ul>
|
|
|
|
<h2>Features</h2>
|
|
<ul>
|
|
<li>2D Graphics</li>
|
|
<li>Input (Mouse, Keyboard)</li>
|
|
</ul>
|
|
|
|
<h2>Example</h2>
|
|
<table class="examples">
|
|
|
|
<tr>
|
|
<td class="code"><pre><code>// <b>blocks</b>
|
|
|
|
// Please read example/blocks/main.go and example/blocks/blocks/*.go</code></pre></td>
|
|
|
|
<td>Click to play!<br><a href="example/blocks.html"><img src="blocks.png" width="256" height="240"></a></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="code"><pre><code>// <b>hue</b>
|
|
|
|
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)
|
|
}
|
|
}
|
|
</code></pre></td>
|
|
|
|
<td><iframe src="example/hue.html" width="320" height="240"></iframe></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="code"><pre><code>// <b>mosaic</b>
|
|
|
|
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)
|
|
}
|
|
}
|
|
</code></pre></td>
|
|
|
|
<td><iframe src="example/mosaic.html" width="320" height="240"></iframe></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="code"><pre><code>// <b>perspective</b>
|
|
|
|
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)
|
|
}
|
|
}
|
|
</code></pre></td>
|
|
|
|
<td><iframe src="example/perspective.html" width="320" height="240"></iframe></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="code"><pre><code>// <b>rotate</b>
|
|
|
|
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)
|
|
}
|
|
}
|
|
</code></pre></td>
|
|
|
|
<td><iframe src="example/rotate.html" width="320" height="240"></iframe></td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
<h2>Install on Mac OS X</h2>
|
|
<pre><code>:; brew install glew
|
|
:; brew install glfw3 # or homebrew/versions/glfw3
|
|
:; go get github.com/hajimehoshi/ebiten</code></pre>
|
|
<p>If you want to run your game on a web browser, execute this:</p>
|
|
<pre><code>:; go get github.com/gopherjs/gopherjs
|
|
:; go get github.com/gopherjs/webgl</code></pre>
|
|
|
|
<h2>Execute the example</h2>
|
|
<pre><code>:; cd $GOHOME/src/github.com/hajimehoshi/ebiten/example
|
|
:; go run rotate/main.go</code></pre>
|
|
|
|
<h2>Execute the example on a web browser</h2>
|
|
<p>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:</p>
|
|
<pre><code>:; go run $GOPATH/src/github.com/hajimehoshi/ebiten/example/server/main.go</code></pre>
|
|
<p>Then, open <code>localhost:8000</code> on your browser.</p>
|
|
<p><code>localhost:8000/?EXAMPLE_NAME</code> shows other examples (e.g. <code>localhost:8000/?rotate</code>).</p>
|
|
<p>Of cource, you can execute gopherjs yourself. Please see <a href="http://gopherjs.org/">GopherJS site</a> for more detail.</p>
|
|
|
|
<h2>Run your game on a web browser</h2>
|
|
<p>Compile your game with GopherJS:</p>
|
|
<pre><code>:; gopherjs build -o yourgame.js path/to/yourgame</code></pre>
|
|
<p>Then, open the below HTML on your HTTP server:</p>
|
|
<pre><code><!DOCTYPE html>
|
|
<script src="yourgame.js"></script></code></pre>
|
|
|
|
<h2>Change Log</h2>
|
|
<h3>2015-??-??</h3>
|
|
<ul>
|
|
<li>v1.1.0-rc1 released.
|
|
<ul>
|
|
<li>Support for web browsers: Ebiten now includes support for web browsers with GopherJS.</li>
|
|
<li>Some API has changed:
|
|
<ul>
|
|
<li>ImagePart is deprecated. Use ImageParts interface instead.</li>
|
|
<li>ColorM.Element and GeoM.Element's recievers changed from structs to pointers.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3>2015-01-04</h3>
|
|
<ul>
|
|
<li>v1.0.0 released.
|
|
<ul>
|
|
<li>Nothing has changed from v1.0.0-rc1.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3>2014-12-29</h3>
|
|
<ul>
|
|
<li>v1.0.0-rc1 released.</li>
|
|
</ul>
|
|
|
|
<h2>License</h2>
|
|
<h3>Ebiten</h3>
|
|
<pre>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.
|
|
</pre>
|
|
<h3>Go Gopher photograph</h3>
|
|
<p><a href="http://blog.golang.org/go-programming-language-turns-two">The original photograph of Go gophers by Chris Nokleberg</a> is licensed under the Creative Commons 3.0 Attributions license.</p>
|