changeset 131:67b2322fda91

Add spawning of animated score elements when player finishes a turn.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 24 Nov 2011 21:11:06 +0200
parents 792bf87886e7
children 333df3e1155b
files game/Engine.java
diffstat 1 files changed, 60 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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<AnimatedPointElement> pointElems;
     
     public GameBoard(IDMPoint pos, float ps)
     {
@@ -218,6 +223,8 @@
 
 //        sndPlaced = G.smgr.getSound("sounds/placed.wav");
 
+        pointElems = new ArrayList<AnimatedPointElement>();
+
         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<AnimatedPointElement> tmp = new ArrayList<AnimatedPointElement>();
+
+            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
             {