Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions ebitest.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,14 @@ func (e *Ebitest) MustNot(t *testing.T, s interface{}) {
return
}

// KeyTap taps all the keys at once
func (e *Ebitest) KeyTap(keys ...ebiten.Key) {
if len(keys) == 0 {
return
}
e.PingPong.KeyTapPing(Ball{KeyTap: BallKeyTap{Keys: keys}})
}

// getSelector converts s to the right Selector initialization
func (e *Ebitest) getSelector(s interface{}) *Selector {
switch v := s.(type) {
Expand Down
5 changes: 5 additions & 0 deletions ebitest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"testing"

"github.com/go-vgo/robotgo"
"github.com/hajimehoshi/ebiten/v2"
"github.com/stretchr/testify/assert"
"github.com/xescugc/ebitest"
"github.com/xescugc/ebitest/testdata"
Expand Down Expand Up @@ -37,4 +38,8 @@ func TestGameButton(t *testing.T) {

et.ShouldNot(t, text1)
et.Should(t, text2)

//et.KeyTap(ebiten.KeyShift, ebiten.KeyI)
et.KeyTap(ebiten.KeyI, ebiten.KeyShift)
assert.True(t, g.ClickedShiftI)
}
36 changes: 29 additions & 7 deletions game.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,19 @@ type Game struct {

pingPong *PingPong

clickTTT *TicTacToe
keyTapKeys []ebiten.Key

clickTTT *TicTacToe
keyTapTTT *TicTacToe
}

func newGame(ctx context.Context, g ebiten.Game, pp *PingPong) *Game {
return &Game{
game: g,
ctx: ctx,
pingPong: pp,
clickTTT: NewTicTacToe(),
game: g,
ctx: ctx,
pingPong: pp,
clickTTT: NewTicTacToe(),
keyTapTTT: NewTicTacToe(),
}
}

Expand Down Expand Up @@ -55,9 +59,24 @@ func (g *Game) Update() error {
return ebiten.Termination
default:
}
if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {
g.clickTTT.Tac()
// Check for click
if g.clickTTT.HasTic() {
if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {
g.clickTTT.Tac()
}
}

// Check for Pressed
if g.keyTapTTT.HasTic() {
pressed := true
for _, k := range g.keyTapKeys {
pressed = pressed && ebiten.IsKeyPressed(k)
}
if pressed {
g.keyTapTTT.Tac()
}
}

return g.game.Update()
}

Expand All @@ -69,7 +88,10 @@ func (g *Game) Draw(screen *ebiten.Image) {

g.pingPong.Pong()
g.pingPong.ClickPong(g.clickTTT)
g.pingPong.KeyTapPong(g.keyTapTTT, g)

g.clickTTT.Toe()
g.keyTapTTT.Toe()

return
}
133 changes: 133 additions & 0 deletions key.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package ebitest

import "github.com/hajimehoshi/ebiten/v2"

var (
// ebitenToRobotgoKeys is a list of keys from Ebiten mapped
// to the 'robotgo' keys
ebitenToRobotgoKeys = map[ebiten.Key]string{
ebiten.KeyA: "a",
ebiten.KeyB: "b",
ebiten.KeyC: "c",
ebiten.KeyD: "d",
ebiten.KeyE: "e",
ebiten.KeyF: "f",
ebiten.KeyG: "g",
ebiten.KeyH: "h",
ebiten.KeyI: "i",
ebiten.KeyJ: "j",
ebiten.KeyK: "k",
ebiten.KeyL: "l",
ebiten.KeyM: "m",
ebiten.KeyN: "n",
ebiten.KeyO: "o",
ebiten.KeyP: "p",
ebiten.KeyQ: "q",
ebiten.KeyR: "r",
ebiten.KeyS: "s",
ebiten.KeyT: "t",
ebiten.KeyU: "u",
ebiten.KeyV: "v",
ebiten.KeyW: "w",
ebiten.KeyX: "x",
ebiten.KeyY: "y",
ebiten.KeyZ: "z",
ebiten.KeyAltLeft: "lalt",
ebiten.KeyAltRight: "ralt",
ebiten.KeyArrowDown: "down",
ebiten.KeyArrowLeft: "left",
ebiten.KeyArrowRight: "right",
ebiten.KeyArrowUp: "up",
//ebiten.KeyBackquote
//ebiten.KeyBackslash
ebiten.KeyBackspace: "backspace",
//ebiten.KeyBracketLeft
//ebiten.KeyBracketRight
ebiten.KeyCapsLock: "capslock",
//ebiten.KeyComma
//ebiten.KeyContextMenu
ebiten.KeyControlLeft: "lctrl",
ebiten.KeyControlRight: "rctrl",
ebiten.KeyDelete: "delete",
ebiten.KeyDigit0: "0",
ebiten.KeyDigit1: "1",
ebiten.KeyDigit2: "2",
ebiten.KeyDigit3: "3",
ebiten.KeyDigit4: "4",
ebiten.KeyDigit5: "5",
ebiten.KeyDigit6: "6",
ebiten.KeyDigit7: "7",
ebiten.KeyDigit8: "8",
ebiten.KeyDigit9: "9",
ebiten.KeyEnd: "end",
ebiten.KeyEnter: "enter",
//ebiten.KeyEqual
ebiten.KeyEscape: "escape",
ebiten.KeyF1: "f1",
ebiten.KeyF2: "f2",
ebiten.KeyF3: "f3",
ebiten.KeyF4: "f4",
ebiten.KeyF5: "f5",
ebiten.KeyF6: "f6",
ebiten.KeyF7: "f7",
ebiten.KeyF8: "f8",
ebiten.KeyF9: "f9",
ebiten.KeyF10: "f10",
ebiten.KeyF11: "f11",
ebiten.KeyF12: "f12",
ebiten.KeyF13: "f13",
ebiten.KeyF14: "f14",
ebiten.KeyF15: "f15",
ebiten.KeyF16: "f16",
ebiten.KeyF17: "f17",
ebiten.KeyF18: "f18",
ebiten.KeyF19: "f19",
ebiten.KeyF20: "f20",
ebiten.KeyF21: "f21",
ebiten.KeyF22: "f22",
ebiten.KeyF23: "f23",
ebiten.KeyF24: "f24",
ebiten.KeyHome: "home",
ebiten.KeyInsert: "insert",
//ebiten.KeyIntlBackslash
ebiten.KeyMetaLeft: "lmeta",
ebiten.KeyMetaRight: "rmeta",
//ebiten.KeyMinus
ebiten.KeyNumLock: "num_lock",
ebiten.KeyNumpad0: "num0",
ebiten.KeyNumpad1: "num1",
ebiten.KeyNumpad2: "num2",
ebiten.KeyNumpad3: "num3",
ebiten.KeyNumpad4: "num4",
ebiten.KeyNumpad5: "num5",
ebiten.KeyNumpad6: "num6",
ebiten.KeyNumpad7: "num7",
ebiten.KeyNumpad8: "num8",
ebiten.KeyNumpad9: "num9",
ebiten.KeyNumpadAdd: "num+",
ebiten.KeyNumpadDecimal: "num.",
ebiten.KeyNumpadDivide: "num/",
ebiten.KeyNumpadEnter: "num_enter",
ebiten.KeyNumpadEqual: "num_equal",
ebiten.KeyNumpadMultiply: "num*",
ebiten.KeyNumpadSubtract: "num-",
ebiten.KeyPageDown: "pagedown",
ebiten.KeyPageUp: "pageup",
//ebiten.KeyPause
//ebiten.KeyPeriod
ebiten.KeyPrintScreen: "printscreen",
//ebiten.KeyQuote
//ebiten.KeyScrollLock
//ebiten.KeySemicolon
ebiten.KeyShiftLeft: "lshift",
ebiten.KeyShiftRight: "rshift",
//ebiten.KeySlash
ebiten.KeySpace: "space",
ebiten.KeyTab: "tab",
ebiten.KeyAlt: "alt",
ebiten.KeyControl: "control",
ebiten.KeyShift: "shift",
ebiten.KeyMeta: "cmd",
//ebiten.KeyMax
}
)
46 changes: 43 additions & 3 deletions ping_pong.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ebitest

import (
"github.com/go-vgo/robotgo"
"github.com/hajimehoshi/ebiten/v2"
)

// PingPong used to switch contexts between goroutines
Expand All @@ -11,10 +12,18 @@ type PingPong struct {

clickPing chan Ball
clickPong chan struct{}

keyTapPing chan Ball
keyTapPong chan struct{}
}

type Ball struct {
X, Y int
X, Y int
KeyTap BallKeyTap
}

type BallKeyTap struct {
Keys []ebiten.Key
}

// NewPingPong initialines a new PingPong
Expand All @@ -25,6 +34,9 @@ func NewPingPong() *PingPong {

clickPing: make(chan Ball, 1),
clickPong: make(chan struct{}, 1),

keyTapPing: make(chan Ball, 1),
keyTapPong: make(chan struct{}, 1),
}
}

Expand All @@ -43,13 +55,13 @@ func (pp *PingPong) Pong() {
}
}

