Close the observing channel

This commit is contained in:
Hajime Hoshi 2013-12-01 21:42:41 +09:00
parent e2a8b07a94
commit 3e5d58ef85
5 changed files with 40 additions and 30 deletions

View File

@ -11,12 +11,12 @@ import (
)
type Rects struct {
rectTextureId graphics.RenderTargetId
rectTextureInited bool
offscreenId graphics.RenderTargetId
offscreenInited bool
rectBounds *graphics.Rect
rectColor *color.RGBA
rectTextureId graphics.RenderTargetId
rectTextureInited bool
offscreenId graphics.RenderTargetId
offscreenInited bool
rectBounds *graphics.Rect
rectColor *color.RGBA
screenSizeUpdatedCh chan ebiten.ScreenSizeUpdatedEvent
screenWidth int
screenHeight int
@ -31,10 +31,10 @@ const (
func New() *Rects {
return &Rects{
rectTextureInited: false,
offscreenInited: false,
rectBounds: &graphics.Rect{},
rectColor: &color.RGBA{},
rectTextureInited: false,
offscreenInited: false,
rectBounds: &graphics.Rect{},
rectColor: &color.RGBA{},
screenSizeUpdatedCh: make(chan ebiten.ScreenSizeUpdatedEvent),
}
}

View File

@ -16,9 +16,9 @@ const (
)
type Rotating struct {
ebitenTextureId graphics.TextureId
x int
geometryMatrix matrix.Geometry
ebitenTextureId graphics.TextureId
x int
geometryMatrix matrix.Geometry
screenSizeUpdatedCh chan ebiten.ScreenSizeUpdatedEvent
screenWidth int
screenHeight int

View File

@ -64,8 +64,8 @@ func (sprite *Sprite) Update() {
}
type Sprites struct {
ebitenTextureId graphics.TextureId
sprites []*Sprite
ebitenTextureId graphics.TextureId
sprites []*Sprite
screenSizeUpdatedCh chan ebiten.ScreenSizeUpdatedEvent
screenWidth int
screenHeight int

View File

@ -81,20 +81,26 @@ func main() {
events:
for {
select {
case e := <-screenSizeUpdated:
type Handler interface {
OnScreenSizeUpdated(e ebiten.ScreenSizeUpdatedEvent)
case e, ok := <-inputStateUpdated:
if ok {
type Handler interface {
OnInputStateUpdated(ebiten.InputStateUpdatedEvent)
}
if game2, ok := game.(Handler); ok {
game2.OnInputStateUpdated(e)
}
}
if game2, ok := game.(Handler); ok {
game2.OnScreenSizeUpdated(e)
}
case e := <-inputStateUpdated:
type Handler interface {
OnInputStateUpdated(ebiten.InputStateUpdatedEvent)
}
if game2, ok := game.(Handler); ok {
game2.OnInputStateUpdated(e)
inputStateUpdated = ui.ObserveInputStateUpdated()
case e, ok := <-screenSizeUpdated:
if ok {
type Handler interface {
OnScreenSizeUpdated(e ebiten.ScreenSizeUpdatedEvent)
}
if game2, ok := game.(Handler); ok {
game2.OnScreenSizeUpdated(e)
}
}
screenSizeUpdated = ui.ObserveScreenSizeUpdated()
default:
break events
}

View File

@ -47,9 +47,9 @@ func New(screenWidth, screenHeight, screenScale int, title string) *UI {
panic("UI can't be duplicated.")
}
ui := &UI{
screenWidth: screenWidth,
screenHeight: screenHeight,
screenScale: screenScale,
screenWidth: screenWidth,
screenHeight: screenHeight,
screenScale: screenScale,
initialEventSent: false,
inputStateUpdatedChs: make(chan chan ebiten.InputStateUpdatedEvent),
inputStateUpdatedNotified: make(chan ebiten.InputStateUpdatedEvent),
@ -90,13 +90,17 @@ func (ui *UI) chLoop() {
case e := <-ui.inputStateUpdatedNotified:
for _, ch := range inputStateUpdated {
ch <- e
close(ch)
}
inputStateUpdated = []chan ebiten.InputStateUpdatedEvent{}
case ch := <-ui.screenSizeUpdatedChs:
screenSizeUpdated = append(screenSizeUpdated, ch)
case e := <-ui.screenSizeUpdatedNotified:
for _, ch := range screenSizeUpdated {
ch <- e
close(ch)
}
screenSizeUpdated = []chan ebiten.ScreenSizeUpdatedEvent{}
}
}
}