Cocos2d — вызывается только один планировщик

#opengl-es #cocos2d-iphone

#opengl-es #cocos2d-iphone

Вопрос:

Я пытаюсь проследить 2 пути на экране через ряд вершин (стиль соединения точек). Каждый должен быть разного цвета, и у каждого свой список вершин.

Я начал с создания класса, который может отслеживать путь, затем создал 2 экземпляра этого класса, по одному для каждого пути. Я отменил метод розыгрыша. Он работал просто отлично, за исключением того, что по какой-то причине только первый экземпляр класса вызывал метод draw . Я решил, что это проблема с OpenGL, поэтому я сделал это снова, используя CCDrawNode, и в нем все та же ошибка.

Только один экземпляр (blackPath) отображает любые объекты на экране. На самом деле запланированный метод updateEndpoint: даже не вызывается для объекта whitePath, хотя он успешно создан.

Мой класс Drawer.m:

 const float size = 10;
const float speed = 5;
ccColor4F pathColor;

int numPoints;
NSArray * path;
CGPoint endPoint;

@implementation Drawer

-(id)initWithPath:(NSArray*)p andColorIsBlack:(BOOL)isBlack{
    self = [super init];

    // Record input
    path = p.copy;

    pathColor = ccc4f(1.0f, 1.0f, 1.0f, 1.0f);
    if(isBlack){
        pathColor = ccc4f(0.0f, 0.0f, 0.0f, 1.0f);
    }


    // Set variables
    numPoints = 1;
    endPoint = [[path firstObject] position];

    NSLog(@"Drawer initialized with path of length %u and color %hhd (isblack)", p.count, isBlack);

    [self schedule:@selector(updateEndpoint:)];

    return self;
}

-(void)updateEndpoint:(ccTime)dt{
    NSLog(@"(%f, %f, %f, %f) Path", pathColor.r, pathColor.g, pathColor.b, pathColor.a);
    [self drawDot:endPoint radius:size color:pathColor];

    CGPoint dest = [[path objectAtIndex:numPoints] position];

    float dx = dest.x - endPoint.x;
    float dy = dest.y - endPoint.y;

    // new coords are current   distance * sign of distance
    float newX = endPoint.x   MIN(speed, fabsf(dx)) * ((dx>0) - (dx<0));
    float newY = endPoint.y   MIN(speed, fabsf(dy)) * ((dy>0) - (dy<0));

    endPoint = ccp(newX, newY);

    if(endPoint.x == dest.x amp;amp; endPoint.y == dest.y){
        if(numPoints < path.count-1){
            numPoints =1;
        }
        else{
            [self unschedule:@selector(updateEndpoint:)];
        }
    }
}
  

И вот здесь я создаю экземпляры объектов:

 -(id) init{
    self = [super init];

    [self addAllCards];
    [self addScore];

    xShrinkRate = [[Grid getInstance] sqWidth] / shrinkTime;
    yShrinkRate = [[Grid getInstance] sqHeight] / shrinkTime;

    dropList = [NSMutableArray new];
    notDropList = [NSMutableArray new];

    [self schedule:@selector(dropCard:) interval:0.075];
    [self schedule:@selector(shrinkCards:)];

    Drawer * whitePath = [[Drawer alloc] initWithPath:[[Score getInstance] whitePath] andColorIsBlack:false];
    [self addChild:whitePath];

    Drawer * blackPath = [[Drawer alloc] initWithPath:[[Score getInstance] blackPath] andColorIsBlack:true];
    [self addChild:blackPath];
    return self;
}
  

Ответ №1:

Измените (неконстантные) глобальные переменные на переменные экземпляра класса следующим образом:

 @implementation Drawer
{
    ccColor4F pathColor;

    int numPoints;
    NSArray * path;
    CGPoint endPoint;
}