// Ping sends a ping and waits for a Pong
// ClickPing sends a ping and waits for a Pong
func (pp *PingPong) ClickPing(b Ball) {
pp.clickPing <- b
<-pp.clickPong
}

// Pong will read on ping if any present and then
// ClickPong will read on ping if any present and then
// will send to pong
func (pp *PingPong) ClickPong(ttt *TicTacToe) {
if len(pp.clickPing) != 0 {
Expand All @@ -63,3 +75,31 @@ func (pp *PingPong) ClickPong(ttt *TicTacToe) {
}()
}
}

// Ping sends a ping and waits for a Pong
func (pp *PingPong) KeyTapPing(b Ball) {
pp.keyTapPing <- b
<-pp.keyTapPong
}

// Pong will read on ping if any present and then
// will send to pong
func (pp *PingPong) KeyTapPong(ttt *TicTacToe, g *Game) {
if len(pp.keyTapPing) != 0 {
b := <-pp.keyTapPing
keys := b.KeyTap.Keys
key := ebitenToRobotgoKeys[keys[0]]
args := make([]interface{}, 0, 0)
for _, k := range keys[1:] {
args = append(args, ebitenToRobotgoKeys[k])
}
g.keyTapKeys = keys
robotgo.KeyTap(key, args...)
ttt.Tic()
go func() {
<-ttt.toe
g.keyTapKeys = make([]ebiten.Key, 0, 0)
pp.keyTapPong <- struct{}{}
}()
}
}
15 changes: 7 additions & 8 deletions selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@ import (
"github.com/hajimehoshi/ebiten/v2/text/v2"
)

