From bab177a71dc0e817a8d90f11f94d7c7dcbda8255 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Fri, 30 Jun 2023 17:00:06 +0200 Subject: [PATCH] keyboard handling --- assets/logo.jpg | Bin 0 -> 35135 bytes assets/logo.png | Bin 0 -> 18119 bytes go.mod | 17 ++++++--- go.sum | 39 ++++++++++++++++++++ presenter/engine.go | 17 +++++++-- presenter/keyboard.go | 82 +++++++++++++++++++++++++++++++++++++++++ presenter/presenter.go | 7 +++- presenter/utils.go | 34 +++++++++++++++++ 8 files changed, 186 insertions(+), 10 deletions(-) create mode 100755 assets/logo.jpg create mode 100755 assets/logo.png create mode 100755 presenter/keyboard.go create mode 100755 presenter/utils.go diff --git a/assets/logo.jpg b/assets/logo.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d06867ae3ea3428875669409dde40beed765b94c GIT binary patch literal 35135 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 BopAsF literal 0 HcmV?d00001 diff --git a/assets/logo.png b/assets/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..0e7db2b88f5c299b4868c9153962c87492f57c15 GIT binary patch literal 18119 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 MUHx3vIVCg!0J!%6bpQYW literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index ab56cf4..15400fe 100755 --- a/go.mod +++ b/go.mod @@ -5,9 +5,16 @@ go 1.20 require github.com/hajimehoshi/ebiten v1.12.12 require ( - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2 // indirect - golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56 // indirect - golang.org/x/image v0.0.0-20200801110659-972c09e46d76 // indirect - golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect - golang.org/x/sys v0.0.0-20200918174421-af09f7315aff // indirect + github.com/ebitengine/purego v0.3.0 // indirect + github.com/jezek/xgb v1.1.0 // indirect + golang.org/x/sync v0.1.0 // indirect +) + +require ( + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect + github.com/hajimehoshi/ebiten/v2 v2.5.5 + golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56 // indirect + golang.org/x/image v0.6.0 // indirect + golang.org/x/mobile v0.0.0-20230301163155-e0f57694e12c // indirect + golang.org/x/sys v0.6.0 // indirect ) diff --git a/go.sum b/go.sum index b550a10..20507bd 100755 --- a/go.sum +++ b/go.sum @@ -1,17 +1,25 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ebitengine/purego v0.3.0 h1:BDv9pD98k6AuGNQf3IF41dDppGBOe0F4AofvhFtBXF4= +github.com/ebitengine/purego v0.3.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2 h1:Ac1OEHHkbAZ6EUnJahF0GKcU0FjPc/V8F1DvjhKngFE= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b h1:GgabKamyOYguHqHjSkDACcgoPIz3w0Dis/zJ1wyHHHU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/hajimehoshi/bitmapfont v1.3.0/go.mod h1:/Qb7yVjHYNUV4JdqNkPs6BSZwLjKqkZOMIp6jZD0KgE= github.com/hajimehoshi/ebiten v1.12.12 h1:JvmF1bXRa+t+/CcLWxrJCRsdjs2GyBYBSiFAfIqDFlI= github.com/hajimehoshi/ebiten v1.12.12/go.mod h1:1XI25ImVCDPJiXox4h9yK/CvN5sjDYnbF4oZcFzPXHw= +github.com/hajimehoshi/ebiten/v2 v2.5.5 h1:TJNoZsYJYUyFucwE56QRSgmZ+/cklUt1YrwpQVC5vjs= +github.com/hajimehoshi/ebiten/v2 v2.5.5/go.mod h1:mnHSOVysTr/nUZrN1lBTRqhK4NG+T9NR3JsJP2rCppk= github.com/hajimehoshi/file2byteslice v0.0.0-20200812174855-0e5e8a80490e/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE= github.com/hajimehoshi/go-mp3 v0.3.1/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM= github.com/hajimehoshi/oto v0.6.1/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI= github.com/hajimehoshi/oto v0.6.8/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI= github.com/jakecoffman/cp v1.0.0/go.mod h1:JjY/Fp6d8E1CHnu74gWNnU0+b9VzEdUVPoJxg2PsTQg= +github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk= +github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= github.com/jfreymuth/oggvorbis v1.0.1/go.mod h1:NqS+K+UXKje0FUYUPosyQ+XTVvjmVjps1aEZH1sumIk= github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -19,10 +27,12 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56 h1:estk1glOnSVeJ9tdEZZc5mAMDZk5lNJNyJ6DvrBkTEU= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= @@ -31,20 +41,32 @@ golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200801110659-972c09e46d76 h1:U7GPaoQyQmX+CBRWXKrvRzWTbd+slqeSh8uARsIyhAw= golang.org/x/image v0.0.0-20200801110659-972c09e46d76/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.6.0 h1:bR8b5okrPI3g/gyZakLZHeWxAR8Dn5CyxXv1hLH5g/4= +golang.org/x/image v0.6.0/go.mod h1:MXLdDR43H7cDJq5GEGXEVeeNhPgi+YYEQ2pC1byI1x0= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f h1:aEcjdTsycgPqO/caTgnxfR9xwWOltP/21vtJyFztEy0= golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= +golang.org/x/mobile v0.0.0-20230301163155-e0f57694e12c h1:Gk61ECugwEHL6IiyyNLXNzmu8XslmRP2dS0xjIYhbb4= +golang.org/x/mobile v0.0.0-20230301163155-e0f57694e12c/go.mod h1:aAjjkJNdrh3PMckS4B10TGS2nag27cbKR1y2BpUxsiY= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -52,11 +74,28 @@ golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200918174421-af09f7315aff h1:1CPUrky56AcgSpxz/KfgzQWzfG09u5YOL8MvPYBlrL8= golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/presenter/engine.go b/presenter/engine.go index 34e9db7..82d7d57 100755 --- a/presenter/engine.go +++ b/presenter/engine.go @@ -1,6 +1,11 @@ package presenter -import "github.com/hajimehoshi/ebiten" +import ( + "game/domain" + "image/color" + + "github.com/hajimehoshi/ebiten" +) const ( screenWidth = 320 @@ -8,15 +13,19 @@ const ( ) type GameEngine struct { - keys []ebiten.Key + Context domain.Context + Keyboard Keyboard } -func (g *GameEngine) Update(*ebiten.Image) error { +func (g *GameEngine) Update(screen *ebiten.Image) error { + g.Keyboard.Watch() return nil } func (g *GameEngine) Draw(screen *ebiten.Image) { - + if g.Keyboard.UpPressed() { + screen.Fill(color.White) + } } func (g *GameEngine) Layout(outsideWidth, outsideHeight int) (int, int) { diff --git a/presenter/keyboard.go b/presenter/keyboard.go new file mode 100755 index 0000000..c1b7aef --- /dev/null +++ b/presenter/keyboard.go @@ -0,0 +1,82 @@ +package presenter + +import ( + "fmt" + "reflect" + + "github.com/hajimehoshi/ebiten" + "github.com/hajimehoshi/ebiten/inpututil" +) + +type KeyMap struct { + Up ebiten.Key + Down ebiten.Key + Right ebiten.Key + Left ebiten.Key + Action0 ebiten.Key + Action1 ebiten.Key + Action2 ebiten.Key + Action3 ebiten.Key +} + +type Keyboard struct { + PressedKey ebiten.Key + KeyMap KeyMap +} + +func CreateDefaultKeyMap() KeyMap { + return KeyMap{ + Up: ebiten.KeyUp, + Down: ebiten.KeyDown, + Right: ebiten.KeyRight, + Left: ebiten.KeyLeft, + Action0: ebiten.KeySpace, + Action1: ebiten.KeyAlt, + Action2: ebiten.KeyControl, + Action3: ebiten.KeyEscape, + } +} + +func (k *Keyboard) Watch() { + values := reflect.ValueOf(k.KeyMap) + + for i := 0; i < values.NumField(); i++ { + key := values.Field(i).Interface().(ebiten.Key) + if inpututil.IsKeyJustPressed(key) { + fmt.Printf("Key pressed: %s\n", key) + k.PressedKey = key + } + } +} + +func (k *Keyboard) UpPressed() bool { + return k.PressedKey == k.KeyMap.Up +} + +func (k *Keyboard) DownPressed() bool { + return k.PressedKey == k.KeyMap.Down +} + +func (k *Keyboard) RightPressed() bool { + return k.PressedKey == k.KeyMap.Right +} + +func (k *Keyboard) LeftPressed() bool { + return k.PressedKey == k.KeyMap.Left +} + +func (k *Keyboard) Action0Pressed() bool { + return k.PressedKey == k.KeyMap.Action0 +} + +func (k *Keyboard) Action1Pressed() bool { + return k.PressedKey == k.KeyMap.Action1 +} + +func (k *Keyboard) Action2Pressed() bool { + return k.PressedKey == k.KeyMap.Action2 +} + +func (k *Keyboard) Action3Pressed() bool { + return k.PressedKey == k.KeyMap.Action3 +} diff --git a/presenter/presenter.go b/presenter/presenter.go index d08ab2a..c0f1fee 100755 --- a/presenter/presenter.go +++ b/presenter/presenter.go @@ -14,7 +14,12 @@ type Presenter struct { func (p Presenter) Init() { ebiten.SetWindowSize(screenWidth*2, screenHeight*2) ebiten.SetWindowTitle("Game") - if err := ebiten.RunGame(&GameEngine{}); err != nil { + if err := ebiten.RunGame(&GameEngine{ + Context: p.Context, + Keyboard: Keyboard{ + KeyMap: CreateDefaultKeyMap(), + }, + }); err != nil { log.Fatal(err) } } diff --git a/presenter/utils.go b/presenter/utils.go new file mode 100755 index 0000000..1a22b26 --- /dev/null +++ b/presenter/utils.go @@ -0,0 +1,34 @@ +package presenter + +import ( + "bytes" + "fmt" + "image" + "io/ioutil" + "log" + + _ "image/png" + + "github.com/hajimehoshi/ebiten" +) + +func LoadImage(path string) *ebiten.Image { + + file, err := ioutil.ReadFile(path) //read the content of file + if err != nil { + log.Fatal(err) + } + + img, _, err := image.Decode(bytes.NewReader(file)) + if err != nil { + fmt.Println("decode error") + log.Fatal(err) + } + + out, err := ebiten.NewImageFromImage(img, 0) + if err != nil { + log.Fatal(err) + } + + return out +}