scg/ch10/AlphabetSelector

From FANG

Jump to: navigation, search

001 package scg.ch10;
002 
003 import java.util.ArrayList;
004 
005 import fang2.attributes.Location2D;
006 import fang2.core.Game;
007 import fang2.sprites.CompositeSprite;
008 
009 /**
010  * A "picked letter board" for playing a letter guessing game. The
011  * letters are displayed in alphabetic order in 2 lines (2 10-character
012  * and 1 6-character line). Letters have two states: ready and used. The
013  * sprite supports checking if there has been a mouse click on one of
014  * the ready letters.
015  */
016 public class AlphabetSelector
017   extends CompositeSprite {
018   /** 2d layout of the letters inside this sprite */
019   private final ArrayList<ArrayList<LetterSprite>> letters;
020 
021   /**
022    * Construct a new alphabet selector. Make the letter layout.
023    */
024   public AlphabetSelector() {
025     letters = makeLetters();
026     unselectAll();
027   }
028 
029   /**
030    * What character was selected? If click is on a ready LetterSprite,
031    * the LetterSprite will be marked used and the letter of the sprite
032    * will be returned. Returns the null character if there is no ready
033    * letter selected.
034    *
035    @return  the letter of the ready (now used) LetterSprite clicked on
036    *          if there was one; null char ('\0') otherwise
037    */
038   public char selectedChar() {
039     char letter = '\0';
040     Location2D outsideClick = Game.getCurrentGame().getClick2D();
041     if (outsideClick != null{
042       Location2D insideClick = getFrameLocation(outsideClick);
043       LetterSprite letterSprite = selectedChar(insideClick);
044       if (letterSprite != null{
045         letterSprite.startUsed();
046         letter = letterSprite.getLetter();
047       }
048     }
049     return letter;
050   }
051 
052   /**
053    * Reset all letter sprites to their ready state; reset the selection
054    * board.
055    */
056   public void unselectAll() {
057     for (int row = 0; row != letters.size()++row{
058       ArrayList<LetterSprite> currRow = letters.get(row);
059       for (int column = 0; column != currRow.size()++column{
060         LetterSprite curr = currRow.get(column);
061         curr.startReady();
062       }
063     }
064   }
065 
066   /**
067    * Construct the array of LetterSprites. The array of LetterSprites is
068    * scaled to fit across a width of 1.0 (-0.5 to 0.5).
069    *
070    @return  the newly created list of lists of LetterSprites.
071    */
072   private ArrayList<ArrayList<LetterSprite>> makeLetters() {
073     final double letterScale = 1.0 (10/*letters*/ + 9/*spaces*/);
074     ArrayList<ArrayList<LetterSprite>> theLetters =
075       new ArrayList<ArrayList<LetterSprite>>();
076     char letter = 'a';
077     double rowY = -* letterScale;
078     for (int row = 0; row != 3++row{
079       int lettersInRow = 10;
080       if (row == 2{
081         lettersInRow = 6;
082       }
083       ArrayList<LetterSprite> currRow = new ArrayList<LetterSprite>();
084       double columnX = -
085         ((letterScale * (lettersInRow + lettersInRow - 1)) 2.0);
086       for (int column = 0; column != lettersInRow; ++column{
087         LetterSprite curr = new LetterSprite(letter);
088         curr.setWidth(letterScale);
089         curr.leftJustify();
090         curr.setLocation(columnX, rowY);
091         addSprite(curr);
092 
093         currRow.add(curr);
094         columnX += * letterScale;
095         ++letter;// lowercase letters are adjacent
096       }
097       theLetters.add(currRow);
098       rowY += * letterScale;
099     }
100     return theLetters;
101   }
102 
103   /**
104    * What LetterSprite (if any) does the given click location intersect?
105    * Returns the LetterSprite clicked on if it is ready. If no sprite is
106    * clicked on or the clicked LetterSprite is already used, returns
107    null.
108    *
109    @param   insideClick  mouse click in sprite coordinates.
110    *
111    @return  the ready LetterSprite intersecting the click if there is
112    *          one; null otherwise
113    */
114   private LetterSprite selectedChar(Location2D insideClick{
115     LetterSprite selected = null;
116     if (insideClick != null{
117       for (int row = 0; row != letters.size()++row{
118         ArrayList<LetterSprite> currRow = letters.get(row);
119         for (int column = 0; column != currRow.size()++column{
120           LetterSprite curr = currRow.get(column);
121           if (curr.intersects(insideClick&& curr.isReady()) {
122             selected = curr;
123           }
124         }
125       }
126     }
127     return selected;
128   }
129 }
130 
131 //Uploaded on Mon Mar 29 21:38:51 EDT 2010


Download/View scg/ch10/AlphabetSelector.java





Views
Personal tools
Add to 
del.icio.usAdd to 
diggAdd to 
FacebookAdd to 
favoritesAdd to 
GoogleAdd to 
MySpaceAdd to 
PrintAdd to 
SlashdotAdd to 
StumbleUponAdd to 
Twitter

Games
Games