Skip to content
This repository has been archived by the owner on Jun 28, 2023. It is now read-only.

Commit

Permalink
sprite: Start work on changing sprite functions to return SpriteIndex…
Browse files Browse the repository at this point in the history
… instead of *Sprite

Updates #2
  • Loading branch information
silbinarywolf committed Nov 24, 2018
1 parent 0df19e2 commit e7ed58f
Show file tree
Hide file tree
Showing 12 changed files with 83 additions and 40 deletions.
13 changes: 12 additions & 1 deletion examples/spaceship/asset/gmlgo.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
package asset

import "github.com/silbinarywolf/gml-go/gml"

// todo(Jake): 2018-11-24
// Auto-generate this file

const (
SprSpaceship = 1
_ gml.SpriteIndex = 0
SprSpaceship = 1
)

func init() {
gml.SpriteInitializeIndexToName([]string{
SprSpaceship: "Spaceship",
}, map[string]gml.SpriteIndex{
"Spaceship": SprSpaceship,
})
}
7 changes: 5 additions & 2 deletions examples/spaceship/game/obj_bullet.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package game

import "github.com/silbinarywolf/gml-go/gml"
import (
"github.com/silbinarywolf/gml-go/examples/spaceship/asset"
"github.com/silbinarywolf/gml-go/gml"
)

type Bullet struct {
gml.Object
}

func (inst *Bullet) Create() {
inst.SetSprite(gml.SpriteLoad("Spaceship"))
inst.SetSprite(gml.SpriteLoad(asset.SprSpaceship))
}

