phantomsri
phantomsri

Reputation: 11

random sprite position

right now i need a advice how to code a code.

I have 4 sprites in a 2x2 arrangement. all the sprite is different. How can i random/mix the position when i load the layer?

So far I have done this code. Is there a simpler way or this method im using is correct? I have plans to load more sprites in 5X5 arrangement.

CGPoint grid1 =ccp(60,210);
CGPoint grid2 =ccp(60,280);
CGPoint grid3 =ccp(180,210);
CGPoint grid4 =ccp(180,280);

sprite1 =[CCSprite spriteWithFile:@"sprite1"];
sprite2 =[CCSprite spriteWithFile:@"sprite2"];
sprite3 =[CCSprite spriteWithFile:@"sprite3"]; 
sprite4 =[CCSprite spriteWithFile:@"sprite4"];

int randomLocation = (arc4random() % 4) + 1;

switch(randomLocation)
{
case 1:

sprite1.position=grid1;
sprite1.position=grid2;
sprite1.position=grid3;
sprite1.position=grid4;

break;

case 2:

sprite1.position=grid2;
sprite1.position=grid3;
sprite1.position=grid1;
sprite1.position=grid4;

break;

case 3:
sprite1.position=grid4;
sprite1.position=grid1;
sprite1.position=grid2;
sprite1.position=grid3;

break;

case 4:
sprite1.position=grid4;
sprite1.position=grid3;
sprite1.position=grid2;
sprite1.position=grid1;

break;
}

[self addChild:sprite1];
[self addChild:sprite2];
[self addChild:sprite3];
[self addChild:sprite4];

Upvotes: 1

Views: 368

Answers (1)

user481081
user481081

Reputation:

Define some constants and some macros:

#define GRID_SIZE 36.0f
#define GRID_MAX_COLUMNS 4
#define GRID_MAX_ROWS 4

#define RAND_COLUMN() (arc4random()%GRID_MAX_COLUMNS)
#define RAND_ROW() (arc4random()%GRID_MAX_ROWS)

Subclass CCSprite:

@interface GridSprite : CCSprite {
    int column_;
    int row_;
}

@property (nonatomic, assign) int column;
@property (nonatomic, assign) int row;
@property (nonatomic, key) NSString* key;

- (void) reposition;

@end

@implementation GridSprite

@synthesize column=column_, row=row_;

- (void) reposition {
    CGPoint position = ccp(column_ * GRID_SIZE, row_ * GRID_SIZE);
    self.position = position;
}

- (NSString*) key {
    return [NSString stringWithFormat:@"%dx%d", column_, row_];
}

@end

Now in your game code:

- (void) setupBoard {
    NSMutableArray* pieces = [NSMutableArray alloc] init];
    NSMutableDictionary* piecesByKey = [NSMutableDictionary alloc] init];

    GridSprite* piece;

    uint i, ic = GRID_MAX_COLUMNS * GRID_MAX_ROWS;
    for (i=0; i<ic; i++) {
        piece = [GridSprite node];
        piece.anchorPosition = CGPointZero;

        while (1) {
            piece.column = RAND_COLUMN();
            piece.row = RAND_ROW();
            if ([piecesByKey objectForKey:piece.key] == nil) break;
        }

        [piece reposition];

        [pieces addObject:piece];
        [pieces setObject:piece forKey:piece.key];
    }
}

That will create a randomly seeded board of any grid size. You'll want to keep pieces and piecesByKey as class variables, of course.

Upvotes: 1

Related Questions