From fd344ad93b080c6275ba5139523573a742cfedc3 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Fri, 17 Nov 2023 22:02:40 +0100 Subject: [PATCH] Izet is ready --- .gitignore | 1 + go.mod | 19 +++++++ go.sum | 57 ++++++++++++++++++++ main.go | 129 ++++++++++++++++++++++++++++++++++++++++++++ resources/embed.go | 13 +++++ resources/grass.png | Bin 0 -> 14502 bytes resources/hero.png | Bin 0 -> 13045 bytes 7 files changed, 219 insertions(+) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 resources/embed.go create mode 100644 resources/grass.png create mode 100644 resources/hero.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..4091df6 --- /dev/null +++ b/go.mod @@ -0,0 +1,19 @@ +module gitlab.com/kbr4/9heroja + +go 1.21.0 + +require github.com/hajimehoshi/ebiten/v2 v2.6.2 + +require ( + github.com/ebitengine/oto/v3 v3.1.0 // indirect + github.com/ebitengine/purego v0.5.0 // indirect + github.com/hajimehoshi/go-mp3 v0.3.4 // indirect + github.com/jezek/xgb v1.1.0 // indirect + github.com/jfreymuth/oggvorbis v1.0.5 // indirect + github.com/jfreymuth/vorbis v1.0.2 // indirect + golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/image v0.12.0 // indirect + golang.org/x/mobile v0.0.0-20230922142353-e2f452493d57 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.12.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..8be1dad --- /dev/null +++ b/go.sum @@ -0,0 +1,57 @@ +github.com/ebitengine/oto/v3 v3.1.0 h1:9tChG6rizyeR2w3vsygTTTVVJ9QMMyu00m2yBOCch6U= +github.com/ebitengine/oto/v3 v3.1.0/go.mod h1:IK1QTnlfZK2GIB6ziyECm433hAdTaPpOsGMLhEyEGTg= +github.com/ebitengine/purego v0.5.0 h1:JrMGKfRIAM4/QVKaesIIT7m/UVjTj5GYhRSQYwfVdpo= +github.com/ebitengine/purego v0.5.0/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/hajimehoshi/ebiten/v2 v2.6.2 h1:tVa3ZJbp4Uz/VSjmpgtQIOvwd7aQH290XehHBLr2iWk= +github.com/hajimehoshi/ebiten/v2 v2.6.2/go.mod h1:TZtorL713an00UW4LyvMeKD8uXWnuIuCPtlH11b0pgI= +github.com/hajimehoshi/go-mp3 v0.3.4 h1:NUP7pBYH8OguP4diaTZ9wJbUbk3tC0KlfzsEpWmYj68= +github.com/hajimehoshi/go-mp3 v0.3.4/go.mod h1:fRtZraRFcWb0pu7ok0LqyFhCUrPeMsGRSVop0eemFmo= +github.com/hajimehoshi/oto/v2 v2.3.1/go.mod h1:seWLbgHH7AyUMYKfKYT9pg7PhUu9/SisyJvNTT+ASQo= +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.5 h1:u+Ck+R0eLSRhgq8WTmffYnrVtSztJcYrl588DM4e3kQ= +github.com/jfreymuth/oggvorbis v1.0.5/go.mod h1:1U4pqWmghcoVsCJJ4fRBKv9peUJMBHixthRlBeD6uII= +github.com/jfreymuth/vorbis v1.0.2 h1:m1xH6+ZI4thH927pgKD8JOH4eaGRm18rEE9/0WKjvNE= +github.com/jfreymuth/vorbis v1.0.2/go.mod h1:DoftRo4AznKnShRl1GxiTFCseHr4zR9BN3TWXyuzrqQ= +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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63 h1:3AGKexOYqL+ztdWdkB1bDwXgPBuTS/S8A4WzuTvJ8Cg= +golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= +golang.org/x/image v0.12.0 h1:w13vZbU4o5rKOFFR8y7M+c4A5jXDC0uXTdHYRP8X2DQ= +golang.org/x/image v0.12.0/go.mod h1:Lu90jvHG7GfemOIcldsh9A2hS01ocl6oNO7ype5mEnk= +golang.org/x/mobile v0.0.0-20230922142353-e2f452493d57 h1:Q6NT8ckDYNcwmi/bmxe+XbiDMXqMRW1xFBtJ+bIpie4= +golang.org/x/mobile v0.0.0-20230922142353-e2f452493d57/go.mod h1:wEyOn6VvNW7tcf+bW/wBz1sehi2s2BZ4TimyR7qZen4= +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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20220712014510-0a85c31ab51e/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.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.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.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +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= diff --git a/main.go b/main.go new file mode 100644 index 0000000..692a692 --- /dev/null +++ b/main.go @@ -0,0 +1,129 @@ +package main + +import ( + "bytes" + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/audio" + "gitlab.com/kbr4/9heroja/resources" + "image" + _ "image/png" + "log" +) + +const ( + screenWidth = 640 + screenHeight = 480 + tileSize = 33 + titleFontSize = fontSize * 1.5 + fontSize = 24 + smallFontSize = fontSize / 2 + pipeWidth = tileSize * 2 + pipeStartOffsetX = 8 + pipeIntervalX = 8 + pipeGapY = 5 +) + +var ( + heroImage *ebiten.Image + grassImage *ebiten.Image +) + +func floorDiv(x, y int) int { + d := x / y + if d*y == x || x >= 0 { + return d + } + return d - 1 +} + +func floorMod(x, y int) int { + return x - floorDiv(x, y)*y +} + +type Game struct { + + // The gopher's position + x16 int + y16 int + vy16 int + + // Camera + cameraX int + cameraY int + + // Pipes + pipeTileYs []int + + gameoverCount int + + touchIDs []ebiten.TouchID + gamepadIDs []ebiten.GamepadID + + audioContext *audio.Context + jumpPlayer *audio.Player + hitPlayer *audio.Player +} + +func (g *Game) Update() error { + return nil +} + +func (g *Game) Draw(screen *ebiten.Image) { + g.drawGrass(screen) + g.drawHero(screen) +} + +func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) { + s := ebiten.DeviceScaleFactor() + return int(float64(outsideWidth) * s), int(float64(outsideHeight) * s) +} + +func (g *Game) drawHero(screen *ebiten.Image) { + const ( + nx = screenWidth / tileSize + ny = screenHeight / tileSize + ) + + op := &ebiten.DrawImageOptions{} + // ground + op.GeoM.Reset() + op.GeoM.Translate(screenWidth/2-16, screenHeight/2-16) + //op.GeoM.Translate(float64(i*tileSize-floorMod(g.cameraX, tileSize)), + // float64((ny-1)*tileSize-floorMod(g.cameraY, tileSize))) + screen.DrawImage(heroImage.SubImage(image.Rect(67, 167, 66+tileSize, 166+tileSize)).(*ebiten.Image), op) +} + +func (g *Game) drawGrass(screen *ebiten.Image) { + op := &ebiten.DrawImageOptions{} + for i := 0; i <= screenWidth/64; i++ { + for j := 0; j <= screenHeight/64; j++ { + // ground + op.GeoM.Reset() + op.GeoM.Translate(float64(i*64), float64(j*64)) + screen.DrawImage(grassImage.SubImage(image.Rect(32, 160, 32+64, 160+64)).(*ebiten.Image), op) + } + + } +} +func init() { + img, _, err := image.Decode(bytes.NewReader(resources.Hero_png)) + if err != nil { + log.Fatal(err) + } + heroImage = ebiten.NewImageFromImage(img) + + img, _, err = image.Decode(bytes.NewReader(resources.Grass_png)) + if err != nil { + log.Fatal(err) + } + grassImage = ebiten.NewImageFromImage(img) +} + +func main() { + ebiten.SetWindowSize(screenWidth, screenHeight) + ebiten.SetWindowTitle("Bosanski Zombicid") + + if err := ebiten.RunGame(&Game{}); err != nil { + log.Fatal(err) + } +} diff --git a/resources/embed.go b/resources/embed.go new file mode 100644 index 0000000..1d1f45c --- /dev/null +++ b/resources/embed.go @@ -0,0 +1,13 @@ +package resources + +import ( + _ "embed" +) + +var ( + //go:embed hero.png + Hero_png []byte + + //go:embed grass.png + Grass_png []byte +) diff --git a/resources/grass.png b/resources/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..cd0980236271466f5033e81174c0edf2f4c756c5 GIT binary patch literal 14502 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 literal 0 HcmV?d00001 diff --git a/resources/hero.png b/resources/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..67e12b878edd067ad086dcf9ebb5b28c7acb7856 GIT binary patch literal 13045 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 Ppha6#U!y|ZKJ