게임용으로 개발한 Go 패키지

15405 단어 gamedevebitengo
Go에서 Clock of AtonementBluebird of Happiness과 같은 일부 게임을 출시했습니다. 안타깝게도 몇 가지 비즈니스상의 이유로 아직 오픈 소스로 만들지 않았습니다. 그러나 우리는 이제 Go 게임 개발자가 코드를 활용할 수 있도록 점차 게임용 일부 공용 패키지로 코드를 분할하고 있으며 Go로 개발하는 게임이 더 대중화될 것입니다. 이 기사에서는 우리가 개발하고 게임에 사용한 공개 Go 패키지를 나열하고 싶습니다!



github.com/hajimehoshi/ebiten



죽은 단순한 2D 게임 라이브러리. 기본적으로 이것은 OpenGL 래퍼입니다. 이것은 GopherJS에 의해 데스크탑뿐만 아니라 모바일 및 웹 브라우저까지 여러 플랫폼에서 작동합니다! 실제로 우리는 데스크톱과 브라우저에서 게임을 개발할 수 있었고 모바일용으로 출시했습니다.

에비텐(海老天)은 새우 튀김이라는 뜻으로 제가 가장 좋아하는 일본 음식 중 하나입니다 :-)

github.com/hajimehoshi/go-mp3



순수한 Go의 MP3 디코더. 퍼블릭 도메인 라이선스의 MP3 디코더인 PDMP3의 포트입니다. 사양을 이해하지 않고 이것을 자동으로 이식했기 때문에 여전히 내 lib에서 무슨 일이 일어나고 있는지 이해하기 위해 고군분투하고 있습니다 :-)

Ogg와 같은 다른 디코더 대신 MP3 디코더를 개발한 동기는 브라우저에서 게임이 작동하도록 만들고 싶었기 때문입니다. 현재MP3 is supported by most modern browsers이지만 다른 것들은 잘 지원되지 않습니다(예: Ogg ). 성능을 위해 Go의 MP3 디코더 대신 브라우저의 브라우저 네이티브 디코더를 활용할 수 있습니다. MP3는 특허 문제가 있었지만 2017년 특허가 만료됐다.

github.com/hajimehoshi/oto



낮은 수준의 오디오 라이브러리. 이것의 가장 큰 장점은 이식성입니다. 이것은 Windows, macOS, Linux, Android, iOS 및 웹 브라우저에서 작동합니다. 이것은 단지 io.Writer를 제공하며 라이터에 바이트를 써서 모든 사운드를 재생할 수 있습니다. go-mp3 io.Copy ( Example ) 로 MP3 파일을 재생할 수 있습니다!

func run() error {
    f, err := os.Open("classic.mp3")
    if err != nil {
        return err
    }
    defer f.Close()

    // Decode MP3 stream and the result is an `io.Reader`
    d, err := mp3.NewDecoder(f)
    if err != nil {
        return err
    }
    defer d.Close()

    // Create an oto's player, which is an `io.Writer`
    p, err := oto.NewPlayer(d.SampleRate(), 2, 2, 8192)
    if err != nil {
        return err
    }
    defer p.Close()

    // With `io.Copy`, you can play the decoded MP3 on your machine!
    if _, err := io.Copy(p, d); err != nil {
        return err
    }
    return nil
}

오토(音)는 일본어로 '소리'를 의미합니다.

github.com/hajimehoshi/file2byteslice



go-bindata 과 같이 Go 파일에 바이너리를 삽입하는 또 다른 도구입니다. file2bytesslice는 다른 유사한 패키지에 비해 매우 간단합니다. 이것은 하나의 바이너리를 하나의 바이트 슬라이스 리터럴로 변환합니다. 그게 다야! 내가 이것을 개발한 동기는 incident이 있었다는 것입니다. go-bindata의 원래 작성자가 GitHub 계정을 삭제했고 다른 사람이 동일한 GitHub 계정을 다시 사용했으며 저장소가 더 이상 신뢰할 수 없다고 생각했습니다. 그래서 직접 개발해보기로 했습니다.

Usage of file2byteslice:
  -compress
        use gzip compression
  -input string
        input filename
  -output string
        output filename
  -package string
        package name (default "main")
  -var string
        variable name (default "_")

github.com/hajimehoshi/go-mplusbitmap



font.Face M+ Bitmap font 객체를 8/16 비티 스타일 일본어 텍스트로 제공하는 패키지입니다. font.Face는 글꼴을 표현하기 위한 준표준 인터페이스로 Go to makefont.Face 인스턴스에 a TrueType parser이 있습니다. Ebiten's text package으로 텍스트를 아주 쉽게 그릴 수 있습니다! 물론 이것은 (준)표준 렌더링 패키지( Example )와 함께 사용할 수 있습니다.

const text = `Hello, World!

こんにちは世界!`

func run() error {
    const (
        ox = 16
        oy = 16
    )

    dst := image.NewRGBA(image.Rect(0, 0, 320, 240))

    // Initialize the destination image dst by filling with white.
    draw.Draw(dst, dst.Bounds(), image.NewUniform(color.White), image.ZP, draw.Src)

    f := mplusbitmap.Gothic12r

    // golang.org/x/image/font's Drawer draws a text on a specified image.
    d := font.Drawer{
        Dst:  dst,
        Src:  image.NewUniform(color.Black),
        Face: f,
        Dot:  fixed.P(ox, oy),
    }

    for _, l := range strings.Split(text, "\n") {
        d.DrawString(l)
        d.Dot.X = fixed.I(ox)
        d.Dot.Y += f.Metrics().Height
    }

    // Now the text is drawn to the image dst.

    return nil
}

github.com/hajimehoshi/chinesegamefonts



이것은 Noto CJK fonts의 (압축된) TTF 바이너리를 제공합니다. 이 패키지의 글꼴은 몇 가지 점에서 원본 Noto CJK 글꼴과 다릅니다.
  • 지금까지 OpenType 글꼴을 구문 분석하는 데 실제로 사용할 수 있는 Go 패키지가 없기 때문에 글꼴은 OpenType이 아닌 TrueType입니다( golang.org/x/image/font/sfnt is under development ).
  • 원본에서 많은 글리프가 제거되었으며 chinesegamefonts 글꼴에는 파일 크기를 줄이기 위해 일반적인 CJK 글리프만 포함되어 있습니다. 원본 파일 크기는 46.1MB(간체 및 전통)이고 축소된 파일 크기는 4.4MB(간체) 및 7.6MB(전통)입니다!

  • 우리 게임은 지금까지 중국어를 지원하지 않지만 이제 이 글꼴 패키지로 구현하고 있습니다.


    위의 패키지 외에도 현재 패키지를 개발하고 있습니다. 사용자 인터페이스용. 계속 지켜봐!

    좋은 웹페이지 즐겨찾기