ebiten/example/blocks/gamescene.go

132 lines
3.2 KiB
Go
Raw Normal View History

2013-12-18 19:21:25 +01:00
package blocks
import (
2014-12-05 14:16:58 +01:00
"github.com/hajimehoshi/ebiten/graphics"
"github.com/hajimehoshi/ebiten/graphics/matrix"
"github.com/hajimehoshi/ebiten/ui"
2013-12-18 19:21:25 +01:00
"image/color"
"math/rand"
"time"
)
func init() {
texturePaths["empty"] = "images/blocks/empty.png"
}
type GameScene struct {
2013-12-19 17:08:32 +01:00
field *Field
rand *rand.Rand
currentPiece *Piece
currentPieceX int
currentPieceY int
currentPieceAngle Angle
nextPiece *Piece
2013-12-19 19:03:35 +01:00
landingCount int
2013-12-18 19:21:25 +01:00
}
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 {
2013-12-19 17:23:00 +01:00
num := NormalBlockTypeNum
blockType := BlockType(s.rand.Intn(num) + 1)
2013-12-18 19:21:25 +01:00
return Pieces[blockType]
}
2013-12-19 19:21:10 +01:00
func (s *GameScene) initCurrentPiece(piece *Piece) {
s.currentPiece = piece
x, y := s.currentPiece.InitialPosition()
s.currentPieceX = x
s.currentPieceY = y
s.currentPieceAngle = Angle0
}
2013-12-18 19:21:25 +01:00
func (s *GameScene) Update(state *GameState) {
2013-12-19 19:21:10 +01:00
const maxLandingCount = 60
2013-12-19 19:03:35 +01:00
2013-12-18 19:21:25 +01:00
if s.currentPiece == nil {
2013-12-19 19:21:10 +01:00
s.initCurrentPiece(s.choosePiece())
}
if s.nextPiece == nil {
s.nextPiece = s.choosePiece()
2013-12-19 17:08:32 +01:00
}
2013-12-19 19:03:35 +01:00
piece := s.currentPiece
x := s.currentPieceX
y := s.currentPieceY
angle := s.currentPieceAngle
moved := false
2013-12-19 17:08:32 +01:00
if state.Input.StateForKey(ui.KeySpace) == 1 {
2013-12-19 19:03:35 +01:00
s.currentPieceAngle = s.field.RotatePieceRight(piece, x, y, angle)
2013-12-19 19:21:10 +01:00
moved = angle != s.currentPieceAngle
2013-12-19 17:08:32 +01:00
}
2014-01-07 15:29:12 +01:00
if l := state.Input.StateForKey(ui.KeyLeft); l == 1 || (10 <= l && l%2 == 0) {
2013-12-19 19:03:35 +01:00
s.currentPieceX = s.field.MovePieceToLeft(piece, x, y, angle)
2013-12-19 19:21:10 +01:00
moved = x != s.currentPieceX
2013-12-19 17:08:32 +01:00
}
2014-01-07 15:29:12 +01:00
if r := state.Input.StateForKey(ui.KeyRight); r == 1 || (10 <= r && r%2 == 0) {
2013-12-19 19:03:35 +01:00
s.currentPieceX = s.field.MovePieceToRight(piece, x, y, angle)
2013-12-19 19:21:10 +01:00
moved = y != s.currentPieceX
2013-12-18 19:21:25 +01:00
}
2014-01-07 15:29:12 +01:00
if d := state.Input.StateForKey(ui.KeyDown); (d-1)%2 == 0 {
2013-12-19 19:03:35 +01:00
s.currentPieceY = s.field.DropPiece(piece, x, y, angle)
2013-12-19 19:21:10 +01:00
moved = y != s.currentPieceY
2013-12-19 19:03:35 +01:00
}
if moved {
s.landingCount = 0
} else if !s.field.PieceDroppable(piece, x, y, angle) {
2013-12-19 19:21:10 +01:00
if 0 < state.Input.StateForKey(ui.KeyDown) {
s.landingCount += 10
} else {
s.landingCount++
}
2013-12-19 19:03:35 +01:00
if maxLandingCount <= s.landingCount {
2013-12-19 19:21:10 +01:00
s.field.AbsorbPiece(piece, x, y, angle)
s.initCurrentPiece(s.nextPiece)
s.nextPiece = nil
2013-12-19 19:03:35 +01:00
s.landingCount = 0
}
2013-12-19 17:23:00 +01:00
}
2013-12-18 19:21:25 +01:00
}
2014-05-11 12:44:36 +02:00
func (s *GameScene) Draw(context graphics.Context, textures Textures) {
2013-12-18 19:21:25 +01:00
context.Fill(0xff, 0xff, 0xff)
2014-05-03 08:25:41 +02:00
field := textures.GetTexture("empty")
2013-12-18 19:21:25 +01:00
geoMat := matrix.IdentityGeometry()
2014-05-03 06:58:18 +02:00
geoMat.Scale(
float64(fieldWidth)/float64(emptyWidth),
2013-12-19 17:08:32 +01:00
float64(fieldHeight)/float64(emptyHeight))
2013-12-18 19:21:25 +01:00
geoMat.Translate(20, 20) // magic number?
colorMat := matrix.IdentityColor()
colorMat.Scale(color.RGBA{0, 0, 0, 0x80})
2014-05-03 06:58:18 +02:00
graphics.DrawWhole(
context.Texture(field),
emptyWidth,
emptyHeight,
geoMat,
colorMat)
2013-12-18 19:21:25 +01:00
geoMat = matrix.IdentityGeometry()
geoMat.Translate(20, 20)
2014-05-03 08:25:41 +02:00
s.field.Draw(context, textures, geoMat)
2013-12-18 19:21:25 +01:00
if s.currentPiece != nil {
2014-05-03 06:58:18 +02:00
s.currentPiece.Draw(
context,
2014-05-03 08:25:41 +02:00
textures,
2014-05-03 06:58:18 +02:00
20, 20,
s.currentPieceX,
s.currentPieceY,
s.currentPieceAngle)
2013-12-18 19:21:25 +01:00
}
}