Add ebiten.InputState

This commit is contained in:
Hajime Hoshi 2013-06-25 10:27:32 +09:00
parent fe11e23286
commit 6e584eb642
7 changed files with 80 additions and 15 deletions

View File

@ -16,7 +16,7 @@ type Game interface {
ScreenHeight() int ScreenHeight() int
Fps() int Fps() int
Init(tf graphics.TextureFactory) Init(tf graphics.TextureFactory)
Update() Update(input InputState)
Draw(g graphics.GraphicsContext, offscreen graphics.Texture) Draw(g graphics.GraphicsContext, offscreen graphics.Texture)
} }
@ -24,7 +24,13 @@ type UI interface {
Run(device graphics.Device) Run(device graphics.Device)
} }
func OpenGLRun(game Game, ui UI, screenScale int) { type InputState struct {
IsTapped bool
X int
Y int
}
func OpenGLRun(game Game, ui UI, screenScale int, input chan InputState) {
ch := make(chan bool, 1) ch := make(chan bool, 1)
graphicsDevice := opengl.NewDevice( graphicsDevice := opengl.NewDevice(
game.ScreenWidth(), game.ScreenHeight(), screenScale, game.ScreenWidth(), game.ScreenHeight(), screenScale,
@ -40,7 +46,8 @@ func OpenGLRun(game Game, ui UI, screenScale int) {
for { for {
<-tick <-tick
ticket := <-ch ticket := <-ch
game.Update() inputState := <-input
game.Update(inputState)
ch <- ticket ch <- ticket
} }
}() }()

View File

@ -1,6 +1,7 @@
package blank package blank
import ( import (
"github.com/hajimehoshi/go.ebiten"
"github.com/hajimehoshi/go.ebiten/graphics" "github.com/hajimehoshi/go.ebiten/graphics"
) )
@ -8,7 +9,7 @@ type Blank struct {
} }
func New() *Blank { func New() *Blank {
return &Blank{} return &Blank{}
} }
func (game *Blank) ScreenWidth() int { func (game *Blank) ScreenWidth() int {
@ -26,10 +27,8 @@ func (game *Blank) Fps() int {
func (game *Blank) Init(tf graphics.TextureFactory) { func (game *Blank) Init(tf graphics.TextureFactory) {
} }
func (game *Blank) Update() { func (game *Blank) Update(input ebiten.InputState) {
} }
func (game *Blank) Draw(g graphics.GraphicsContext, offscreen graphics.Texture) { func (game *Blank) Draw(g graphics.GraphicsContext, offscreen graphics.Texture) {
} }

View File

@ -1,6 +1,7 @@
package monochrome package monochrome
import ( import (
"github.com/hajimehoshi/go.ebiten"
"github.com/hajimehoshi/go.ebiten/graphics" "github.com/hajimehoshi/go.ebiten/graphics"
"github.com/hajimehoshi/go.ebiten/graphics/matrix" "github.com/hajimehoshi/go.ebiten/graphics/matrix"
"image" "image"
@ -94,7 +95,7 @@ func (game *Monochrome) update() {
} }
} }
func (game *Monochrome) Update() { func (game *Monochrome) Update(input ebiten.InputState) {
game.ch <- true game.ch <- true
<-game.ch <-game.ch
} }

View File

@ -1,6 +1,7 @@
package rects package rects
import ( import (
"github.com/hajimehoshi/go.ebiten"
"github.com/hajimehoshi/go.ebiten/graphics" "github.com/hajimehoshi/go.ebiten/graphics"
"github.com/hajimehoshi/go.ebiten/graphics/matrix" "github.com/hajimehoshi/go.ebiten/graphics/matrix"
"image/color" "image/color"
@ -32,7 +33,7 @@ func (game *Rects) Init(tf graphics.TextureFactory) {
game.rectsTexture = tf.NewTexture(game.ScreenWidth(), game.ScreenHeight()) game.rectsTexture = tf.NewTexture(game.ScreenWidth(), game.ScreenHeight())
} }
func (game *Rects) Update() { func (game *Rects) Update(input ebiten.InputState) {
} }
func (game *Rects) Draw(g graphics.GraphicsContext, offscreen graphics.Texture) { func (game *Rects) Draw(g graphics.GraphicsContext, offscreen graphics.Texture) {

View File

@ -1,6 +1,7 @@
package rotating package rotating
import ( import (
"github.com/hajimehoshi/go.ebiten"
"github.com/hajimehoshi/go.ebiten/graphics" "github.com/hajimehoshi/go.ebiten/graphics"
"github.com/hajimehoshi/go.ebiten/graphics/matrix" "github.com/hajimehoshi/go.ebiten/graphics/matrix"
"image" "image"
@ -47,7 +48,7 @@ func (game *Rotating) Init(tf graphics.TextureFactory) {
} }
} }
func (game *Rotating) Update() { func (game *Rotating) Update(input ebiten.InputState) {
game.x++ game.x++
} }

View File

@ -1,6 +1,7 @@
package sprites package sprites
import ( import (
"github.com/hajimehoshi/go.ebiten"
"github.com/hajimehoshi/go.ebiten/graphics" "github.com/hajimehoshi/go.ebiten/graphics"
"github.com/hajimehoshi/go.ebiten/graphics/matrix" "github.com/hajimehoshi/go.ebiten/graphics/matrix"
"image" "image"
@ -104,7 +105,7 @@ func (game *Sprites) Init(tf graphics.TextureFactory) {
} }
} }
func (game *Sprites) Update() { func (game *Sprites) Update(input ebiten.InputState) {
for _, sprite := range game.sprites { for _, sprite := range game.sprites {
sprite.Update() sprite.Update()
} }

View File

@ -29,8 +29,23 @@ import (
"unsafe" "unsafe"
) )
type GlutInputEventState int
const (
GlutInputEventStateUp GlutInputEventState = iota
GlutInputEventStateDown
)
type GlutInputEvent struct {
State GlutInputEventState
X int
Y int
}
type GlutUI struct { type GlutUI struct {
device graphics.Device screenScale int
device graphics.Device
glutInputEventCh chan GlutInputEvent
} }
var currentUI *GlutUI var currentUI *GlutUI
@ -42,8 +57,21 @@ func display() {
} }
//export mouse //export mouse
func mouse(button, state, x, y C.int) { func mouse(button, glutState, x, y C.int) {
var state GlutInputEventState
switch glutState {
case C.GLUT_UP:
state = GlutInputEventStateUp
case C.GLUT_DOWN:
state = GlutInputEventStateDown
default:
panic("invalid glutState")
}
currentUI.glutInputEventCh <- GlutInputEvent{
State: state,
X: int(x),
Y: int(y),
}
} }
//export idle //export idle
@ -52,6 +80,9 @@ func idle() {
} }
func (ui *GlutUI) Init(screenWidth, screenHeight, screenScale int) { func (ui *GlutUI) Init(screenWidth, screenHeight, screenScale int) {
ui.screenScale = screenScale
ui.glutInputEventCh = make(chan GlutInputEvent, 10)
cargs := []*C.char{} cargs := []*C.char{}
for _, arg := range os.Args { for _, arg := range os.Args {
cargs = append(cargs, C.CString(arg)) cargs = append(cargs, C.CString(arg))
@ -109,5 +140,29 @@ func main() {
currentUI = &GlutUI{} currentUI = &GlutUI{}
currentUI.Init(gm.ScreenWidth(), gm.ScreenHeight(), screenScale) currentUI.Init(gm.ScreenWidth(), gm.ScreenHeight(), screenScale)
ebiten.OpenGLRun(gm, currentUI, screenScale) input := make(chan ebiten.InputState)
go func() {
ch := currentUI.glutInputEventCh
var inputState ebiten.InputState
for {
select {
case event := <-ch:
switch event.State {
case GlutInputEventStateUp:
inputState.IsTapped = false
inputState.X = 0
inputState.Y = 0
case GlutInputEventStateDown:
inputState.IsTapped = true
inputState.X = event.X
inputState.Y = event.Y
}
default:
// do nothing
}
input <- inputState
}
}()
ebiten.OpenGLRun(gm, currentUI, screenScale, input)
} }