I'm working with the cocos2d 3.x and Xcode 5.1.1.i'm doing the game like a candy crush,here i load the sprites to 5*5 matrix,and i already get the position for the touched sprite,now i need to save and use that x,y value in a array like (0,0),(3,0),(2,2)
there are a few of ways to store coordinates, it is hard to tell which way would fit better for, regarding I don't know what you mean exactly when you say save...
CGPoint _coords = CGPointMake(x, y);
obvious choice to store them in a CGPoint
struct, however the struct is designed to store fraction coordinates, but it can handle integer values as well.
you cannot insert a CGPoint
directly into any collection type, like e.g. NSArray
, NSSet
or NSSDictionary
, but you can store them in e.g. a fix-sized C-array, like:
CGPoint _fiveCoordinates[4];
NSString *_coordinates = [NSString stringWithFormat:@"%d %d", x, y];
that is a quick and ugly solution, I personally don't like it – however in certain cases is useful (vs. option #4!). it is also possible to store it any collection type, and you can extract the coordinates after, for further usage, like e.g.:
NSArray *_components = [_coordinates componentsSeparatedByString:@" "];
NSInteger x = [[_components firstObject] integerValue];
NSInteger y = [[_components lastObject] integerValue];
if you'd store the values in a simple NSArray
like
NSArray *_coordinates = [NSArray arrayWithObjects:@(x), @(y)];
the extraction procedure would be the similar to the idea above.
NSDictionary *_coordinates = [NSDictionary dictionaryWithObjectsAndKeys:@(x), @"x", @(y), @"y"];
a simple dictionary can store them flawlessly, if you need to extract the values, it is like e.g.
NSInteger x = [[_coordinates valueForKey:@"x"] integerValue];
NSInteger y = [[_coordinates valueForKey:@"y"] integerValue];
NSIndexPath *_coordinates = [NSIndexPath indexPathForRow:y inSection:x];
if you like to work with index paths, that is a very straightforward way to store indices, because the NSIndexPath
widely used and can be inserted directly into any collection type.
extracting the coordinates would be the same easy way:
NSInteger x = [_coordinates section];
NSInteger y = [_coordinates row];
another obvious way would be that creating an own class to store those coordinates, like e.g.:
@interface MyCoordinates : NSObject { }
@property (nonatomic) NSinteger x;
@property (nonatomic) NSinteger y;
@end
@implementation MyCoordinates
@end
and you can also extend it comforming the NSCoding
protocol, if you want to get a pure serialisable object, which can be archived with the NSArray
for permanent storing, like:
@interface MyCoordinates : NSObject <NSCoding> { }
@property (nonatmic) NSInteger x;
@property (nonatmic) NSInteger y;
@end
@implementation MyCoordinates
#pragma mark - <NSCoding>
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
_x = [[aDecoder decodeObjectForKey:@"x"] integerValue];
_y = [[aDecoder decodeObjectForKey:@"y"] IntegerValue];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:@(_x) forKey:@"x"];
[aCoder encodeObject:@(_y) forKey:@"y"];
}
@end
...or something similar, or you can combine them together as you'd feel which the most convenient way is in your personal view.