# HG changeset patch # User Matti Hamalainen # Date 1322161866 -7200 # Node ID 67b2322fda9106cf5d7bc8560c5e7673642b45de # Parent 792bf87886e7a38eb50a640680eab33d0e5fb1d5 Add spawning of animated score elements when player finishes a turn. diff -r 792bf87886e7 -r 67b2322fda91 game/Engine.java --- a/game/Engine.java Thu Nov 24 21:10:13 2011 +0200 +++ b/game/Engine.java Thu Nov 24 21:11:06 2011 +0200 @@ -13,6 +13,8 @@ import javax.imageio.*; import javax.swing.*; import java.util.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.io.*; import game.*; import javax.sound.sampled.*; @@ -210,6 +212,9 @@ int currX, currY, currPoint; Sound sndPlaced; + + private final ReentrantReadWriteLock pointLock = new ReentrantReadWriteLock(); + private ArrayList pointElems; public GameBoard(IDMPoint pos, float ps) { @@ -218,6 +223,8 @@ // sndPlaced = G.smgr.getSound("sounds/placed.wav"); + pointElems = new ArrayList(); + startNewGame(); } @@ -259,6 +266,21 @@ pscale - pscale / 10); } + Lock read = pointLock.readLock(); + read.lock(); + try + { + for (AnimatedPointElement elem : pointElems) + { + elem.paint(g); + } + } + finally + { + read.unlock(); + } + + if (!flagGameOver) { if (nextPiece != null) @@ -308,6 +330,26 @@ { board[x][y].animate(time); } + + Lock write = pointLock.writeLock(); + write.lock(); + try + { + ArrayList tmp = new ArrayList(); + + for (AnimatedPointElement elem : pointElems) + { + elem.animate(time); + if (elem.active) + tmp.add(elem); + } + + pointElems = tmp; + } + finally + { + write.unlock(); + } } public void pieceRotate(Piece.RotateDir dir) @@ -423,6 +465,24 @@ { connections++; finished = pieceCheck(board[currX][currY]); + + if (!finished) + { + Lock write = pointLock.writeLock(); + write.lock(); + try + { + pointElems.add(new AnimatedPointElement( + new IDMPoint( + getScaledX() + ((currX + 0.5f) * pscale), + getScaledY() + ((currY + 0.5f) * pscale)), + "" + connections)); + } + finally + { + write.unlock(); + } + } } else {