inpututil: Add AppendJustConnectedTouchIDs

Closes #1705
This commit is contained in:
Hajime Hoshi 2021-07-10 23:28:32 +09:00
parent e8ea4046cb
commit 5c4885c988
5 changed files with 50 additions and 31 deletions

View File

@ -112,6 +112,7 @@ func (t musicType) String() string {
// Player represents the current audio state. // Player represents the current audio state.
type Player struct { type Player struct {
game *Game
audioContext *audio.Context audioContext *audio.Context
audioPlayer *audio.Player audioPlayer *audio.Player
current time.Duration current time.Duration
@ -129,7 +130,7 @@ func playerBarRect() (x, y, w, h int) {
return return
} }
func NewPlayer(audioContext *audio.Context, musicType musicType) (*Player, error) { func NewPlayer(game *Game, audioContext *audio.Context, musicType musicType) (*Player, error) {
type audioStream interface { type audioStream interface {
io.ReadSeeker io.ReadSeeker
Length() int64 Length() int64
@ -160,6 +161,7 @@ func NewPlayer(audioContext *audio.Context, musicType musicType) (*Player, error
return nil, err return nil, err
} }
player := &Player{ player := &Player{
game: game,
audioContext: audioContext, audioContext: audioContext,
audioPlayer: p, audioPlayer: p,
total: time.Second * time.Duration(s.Length()) / bytesPerSample / sampleRate, total: time.Second * time.Duration(s.Length()) / bytesPerSample / sampleRate,
@ -232,7 +234,7 @@ func (p *Player) shouldPlaySE() bool {
return true return true
} }
} }
for _, id := range inpututil.JustPressedTouchIDs() { for _, id := range p.game.justPressedTouchIDs {
if image.Pt(ebiten.TouchPosition(id)).In(r) { if image.Pt(ebiten.TouchPosition(id)).In(r) {
return true return true
} }
@ -277,7 +279,7 @@ func (p *Player) shouldSwitchPlayStateIfNeeded() bool {
return true return true
} }
} }
for _, id := range inpututil.JustPressedTouchIDs() { for _, id := range p.game.justPressedTouchIDs {
if image.Pt(ebiten.TouchPosition(id)).In(r) { if image.Pt(ebiten.TouchPosition(id)).In(r) {
return true return true
} }
@ -296,14 +298,14 @@ func (p *Player) switchPlayStateIfNeeded() {
p.audioPlayer.Play() p.audioPlayer.Play()
} }
func justPressedPosition() (int, int, bool) { func (p *Player) justPressedPosition() (int, int, bool) {
if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) { if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {
x, y := ebiten.CursorPosition() x, y := ebiten.CursorPosition()
return x, y, true return x, y, true
} }
if ts := inpututil.JustPressedTouchIDs(); len(ts) > 0 { if len(p.game.justPressedTouchIDs) > 0 {
x, y := ebiten.TouchPosition(ts[0]) x, y := ebiten.TouchPosition(p.game.justPressedTouchIDs[0])
return x, y, true return x, y, true
} }
@ -312,7 +314,7 @@ func justPressedPosition() (int, int, bool) {
func (p *Player) seekBarIfNeeded() { func (p *Player) seekBarIfNeeded() {
// Calculate the next seeking position from the current cursor position. // Calculate the next seeking position from the current cursor position.
x, y, ok := justPressedPosition() x, y, ok := p.justPressedPosition()
if !ok { if !ok {
return return
} }
@ -376,21 +378,25 @@ type Game struct {
musicPlayer *Player musicPlayer *Player
musicPlayerCh chan *Player musicPlayerCh chan *Player
errCh chan error errCh chan error
justPressedTouchIDs []ebiten.TouchID
} }
func NewGame() (*Game, error) { func NewGame() (*Game, error) {
audioContext := audio.NewContext(sampleRate) audioContext := audio.NewContext(sampleRate)
m, err := NewPlayer(audioContext, typeOgg) g := &Game{
musicPlayerCh: make(chan *Player),
errCh: make(chan error),
}
m, err := NewPlayer(g, audioContext, typeOgg)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &Game{ g.musicPlayer = m
musicPlayer: m, return g, nil
musicPlayerCh: make(chan *Player),
errCh: make(chan error),
}, nil
} }
func (g *Game) Update() error { func (g *Game) Update() error {
@ -402,6 +408,8 @@ func (g *Game) Update() error {
default: default:
} }
g.justPressedTouchIDs = inpututil.AppendJustPressedTouchIDs(g.justPressedTouchIDs[:0])
if g.musicPlayer != nil && inpututil.IsKeyJustPressed(ebiten.KeyA) { if g.musicPlayer != nil && inpututil.IsKeyJustPressed(ebiten.KeyA) {
var t musicType var t musicType
switch g.musicPlayer.musicType { switch g.musicPlayer.musicType {
@ -417,7 +425,7 @@ func (g *Game) Update() error {
g.musicPlayer = nil g.musicPlayer = nil
go func() { go func() {
p, err := NewPlayer(audio.CurrentContext(), t) p, err := NewPlayer(g, audio.CurrentContext(), t)
if err != nil { if err != nil {
g.errCh <- err g.errCh <- err
return return

View File

@ -184,8 +184,9 @@ func (s *Stroke) SetDraggingObject(object interface{}) {
} }
type Game struct { type Game struct {
strokes map[*Stroke]struct{} touchIDs []ebiten.TouchID
sprites []*Sprite strokes map[*Stroke]struct{}
sprites []*Sprite
} }
var ebitenImage *ebiten.Image var ebitenImage *ebiten.Image
@ -273,7 +274,8 @@ func (g *Game) Update() error {
s.SetDraggingObject(g.spriteAt(s.Position())) s.SetDraggingObject(g.spriteAt(s.Position()))
g.strokes[s] = struct{}{} g.strokes[s] = struct{}{}
} }
for _, id := range inpututil.JustPressedTouchIDs() { g.touchIDs = inpututil.AppendJustPressedTouchIDs(g.touchIDs[:0])
for _, id := range g.touchIDs {
s := NewStroke(&TouchStrokeSource{id}) s := NewStroke(&TouchStrokeSource{id})
s.SetDraggingObject(g.spriteAt(s.Position())) s.SetDraggingObject(g.spriteAt(s.Position()))
g.strokes[s] = struct{}{} g.strokes[s] = struct{}{}

View File

@ -178,6 +178,7 @@ type Game struct {
gameoverCount int gameoverCount int
keys []ebiten.Key keys []ebiten.Key
touchIDs []ebiten.TouchID
gamepadIDs []ebiten.GamepadID gamepadIDs []ebiten.GamepadID
} }
@ -215,7 +216,8 @@ func (g *Game) jump() bool {
if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) { if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {
return true return true
} }
if len(inpututil.JustPressedTouchIDs()) > 0 { g.touchIDs = inpututil.AppendJustPressedTouchIDs(g.touchIDs)
if len(g.touchIDs) > 0 {
return true return true
} }
g.gamepadIDs = ebiten.AppendGamepadIDs(g.gamepadIDs[:0]) g.gamepadIDs = ebiten.AppendGamepadIDs(g.gamepadIDs[:0])

View File

@ -110,7 +110,8 @@ func (g *Game) Update() error {
} }
// What touches are new in this frame? // What touches are new in this frame?
for _, id := range inpututil.JustPressedTouchIDs() { g.touchIDs = inpututil.AppendJustPressedTouchIDs(g.touchIDs[:0])
for _, id := range g.touchIDs {
x, y := ebiten.TouchPosition(id) x, y := ebiten.TouchPosition(id)
g.touches[id] = &touch{ g.touches[id] = &touch{
originX: x, originY: y, originX: x, originY: y,

View File

@ -253,8 +253,6 @@ func MouseButtonPressDuration(button ebiten.MouseButton) int {
// and returns the extended buffer. // and returns the extended buffer.
// Giving a slice that already has enough capacity works efficiently. // Giving a slice that already has enough capacity works efficiently.
// //
// AppendJustConnectedGamepadIDs might append nothing when there is no connected gamepad.
//
// AppendJustConnectedGamepadIDs is concurrent safe. // AppendJustConnectedGamepadIDs is concurrent safe.
func AppendJustConnectedGamepadIDs(gamepadIDs []ebiten.GamepadID) []ebiten.GamepadID { func AppendJustConnectedGamepadIDs(gamepadIDs []ebiten.GamepadID) []ebiten.GamepadID {
origLen := len(gamepadIDs) origLen := len(gamepadIDs)
@ -330,24 +328,32 @@ func GamepadButtonPressDuration(id ebiten.GamepadID, button ebiten.GamepadButton
return s return s
} }
// JustPressedTouchIDs returns touch IDs that are created just in the current frame. // AppendJustPressedTouchIDs append touch IDs that are created just in the current frame to touchIDs,
// and returns the extended buffer.
// Giving a slice that already has enough capacity works efficiently.
// //
// JustPressedTouchIDs might return nil when there is not touch. // AppendJustPressedTouchIDs is concurrent safe.
// func AppendJustPressedTouchIDs(touchIDs []ebiten.TouchID) []ebiten.TouchID {
// JustPressedTouchIDs is concurrent safe. origLen := len(touchIDs)
func JustPressedTouchIDs() []ebiten.TouchID {
var ids []ebiten.TouchID
theInputState.m.RLock() theInputState.m.RLock()
for id, s := range theInputState.touchDurations { for id, s := range theInputState.touchDurations {
if s == 1 { if s == 1 {
ids = append(ids, id) touchIDs = append(touchIDs, id)
} }
} }
theInputState.m.RUnlock() theInputState.m.RUnlock()
sort.Slice(ids, func(a, b int) bool { s := touchIDs[origLen:]
return ids[a] < ids[b] sort.Slice(s, func(a, b int) bool {
return s[a] < s[b]
}) })
return ids return touchIDs
}
// JustPressedTouchIDs returns touch IDs that are created just in the current frame.
//
// Deprecated: as of v2.2. Use AppendJustPressedTouchIDs instead.
func JustPressedTouchIDs() []ebiten.TouchID {
return AppendJustPressedTouchIDs(nil)
} }
// IsTouchJustReleased returns a boolean value indicating // IsTouchJustReleased returns a boolean value indicating