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

Commit 8605c7c

Browse files
committed
sprite: change *Sprite to SpriteIndex (int)
Fixes #2
1 parent e7ed58f commit 8605c7c

18 files changed

+146
-113
lines changed

examples/spaceship/game/obj_player.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ type Player struct {
1010
}
1111

1212
func (inst *Player) Create() {
13-
inst.SetSprite(gml.SpriteLoad(asset.SprSpaceship))
13+
inst.SetSprite(asset.SprSpaceship)
1414
}
1515

1616
func (inst *Player) Destroy() {

gml/animation_editor_debug.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func (editor *debugAnimationEditor) animationConfigLoad() {
8282

8383
func (editor *debugAnimationEditor) animationConfigSave() {
8484
editorConfig := animationEditorConfig{}
85-
editorConfig.SpriteSelected = editor.spriteViewing.Sprite().Name()
85+
editorConfig.SpriteSelected = editor.spriteViewing.SpriteIndex().Name()
8686
json, _ := json.MarshalIndent(editorConfig, "", "\t")
8787
configPath := debugConfigPath("animation_editor")
8888
err := ioutil.WriteFile(configPath, json, 0644)
@@ -95,9 +95,9 @@ func (editor *debugAnimationEditor) animationEditorToggleMenu(menu animMenu) {
9595
if editor.menuOpened == menu {
9696
menu = animMenuNone
9797
}
98-
spr := editor.spriteViewing.Sprite()
98+
spriteIndex := editor.spriteViewing.SpriteIndex()
9999
imageIndex := int(math.Floor(editor.spriteViewing.ImageIndex()))
100-
collisionMask := sprite.GetCollisionMask(spr, imageIndex, 0)
100+
collisionMask := sprite.GetCollisionMask(spriteIndex, imageIndex, 0)
101101
value, err := strconv.ParseFloat(KeyboardString(), 64)
102102
if err == nil {
103103
switch editor.menuOpened {
@@ -131,12 +131,13 @@ func animationEditorUpdate() {
131131
DrawTextColor(pos, "Space = Play/Pause Animation", color.White)
132132
pos.Y += 24
133133
DrawTextColor(pos, "CTRL + P = Open Sprite List", color.White)
134-
if spr := editor.spriteViewing.Sprite(); spr != nil {
134+
135+
if spriteIndex := editor.spriteViewing.SpriteIndex(); spriteIndex != sprite.SprUndefined {
135136
pos.Y += 24
136137
DrawTextColor(pos, "CTRL + S = Save", color.White)
137138

138139
if KeyboardCheck(VkControl) && KeyboardCheckPressed(VkS) {
139-
err := sprite.DebugWriteSpriteConfig(spr)
140+
err := sprite.DebugWriteSpriteConfig(spriteIndex)
140141
if err != nil {
141142
panic(err)
142143
}
@@ -155,7 +156,7 @@ func animationEditorUpdate() {
155156
}
156157

157158
// Change frame viewing
158-
if spr := editor.spriteViewing.Sprite(); spr != nil {
159+
if spr := editor.spriteViewing.SpriteIndex(); spr.IsValid() {
159160
imageIndex := math.Floor(editor.spriteViewing.ImageIndex())
160161
if KeyboardCheckPressed(VkLeft) {
161162
imageIndex -= 1
@@ -176,24 +177,24 @@ func animationEditorUpdate() {
176177
//
177178
var collisionMask *sprite.CollisionMask
178179
var inheritCollisionMask *sprite.CollisionMask
179-
if spr := editor.spriteViewing.Sprite(); spr != nil {
180+
if spriteIndex := editor.spriteViewing.SpriteIndex(); spriteIndex.IsValid() {
180181
imageIndex := int(math.Floor(editor.spriteViewing.ImageIndex()))
181-
collisionMask = sprite.GetCollisionMask(spr, imageIndex, 0)
182+
collisionMask = sprite.GetCollisionMask(spriteIndex, imageIndex, 0)
182183
switch collisionMask.Kind {
183184
case sprite.CollisionMaskInherit:
184185
for ; imageIndex > 0; imageIndex-- {
185-
collisionMask = sprite.GetCollisionMask(spr, imageIndex, 0)
186+
collisionMask = sprite.GetCollisionMask(spriteIndex, imageIndex, 0)
186187
if collisionMask.Kind != sprite.CollisionMaskInherit {
187188
break
188189
}
189190
}
190191
if imageIndex == 0 {
191-
collisionMask = sprite.GetCollisionMask(spr, imageIndex, 0)
192+
collisionMask = sprite.GetCollisionMask(spriteIndex, imageIndex, 0)
192193
if collisionMask.Kind == sprite.CollisionMaskInherit {
193194
collisionMask = &sprite.CollisionMask{
194195
Kind: sprite.CollisionMaskManual,
195196
Rect: geom.Rect{
196-
Size: spr.Size(),
197+
Size: spriteIndex.Size(),
197198
},
198199
}
199200
}
@@ -204,8 +205,8 @@ func animationEditorUpdate() {
204205
}
205206
}
206207

207-
if spr := editor.spriteViewing.Sprite(); spr != nil {
208-
size := spr.Size()
208+
if spriteIndex := editor.spriteViewing.SpriteIndex(); spriteIndex.IsValid() {
209+
size := spriteIndex.Size()
209210
pos := geom.Vec{float64(windowWidth()/2) - (float64(size.X) / 2), float64(windowHeight()/2) - (float64(size.Y) / 2)}
210211

211212
{
@@ -218,7 +219,7 @@ func animationEditorUpdate() {
218219
if editor.isInPlayback {
219220
editor.spriteViewing.ImageUpdate()
220221
}
221-
DrawSprite(spr, editor.spriteViewing.ImageIndex(), pos)
222+
DrawSprite(spriteIndex, editor.spriteViewing.ImageIndex(), pos)
222223

223224
if collisionMask != nil {
224225
// Draw collision box
@@ -357,20 +358,20 @@ func animationEditorUpdate() {
357358
}
358359
}
359360

360-
if spr := editor.spriteViewing.Sprite(); spr != nil {
361+
if spriteIndex := editor.spriteViewing.SpriteIndex(); spriteIndex.IsValid() {
361362
basePos := geom.Vec{(float64(windowWidth()) / 2) - 140, float64(windowHeight())}
362363
basePos.Y -= 210
363364

364365
imageIndex := int(math.Floor(editor.spriteViewing.ImageIndex()))
365366
DrawTextF(basePos, "Frame: %d", imageIndex)
366367
basePos.Y += 24
367368
if drawButton(basePos, "Kind: Inherit") {
368-
collisionMask = sprite.GetCollisionMask(spr, imageIndex, 0)
369+
collisionMask = sprite.GetCollisionMask(spriteIndex, imageIndex, 0)
369370
collisionMask.Kind = sprite.CollisionMaskInherit
370371
}
371372
basePos.Y += 30
372373
if drawButton(basePos, "Kind: Manual") {
373-
collisionMask = sprite.GetCollisionMask(spr, imageIndex, 0)
374+
collisionMask = sprite.GetCollisionMask(spriteIndex, imageIndex, 0)
374375
if collisionMask.Kind != sprite.CollisionMaskManual {
375376
collisionMask.Rect = inheritCollisionMask.Rect
376377
collisionMask.Kind = sprite.CollisionMaskManual

gml/draw.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ import (
66
)
77

88
func DrawSelf(state *sprite.SpriteState, position geom.Vec) {
9-
DrawSpriteScaled(state.Sprite(), state.ImageIndex(), position, state.ImageScale)
9+
DrawSpriteScaled(state.SpriteIndex(), state.ImageIndex(), position, state.ImageScale)
1010
}

gml/draw_headless.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ func DrawGetGUI() bool {
1515
func DrawSetGUI(guiMode bool) {
1616
}
1717

18-
func DrawSprite(spr *sprite.Sprite, subimage float64, position Vec) {
18+
func DrawSprite(spr sprite.SpriteIndex, subimage float64, position Vec) {
1919
}
2020

21-
func DrawSpriteScaled(spr *sprite.Sprite, subimage float64, position Vec, scale Vec) {
21+
func DrawSpriteScaled(spr sprite.SpriteIndex, subimage float64, position Vec, scale Vec) {
2222
}
2323

24-
func DrawSpriteExt(spr *sprite.Sprite, subimage float64, position Vec, scale Vec, alpha float64) {
24+
func DrawSpriteExt(spr sprite.SpriteIndex, subimage float64, position Vec, scale Vec, alpha float64) {
2525
}
2626

2727
func DrawRectangle(pos Vec, size Vec, col color.Color) {

gml/draw_nonheadless.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,16 @@ func DrawSetGUI(guiMode bool) {
2727
isDrawGuiMode = guiMode
2828
}
2929

30-
func DrawSprite(spr *sprite.Sprite, subimage float64, position geom.Vec) {
31-
position = maybeApplyOffsetByCamera(position)
32-
frame := sprite.GetRawFrame(spr, int(math.Floor(subimage)))
33-
op := ebiten.DrawImageOptions{}
34-
op.GeoM.Translate(position.X, position.Y)
35-
drawGetTarget().DrawImage(frame, &op)
30+
func DrawSprite(spriteIndex sprite.SpriteIndex, subimage float64, position geom.Vec) {
31+
DrawSpriteExt(spriteIndex, subimage, position, geom.Vec{1, 1}, 1.0)
3632
}
3733

38-
func DrawSpriteScaled(spr *sprite.Sprite, subimage float64, position geom.Vec, scale geom.Vec) {
39-
DrawSpriteExt(spr, subimage, position, scale, 1.0)
34+
func DrawSpriteScaled(spriteIndex sprite.SpriteIndex, subimage float64, position geom.Vec, scale geom.Vec) {
35+
DrawSpriteExt(spriteIndex, subimage, position, scale, 1.0)
4036
}
4137

4238
// draw_sprite_ext( sprite, subimg, x, y, xscale, yscale, rot, colour, alpha );
43-
func DrawSpriteExt(spr *sprite.Sprite, subimage float64, position geom.Vec, scale geom.Vec, alpha float64) {
39+
func DrawSpriteExt(spriteIndex sprite.SpriteIndex, subimage float64, position geom.Vec, scale geom.Vec, alpha float64) {
4440
position = maybeApplyOffsetByCamera(position)
4541
// NOTE(Jake): 2018-07-09
4642
//
@@ -54,7 +50,7 @@ func DrawSpriteExt(spr *sprite.Sprite, subimage float64, position geom.Vec, scal
5450
//scale.X *= view.Scale().X
5551
//scale.Y *= view.Scale().Y
5652

57-
frame := sprite.GetRawFrame(spr, int(math.Floor(subimage)))
53+
frame := sprite.GetRawFrame(spriteIndex, int(math.Floor(subimage)))
5854
op := ebiten.DrawImageOptions{}
5955
op.GeoM.Scale(scale.X, scale.Y)
6056
op.GeoM.Translate(position.X, position.Y)

gml/internal/object/object.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,17 @@ func (inst *Object) ImageAngle() float64 { return inst.imageAngleRadians
4343

4444
//func (inst *Object) ImageScale() geom.Vec { return inst.imageScale }
4545

46-
func (inst *Object) SetSprite(sprite *sprite.Sprite) {
47-
inst.SpriteState.SetSprite(sprite)
46+
func (inst *Object) SetSprite(spriteIndex sprite.SpriteIndex) {
47+
inst.SpriteState.SetSprite(spriteIndex)
4848

4949
// Infer width and height if they aren't manually set
5050
// (This might be a bad idea, too magic! But feels like Game Maker, so...)
51+
size := spriteIndex.Size()
5152
if inst.Size.X == 0 {
52-
inst.Size.X = sprite.Size().X
53+
inst.Size.X = size.X
5354
}
5455
if inst.Size.Y == 0 {
55-
inst.Size.Y = sprite.Size().Y
56+
inst.Size.Y = size.Y
5657
}
5758
}
5859

gml/internal/room/room_manager_nonjs.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,15 +369,16 @@ func loadRoomFromDirectoryFiles(name string) *Room {
369369

370370
// Set room dimensions
371371
{
372-
spr := sprite.SpriteLoadByName(spriteName)
373-
if spr == nil {
372+
spriteIndex := sprite.SpriteLoadByName(spriteName)
373+
if spriteIndex == sprite.SprUndefined {
374374
println("Error loading sprite sprite \"", spriteName, "\" error: ", err.Error())
375375
continue
376376
}
377377
x := int32(x)
378378
y := int32(y)
379-
width := int32(spr.Size().X)
380-
height := int32(spr.Size().Y)
379+
size := spriteIndex.Size()
380+
width := int32(size.X)
381+
height := int32(size.Y)
381382

382383
if x < room.Left {
383384
room.Left = x

gml/internal/sprite/sprite.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,40 @@ const (
88
maxCollisionMasks = 3
99
)
1010

11+
const SprUndefined SpriteIndex = 0
12+
1113
type Sprite struct {
1214
name string
1315
frames []SpriteFrame
1416
size geom.Size
1517
imageSpeed float64
1618
}
1719

18-
type SpriteIndex int32
19-
20-
func (spr *Sprite) Name() string { return spr.name }
21-
func (spr *Sprite) Size() geom.Size { return spr.size }
22-
func (spr *Sprite) ImageSpeed() float64 { return spr.imageSpeed }
23-
func (spr *Sprite) isUsed() bool { return len(spr.frames) > 0 }
20+
func (spr *Sprite) Name() string { return spr.name }
21+
func (spr *Sprite) isLoaded() bool { return len(spr.frames) > 0 }
2422
func (spr *Sprite) rect() geom.Rect {
2523
return geom.Rect{
2624
Vec: geom.Vec{},
27-
Size: spr.Size(),
25+
Size: spr.size,
2826
}
2927
}
3028

31-
func GetCollisionMask(spr *Sprite, frame int, kind int) *CollisionMask {
32-
// masks := &spr.frames[frame].collisionMasks[kind].masks[kind]
33-
//if len(masks) == 0 {
34-
// panic("Should have at least 1 collision mask defined")
35-
//}
36-
return &spr.frames[frame].collisionMasks[kind]
29+
type SpriteIndex int32
30+
31+
func (spriteIndex SpriteIndex) Name() string { return g_spriteManager.assetList[spriteIndex].name }
32+
func (spriteIndex SpriteIndex) Size() geom.Size { return g_spriteManager.assetList[spriteIndex].size }
33+
func (spriteIndex SpriteIndex) ImageSpeed() float64 {
34+
return g_spriteManager.assetList[spriteIndex].imageSpeed
35+
}
36+
func (spriteIndex SpriteIndex) IsValid() bool {
37+
return spriteIndex > 0
38+
}
39+
func (spriteIndex SpriteIndex) IsLoaded() bool {
40+
return len(g_spriteManager.assetList[spriteIndex].frames) > 0
41+
}
42+
43+
func Frames(spriteIndex SpriteIndex) []SpriteFrame {
44+
return g_spriteManager.assetList[spriteIndex].frames
3745
}
3846

3947
/*func (spr *Sprite) GetFrame(index int) *SpriteFrame {

gml/internal/sprite/sprite_frame_nonheadless.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func createFrame(frameData spriteAssetFrame) (SpriteFrame, error) {
3838
// This is called by draw_nonheadless.go in the parent package
3939
// so that it can draw the image.
4040
//
41-
func GetRawFrame(spr *Sprite, index int) *ebiten.Image {
41+
func GetRawFrame(spriteIndex SpriteIndex, index int) *ebiten.Image {
4242
// NOTE(Jake): 2018-06-17
4343
//
4444
// Golang does not "cast", it uses type conversion, which means
@@ -47,5 +47,5 @@ func GetRawFrame(spr *Sprite, index int) *ebiten.Image {
4747
//
4848
// https://stackoverflow.com/questions/35115868/how-to-round-to-nearest-int-when-casting-float-to-int-in-go
4949
//
50-
return spr.frames[index].image
50+
return Frames(spriteIndex)[index].image
5151
}

gml/internal/sprite/sprite_manager.go

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,33 +34,45 @@ func SpriteInitializeIndexToName(indexToName []string, nameToIndex map[string]Sp
3434
g_spriteManager.assetList = make([]Sprite, len(g_spriteManager.spriteIndexToName))
3535
}
3636

37-
// todo(Jake): 2018-24-11 - Github #14
38-
// Remove SpriteList() as it's brittle and only used by sprite_selector.go
39-
func SpriteList() []*Sprite {
40-
panic("Broke sprite_selector(), need to fix")
37+
func SpriteNames() []string {
38+
return g_spriteManager.spriteIndexToName
39+
}
40+
41+
func sprite(index SpriteIndex) *Sprite {
42+
sprite := &g_spriteManager.assetList[index]
43+
if sprite.isLoaded() {
44+
return sprite
45+
}
4146
return nil
42-
//return g_spriteManager.assetList[1:]
4347
}
4448

45-
func SpriteLoadByName(name string) *Sprite {
46-
index := g_spriteManager.spriteNameToIndex[name]
47-
return SpriteLoad(index)
49+
func SpriteLoadByName(name string) SpriteIndex {
50+
index, ok := g_spriteManager.spriteNameToIndex[name]
51+
if !ok {
52+
return SprUndefined
53+
}
54+
return index
4855
}
4956

50-
func SpriteLoad(index SpriteIndex) *Sprite {
57+
/*func SpriteSize(index SpriteIndex) geom.Size {
5158
manager := g_spriteManager
59+
sprite := &manager.assetList[index]
60+
if !sprite.isUsed() {
61+
panic("sprite: Invalid sprite.")
62+
}
63+
return sprite.Size()
64+
}*/
5265

66+
func SpriteLoad(index SpriteIndex) {
67+
manager := g_spriteManager
5368
sprite := &manager.assetList[index]
54-
// todo(Jake): have a "isUsed" var or function instead of checking
55-
// for frames
56-
if sprite.isUsed() {
57-
return sprite
69+
if sprite.isLoaded() {
70+
return
5871
}
59-
name := g_spriteManager.spriteIndexToName[index]
72+
name := manager.spriteIndexToName[index]
6073
// todo(Jake): change loadSprite() to return Sprite, not *Sprite
6174
result := loadSprite(name)
6275
*sprite = *result
63-
return result
6476
}
6577

6678
func loadSpriteFromData(name string) *spriteAsset {

gml/internal/sprite/sprite_manager_debug.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,19 @@ FileWatchLoop:
6565

6666
// If those sprites are loaded, reload them
6767
for _, spriteName := range watcherSpritesToUpdate {
68-
spr := SpriteLoadByName(spriteName)
69-
if spr != nil {
70-
newSprData := loadSprite(spriteName)
71-
*spr = *newSprData
68+
spriteIndex := SpriteLoadByName(spriteName)
69+
if spriteIndex == SprUndefined {
70+
continue
7271
}
72+
spr := sprite(spriteIndex)
73+
newSprData := loadSprite(spriteName)
74+
*spr = *newSprData
7375
}
7476
}
7577

76-
func DebugWriteSpriteConfig(spr *Sprite) error {
78+
// DebugWriteSpriteConfig is called by the animation editor
79+
func DebugWriteSpriteConfig(spriteIndex SpriteIndex) error {
80+
spr := sprite(spriteIndex)
7781
name := spr.Name()
7882
config := loadConfig(name)
7983

@@ -82,7 +86,7 @@ func DebugWriteSpriteConfig(spr *Sprite) error {
8286
collisionMasks := make(map[int]map[int]CollisionMask)
8387
masks := make(map[int]CollisionMask)
8488
for i, _ := range spr.frames {
85-
mask := *GetCollisionMask(spr, i, 0)
89+
mask := *GetCollisionMask(spriteIndex, i, 0)
8690
if mask.Kind == CollisionMaskInherit {
8791
delete(masks, i)
8892
} else {

0 commit comments

Comments
 (0)