func (inst *Bullet) Destroy() {
Expand Down
7 changes: 5 additions & 2 deletions examples/spaceship/game/obj_player.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package game

import "github.com/silbinarywolf/gml-go/gml"
import (
"github.com/silbinarywolf/gml-go/examples/spaceship/asset"
"github.com/silbinarywolf/gml-go/gml"
)

type Player struct {
gml.Object
}

func (inst *Player) Create() {
inst.SetSprite(gml.SpriteLoad("Spaceship"))
inst.SetSprite(gml.SpriteLoad(asset.SprSpaceship))
}

func (inst *Player) Destroy() {
Expand Down
2 changes: 1 addition & 1 deletion gml/animation_editor_debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func (editor *debugAnimationEditor) animationConfigLoad() {
// todo(Jake): 2018-10-28
// Add function to load a sprite if it exists, we don't want to crash
// if we remove a sprite that we previously had loaded.
spr := sprite.LoadSprite(name)
spr := sprite.SpriteLoadByName(name)
editor.spriteViewing.SetSprite(spr)
}
}
Expand Down
2 changes: 1 addition & 1 deletion gml/internal/room/room_manager_nonjs.go
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ func loadRoomFromDirectoryFiles(name string) *Room {

// Set room dimensions
{
spr := sprite.LoadSprite(spriteName)
spr := sprite.SpriteLoadByName(spriteName)
if spr == nil {
println("Error loading sprite sprite \"", spriteName, "\" error: ", err.Error())
continue
Expand Down
3 changes: 3 additions & 0 deletions gml/internal/sprite/sprite.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ type Sprite struct {
imageSpeed float64
}

type SpriteIndex int32

func (spr *Sprite) Name() string { return spr.name }
func (spr *Sprite) Size() geom.Size { return spr.size }
func (spr *Sprite) ImageSpeed() float64 { return spr.imageSpeed }
func (spr *Sprite) isUsed() bool { return len(spr.frames) > 0 }
func (spr *Sprite) rect() geom.Rect {
return geom.Rect{
Vec: geom.Vec{},
Expand Down
40 changes: 28 additions & 12 deletions gml/internal/sprite/sprite_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,48 @@ var (
)

type spriteManager struct {
assetMap map[string]*Sprite
assetList []*Sprite
assetList []Sprite
spriteNameToIndex map[string]SpriteIndex
spriteIndexToName []string
}

func newSpriteManager() *spriteManager {
manager := &spriteManager{}
manager.assetMap = make(map[string]*Sprite)
manager.assetList = make([]*Sprite, 1, 10)
return manager
}

func SpriteInitializeIndexToName(indexToName []string, nameToIndex map[string]SpriteIndex) {
g_spriteManager.spriteIndexToName = indexToName
g_spriteManager.spriteNameToIndex = nameToIndex
g_spriteManager.assetList = make([]Sprite, len(g_spriteManager.spriteIndexToName))
}

// todo(Jake): 2018-24-11 - Github #14
// Remove SpriteList() as it's brittle and only used by sprite_selector.go
func SpriteList() []*Sprite {
return g_spriteManager.assetList[1:]
panic("Broke sprite_selector(), need to fix")
return nil
//return g_spriteManager.assetList[1:]
}

func LoadSprite(name string) *Sprite {
func SpriteLoadByName(name string) *Sprite {
index := g_spriteManager.spriteNameToIndex[name]
return SpriteLoad(index)
}

func SpriteLoad(index SpriteIndex) *Sprite {
manager := g_spriteManager

// Use already loaded asset
if res, ok := manager.assetMap[name]; ok {
return res
sprite := &manager.assetList[index]
// todo(Jake): have a "isUsed" var or function instead of checking
// for frames
if sprite.isUsed() {
return sprite
}
name := g_spriteManager.spriteIndexToName[index]
// todo(Jake): change loadSprite() to return Sprite, not *Sprite
result := loadSprite(name)
manager.assetMap[name] = result
manager.assetList = append(manager.assetList, result)

*sprite = *result
return result
}

Expand Down
7 changes: 5 additions & 2 deletions gml/internal/sprite/sprite_manager_debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ func init() {
//watcher.Close()
}

func debugSpriteByName() {

}

func DebugWatch() {
// Get list of sprites updated this frame
var watcherSpritesToUpdate []string
Expand Down Expand Up @@ -60,9 +64,8 @@ FileWatchLoop:
}

// If those sprites are loaded, reload them
manager := g_spriteManager
for _, spriteName := range watcherSpritesToUpdate {
spr := manager.assetMap[spriteName]
spr := SpriteLoadByName(spriteName)
if spr != nil {
newSprData := loadSprite(spriteName)
*spr = *newSprData
Expand Down
22 changes: 11 additions & 11 deletions gml/room_editor_debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ func editorUpdate() {
break
}
// Draw bg
sprite := sprite.LoadSprite(layer.SpriteName)
sprite := sprite.SpriteLoadByName(layer.SpriteName)
x := float64(layer.X)
y := float64(layer.Y)
width := float64(sprite.Size().X)
Expand All @@ -568,7 +568,7 @@ func editorUpdate() {
// Draw room sprites
for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)
DrawSprite(sprite, 0, geom.Vec{float64(obj.X), float64(obj.Y)})
}
default:
Expand Down Expand Up @@ -998,7 +998,7 @@ func editorUpdate() {
hasCollision := false
for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

other := geom.Rect{}
other.X = float64(obj.X)
Expand Down Expand Up @@ -1043,7 +1043,7 @@ func editorUpdate() {
hasCollision := false
for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

other := geom.Rect{}
other.X = float64(obj.X)
Expand Down Expand Up @@ -1095,7 +1095,7 @@ func editorUpdate() {
// Mark deleted
for i, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

width := float64(sprite.Size().X)
height := float64(sprite.Size().Y)
Expand Down Expand Up @@ -1402,7 +1402,7 @@ func (roomEditor *roomEditor) getSnapPosition(pos geom.Vec, brushSize geom.Size,

for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

other := geom.Rect{}
other.X = float64(obj.X)
Expand Down Expand Up @@ -1431,7 +1431,7 @@ func (roomEditor *roomEditor) getSnapPosition(pos geom.Vec, brushSize geom.Size,

for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

other := geom.Rect{}
other.X = float64(obj.X)
Expand Down Expand Up @@ -1460,7 +1460,7 @@ func (roomEditor *roomEditor) getSnapPosition(pos geom.Vec, brushSize geom.Size,

for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

other := geom.Rect{}
other.X = float64(obj.X)
Expand Down Expand Up @@ -1489,7 +1489,7 @@ func (roomEditor *roomEditor) getSnapPosition(pos geom.Vec, brushSize geom.Size,

for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

other := geom.Rect{}
other.X = float64(obj.X)
Expand Down Expand Up @@ -1590,7 +1590,7 @@ func (roomEditor *roomEditor) calculateRoomBounds() {
case *room.RoomLayerSprite:
for _, obj := range layer.Sprites {
spriteName := obj.SpriteName
sprite := sprite.LoadSprite(spriteName)
sprite := sprite.SpriteLoadByName(spriteName)

x := int32(obj.X)
y := int32(obj.Y)
Expand Down Expand Up @@ -1736,7 +1736,7 @@ func (roomEditor *roomEditor) editorConfigLoad() {
// Set brush from config
switch roomEditor.editingLayer.(type) {
case *room.RoomLayerSprite:
obj := sprite.LoadSprite(editorConfig.BrushSelected)
obj := sprite.SpriteLoadByName(editorConfig.BrushSelected)
if obj.Name() == editorConfig.BrushSelected {
roomEditor.spriteSelected = obj
break
Expand Down
14 changes: 9 additions & 5 deletions gml/sprite.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ import (
"github.com/silbinarywolf/gml-go/gml/internal/sprite"
)

// todo(Jake): 2018-10-27
// Consider changing this to `type SpriteIndex int` and exposing
// Sprite functions by accessing the assetList.
// todo(Jake): 2018-11-24 - Github Issue #2
// Remove Sprite in favour of exposing "SpriteIndex"
type Sprite = sprite.Sprite
type SpriteIndex = sprite.SpriteIndex

type SpriteState = sprite.SpriteState

func SpriteLoad(name string) *Sprite {
return sprite.LoadSprite(name)
func SpriteInitializeIndexToName(indexToName []string, nameToIndex map[string]SpriteIndex) {
sprite.SpriteInitializeIndexToName(indexToName, nameToIndex)
}

func SpriteLoad(index SpriteIndex) *Sprite {
return sprite.SpriteLoad(index)
}
2 changes: 1 addition & 1 deletion gml/sprite_selector_debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (viewer *debugSpriteViewer) lazyLoad() {
return nil
}
name := filepath.Base(path)
sprite.LoadSprite(name)
sprite.SpriteLoadByName(name)
return nil
})
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions gml/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func (state *state) createNewRoomInstance(room *Room) *RoomInstance {
layer.y = float64(layerData.Y)
layer.roomLeft = float64(room.Left)
layer.roomRight = float64(room.Right)
layer.sprite = sprite.LoadSprite(spriteName)
layer.sprite = sprite.SpriteLoadByName(spriteName)
layer.drawOrder = layerData.Config.Order
roomInst.drawLayers = append(roomInst.drawLayers, layer)
}
Expand All @@ -120,7 +120,7 @@ func (state *state) createNewRoomInstance(room *Room) *RoomInstance {
layer.sprites = make([]RoomInstanceLayerSpriteObject, 0, len(layerData.Sprites))
for _, sprObj := range layerData.Sprites {
// Add draw sprite
spr := sprite.LoadSprite(sprObj.SpriteName)
spr := sprite.SpriteLoadByName(sprObj.SpriteName)
record := RoomInstanceLayerSpriteObject{
Sprite: spr,
}
Expand Down

0 comments on commit e7ed58f

Please sign in to comment.