Hey guys!
I've some issues with detecting the X and Y coordinates in the grid upon touch
the grid is 6x7 and there are 41 bricks upon the grid
what am I forgetting?
bricks.m
Code:
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *) event{
CCLOG(@"ccTouchEnded");
NSAssert(state == kStateGrabbed, @"Unexpected state!");
CGPoint location = [touch locationInView: [touch view]];
location = [[CCDirector sharedDirector] convertToGL: location];
CCLOG(@"location.x %f", location.x);
CCLOG(@"location.y %f", location.y);
[theGame moveBrick:self Xpos: location.x Ypos: location.y];
state = kStateUngrabbed;
}
@end
gameplaylayer.m
Code:
//-(void)moveBrick:(Bricks *)brick dir:(int)dir{
-(void)moveBrick:(Bricks *)brick Xpos: (float)xpos Ypos: (float) ypos{
CCLOG(@"moveBrick");
CCLOG(@"xpos %f", xpos);
CCLOG(@"ypos %f", ypos);
float CoordX = xpos+blankPosition.x*80;
float CoordY = ypos+blankPosition.y*46;
CCLOG(@"CoordX %f", CoordX);
CCLOG(@"CoordY %f", CoordY);
for(int i =0; i< GRID_WIDTH ; i++)
{
for(int j =0; j< GRID_HEIGHT ; j++)
{
if(grid[i][j] == brick)
{
switch ([self validMove:CoordX Yposition:CoordY]) {
case 1:
if(i<GRID_WIDTH-1)
{
CCLOG(@"rightBrick");
grid[i][j] = grid[i+1][j];
grid[i+1][j] = brick;
[grid[i][j].mySprite setPosition:ccp(100*i + GRID_OFFSET.x,100*j + GRID_OFFSET.y)];
[grid[i+1][j].mySprite setPosition:ccp(100*(i+1) + GRID_OFFSET.x,100*j + GRID_OFFSET.y)];
//[self checkGroups:YES];
return;
}
break;
case 2:
if(i>0)
{
CCLOG(@"leftBrick");
grid[i][j] = grid[i-1][j];
grid[i-1][j] = brick;
[grid[i][j].mySprite setPosition:ccp(100*i + GRID_OFFSET.x,100*j + GRID_OFFSET.y)];
[grid[i-1][j].mySprite setPosition:ccp(100*(i-1) + GRID_OFFSET.x,100*j + GRID_OFFSET.y)];
//[self checkGroups:YES];
return;
}
break;
case 3:
if(j<GRID_HEIGHT-1)
{
CCLOG(@"downBrick");
grid[i][j] = grid[i][j+1];
grid[i][j+1] = brick;
[grid[i][j].mySprite setPosition:ccp(100*i + GRID_OFFSET.x,100*j + GRID_OFFSET.y)];
[grid[i][j+1].mySprite setPosition:ccp(100*i + GRID_OFFSET.x,100*(j+1) + GRID_OFFSET.y)];
//[self checkGroups:YES];
return;
}
break;
case 4:
if(j>0)
{
CCLOG(@"upBrick");
grid[i][j] = grid[i][j-1];
grid[i][j-1] = brick;
[grid[i][j].mySprite setPosition:ccp(100*i + GRID_OFFSET.x,100*j + GRID_OFFSET.y)];
[grid[i][j-1].mySprite setPosition:ccp(100*i + GRID_OFFSET.x,100*(j-1) + GRID_OFFSET.y)];
//[self checkGroups:YES];
return;
}
break;
}
}
}
}
}
-(void)placeBricks{
CCLOG(@"placeBricks");
//empty spot in the bottom right corner of the grid
blankPosition = CGPointMake(5, 0);
for(int i =0; i< GRID_WIDTH ; i++)
{
for(int j =0; j< GRID_HEIGHT ; j++)
{
CGPoint orgPosition = CGPointMake(i,j);
if( blankPosition.x == orgPosition.x && blankPosition.y == orgPosition.y ){
continue;
}
Bricks * leftB = nil;
Bricks *leftmostB= nil;
Bricks * topB= nil;
Bricks *topmostB= nil;
int prohibitedLeft = -1, prohibitedTop = -1;
if(i>=2)
{
leftB = (Bricks *)grid[i-1][j];
leftmostB = (Bricks *)grid[i-2][j];
}
if(j>=2)
{
topB = (Bricks *)grid[i][j-1];
topmostB = (Bricks *)grid[i][j-2];
}
if(leftB && leftmostB && leftB.bricksType == leftmostB.bricksType)
{
prohibitedLeft = leftB.bricksType;
}
if(topB && topmostB && topB.bricksType == topmostB.bricksType)
{
prohibitedTop = topB.bricksType;
}
[grid[i][j] placeInGrid:ccp(100*i + GRID_OFFSET.x,101*j + GRID_OFFSET.y) pt:prohibitedTop pl:prohibitedLeft];
}
}
}
//Valid moves: UP, DOWN, LEFT or RIGHT
-(Move) validMove:(float) brickX Yposition: (float) brickY{
CCLOG(@"validMove");
CCLOG(@"brickX %f", brickX);
CCLOG(@"brickY %f", brickY);
CCLOG(@"blankPosition.x %f", blankPosition.x);
CCLOG(@"blankPosition.y %f", blankPosition.y);
// blank spot above current brick
if( brickX == blankPosition.x && brickY == blankPosition.y+1 ){
return UP;
CCLOG(@"Up");
}
// bank splot below current brick
if( brickX == blankPosition.x && brickY == blankPosition.y-1 ){
return DOWN;
CCLOG(@"Down");
}
// bank spot left of the current brick
if( brickX == blankPosition.x+1 && brickY == blankPosition.y ){
return LEFT;
CCLOG(@"Left");
}
// bank spot right of the current brick
if( brickX == blankPosition.x-1 && brickY == blankPosition.y ){
return RIGHT;
CCLOG(@"Right");
}
return NONE;
}