switch to using gopackagebase
parent
4882cdedf5
commit
d86124b735
1
Makefile
1
Makefile
|
@ -29,6 +29,7 @@ release_static: prebuild
|
||||||
CGO_LDFLAGS="-Wl,-rpath -L${HOME}/pkg/lib -L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
|
CGO_LDFLAGS="-Wl,-rpath -L${HOME}/pkg/lib -L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
|
||||||
${GO} ${GO_BUILD_RELEASE_STATIC}
|
${GO} ${GO_BUILD_RELEASE_STATIC}
|
||||||
|
|
||||||
|
lint: linter
|
||||||
linter:
|
linter:
|
||||||
golangci-lint run
|
golangci-lint run
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ You can use the Git Bash terminal to do this too. Open up `Git Bash`. This is a
|
||||||
```sh
|
```sh
|
||||||
mkdir projects
|
mkdir projects
|
||||||
cd projects
|
cd projects
|
||||||
git clone ssh://git@gitea.wisellama.rocks:222/Project-Ely/project-ely.git
|
git clone ssh://git@git.wisellama.rocks:222/Project-Ely/project-ely.git
|
||||||
```
|
```
|
||||||
|
|
||||||
## Install Go
|
## Install Go
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
game.title = "Project Ely"
|
|
||||||
game.framerate = 60.0
|
|
||||||
|
|
||||||
log.utcTime = false
|
|
||||||
log.file = "output.log"
|
|
||||||
log.writeToFile = false
|
|
5
go.mod
5
go.mod
|
@ -1,8 +1,9 @@
|
||||||
module gitea.wisellama.rocks/Project-Ely/project-ely
|
module git.wisellama.rocks/Project-Ely/project-ely
|
||||||
|
|
||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
require (
|
require (
|
||||||
gitea.wisellama.rocks/Wisellama/gosimpleconf v0.0.4
|
git.wisellama.rocks/Wisellama/gopackagebase v0.0.4
|
||||||
|
git.wisellama.rocks/Wisellama/gosimpleconf v0.1.0
|
||||||
github.com/veandco/go-sdl2 v0.4.25
|
github.com/veandco/go-sdl2 v0.4.25
|
||||||
)
|
)
|
||||||
|
|
6
go.sum
6
go.sum
|
@ -1,4 +1,6 @@
|
||||||
gitea.wisellama.rocks/Wisellama/gosimpleconf v0.0.4 h1:xFjG/dGPUoh1L7/PG9xQRr0GQZwlh1EGI9RnG8Ja8R8=
|
git.wisellama.rocks/Wisellama/gopackagebase v0.0.4 h1:EUj/GqcSLJVm4aedSFaleudXlJNwJqRuSrTE0LhcA1M=
|
||||||
gitea.wisellama.rocks/Wisellama/gosimpleconf v0.0.4/go.mod h1:kY9gQL8laVTe+tW0ue5bYb6QThw78d7mx6AHwQ5CIzc=
|
git.wisellama.rocks/Wisellama/gopackagebase v0.0.4/go.mod h1:0xUyJkT61TTIpekmeApB8U0mVwNqX/6Iz85RKUZQYyU=
|
||||||
|
git.wisellama.rocks/Wisellama/gosimpleconf v0.1.0 h1:Z2FAzARct8ShV4NSueC/y+PyuSQVcyo4WnW7GoZ9L10=
|
||||||
|
git.wisellama.rocks/Wisellama/gosimpleconf v0.1.0/go.mod h1:Gg1vUTBRZD7qcXvdF8L50PsnL9coLt/XbWa5BwSDN/M=
|
||||||
github.com/veandco/go-sdl2 v0.4.25 h1:J5ac3KKOccp/0xGJA1PaNYKPUcZm19IxhDGs8lJofPI=
|
github.com/veandco/go-sdl2 v0.4.25 h1:J5ac3KKOccp/0xGJA1PaNYKPUcZm19IxhDGs8lJofPI=
|
||||||
github.com/veandco/go-sdl2 v0.4.25/go.mod h1:OROqMhHD43nT4/i9crJukyVecjPNYYuCofep6SNiAjY=
|
github.com/veandco/go-sdl2 v0.4.25/go.mod h1:OROqMhHD43nT4/i9crJukyVecjPNYYuCofep6SNiAjY=
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"gitea.wisellama.rocks/Wisellama/gosimpleconf"
|
|
||||||
)
|
|
||||||
|
|
||||||
var defaultConfig gosimpleconf.ConfigMap = gosimpleconf.ConfigMap{
|
|
||||||
"game.title": "Project Ely",
|
|
||||||
"game.framerate": "60.0",
|
|
||||||
"log.utcTime": "false",
|
|
||||||
"log.writeToFile": "false",
|
|
||||||
}
|
|
||||||
|
|
||||||
func Configure(filename string) (gosimpleconf.ConfigMap, error) {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
_, err = os.Stat(filename)
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
// Config file does not exist, return a default configMap
|
|
||||||
return defaultConfig, nil
|
|
||||||
} else if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
configMap, err := gosimpleconf.Load(filename)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
flagMap := gosimpleconf.SetupFlagOverrides(configMap)
|
|
||||||
configMap = gosimpleconf.ParseFlags(configMap, flagMap)
|
|
||||||
|
|
||||||
return configMap, nil
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type logWriter struct {
|
|
||||||
writeToFile bool
|
|
||||||
utcTime bool
|
|
||||||
logFile *os.File
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *logWriter) Write(bytes []byte) (int, error) {
|
|
||||||
t := time.Now()
|
|
||||||
if w.utcTime {
|
|
||||||
t = t.UTC()
|
|
||||||
}
|
|
||||||
format := t.Format(time.RFC3339)
|
|
||||||
return fmt.Fprintf(w.logFile, "%v %v", format, string(bytes))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *logWriter) Cleanup() {
|
|
||||||
defer w.logFile.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetupLogging(writeToFile bool, utcTime bool, logFilename string) (*logWriter, error) {
|
|
||||||
var err error
|
|
||||||
log.SetFlags(0)
|
|
||||||
|
|
||||||
logFile := os.Stdout
|
|
||||||
if writeToFile {
|
|
||||||
logFile, err = os.OpenFile(logFilename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writer := &logWriter{
|
|
||||||
writeToFile: writeToFile,
|
|
||||||
utcTime: utcTime,
|
|
||||||
logFile: logFile,
|
|
||||||
}
|
|
||||||
log.SetOutput(writer)
|
|
||||||
|
|
||||||
return writer, nil
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
crypto_rand "crypto/rand"
|
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
|
||||||
math_rand "math/rand"
|
|
||||||
)
|
|
||||||
|
|
||||||
// InitRNG will grab some cryptographically secure bytes to use as the
|
|
||||||
// seed for the non-crypto random number generator. Suggested on
|
|
||||||
// StackOverflow to avoid time-based seeds:
|
|
||||||
// https://stackoverflow.com/a/54491783
|
|
||||||
func InitRNG() error {
|
|
||||||
var b [8]byte
|
|
||||||
_, err := crypto_rand.Read(b[:])
|
|
||||||
if err != nil {
|
|
||||||
err = fmt.Errorf("error seeding random number generator: %w", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
math_rand.Seed(int64(binary.LittleEndian.Uint64(b[:])))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
package animation
|
package animation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/sprite"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/sprite"
|
||||||
"github.com/veandco/go-sdl2/sdl"
|
"github.com/veandco/go-sdl2/sdl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/channels"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/channels"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Entity interface {
|
type Entity interface {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/vector"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/vector"
|
||||||
"github.com/veandco/go-sdl2/sdl"
|
"github.com/veandco/go-sdl2/sdl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"math"
|
"math"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/animation"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/animation"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/vector"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/vector"
|
||||||
"github.com/veandco/go-sdl2/sdl"
|
"github.com/veandco/go-sdl2/sdl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -8,14 +8,14 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/animation"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/animation"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/command"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/command"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/types"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/types"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/player"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/player"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/sprite"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/sprite"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/window"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/window"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/vector"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/vector"
|
||||||
"gitea.wisellama.rocks/Wisellama/gosimpleconf"
|
"git.wisellama.rocks/Wisellama/gosimpleconf"
|
||||||
"github.com/veandco/go-sdl2/sdl"
|
"github.com/veandco/go-sdl2/sdl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/command"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game/entity/command"
|
||||||
"github.com/veandco/go-sdl2/sdl"
|
"github.com/veandco/go-sdl2/sdl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package sprite
|
||||||
|
|
||||||
|
const (
|
||||||
|
PENGUIN = "assets/images/penguin.png"
|
||||||
|
PERCYWALKING = "assets/images/percywalking.png"
|
||||||
|
PLATFORMER_FOREST_CHARACTERS = "assets/images/a-platformer-in-the-forest/characters.png"
|
||||||
|
DELILAHWALKING = "assets/images/Delilah_walking.png"
|
||||||
|
KINGWALKING = "assets/images/King_walking.png"
|
||||||
|
)
|
||||||
|
|
||||||
|
var SPRITE_FILE_LIST []string = []string{
|
||||||
|
PENGUIN,
|
||||||
|
PERCYWALKING,
|
||||||
|
PLATFORMER_FOREST_CHARACTERS,
|
||||||
|
DELILAHWALKING,
|
||||||
|
KINGWALKING,
|
||||||
|
}
|
|
@ -6,22 +6,6 @@ import (
|
||||||
"github.com/veandco/go-sdl2/sdl"
|
"github.com/veandco/go-sdl2/sdl"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
PENGUIN = "assets/images/penguin.png"
|
|
||||||
PERCYWALKING = "assets/images/percywalking.png"
|
|
||||||
PLATFORMER_FOREST_CHARACTERS = "assets/images/a-platformer-in-the-forest/characters.png"
|
|
||||||
DELILAHWALKING = "assets/images/Delilah_walking.png"
|
|
||||||
KINGWALKING = "assets/images/King_walking.png"
|
|
||||||
)
|
|
||||||
|
|
||||||
var fileList []string = []string{
|
|
||||||
PENGUIN,
|
|
||||||
PERCYWALKING,
|
|
||||||
PLATFORMER_FOREST_CHARACTERS,
|
|
||||||
DELILAHWALKING,
|
|
||||||
KINGWALKING,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
spriteCache map[string]*spritesheet
|
spriteCache map[string]*spritesheet
|
||||||
defaultSprite *spritesheet
|
defaultSprite *spritesheet
|
||||||
|
@ -30,7 +14,7 @@ var (
|
||||||
func InitSpriteCache(renderer *sdl.Renderer) error {
|
func InitSpriteCache(renderer *sdl.Renderer) error {
|
||||||
spriteCache = make(map[string]*spritesheet)
|
spriteCache = make(map[string]*spritesheet)
|
||||||
|
|
||||||
for _, filename := range fileList {
|
for _, filename := range SPRITE_FILE_LIST {
|
||||||
s, err := NewSprite(renderer, filename)
|
s, err := NewSprite(renderer, filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("error creating sprite %v, using DefaultSprite: %v", filename, err)
|
log.Printf("error creating sprite %v, using DefaultSprite: %v", filename, err)
|
||||||
|
|
93
main.go
93
main.go
|
@ -1,44 +1,44 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
|
||||||
|
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/config"
|
"git.wisellama.rocks/Project-Ely/project-ely/internal/game"
|
||||||
"gitea.wisellama.rocks/Project-Ely/project-ely/internal/game"
|
"git.wisellama.rocks/Wisellama/gopackagebase"
|
||||||
"gitea.wisellama.rocks/Wisellama/gosimpleconf"
|
"git.wisellama.rocks/Wisellama/gosimpleconf"
|
||||||
"github.com/veandco/go-sdl2/sdl"
|
"github.com/veandco/go-sdl2/sdl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
CONFIG_FILE = "project-ely.conf"
|
||||||
|
)
|
||||||
|
|
||||||
|
var defaultConfig gosimpleconf.ConfigMap = gosimpleconf.ConfigMap{
|
||||||
|
"game.title": "Project Ely",
|
||||||
|
"game.framerate": "60.0",
|
||||||
|
"log.utcTime": "false",
|
||||||
|
"log.writeToFile": "false",
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Setup some initial context for gracefully killing
|
var err error
|
||||||
// the program with system interrupt signals like ctrl+c
|
|
||||||
// https://pace.dev/blog/2020/02/17/repond-to-ctrl-c-interrupt-signals-gracefully-with-context-in-golang-by-mat-ryer.html
|
baseConfig, err := gopackagebase.Initialize(CONFIG_FILE, defaultConfig)
|
||||||
ctx := context.Background()
|
if err != nil {
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
log.Fatalf("error initializing: %v", err)
|
||||||
signalChan := make(chan os.Signal, 1)
|
}
|
||||||
signal.Notify(signalChan, os.Interrupt)
|
if baseConfig == nil {
|
||||||
defer func() {
|
log.Fatalf("baseConfig was nil")
|
||||||
signal.Stop(signalChan)
|
}
|
||||||
cancel()
|
defer baseConfig.Cancel()
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
select {
|
|
||||||
case <-signalChan:
|
|
||||||
// Graceful exit on ctrl+c
|
|
||||||
log.Printf("Attempting to exit gracefully...\n")
|
|
||||||
cancel()
|
|
||||||
case <-ctx.Done():
|
|
||||||
}
|
|
||||||
<-signalChan // Hard exit on second ctrl+c
|
|
||||||
log.Printf("Hard kill\n")
|
|
||||||
os.Exit(2)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Run the program
|
// Run the program
|
||||||
err := run(ctx)
|
// Start everything with the SDL goroutine context
|
||||||
|
log.Printf("=== Starting %v ===", baseConfig.ConfigMap["game.title"])
|
||||||
|
sdl.Main(func() {
|
||||||
|
err = game.Run(baseConfig.Ctx, baseConfig.ConfigMap)
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%v\n", err)
|
log.Printf("%v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
@ -46,38 +46,3 @@ func main() {
|
||||||
|
|
||||||
log.Printf("Exited gracefully!\n")
|
log.Printf("Exited gracefully!\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func run(ctx context.Context) error {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// Read configuration
|
|
||||||
configMap, err := config.Configure("game.conf")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("error during configure: %v\n", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup logging
|
|
||||||
writeToFile := gosimpleconf.Bool(configMap["log.writeToFile"])
|
|
||||||
utcTime := gosimpleconf.Bool(configMap["log.utcTime"])
|
|
||||||
logFilename := configMap["log.file"]
|
|
||||||
logWriter, err := config.SetupLogging(writeToFile, utcTime, logFilename)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("error setting up logging: %v\n", err)
|
|
||||||
}
|
|
||||||
defer logWriter.Cleanup()
|
|
||||||
|
|
||||||
// Setup Random Number Generator seed
|
|
||||||
config.InitRNG()
|
|
||||||
|
|
||||||
// Start everything with the SDL goroutine context
|
|
||||||
log.Printf("=== Starting %v ===", configMap["game.title"])
|
|
||||||
sdl.Main(func() {
|
|
||||||
err = game.Run(ctx, configMap)
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue