diff --git a/domain/font.go b/domain/font.go index 9f5958d..86ac3e8 100644 --- a/domain/font.go +++ b/domain/font.go @@ -5,12 +5,30 @@ import ( "image/color" ) +const ( + DefaultFontName konstructor.FontName = "ArcadeClassic" +) + +const ( + DefaultDPI = 72 +) + func GetDefaultFontLayout() konstructor.FontLayout { return konstructor.FontLayout{ - Path: "assets/fonts/ArcadeClassic.ttf", - DPI: 72, + Path: konstructor.GetFontPath(DefaultFontName), + DPI: DefaultDPI, Size: 24, Color: color.White, SelectedColor: color.RGBA{R: 255, G: 0, B: 0, A: 100}, } } + +func GetHeaderFontLayout() konstructor.FontLayout { + return konstructor.FontLayout{ + Path: konstructor.GetFontPath(DefaultFontName), + DPI: DefaultDPI, + Size: 12, + Color: color.White, + SelectedColor: color.RGBA{R: 255, G: 0, B: 0, A: 100}, + } +} diff --git a/konstructor/config.go b/konstructor/config.go index e7b5cb4..bba0ed5 100644 --- a/konstructor/config.go +++ b/konstructor/config.go @@ -1,5 +1,7 @@ package konstructor +import "image/color" + type KeyMap struct { Up any Down any @@ -16,9 +18,15 @@ type ScreenConfig struct { Height int Scale int } +type HeaderConfig struct { + BackgroundColor color.Color + Height int + FontLayout FontLayout +} type Config struct { Name string Screen *ScreenConfig + Header *HeaderConfig KeyMap KeyMap } diff --git a/konstructor/engines/easy_ebitengine/screen.dialog.go b/konstructor/engines/easy_ebitengine/screen.dialog.go index 4ef396f..199b4ed 100644 --- a/konstructor/engines/easy_ebitengine/screen.dialog.go +++ b/konstructor/engines/easy_ebitengine/screen.dialog.go @@ -25,7 +25,7 @@ func (e *Engine) DialogUpdate() { func (e *Engine) DialogDraw(screen *ebiten.Image) { dialog := e.Domain.GetDialog(e.KContext.ActiveDialog) - face := dialog.Layout.ChoiceFont.GetFontFace() + face := dialog.Layout.ChoiceFont.GetFontFace(e.Config.Screen.Scale) for i, choice := range dialog.Choices { offset := int(dialog.Layout.ChoiceFont.Size) * (i + 1) diff --git a/konstructor/engines/easy_ebitengine/screen.menu.go b/konstructor/engines/easy_ebitengine/screen.menu.go index b3a4aa1..1e2161d 100644 --- a/konstructor/engines/easy_ebitengine/screen.menu.go +++ b/konstructor/engines/easy_ebitengine/screen.menu.go @@ -25,7 +25,7 @@ func (e *Engine) MenuUpdate() { func (e *Engine) MenuDraw(screen *ebiten.Image) { menu := e.Domain.GetMenu(e.KContext.ActiveMenu) - face := menu.Layout.MenuItemFont.GetFontFace() + face := menu.Layout.MenuItemFont.GetFontFace(e.Config.Screen.Scale) for i, menu_item := range menu.MenuItems { color := menu.GetMenuItemColor(i) diff --git a/konstructor/engines/easy_ebitengine/screen.playground.go b/konstructor/engines/easy_ebitengine/screen.playground.go index b55d55d..b938c01 100644 --- a/konstructor/engines/easy_ebitengine/screen.playground.go +++ b/konstructor/engines/easy_ebitengine/screen.playground.go @@ -16,11 +16,11 @@ func (e *Engine) PlaygroundUpdate() { func (e *Engine) PlaygroundDraw(screen *ebiten.Image) { e.PlaygroundBackgroundDraw(screen) - e.PlaygroundHeaderDraw(screen) e.PlaygroundPlatformsDraw(screen) e.PlaygroundItemsDraw(screen) e.PlaygroundNPCsDraw(screen) e.PlaygroundDefaultPlayerDraw(screen) + e.PlaygroundHeaderDraw(screen) } func (e *Engine) PlaygroundBackgroundDraw(screen *ebiten.Image) { @@ -37,7 +37,5 @@ func (e *Engine) PlaygroundAssetDraw(screen *ebiten.Image, render konstructor.Re geoM := ebiten.GeoM{} geoM.Translate(float64(position.X), float64(position.Y)) geoM.Scale(float64(e.Config.Screen.Scale), float64(e.Config.Screen.Scale)) - screen.DrawImage(e.GetImage(render), &ebiten.DrawImageOptions{ - GeoM: geoM, - }) + screen.DrawImage(e.GetImage(render), &ebiten.DrawImageOptions{GeoM: geoM}) } diff --git a/konstructor/engines/easy_ebitengine/screen.playground.header.go b/konstructor/engines/easy_ebitengine/screen.playground.header.go index 7be79d0..856670d 100644 --- a/konstructor/engines/easy_ebitengine/screen.playground.header.go +++ b/konstructor/engines/easy_ebitengine/screen.playground.header.go @@ -1,6 +1,7 @@ package easy_ebitengine import ( + "fmt" "game/konstructor" "image/color" @@ -9,27 +10,28 @@ import ( ) func (e *Engine) PlaygroundHeaderDraw(screen *ebiten.Image) { - header_bg, _ := ebiten.NewImage(e.Config.Screen.Width, 20, ebiten.FilterDefault) - header_bg.Fill(color.RGBA{ - R: 0, - G: 255, - B: 0, - A: 200, - }) - - fl := konstructor.FontLayout{ - Path: "assets/fonts/ArcadeClassic.ttf", - DPI: 72, - Size: 24, - } - - face := fl.GetFontFace() + e.PlaygroundHeaderBackgroundDraw(screen) + e.PlaygroundHeaderTextDraw(screen) +} +func (e *Engine) PlaygroundHeaderBackgroundDraw(screen *ebiten.Image) { + background, _ := ebiten.NewImage(e.Config.Screen.Width, e.Config.Header.Height, ebiten.FilterDefault) + background.Fill(e.Config.Header.BackgroundColor) geoM := ebiten.GeoM{} geoM.Scale(float64(e.Config.Screen.Scale), float64(e.Config.Screen.Scale)) - screen.DrawImage(header_bg, &ebiten.DrawImageOptions{ - GeoM: geoM, - }) - text.Draw(screen, e.Config.Name, face, 10, 20, color.Black) - + screen.DrawImage(background, &ebiten.DrawImageOptions{GeoM: geoM}) +} + +func (e *Engine) PlaygroundHeaderTextDraw(screen *ebiten.Image) { + face := e.Config.Header.FontLayout.GetFontFace(e.Config.Screen.Scale) + header_text := fmt.Sprint(e.Config.Name, " LIVES ", e.KContext.LiveCount, " LEVEL ", e.KContext.CurrentLevel) + + offset := getTopOffset(e.Config) + text.Draw(screen, header_text, face, 10, offset, color.Black) +} + +func getTopOffset(config *konstructor.Config) int { + size := int(config.Header.FontLayout.Size) * config.Screen.Scale + height := config.Header.Height * config.Screen.Scale + return (height-size)/2 + size } diff --git a/konstructor/kcontext.go b/konstructor/kcontext.go index c290a99..1ae323d 100644 --- a/konstructor/kcontext.go +++ b/konstructor/kcontext.go @@ -7,6 +7,7 @@ type KContext struct { CurrentLevel int CurrentPlayground int Multiplayer bool + LiveCount int } func (c *KContext) ScreenTypeIs(name ScreenType) bool { diff --git a/konstructor/layout.font.go b/konstructor/layout.font.go index 7871c6c..c919f67 100644 --- a/konstructor/layout.font.go +++ b/konstructor/layout.font.go @@ -8,6 +8,8 @@ import ( "golang.org/x/image/font/opentype" ) +type FontName string + type FontLayout struct { Path string DPI float64 @@ -17,17 +19,21 @@ type FontLayout struct { cachedFontFace font.Face } -func (fl *FontLayout) GetFontFace() font.Face { +func (fl *FontLayout) GetFontFace(scale int) font.Face { if fl.cachedFontFace != nil { return fl.cachedFontFace } file, _ := ioutil.ReadFile(fl.Path) true_type, _ := opentype.Parse(file) font_face, _ := opentype.NewFace(true_type, &opentype.FaceOptions{ - Size: fl.DPI, - DPI: fl.Size, + Size: fl.Size * float64(scale), + DPI: fl.DPI, Hinting: font.HintingVertical, }) fl.cachedFontFace = font_face return font_face } + +func GetFontPath(name FontName) string { + return "assets/fonts/" + string(name) + ".ttf" +} diff --git a/main.go b/main.go index eef23af..9e19f3f 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "game/domain" "game/konstructor" "game/konstructor/engines/easy_ebitengine" + "image/color" "github.com/hajimehoshi/ebiten" ) @@ -18,14 +19,26 @@ func main() { ActiveDialog: domain.DialogTest, CurrentLevel: 0, CurrentPlayground: 0, + Multiplayer: false, + LiveCount: 3, }, Config: &konstructor.Config{ - Name: "Game", + Name: "Teletype Adventure", Screen: &konstructor.ScreenConfig{ Width: 640, Height: 480, Scale: 2, }, + Header: &konstructor.HeaderConfig{ + BackgroundColor: color.RGBA{ + R: 0, + G: 255, + B: 0, + A: 200, + }, + Height: 20, + FontLayout: domain.GetHeaderFontLayout(), + }, KeyMap: konstructor.KeyMap{ Up: ebiten.KeyUp, Down: ebiten.KeyDown,