// Selector represents the thing you are searching for
type Selector struct {
img image.Image
rect image.Rectangle

PingPong *PingPong
}

// NewFromText crates a new Selector from a txt
func NewFromText(txt string, f text.Face, c color.Color) *Selector {
top := &text.DrawOptions{}
top.ColorScale.ScaleWithColor(c)
Expand All @@ -30,33 +32,30 @@ func NewFromText(txt string, f text.Face, c color.Color) *Selector {
return NewFromImage(ebitenImageToImage(img))
}

// NewFromImage creates a new Selector from an image
func NewFromImage(i image.Image) *Selector {
return &Selector{
img: i,
}
}

// Click will click on the center of the Selectore
func (s *Selector) Click() {
cx, cy := s.center()
//robotgo.Move(cx, cy)
//robotgo.Click("left")
s.PingPong.ClickPing(Ball{X: cx, Y: cy})
}

// center returns the center of the selector
func (s *Selector) center() (int, int) {
return s.rect.Min.X + (s.rect.Dx() / 2), s.rect.Min.Y + (s.rect.Dy() / 2)
}

// Rec returns the image.Rectangle of the image
func (s *Selector) Rec() image.Rectangle {
return s.rect
}

// Image returns the underlying image
func (s *Selector) Image() image.Image {
return s.img
}

func (s *Selector) Type(string) {
}

func (s *Selector) KeyTap(ks ...string) {
}
7 changes: 6 additions & 1 deletion testdata/game.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ type Game struct {
ui *ebitenui.UI
btn *widget.Button

Clicked bool
Clicked bool
ClickedShiftI bool
}

func NewGame() *Game {
Expand Down Expand Up @@ -100,6 +101,10 @@ func (g *Game) Update() error {
g.Clicked = true
}

if ebiten.IsKeyPressed(ebiten.KeyShift) && ebiten.IsKeyPressed(ebiten.KeyI) {
g.ClickedShiftI = true
}

// update the UI
g.ui.Update()

Expand Down
Loading
Loading