mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-09-20 13:22:19 +02:00
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
|
package blocks
|
||
|
|
||
|
import (
|
||
|
"github.com/hajimehoshi/go-ebiten/graphics"
|
||
|
"github.com/hajimehoshi/go-ebiten/graphics/matrix"
|
||
|
"image/color"
|
||
|
"math/rand"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
texturePaths["empty"] = "images/blocks/empty.png"
|
||
|
}
|
||
|
|
||
|
type GameScene struct {
|
||
|
field *Field
|
||
|
rand *rand.Rand
|
||
|
currentPiece *Piece
|
||
|
nextPiece *Piece
|
||
|
}
|
||
|
|
||
|
func NewGameScene() *GameScene {
|
||
|
return &GameScene{
|
||
|
field: NewField(),
|
||
|
rand: rand.New(rand.NewSource(time.Now().UnixNano())),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const emptyWidth = 16
|
||
|
const emptyHeight = 16
|
||
|
const fieldWidth = blockWidth * fieldBlockNumX
|
||
|
const fieldHeight = blockHeight * fieldBlockNumY
|
||
|
|
||
|
func (s *GameScene) choosePiece() *Piece {
|
||
|
// Omit BlockTypeNone.
|
||
|
num := int(BlockTypeMax) - 1
|
||
|
blockType := BlockType(s.rand.Intn(num) + 1)
|
||
|
return Pieces[blockType]
|
||
|
}
|
||
|
|
||
|
func (s *GameScene) Update(state *GameState) {
|
||
|
if s.currentPiece == nil {
|
||
|
s.currentPiece = s.choosePiece()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *GameScene) Draw(context graphics.Context) {
|
||
|
context.Fill(0xff, 0xff, 0xff)
|
||
|
|
||
|
field := drawInfo.textures["empty"]
|
||
|
geoMat := matrix.IdentityGeometry()
|
||
|
geoMat.Scale(float64(fieldWidth) / float64(emptyWidth),
|
||
|
float64(fieldHeight) / float64(emptyHeight))
|
||
|
geoMat.Translate(20, 20) // magic number?
|
||
|
colorMat := matrix.IdentityColor()
|
||
|
colorMat.Scale(color.RGBA{0, 0, 0, 0x80})
|
||
|
context.DrawTexture(field, geoMat, colorMat)
|
||
|
|
||
|
geoMat = matrix.IdentityGeometry()
|
||
|
geoMat.Translate(20, 20)
|
||
|
s.field.Draw(context, geoMat)
|
||
|
|
||
|
if s.currentPiece != nil {
|
||
|
s.currentPiece.Draw(context, geoMat)
|
||
|
}
|
||
|
}
|