前回の続き。
プレイヤーが移動するフィールドをハードコードしていましたが、より効率的に生成することにします。
フィールドの生成
簡易的に文字列からフィールドを生成します。go-inovationの方法を参考にしています。
ソースコード
-
全体の差分は以下
-
field/field_data.go
package field
const Field_data_1 = `+ +
+ +
+ +
+ ++++++++++++++ +
+ + +
+ + ++ +
+ + + +++++ +
+ + + +
+ +++++++++ +
+ +++ + +
+ +
+ ++ +
+ P +
++++++++++++++++++++++++++++++++++++++++++
`
- field/field.go
package field
import (
"strings"
"github.com/hajimehoshi/ebiten"
"github.com/zenwerk/go-pixelman3/sprite"
)
const (
width = 17
height = 17
blockMark = "+"
playerMark = "P"
)
type Field struct {
Player *sprite.Player
Sprites []sprite.Sprite
}
func NewField(fieldData string) *Field {
field := new(Field)
for indexY, line := range strings.Split(fieldData, "\n") {
for indexX, str := range line {
switch string(str) {
case blockMark:
block := sprite.NewBlock()
block.Position.X = indexX * width
block.Position.Y = indexY * height
field.Sprites = append(field.Sprites, block)
case playerMark:
player := sprite.NewPlayer()
player.Position.X = indexX * width
player.Position.Y = indexY * height
field.Player = player
}
}
}
return field
}
func (f *Field) DrawImage(screen *ebiten.Image, viewport sprite.Position) {
for _, sprite := range f.Sprites {
sprite.DrawImage(screen, viewport)
}
}
field_data.go
で定義されている文字列がフィールドの生成元です。
field.go
の NewField
で文字列をループで回し、特定の文字が現れたら該当する Sprite を生成します。
実行結果
まとめ
手作業で座標を指定するよりだいぶ楽になりました。