Справка по Refactor> Для отображения контуров CGPoints и SKSpriteNodes
Привет, я новичок в программировании и изучаю SpriteKit. (хотя это вопрос программирования общего назначения.) У меня есть жестко закодированные значения, и я снова и снова использовал одно и то же изображение. А кодирования нет нет, из того, что я понимаю. Может ли кто-нибудь помочь мне узнать это путем рефакторинга с помощью циклов, которые я предполагаю.
Я создаю ряд из 20 пунктирных пустых мест для карточек и размещаю по 4 по размеру экрана по центру внизу экрана. Я добавил эти пустые места (только одно изображение карты использовалось снова и снова) как "ребенок" в стойку.
Примечание: поскольку это общий вопрос программирования, если вы не знакомы с SpriteKit, мои CGPoints отображаются в системе координат стоек, а не в экранных координатах... если это вас смутило...
Я попытался создать рефакторированный код внизу, но я застрял, потому что node.positions привязаны к SKSpriteNodes и зацикливанию, что, кажется, озадачивает меня.
Вот что у меня есть:
-(SKSpriteNode*)createBottomRack
{
self.rack = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(10240.0, 200)];
self.rack.position = CGPointMake(0.0,150.0);
self.rack.zPosition = 0;
self.rack.name = @"bottomRack";
// Screen 1
SKSpriteNode *number0 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number1 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number2 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number3 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
// Screen 1 positions
number0.position = CGPointMake(212, 0.0);
number1.position = CGPointMake(412, 0.0);
number2.position = CGPointMake(612, 0.0);
number3.position = CGPointMake(812, 0.0);
// Screen 2
SKSpriteNode *number4 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number5 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number6 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number7 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
// Screen 2 positions
number4.position =CGPointMake(1236.0, 0.0);
number5.position =CGPointMake(1436.0, 0.0);
number6.position =CGPointMake(1636.0, 0.0);
number7.position =CGPointMake(1836.0, 0.0);
// Screen 3
SKSpriteNode *number8 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number9 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number10 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number11 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
// Screen 3 positions
number8.position =CGPointMake(2260.0, 0.0);
number9.position =CGPointMake(2460.0, 0.0);
number10.position =CGPointMake(2660.0, 0.0);
number11.position =CGPointMake(2860.0, 0.0);
// Screen 4
SKSpriteNode *number12 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number13 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number14 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number15 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
// Screen 4 positions
number12.position =CGPointMake(3284.0, 0.0);
number13.position =CGPointMake(3484.0, 0.0);
number14.position =CGPointMake(3684.0, 0.0);
number15.position =CGPointMake(3884.0, 0.0);
// Screen 5
SKSpriteNode *number16 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number17 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number18 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
SKSpriteNode *number19 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
// Screen 5 positions
number16.position =CGPointMake(4308.0, 0.0);
number17.position =CGPointMake(4508.0, 0.0);
number18.position =CGPointMake(4708.0, 0.0);
number19.position =CGPointMake(4908.0, 0.0);
// Add dashedCards in position on screen
[self.rack addChild:number0];
[self.rack addChild:number1];
[self.rack addChild:number2];
[self.rack addChild:number3];
[self.rack addChild:number4];
[self.rack addChild:number5];
[self.rack addChild:number6];
[self.rack addChild:number7];
[self.rack addChild:number8];
[self.rack addChild:number9];
[self.rack addChild:number10];
[self.rack addChild:number11];
[self.rack addChild:number12];
[self.rack addChild:number13];
[self.rack addChild:number14];
[self.rack addChild:number15];
[self.rack addChild:number16];
[self.rack addChild:number17];
[self.rack addChild:number18];
[self.rack addChild:number19];
return self.rack;
}
Вот где я сейчас нахожусь в рефакторинге...
NSMutableArray *dashesArray = [NSMutableArray arrayWithCapacity:20];
for (int i = 0; i<=20; i++) {
SKSpriteNode *dash = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
[dashesArray addObject:dash];
}
Это потому, что если я сделаю цикл, содержащий номераные узлы SKSpriteNode с общим номером, я не вижу, как я сопоставлю их с позициями....?
2 ответа
Расчет координаты х для position
каждого узла довольно просто:
- х начинается в 212
- Последующие узлы находятся в 200px справа от предыдущего узла
- Каждый 5-й узел имеет длину 424 пикселя (вместо 200 пикселей) справа от предыдущего узла.
Код для этого выглядит так:
- (SKSpriteNode *)createBottomRack
{
self.rack = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(10240.0, 200)];
self.rack.position = CGPointMake(0.0,150.0);
self.rack.zPosition = 0;
self.rack.name = @"bottomRack";
float x = 212.0, y = 0.0;
for (NSUInteger i = 0; i < 20; i++) {
SKSpriteNode *dash = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
dash.position = CGPointMake(x, y);
[self.rack addChild:dash];
// Calculate the next x coordinate
x += (i % 4 == 3) ? 424.0 : 200;
}
return self.rack;
}
Поскольку вы новичок в программировании, я предлагаю вам потратить некоторое время на изучение того, как работают массивы и как они используются:
http://en.wikipedia.org/wiki/Array_data_structure
и их реализация iOS:
Для начала вы можете объявить два массива, один из которых содержит узлы SKSpriteNode, а другой - точки позиционирования:
//Declare these in @interface
@property (nonatomic) NSMutableArray *sprites;
@property (nonatomic) NSMutableArray *points;
//This will contain the SKSpriteNodes
self.sprites =[[NSMutableArray alloc] init];
//This will contain the points, we initialise it with the hard-coded values.
//You have to wrap the values in an object type of NSValue of the array to accept it
self.points = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithCGPoint:CGPointMake(212, 0.0)],
[NSValue valueWithCGPoint:CGPointMake(412, 0.0)],
[NSValue valueWithCGPoint:CGPointMake(612, 0.0)],
[NSValue valueWithCGPoint:CGPointMake(812, 0.0)],
//Put the rest of the values here... for the moment it will do
nil];
//Now for each declared point, we create a SKSpriteNode, insert it into the array and add it to "rack"
//for will loop over eacg point you have defined.
for (NSValue *point in self.points){
//This will be a temporary object we create to add it into the array.
SKSpriteNode *node =[SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
node.position = [point CGPointValue];
[self.sprites addObject:node];
[self.rack addChild:node];
}
По мере накопления опыта вы найдете много других способов улучшить код, но не спешите изучать код и основные структуры данных. Удачи!