mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 03:38:55 +01:00
Implement landing
This commit is contained in:
parent
14994d57f2
commit
ce97070f66
@ -62,6 +62,11 @@ func (f *Field) RotatePieceRight(piece *Piece, x, y int, angle Angle) Angle {
|
|||||||
return angle.RotateRight()
|
return angle.RotateRight()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (f *Field) AbsorbPiece(piece *Piece, x, y int, angle Angle) {
|
||||||
|
piece.absorbInto(f, x, y, angle)
|
||||||
|
}
|
||||||
|
|
||||||
func (f *Field) Draw(context graphics.Context, geo matrix.Geometry) {
|
func (f *Field) Draw(context graphics.Context, geo matrix.Geometry) {
|
||||||
blocks := make([][]BlockType, len(f.blocks))
|
blocks := make([][]BlockType, len(f.blocks))
|
||||||
for i, blockCol := range f.blocks {
|
for i, blockCol := range f.blocks {
|
||||||
|
@ -42,52 +42,59 @@ func (s *GameScene) choosePiece() *Piece {
|
|||||||
return Pieces[blockType]
|
return Pieces[blockType]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *GameScene) Update(state *GameState) {
|
func (s *GameScene) initCurrentPiece(piece *Piece) {
|
||||||
const maxLandingCount = 30
|
s.currentPiece = piece
|
||||||
|
|
||||||
if s.currentPiece == nil {
|
|
||||||
s.currentPiece = s.choosePiece()
|
|
||||||
x, y := s.currentPiece.InitialPosition()
|
x, y := s.currentPiece.InitialPosition()
|
||||||
s.currentPieceX = x
|
s.currentPieceX = x
|
||||||
s.currentPieceY = y
|
s.currentPieceY = y
|
||||||
s.currentPieceAngle = Angle0
|
s.currentPieceAngle = Angle0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GameScene) Update(state *GameState) {
|
||||||
|
const maxLandingCount = 60
|
||||||
|
|
||||||
|
if s.currentPiece == nil {
|
||||||
|
s.initCurrentPiece(s.choosePiece())
|
||||||
|
}
|
||||||
|
if s.nextPiece == nil {
|
||||||
|
s.nextPiece = s.choosePiece()
|
||||||
|
}
|
||||||
piece := s.currentPiece
|
piece := s.currentPiece
|
||||||
x := s.currentPieceX
|
x := s.currentPieceX
|
||||||
y := s.currentPieceY
|
y := s.currentPieceY
|
||||||
angle := s.currentPieceAngle
|
angle := s.currentPieceAngle
|
||||||
moved := false
|
moved := false
|
||||||
if state.Input.StateForKey(ui.KeySpace) == 1 {
|
if state.Input.StateForKey(ui.KeySpace) == 1 {
|
||||||
orig := angle
|
|
||||||
s.currentPieceAngle = s.field.RotatePieceRight(piece, x, y, angle)
|
s.currentPieceAngle = s.field.RotatePieceRight(piece, x, y, angle)
|
||||||
moved = orig != angle
|
moved = angle != s.currentPieceAngle
|
||||||
}
|
}
|
||||||
if l := state.Input.StateForKey(ui.KeyLeft);
|
if l := state.Input.StateForKey(ui.KeyLeft);
|
||||||
l == 1 || (10 <= l && l % 2 == 0) {
|
l == 1 || (10 <= l && l % 2 == 0) {
|
||||||
orig := x
|
|
||||||
s.currentPieceX = s.field.MovePieceToLeft(piece, x, y, angle)
|
s.currentPieceX = s.field.MovePieceToLeft(piece, x, y, angle)
|
||||||
moved = orig != x
|
moved = x != s.currentPieceX
|
||||||
}
|
}
|
||||||
if r := state.Input.StateForKey(ui.KeyRight);
|
if r := state.Input.StateForKey(ui.KeyRight);
|
||||||
r == 1 || (10 <= r && r % 2 == 0) {
|
r == 1 || (10 <= r && r % 2 == 0) {
|
||||||
orig := y
|
|
||||||
s.currentPieceX = s.field.MovePieceToRight(piece, x, y, angle)
|
s.currentPieceX = s.field.MovePieceToRight(piece, x, y, angle)
|
||||||
moved = orig != y
|
moved = y != s.currentPieceX
|
||||||
}
|
}
|
||||||
if d := state.Input.StateForKey(ui.KeyDown);
|
if d := state.Input.StateForKey(ui.KeyDown);
|
||||||
(d - 1) % 2 == 0 {
|
(d - 1) % 2 == 0 {
|
||||||
orig := y
|
|
||||||
s.currentPieceY = s.field.DropPiece(piece, x, y, angle)
|
s.currentPieceY = s.field.DropPiece(piece, x, y, angle)
|
||||||
moved = orig != y
|
moved = y != s.currentPieceY
|
||||||
}
|
}
|
||||||
if moved {
|
if moved {
|
||||||
s.landingCount = 0
|
s.landingCount = 0
|
||||||
} else if !s.field.PieceDroppable(piece, x, y, angle) {
|
} else if !s.field.PieceDroppable(piece, x, y, angle) {
|
||||||
|
if 0 < state.Input.StateForKey(ui.KeyDown) {
|
||||||
|
s.landingCount += 10
|
||||||
|
} else {
|
||||||
s.landingCount++
|
s.landingCount++
|
||||||
|
}
|
||||||
if maxLandingCount <= s.landingCount {
|
if maxLandingCount <= s.landingCount {
|
||||||
print("landing!\n")
|
s.field.AbsorbPiece(piece, x, y, angle)
|
||||||
// TODO: implement
|
s.initCurrentPiece(s.nextPiece)
|
||||||
s.currentPiece = nil
|
s.nextPiece = nil
|
||||||
s.landingCount = 0
|
s.landingCount = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -193,6 +193,18 @@ func (p *Piece) collides(field *Field, x, y int, angle Angle) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Piece) absorbInto(field *Field, x, y int, angle Angle) {
|
||||||
|
size := len(p.blocks)
|
||||||
|
for i := 0; i < size; i++ {
|
||||||
|
for j := 0; j < size; j++ {
|
||||||
|
if p.isBlocked(i, j, angle) {
|
||||||
|
// TODO: Is it OK to access field.block directly?
|
||||||
|
field.blocks[x+i][y+j] = p.blockType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Piece) Draw(context graphics.Context, fieldX, fieldY int, pieceX, pieceY int, angle Angle) {
|
func (p *Piece) Draw(context graphics.Context, fieldX, fieldY int, pieceX, pieceY int, angle Angle) {
|
||||||
size := len(p.blocks)
|
size := len(p.blocks)
|
||||||
blocks := make([][]BlockType, size)
|
blocks := make([][]BlockType, size)
|
||||||
|
Loading…
Reference in New Issue
Block a user