'ebiten'에 해당되는 글 2건

  1. 2022.05.01 Go - Asesprite json 파일 읽기
  2. 2022.04.17 Go - Ebiten TTF 폰트 사용하기
반응형

Ebiten으로 간단한 게임을 구현해보려고 하는데 이번에는 그래픽 리소스를 직접 만들어보고 싶었다.

개인적으로 픽셀 감성을 좋아해서 픽셀을 찍어보려고 하기는 하는데 역시 쉽지 않다;;

뭐가 되었든 테스트용으로 간단한 픽셀 스프라이트를 Asesprite로 찍을 수 있었다.

 

Asesprite를 export 하면 json 파일과 png 파일을 뽑을 수 있는데

이 데이터를 읽어서 스프라이트 애니메이션을 구현해야 한다.

뽑힌 데이터들을 보니 애니메이션을 구현할만한 정보는 모두 포함되어 있었다.

 

그래서 일단 json 정보를 읽어보는것을 먼저 해보기로 했다.

검색해보니 기본적으로 'encoding/json' 패키지를 제공하고 있었고 다른 분이 만든 gson도 유명해보였다.

goasesprite라는 패키지도 있는데 (내부에서 gson을 이용해서 파싱) 테스트해보니 바로 애니메이션이 잘 동작했지만

json 읽는 부분도 연습해볼겸 직접 로드해보기로 했다.

 

일단 기본 흐름은 os.Open()으로 파일을 읽고 ioutil.ReadAll()로 []byte로 변경한뒤 json.Unmarshal()로 읽어오면된다.

Unmarshal을 하기 위해 json struct를 만들어주고 json의 key값을 연결해주어야 한다.

 

예를 들어 asesprite json에 있는 Meta 부분의 정보를 읽어오려면

type FrameTag struct {
...
}

type Meta struct {
  App string `json:"app"`	// meta.app을 읽어온다.
  ...
  Img string `json:"image"`	// meta.image를 읽어온다.
  ...
  FrameTags []FrameTag `json:"FrameTag"`	// meta.FrameTag을 읽어온다. (배열)
}

위와 같이 `json:"app"`과 같이 json의 키를 직접 입력해주어야 한다.

FrameTag와 같이 기본 타입이 아니라면 그에 맞는 struct를 추가해서 읽어줘야 하고 배열이라면 배열로 잡아야 한다.

 

Meta정보와 다르게 Frame은 배열이 아니라 Map의 형태로 되어있다.

이때는 Frames map[string]Frame `json:"frames"` 와 같이 map으로 읽으면 된다.

 

이 정도만 되어도 일단 원하는 데이터는 다 읽어올 수 있었다.

 

다음에는 이 데이터를 이용해서 애니메이션을 구현해봐야겠다.

반응형

'프로그래밍 > Go' 카테고리의 다른 글

Go - Ebiten TTF 폰트 사용하기  (0) 2022.04.17
Go 언어 환경설정 간단 정리(IDE - VS Code)  (0) 2022.03.19
Posted by msparkms
,
반응형

요즘 Go의 Ebiten을 조금씩 보고 있다.

아직 Go 언어가 익숙하지는 않지만 조금씩 기능을 추가해가면서 공부해보려고 한다.

 

일단 가장 기본적인 기능으로 텍스트 출력을 해보고 싶었다. (FPS 출력;;)

그래서 무료 라이센스의 TTF 파일을 우선 찾았고 이 파일을 어떻게 사용할까 찾아보았다.

ebiten에서 텍스트를 사용하는 기능은 지원하고 있어서 TTF를 읽어서 font.Face를 만들어내기만 하면 되었다.

 

TTF를 읽기 위해서 freetype 패키지를 설치하였다.

go get github.com/golang/freetype

 

그리고 아래와 같이 파일 경로를 통해서 파일을 읽고 해당 파일을 바이트로 변경하고 truetype으로 파싱해서 font.Face를 생성하는 함수를 만들었다. 나는 utils 패키지를 만들어서 ttfLoader.go 파일로 빼놓았다.

 

func Load_TTF(fontPath string) font.Face {
	f, err := ebitenutil.OpenFile(fontPath)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	b, err := ioutil.ReadAll(f)
	if err != nil {
		log.Fatal(err)
	}

	tt, err := truetype.Parse(b)
	if err != nil {
		log.Fatal(err)
	}

	const dpi = 72
	return truetype.NewFace(tt, &truetype.Options{
		Size:    24,
		DPI:     dpi,
		Hinting: font.HintingFull,
	})
}

 

update 함수에서 ebiten.CurrentFPS() 를 이용하여 현재 FPS를 얻어내 문자열을 만들었고

draw 함수에서 text.Draw()로 텍스트를 출력해보았다.

 

이렇게 조금 조금씩 코드를 추가해나가면서 간단한 게임 엔진을 만들어보려고 하는데

간단히 정리할 수 있는 내용이 있다면 블로그에 올리도록 하겠다.

반응형

'프로그래밍 > Go' 카테고리의 다른 글

Go - Asesprite json 파일 읽기  (0) 2022.05.01
Go 언어 환경설정 간단 정리(IDE - VS Code)  (0) 2022.03.19
Posted by msparkms
,