main.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package main
  2. import (
  3. "embed"
  4. "fmt"
  5. _ "image/jpeg"
  6. "io"
  7. "io/fs"
  8. "log"
  9. "os"
  10. "github.com/hajimehoshi/ebiten/v2"
  11. "github.com/hajimehoshi/ebiten/v2/audio"
  12. "github.com/hajimehoshi/ebiten/v2/audio/mp3"
  13. "github.com/hajimehoshi/ebiten/v2/ebitenutil"
  14. )
  15. var (
  16. // TODO: Make this redundant
  17. //go:embed src/frames/output_*.jpg
  18. assetsFS embed.FS
  19. sampleRate = 44100
  20. bps = 32
  21. brate = 128
  22. )
  23. type Game struct {
  24. count int
  25. frame *ebiten.Image
  26. files []fs.DirEntry
  27. audioContext *audio.Context
  28. player *audio.Player
  29. started bool
  30. }
  31. func (g *Game) Update() error {
  32. var err error
  33. g.frame, _, err = ebitenutil.NewImageFromFile("src/frames/" + g.files[g.count].Name())
  34. if err != nil {
  35. log.Fatal(err)
  36. }
  37. ebitenutil.DebugPrint(g.frame, "src/frames/"+g.files[g.count].Name())
  38. // Up by one
  39. if g.count != 6571 {
  40. g.count++
  41. } else {
  42. return ebiten.Termination
  43. }
  44. // Play Audio
  45. if !g.started {
  46. g.player.SetVolume(0.7)
  47. g.player.Play()
  48. g.started = true
  49. }
  50. return nil
  51. }
  52. func (g *Game) Draw(screen *ebiten.Image) {
  53. op := &ebiten.DrawImageOptions{}
  54. screen.DrawImage(g.frame, op)
  55. }
  56. func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
  57. return 480, 360
  58. }
  59. func main() {
  60. files, err := assetsFS.ReadDir("src/frames")
  61. if err != nil {
  62. fmt.Println("Error reading embedded directory:", err)
  63. return
  64. }
  65. // Do all the audio things. This isn't working...
  66. // Create audio context
  67. ctx := audio.NewContext(sampleRate)
  68. // Open MP3 file
  69. f, err := os.Open("src/bad-apple-audio.mp3")
  70. if err != nil {
  71. log.Fatal(err)
  72. }
  73. //defer f.Close()
  74. // Decode MP3
  75. stream, err := mp3.DecodeWithSampleRate(sampleRate, f)
  76. if err != nil {
  77. log.Fatal(err)
  78. }
  79. // Create player
  80. player, err := audio.NewPlayer(ctx, io.NopCloser(stream))
  81. if err != nil {
  82. log.Fatal(err)
  83. }
  84. ebiten.SetWindowSize(640, 480)
  85. ebiten.SetWindowTitle("Ebitengine: Bad Apple")
  86. game := &Game{
  87. count: 0,
  88. files: files,
  89. player: player,
  90. audioContext: ctx,
  91. }
  92. // Ensure that the image doesn't go twice as fast as it should've.
  93. ebiten.SetTPS(30)
  94. // Play the thing
  95. if err := ebiten.RunGame(game); err != nil {
  96. panic(err)
  97. }
  98. fmt.Println("Now go to bed, you are tired...")
  99. }