jens@0: /* This code is based on Apple's "GeekGameBoard" sample code, version 1.0. jens@0: http://developer.apple.com/samplecode/GeekGameBoard/ jens@0: Copyright © 2007 Apple Inc. Copyright © 2008 Jens Alfke. All Rights Reserved. jens@0: jens@0: Redistribution and use in source and binary forms, with or without modification, are permitted jens@0: provided that the following conditions are met: jens@0: jens@0: * Redistributions of source code must retain the above copyright notice, this list of conditions jens@0: and the following disclaimer. jens@0: * Redistributions in binary form must reproduce the above copyright notice, this list of jens@0: conditions and the following disclaimer in the documentation and/or other materials provided jens@0: with the distribution. jens@0: jens@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR jens@0: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND jens@0: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRI- jens@0: BUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES jens@0: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR jens@0: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN jens@0: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF jens@0: THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. jens@0: */ jens@0: #import "HexGrid.h" jens@0: #import "Game.h" jens@0: jens@0: jens@0: @implementation HexGrid jens@0: jens@0: jens@0: - (id) initWithRows: (unsigned)nRows columns: (unsigned)nColumns jens@0: spacing: (CGSize)spacing jens@0: position: (CGPoint)pos jens@0: { jens@0: // Ignore given spacing.height; set it to make the hexagons regular. jens@0: CGFloat capHeight = spacing.height / 2 * tan(M_PI/6); jens@0: CGFloat side = spacing.height / 2 / cos(M_PI/6); jens@0: spacing.height = side + capHeight; jens@0: jens@0: self = [super initWithRows: nRows columns: nColumns jens@0: spacing: spacing jens@0: position: pos]; jens@0: if( self ) { jens@0: _capHeight = capHeight; jens@0: _side = side; jens@0: self.bounds = CGRectMake(-1, -1, jens@0: (nColumns+0.5)*spacing.width + 2, jens@0: nRows*spacing.height+capHeight + 2); jens@0: _cellClass = [Hex class]; jens@0: } jens@0: return self; jens@0: } jens@0: jens@0: jens@0: - (id) initWithRows: (unsigned)nRows columns: (unsigned)nColumns jens@0: frame: (CGRect)frame; jens@0: { jens@0: // Compute the horizontal spacing: jens@0: CGFloat s = floor(MIN( (frame.size.width -2.0)/nColumns, jens@0: (frame.size.height-2.0)/(nRows+0.5*tan(M_PI/6)) / (0.5*(tan(M_PI/6)+1/cos(M_PI/6))) )); jens@10: self = [self initWithRows: nRows columns: nColumns jens@0: spacing: CGSizeMake(s,s) jens@0: position: frame.origin]; jens@10: if( self ) { jens@10: // Center in frame: jens@10: CGRect curFrame = self.frame; jens@10: curFrame.origin.x = round( curFrame.origin.x + (frame.size.width - curFrame.size.width )/2.0f ); jens@10: curFrame.origin.y = round( curFrame.origin.y + (frame.size.height- curFrame.size.height)/2.0f ); jens@10: self.frame = curFrame; jens@10: } jens@10: return self; jens@0: } jens@0: jens@0: jens@0: - (void) dealloc jens@0: { jens@0: CGPathRelease(_cellPath); jens@0: [super dealloc]; jens@0: } jens@0: jens@0: jens@0: - (void) addCellsInHexagon jens@0: { jens@0: int size = _nRows - !(_nRows & 1); // make it odd jens@0: for( int row=0; row<_nRows; row++ ) { jens@0: int n; // # of hexes remaining in this row jens@0: if( row < size ) jens@0: n = size - abs(row-size/2); jens@0: else jens@0: n = 0; jens@0: int c0 = floor(((int)_nRows+1-n -(row&1))/2.0); // col of 1st remaining hex jens@0: jens@0: for( int col=0; col<_nColumns; col++ ) jens@0: if( col>=c0 && col