如何在数组中保存x和y值的触摸位置

时间:2014-08-30 05:30:14

标签: ios5 cocos2d-iphone cocos2d-iphone-3

我正在使用cocos2d 3.x和Xcode 5.1.1.i'm做的游戏就像一个糖果粉碎,在这里我将精灵加载到5 * 5矩阵,我已经获得了触摸的位置精灵,现在我需要保存并使用数组中的x,y值,如(0,0),(3,0),(2,2)

2 个答案:

答案 0 :(得分:1)

有几种方法可以存储坐标,很难说哪种方式更合适,因为当你说 save 时,我不知道你究竟是什么意思... < / p>

选项#1

CGPoint _coords = CGPointMake(x, y);

将它们存储在CGPoint结构中的明显选择,但结构设计用于存储 fraction 坐标,但它也可以处理整数值。

您不能将CGPoint直接插入任何集合类型,例如NSArrayNSSetNSSDictionary,但您可以将其存储在一个固定大小的C数组,如:

CGPoint _fiveCoordinates[4];

选项#2

NSString *_coordinates = [NSString stringWithFormat:@"%d %d", x, y];

这是一个快速而丑陋的解决方案,我个人不喜欢它 - 但在某些情况下是有用的(与选项#4 !)。它也可以存储任何集合类型,你可以在以后提取坐标,以便进一步使用,例如:

NSArray *_components = [_coordinates componentsSeparatedByString:@" "];
NSInteger x = [[_components firstObject] integerValue];
NSInteger y = [[_components lastObject] integerValue];

如果您将值存储在简单的NSArray

NSArray *_coordinates = [NSArray arrayWithObjects:@(x), @(y)];

提取程序与上述想法类似。

选项#3

NSDictionary *_coordinates = [NSDictionary dictionaryWithObjectsAndKeys:@(x), @"x", @(y), @"y"];

一个简单的字典可以完美地存储它们,如果你需要提取值,就像是一样。

NSInteger x = [[_coordinates valueForKey:@"x"] integerValue];
NSInteger y = [[_coordinates valueForKey:@"y"] integerValue];

选项#4

NSIndexPath *_coordinates = [NSIndexPath indexPathForRow:y inSection:x];

如果您喜欢使用索引路径,这是一种非常直接的存储索引的方法,因为NSIndexPath被广泛使用并且可以直接插入到任何集合类型中。

提取坐标将是同样简单的方法:

NSInteger x = [_coordinates section];
NSInteger y = [_coordinates row];

选项#5A

另一个显而易见的方法是创建一个自己的类来存储这些坐标,例如:

·H

@interface MyCoordinates : NSObject { }

@property (nonatomic) NSinteger x;
@property (nonatomic) NSinteger y;

@end

的.m

@implementation MyCoordinates

@end

选项#5B

如果你想获得一个纯的可序列化对象,也可以使用NSCoding进行永久存储,可以扩展它,使其符合NSArray协议,如:

·H

@interface MyCoordinates : NSObject <NSCoding> { }

@property (nonatmic) NSInteger x;
@property (nonatmic) NSInteger y;

@end

的.m

@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

...或类似的东西,或者您可以将它们组合在一起,因为您觉得哪种方式最适合您的个人观点。

答案 1 :(得分:1)

//SET
NSMutableArray* points = [[NSMutableArray alloc] initWithCapacity:10];
CGPoint pointToBeStored = CGPointMake(0,0);
[points addObject:[NSValue valueWithCGPoint:pointToBeStored]];

//GET
NSValue *value = [points objectAtIndex:index];
CGPoint storedPoint = [value CGPointValue];