44package main
55
66import (
7- "log"
7+ "bytes"
8+ _ "embed"
9+ "fmt"
10+ "image"
11+ "image/color"
12+ _ "image/jpeg"
13+ "math/rand/v2"
14+ "os"
815
916 "github.com/hajimehoshi/ebiten/v2"
1017
1118 "github.com/ebitengine/debugui"
1219)
1320
21+ //go:embed gophers.jpg
22+ var gophersJPG []byte
23+
1424type Game struct {
25+ gopherImage * ebiten.Image
26+ x int
27+ y int
28+ vx int
29+ vy int
30+ hiRes bool
31+
1532 debugUI * debugui.DebugUI
1633
1734 logBuf string
@@ -23,15 +40,44 @@ type Game struct {
2340 num2 float64
2441}
2542
26- func New () * Game {
27- return & Game {
28- debugUI : debugui .New (),
29- bg : [3 ]float64 {90 , 95 , 100 },
30- checks : [3 ]bool {true , false , true },
43+ func NewGame () (* Game , error ) {
44+ img , _ , err := image .Decode (bytes .NewReader (gophersJPG ))
45+ if err != nil {
46+ return nil , err
47+ }
48+
49+ g := & Game {
50+ gopherImage : ebiten .NewImageFromImage (img ),
51+ vx : 2 ,
52+ vy : 2 ,
53+ debugUI : debugui .New (),
54+ bg : [3 ]float64 {90 , 95 , 100 },
55+ checks : [3 ]bool {true , false , true },
3156 }
57+ g .resetPosition ()
58+
59+ return g , nil
60+ }
61+
62+ func (g * Game ) resetPosition () {
63+ sW , sH := g .screenSize ()
64+ imgW , imgH := g .gopherImage .Bounds ().Dx (), g .gopherImage .Bounds ().Dy ()
65+ g .x = rand .IntN (sW - imgW )
66+ g .y = rand .IntN (sH - imgH )
3267}
3368
3469func (g * Game ) Update () error {
70+ sW , sH := g .screenSize ()
71+ imgW , imgH := g .gopherImage .Bounds ().Dx (), g .gopherImage .Bounds ().Dy ()
72+ g .x += g .vx
73+ g .y += g .vy
74+ if g .x < 0 || sW - imgW <= g .x {
75+ g .vx *= - 1
76+ }
77+ if g .y < 0 || sH - imgH <= g .y {
78+ g .vy *= - 1
79+ }
80+
3581 if ebiten .IsKeyPressed (ebiten .KeyEscape ) {
3682 return ebiten .Termination
3783 }
@@ -44,17 +90,36 @@ func (g *Game) Update() error {
4490}
4591
4692func (g * Game ) Draw (screen * ebiten.Image ) {
93+ screen .Fill (color.RGBA {0x40 , 0x40 , 0x80 , 0xff })
94+ op := & ebiten.DrawImageOptions {}
95+ op .GeoM .Translate (float64 (g .x ), float64 (g .y ))
96+ screen .DrawImage (g .gopherImage , op )
97+
4798 g .debugUI .Draw (screen )
4899}
49100
50101func (g * Game ) Layout (outsideWidth , outsideHeight int ) (int , int ) {
51- return 1280 , 960
102+ return g .screenSize ()
103+ }
104+
105+ func (g * Game ) screenSize () (int , int ) {
106+ scale := 1
107+ if g .hiRes {
108+ scale = 2
109+ }
110+ return 1280 * scale , 960 * scale
52111}
53112
54113func main () {
55114 ebiten .SetWindowTitle ("Ebitengine DebugUI Demo" )
56115 ebiten .SetWindowSize (1280 , 960 )
57- if err := ebiten .RunGame (New ()); err != nil {
58- log .Fatal ("err: " , err )
116+ g , err := NewGame ()
117+ if err != nil {
118+ fmt .Fprintln (os .Stderr , err )
119+ os .Exit (1 )
120+ }
121+ if err := ebiten .RunGame (g ); err != nil {
122+ fmt .Fprintln (os .Stderr , err )
123+ os .Exit (1 )
59124 }
60125}
0 commit comments